fix more linting errors

This commit is contained in:
Philipp Kühn
2020-09-24 00:29:05 +02:00
parent aefb4ca8e6
commit ac33eb483e
106 changed files with 310 additions and 274 deletions

View File

@@ -34,6 +34,7 @@ module.exports = {
'global-require': 'off', 'global-require': 'off',
'func-names': ['error', 'never'], 'func-names': ['error', 'never'],
'arrow-body-style': 'off', 'arrow-body-style': 'off',
'max-len': 'off',
'vue/this-in-template': ['error', 'never'], 'vue/this-in-template': ['error', 'never'],
'vue/max-attributes-per-line': ['error', { 'vue/max-attributes-per-line': ['error', {
singleline: 3, singleline: 3,
@@ -42,6 +43,9 @@ module.exports = {
allowFirstLine: false, allowFirstLine: false,
}, },
}], }],
'no-param-reassign': 'off',
'import/prefer-default-export': 'off',
'consistent-return': 'off',
'no-unused-vars': 'off', 'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': ['error'], '@typescript-eslint/no-unused-vars': ['error'],
}, },

View File

@@ -23,7 +23,7 @@
</div> </div>
<div class="demo__meta"> <div class="demo__meta">
<div class="demo__name"> <div class="demo__name">
Demo/{{ this.name }} Demo/{{ name }}
</div> </div>
<a class="demo__link" :href="githubUrl" target="_blank"> <a class="demo__link" :href="githubUrl" target="_blank">
Edit on GitHub Edit on GitHub
@@ -31,7 +31,7 @@
</div> </div>
</template> </template>
<div v-else class="demo__error"> <div v-else class="demo__error">
Could not find a demo called {{ this.name }}. Could not find a demo called {{ name }}.
</div> </div>
</div> </div>
</template> </template>
@@ -66,7 +66,7 @@ export default {
hideSourceCode: { hideSourceCode: {
type: Boolean, type: Boolean,
default: false, default: false,
} },
}, },
data() { data() {
@@ -106,7 +106,7 @@ export default {
}, },
mounted() { mounted() {
this.files = collect(require.context(`~/demos/`, true, /.+\..+$/).keys()) this.files = collect(require.context('~/demos/', true, /.+\..+$/).keys())
.filter(path => path.startsWith(`./${this.name}`)) .filter(path => path.startsWith(`./${this.name}`))
.map(path => path.replace('./', '')) .map(path => path.replace('./', ''))
.map(path => { .map(path => {
@@ -120,12 +120,12 @@ export default {
highlight: this.syntax[extension] || extension, highlight: this.syntax[extension] || extension,
} }
}) })
.filter((item) => { .filter(item => {
return ['vue', 'jsx', 'scss'].includes(item.extension) return ['vue', 'jsx', 'scss'].includes(item.extension)
}) })
.sortBy(item => item.path.split('/').length) .sortBy(item => item.path.split('/').length)
.toArray() .toArray()
} },
} }
</script> </script>

View File

@@ -51,7 +51,7 @@ export default {
previousPage() { previousPage() {
return this.items[this.currentIndex - 1] return this.items[this.currentIndex - 1]
}, },
} },
} }
</script> </script>

View File

@@ -34,7 +34,7 @@ export default {
methods: { methods: {
highlightCode() { highlightCode() {
Prism.highlightAllUnder(this.$el) Prism.highlightAllUnder(this.$el)
} },
}, },
mounted() { mounted() {

View File

@@ -10,7 +10,7 @@ export default {
props: { props: {
component: { component: {
required: true, required: true,
} },
}, },
mounted() { mounted() {

View File

@@ -8,18 +8,18 @@ import { outdent } from '@mvasilkov/outdent'
export default { export default {
data() { data() {
return { return {
formattedCode: null formattedCode: null,
} }
}, },
methods: { methods: {
updateCode() { updateCode() {
const text = this.$slots.default[0].text const { text } = this.$slots.default[0]
if (text) { if (text) {
this.formattedCode = outdent(text) this.formattedCode = outdent(text)
} }
} },
}, },
beforeUpdate() { beforeUpdate() {

View File

@@ -1,5 +1,5 @@
<template> <template>
<pre>{{ this.html }}</pre> <pre>{{ html }}</pre>
</template> </template>
<script> <script>
@@ -9,22 +9,21 @@ import Paragraph from '@tiptap/extension-paragraph'
import Text from '@tiptap/extension-text' import Text from '@tiptap/extension-text'
export default { export default {
data() { data() {
return { return {
doc: { doc: {
'type': 'document', type: 'document',
'content': [{ content: [{
'type': 'paragraph', type: 'paragraph',
'attrs': { attrs: {
'align': 'left' align: 'left',
},
content: [{
type: 'text',
text: 'Example Text',
}],
}],
}, },
'content': [{
'type': 'text',
'text': 'Example Text'
}]
}]
}
} }
}, },
@@ -35,8 +34,7 @@ export default {
Paragraph(), Paragraph(),
Text(), Text(),
]) ])
} },
} },
} }
</script> </script>

View File

@@ -46,6 +46,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -49,6 +49,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -48,6 +48,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -44,6 +44,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -59,6 +59,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -37,6 +37,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -52,6 +52,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -54,6 +54,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -46,6 +46,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -47,6 +47,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -46,6 +46,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -41,6 +41,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -68,6 +68,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -48,6 +48,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -37,6 +37,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -47,6 +47,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -37,6 +37,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -45,6 +45,6 @@ export default {
beforeDestroy() { beforeDestroy() {
this.editor.destroy() this.editor.destroy()
} },
} }
</script> </script>

View File

@@ -1,11 +1,15 @@
import React, { useState, useRef, useEffect, createContext, useContext } from 'react' import {
useState, useRef, useEffect, createContext, useContext,
} from 'react'
import { Editor as Tiptap } from '@tiptap/core' import { Editor as Tiptap } from '@tiptap/core'
export const EditorContext = createContext({}) export const EditorContext = createContext({})
export const useEditor = () => useContext(EditorContext) export const useEditor = () => useContext(EditorContext)
export const Editor = ({ value, onChange, children, ...props }) => { export const Editor = ({
value, onChange, children, ...props
}) => {
const [editor, setEditor] = useState(null) const [editor, setEditor] = useState(null)
const editorRef = useRef(null) const editorRef = useRef(null)

View File

@@ -1,6 +1,6 @@
import React, { useState } from 'react' import { useState } from 'react'
import { useEditor, Editor } from './components/Editor'
import extensions from '@tiptap/starter-kit' import extensions from '@tiptap/starter-kit'
import { useEditor, Editor } from './components/Editor'
// Menu bar example component // Menu bar example component
// useEditor only works for child components of <Editor /> // useEditor only works for child components of <Editor />
@@ -24,31 +24,31 @@ const MenuBar = () => {
export default () => { export default () => {
const [value, setValue] = useState({ const [value, setValue] = useState({
'type': 'document', type: 'document',
'content': [ content: [
{ {
'type': 'paragraph', type: 'paragraph',
'content': [ content: [
{ {
'type': 'text', type: 'text',
'text': 'rendered in ' text: 'rendered in ',
}, },
{ {
'type': 'text', type: 'text',
'marks': [ marks: [
{ {
'type': 'bold' type: 'bold',
} },
], ],
'text': 'react' text: 'react',
}, },
{ {
'type': 'text', type: 'text',
'text': '!' text: '!',
} },
] ],
} },
] ],
}) })
return ( return (

View File

@@ -6,7 +6,7 @@
{{ $static.metadata.siteName }} {{ $static.metadata.siteName }}
</g-link> </g-link>
<div> <div>
<input class="search" type="search" placeholder="Search" /> <input class="search" type="search" placeholder="Search">
<a href="https://github.com/sponsors/ueberdosis"> <a href="https://github.com/sponsors/ueberdosis">
Sponsor Sponsor
</a> </a>
@@ -60,7 +60,7 @@
<main class="app__main"> <main class="app__main">
<slot /> <slot />
<p> <p>
<br /> <br>
<a :href="editLink" target="_blank"> <a :href="editLink" target="_blank">
<span>Edit this page on GitHub</span> <span>Edit this page on GitHub</span>
</a> </a>
@@ -107,7 +107,7 @@ export default {
return this.$route.matched[0].path return this.$route.matched[0].path
}, },
editLink() { editLink() {
const currentPath = this.currentPath const { currentPath } = this
const filePath = currentPath === '' ? '/introduction' : currentPath const filePath = currentPath === '' ? '/introduction' : currentPath
return `https://github.com/ueberdosis/tiptap-next/blob/main/docs/src/docPages${filePath}.md` return `https://github.com/ueberdosis/tiptap-next/blob/main/docs/src/docPages${filePath}.md`
@@ -116,13 +116,14 @@ export default {
methods: { methods: {
initSearch() { initSearch() {
// eslint-disable-next-line
docsearch({ docsearch({
apiKey: '1abe7fb0f0dac150d0e963d2eda930fe', apiKey: '1abe7fb0f0dac150d0e963d2eda930fe',
indexName: 'ueberdosis_tiptap', indexName: 'ueberdosis_tiptap',
inputSelector: '.search', inputSelector: '.search',
debug: false, debug: false,
}) })
} },
}, },
mounted() { mounted() {

View File

@@ -1,10 +1,11 @@
import { EditorState, Transaction } from "prosemirror-state" import { EditorState, Transaction } from 'prosemirror-state'
import { ChainedCommands, Editor, CommandSpec } from "./Editor" import { ChainedCommands, Editor, CommandSpec } from './Editor'
import getAllMethodNames from './utils/getAllMethodNames' import getAllMethodNames from './utils/getAllMethodNames'
export default class CommandManager { export default class CommandManager {
editor: Editor editor: Editor
commands: { [key: string]: any } = {} commands: { [key: string]: any } = {}
constructor(editor: Editor) { constructor(editor: Editor) {
@@ -87,7 +88,7 @@ export default class CommandManager {
return proxy return proxy
} }
} },
}) as ChainedCommands }) as ChainedCommands
} }
@@ -108,16 +109,16 @@ export default class CommandManager {
.map(([name, command]) => { .map(([name, command]) => {
return [name, (...args: any[]) => command(...args)(props)] return [name, (...args: any[]) => command(...args)(props)]
})) }))
} },
} }
return props return props
} }
public chainableState(tr: Transaction, state: EditorState): EditorState { public chainableState(tr: Transaction, state: EditorState): EditorState {
let selection = tr.selection let { selection } = tr
let doc = tr.doc let { doc } = tr
let storedMarks = tr.storedMarks let { storedMarks } = tr
return { return {
...state, ...state,
@@ -143,7 +144,7 @@ export default class CommandManager {
return tr return tr
}, },
}; }
} }
} }

View File

@@ -18,7 +18,7 @@ import Node from './Node'
import Mark from './Mark' import Mark from './Mark'
import ComponentRenderer from './ComponentRenderer' import ComponentRenderer from './ComponentRenderer'
import defaultPlugins from './plugins' import defaultPlugins from './plugins'
import * as commands from './commands' import * as coreCommands from './commands'
export type Command = (props: { export type Command = (props: {
editor: Editor, editor: Editor,
@@ -77,14 +77,23 @@ declare module './Editor' {
export class Editor extends EventEmitter { export class Editor extends EventEmitter {
public renderer!: any public renderer!: any
private proxy!: Editor private proxy!: Editor
private commandManager!: CommandManager private commandManager!: CommandManager
private extensionManager!: ExtensionManager private extensionManager!: ExtensionManager
private css!: HTMLStyleElement private css!: HTMLStyleElement
public schema!: Schema public schema!: Schema
public view!: EditorView public view!: EditorView
public selection = { from: 0, to: 0 } public selection = { from: 0, to: 0 }
public isFocused = false public isFocused = false
public options: EditorOptions = { public options: EditorOptions = {
element: document.createElement('div'), element: document.createElement('div'),
content: '', content: '',
@@ -109,7 +118,7 @@ export class Editor extends EventEmitter {
this.createSchema() this.createSchema()
this.extensionManager.resolveConfigs() this.extensionManager.resolveConfigs()
this.createView() this.createView()
this.registerCommands(commands) this.registerCommands(coreCommands)
if (this.options.injectCSS) { if (this.options.injectCSS) {
require('./style.css') require('./style.css')
@@ -190,7 +199,7 @@ export class Editor extends EventEmitter {
* @param plugin A ProseMirror plugin * @param plugin A ProseMirror plugin
* @param handlePlugins Control how to merge the plugin into the existing plugins. * @param handlePlugins Control how to merge the plugin into the existing plugins.
*/ */
public registerPlugin(plugin: Plugin, handlePlugins?: (plugin: Plugin, plugins: Plugin[]) => Plugin[]) { public registerPlugin(plugin: Plugin, handlePlugins?: (newPlugin: Plugin, plugins: Plugin[]) => Plugin[]) {
const plugins = typeof handlePlugins === 'function' const plugins = typeof handlePlugins === 'function'
? handlePlugins(plugin, this.state.plugins) ? handlePlugins(plugin, this.state.plugins)
: [plugin, ...this.state.plugins] : [plugin, ...this.state.plugins]
@@ -333,7 +342,7 @@ export class Editor extends EventEmitter {
if (schemaType === 'node') { if (schemaType === 'node') {
return nodeIsActive(this.state, this.schema.nodes[name], attrs) return nodeIsActive(this.state, this.schema.nodes[name], attrs)
} else if (schemaType === 'mark') { } if (schemaType === 'mark') {
return markIsActive(this.state, this.schema.marks[name]) return markIsActive(this.state, this.schema.marks[name])
} }

View File

@@ -41,8 +41,11 @@ export default class Extension<
Methods extends ExtensionMethods<Props, Options> = ExtensionMethods<Props, Options> Methods extends ExtensionMethods<Props, Options> = ExtensionMethods<Props, Options>
> { > {
type = 'extension' type = 'extension'
config: AnyObject = {} config: AnyObject = {}
configs: Configs = {} configs: Configs = {}
options: Partial<Options> = {} options: Partial<Options> = {}
protected storeConfig(key: string, value: any, stategy: MergeStrategy) { protected storeConfig(key: string, value: any, stategy: MergeStrategy) {
@@ -104,10 +107,8 @@ export default class Extension<
} }
public create() { public create() {
type ParentOptions = Options return <NewOptions = Options>(options?: Partial<NoInfer<NewOptions>>) => {
return cloneDeep(this, true).configure(options as NewOptions)
return <Options = ParentOptions>(options?: Partial<NoInfer<Options>>) => {
return cloneDeep(this, true).configure(options as Options)
} }
} }
} }

View File

@@ -2,10 +2,10 @@ import deepmerge from 'deepmerge'
import collect from 'collect.js' import collect from 'collect.js'
import { Plugin } from 'prosemirror-state' import { Plugin } from 'prosemirror-state'
import { keymap } from 'prosemirror-keymap' import { keymap } from 'prosemirror-keymap'
import { Schema } from 'prosemirror-model' import { Schema, Node as ProsemirrorNode } from 'prosemirror-model'
import { inputRules } from 'prosemirror-inputrules' import { inputRules } from 'prosemirror-inputrules'
import { EditorView, Decoration } from 'prosemirror-view' import { EditorView, Decoration } from 'prosemirror-view'
import { Node as ProsemirrorNode } from 'prosemirror-model'
import { Editor } from './Editor' import { Editor } from './Editor'
import capitalize from './utils/capitalize' import capitalize from './utils/capitalize'
import { Extensions } from './types' import { Extensions } from './types'
@@ -18,6 +18,7 @@ import getSchema from './utils/getSchema'
export default class ExtensionManager { export default class ExtensionManager {
editor: Editor editor: Editor
extensions: Extensions extensions: Extensions
constructor(extensions: Extensions, editor: Editor) { constructor(extensions: Extensions, editor: Editor) {
@@ -28,17 +29,27 @@ export default class ExtensionManager {
resolveConfigs() { resolveConfigs() {
this.extensions.forEach(extension => { this.extensions.forEach(extension => {
const { editor } = this const { editor } = this
const name = extension.config.name const { name } = extension.config
const options = deepmerge(extension.config.defaults, extension.options) const options = deepmerge(extension.config.defaults, extension.options)
const type = extension.type === 'node' const type = extension.type === 'node'
? editor.schema.nodes[name] ? editor.schema.nodes[name]
: editor.schema.marks[name] : editor.schema.marks[name]
resolveExtensionConfig(extension, 'commands', { name, options, editor, type }) resolveExtensionConfig(extension, 'commands', {
resolveExtensionConfig(extension, 'inputRules', { name, options, editor, type }) name, options, editor, type,
resolveExtensionConfig(extension, 'pasteRules', { name, options, editor, type }) })
resolveExtensionConfig(extension, 'keys', { name, options, editor, type }) resolveExtensionConfig(extension, 'inputRules', {
resolveExtensionConfig(extension, 'plugins', { name, options, editor, type }) name, options, editor, type,
})
resolveExtensionConfig(extension, 'pasteRules', {
name, options, editor, type,
})
resolveExtensionConfig(extension, 'keys', {
name, options, editor, type,
})
resolveExtensionConfig(extension, 'plugins', {
name, options, editor, type,
})
if (extension.config.commands) { if (extension.config.commands) {
editor.registerCommands(extension.config.commands) editor.registerCommands(extension.config.commands)

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { deleteSelection as originalDeleteSelection } from 'prosemirror-commands' import { deleteSelection as originalDeleteSelection } from 'prosemirror-commands'
import { Command } from '../Editor'
type DeleteSelectionCommand = () => Command type DeleteSelectionCommand = () => Command

View File

@@ -1,7 +1,8 @@
import { Editor, Command } from '../Editor'
import { TextSelection } from 'prosemirror-state' import { TextSelection } from 'prosemirror-state'
import { Editor, Command } from '../Editor'
import minMax from '../utils/minMax' import minMax from '../utils/minMax'
type Position = 'start' | 'end' | number | boolean | null
type FocusCommand = (position?: Position) => Command type FocusCommand = (position?: Position) => Command
declare module '../Editor' { declare module '../Editor' {
@@ -15,8 +16,6 @@ interface ResolvedSelection {
to: number, to: number,
} }
type Position = 'start' | 'end' | number | boolean | null
function resolveSelection(editor: Editor, position: Position = null): ResolvedSelection { function resolveSelection(editor: Editor, position: Position = null): ResolvedSelection {
if (position === null) { if (position === null) {
return editor.selection return editor.selection

View File

@@ -1,8 +1,8 @@
import { DOMParser } from 'prosemirror-model' import { DOMParser } from 'prosemirror-model'
import { Selection, Transaction } from 'prosemirror-state' import { Selection, Transaction } from 'prosemirror-state'
import { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform'
import { Command } from '../Editor' import { Command } from '../Editor'
import elementFromString from '../utils/elementFromString' import elementFromString from '../utils/elementFromString'
import {ReplaceStep, ReplaceAroundStep} from "prosemirror-transform"
type InsertHTMLCommand = (value: string) => Command type InsertHTMLCommand = (value: string) => Command
@@ -15,13 +15,13 @@ declare module '../Editor' {
// TODO: move to utils // TODO: move to utils
// https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466 // https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466
function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) { function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {
let last = tr.steps.length - 1 const last = tr.steps.length - 1
if (last < startLen) return if (last < startLen) return
let step = tr.steps[last] const step = tr.steps[last]
if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) return if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) return
let map = tr.mapping.maps[last] const map = tr.mapping.maps[last]
let end = 0 let end = 0
map.forEach((_from, _to, _newFrom, newTo) => { if (end == 0) end = newTo }) map.forEach((_from, _to, _newFrom, newTo) => { if (end === 0) end = newTo })
tr.setSelection(Selection.near(tr.doc.resolve(end as unknown as number), bias)) tr.setSelection(Selection.near(tr.doc.resolve(end as unknown as number), bias))
} }

View File

@@ -1,6 +1,6 @@
import { Command } from '../Editor'
import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list' import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list'
import { NodeType } from 'prosemirror-model' import { NodeType } from 'prosemirror-model'
import { Command } from '../Editor'
import getNodeType from '../utils/getNodeType' import getNodeType from '../utils/getNodeType'
type LiftListItem = (typeOrName: string | NodeType) => Command type LiftListItem = (typeOrName: string | NodeType) => Command
@@ -11,7 +11,7 @@ declare module '../Editor' {
} }
} }
export const liftListItem: LiftListItem = (typeOrName) => ({ state, dispatch }) => { export const liftListItem: LiftListItem = typeOrName => ({ state, dispatch }) => {
const type = getNodeType(typeOrName, state.schema) const type = getNodeType(typeOrName, state.schema)
return originalLiftListItem(type)(state, dispatch) return originalLiftListItem(type)(state, dispatch)

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { MarkType } from 'prosemirror-model' import { MarkType } from 'prosemirror-model'
import { Command } from '../Editor'
import getMarkType from '../utils/getMarkType' import getMarkType from '../utils/getMarkType'
import getMarkRange from '../utils/getMarkRange' import getMarkRange from '../utils/getMarkRange'
@@ -11,10 +11,12 @@ declare module '../Editor' {
} }
} }
export const removeMark: RemoveMarkCommand = (typeOrName) => ({ tr, state }) => { export const removeMark: RemoveMarkCommand = typeOrName => ({ tr, state }) => {
const { selection } = tr const { selection } = tr
const type = getMarkType(typeOrName, state.schema) const type = getMarkType(typeOrName, state.schema)
let { from, to, $from, empty } = selection let {
from, to, $from, empty,
} = selection
if (empty) { if (empty) {
const range = getMarkRange($from, type) const range = getMarkRange($from, type)

View File

@@ -8,7 +8,7 @@ declare module '../Editor' {
} }
} }
export const removeMarks: RemoveMarksCommand = () => ({ tr, state, view }) => { export const removeMarks: RemoveMarksCommand = () => ({ tr, state }) => {
const { selection } = tr const { selection } = tr
const { from, to, empty } = selection const { from, to, empty } = selection
@@ -18,7 +18,7 @@ export const removeMarks: RemoveMarksCommand = () => ({ tr, state, view }) => {
Object Object
.entries(state.schema.marks) .entries(state.schema.marks)
.forEach(([name, mark]) => { .forEach(([, mark]) => {
tr.removeMark(from, to, mark as any) tr.removeMark(from, to, mark as any)
}) })

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { NodeType } from 'prosemirror-model' import { NodeType } from 'prosemirror-model'
import { Command } from '../Editor'
import getNodeType from '../utils/getNodeType' import getNodeType from '../utils/getNodeType'
interface Range { interface Range {

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { selectAll as originalSelectAll } from 'prosemirror-commands' import { selectAll as originalSelectAll } from 'prosemirror-commands'
import { Command } from '../Editor'
type SelectAllCommand = () => Command type SelectAllCommand = () => Command

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands' import { selectParentNode as originalSelectParentNode } from 'prosemirror-commands'
import { Command } from '../Editor'
type SelectParentNodeCommand = () => Command type SelectParentNodeCommand = () => Command

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { TextSelection } from 'prosemirror-state' import { TextSelection } from 'prosemirror-state'
import { Command } from '../Editor'
type SetContentCommand = ( type SetContentCommand = (
content: string, content: string,

View File

@@ -1,6 +1,6 @@
import { Command } from '../Editor'
import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list' import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list'
import { NodeType } from 'prosemirror-model' import { NodeType } from 'prosemirror-model'
import { Command } from '../Editor'
import getNodeType from '../utils/getNodeType' import getNodeType from '../utils/getNodeType'
type SinkListItem = (typeOrName: string | NodeType) => Command type SinkListItem = (typeOrName: string | NodeType) => Command
@@ -11,7 +11,7 @@ declare module '../Editor' {
} }
} }
export const sinkListItem: SinkListItem = (typeOrName) => ({ state, dispatch }) => { export const sinkListItem: SinkListItem = typeOrName => ({ state, dispatch }) => {
const type = getNodeType(typeOrName, state.schema) const type = getNodeType(typeOrName, state.schema)
return originalSinkListItem(type)(state, dispatch) return originalSinkListItem(type)(state, dispatch)

View File

@@ -1,6 +1,6 @@
import { Command } from '../Editor'
import { splitListItem as originalSplitListItem } from 'prosemirror-schema-list' import { splitListItem as originalSplitListItem } from 'prosemirror-schema-list'
import { NodeType } from 'prosemirror-model' import { NodeType } from 'prosemirror-model'
import { Command } from '../Editor'
import getNodeType from '../utils/getNodeType' import getNodeType from '../utils/getNodeType'
type SplitListItem = (typeOrName: string | NodeType) => Command type SplitListItem = (typeOrName: string | NodeType) => Command
@@ -11,7 +11,7 @@ declare module '../Editor' {
} }
} }
export const splitListItem: SplitListItem = (typeOrName) => ({ state, dispatch }) => { export const splitListItem: SplitListItem = typeOrName => ({ state, dispatch }) => {
const type = getNodeType(typeOrName, state.schema) const type = getNodeType(typeOrName, state.schema)
return originalSplitListItem(type)(state, dispatch) return originalSplitListItem(type)(state, dispatch)

View File

@@ -1,7 +1,7 @@
import { Command } from '../Editor'
import { wrapInList, liftListItem } from 'prosemirror-schema-list' import { wrapInList, liftListItem } from 'prosemirror-schema-list'
import { findParentNode } from 'prosemirror-utils' import { findParentNode } from 'prosemirror-utils'
import { Node, NodeType, Schema } from 'prosemirror-model' import { Node, NodeType, Schema } from 'prosemirror-model'
import { Command } from '../Editor'
import getNodeType from '../utils/getNodeType' import getNodeType from '../utils/getNodeType'
type ToggleListCommand = ( type ToggleListCommand = (

View File

@@ -1,6 +1,6 @@
import { Command } from '../Editor'
import { toggleMark as originalToggleMark } from 'prosemirror-commands' import { toggleMark as originalToggleMark } from 'prosemirror-commands'
import { MarkType } from 'prosemirror-model' import { MarkType } from 'prosemirror-model'
import { Command } from '../Editor'
import getMarkType from '../utils/getMarkType' import getMarkType from '../utils/getMarkType'
type ToggleMarkCommand = (typeOrName: string | MarkType) => Command type ToggleMarkCommand = (typeOrName: string | MarkType) => Command
@@ -11,7 +11,7 @@ declare module '../Editor' {
} }
} }
export const toggleMark: ToggleMarkCommand = (typeOrName) => ({ state, dispatch }) => { export const toggleMark: ToggleMarkCommand = typeOrName => ({ state, dispatch }) => {
const type = getMarkType(typeOrName, state.schema) const type = getMarkType(typeOrName, state.schema)
return originalToggleMark(type)(state, dispatch) return originalToggleMark(type)(state, dispatch)

View File

@@ -23,7 +23,7 @@ export const toggleNode: ToggleNodeCommand = (typeOrName, toggleTypeOrName, attr
if (isActive) { if (isActive) {
return setBlockType(toggleType)(state, dispatch) return setBlockType(toggleType)(state, dispatch)
} else { }
return setBlockType(type, attrs)(state, dispatch) return setBlockType(type, attrs)(state, dispatch)
}
} }

View File

@@ -1,5 +1,5 @@
import { Command } from '../Editor'
import { MarkType } from 'prosemirror-model' import { MarkType } from 'prosemirror-model'
import { Command } from '../Editor'
import getMarkType from '../utils/getMarkType' import getMarkType from '../utils/getMarkType'
import getMarkRange from '../utils/getMarkRange' import getMarkRange from '../utils/getMarkRange'
@@ -16,7 +16,8 @@ declare module '../Editor' {
export const updateMark: UpdateMarkCommand = (typeOrName, attrs = {}) => ({ tr, state }) => { export const updateMark: UpdateMarkCommand = (typeOrName, attrs = {}) => ({ tr, state }) => {
const { selection, doc } = tr const { selection, doc } = tr
let { from, to, $from, empty } = selection let { from, to } = selection
const { $from, empty } = selection
const type = getMarkType(typeOrName, state.schema) const type = getMarkType(typeOrName, state.schema)
if (empty) { if (empty) {

View File

@@ -2,9 +2,9 @@ import { keymap } from 'prosemirror-keymap'
import { baseKeymap } from 'prosemirror-commands' import { baseKeymap } from 'prosemirror-commands'
import { dropCursor } from 'prosemirror-dropcursor' import { dropCursor } from 'prosemirror-dropcursor'
import { gapCursor } from 'prosemirror-gapcursor' import { gapCursor } from 'prosemirror-gapcursor'
import { undoInputRule } from 'prosemirror-inputrules'
import editable from './editable' import editable from './editable'
import focus from './focus' import focus from './focus'
import { undoInputRule } from 'prosemirror-inputrules'
export default [ export default [
() => dropCursor(), () => dropCursor(),

View File

@@ -1,6 +1,6 @@
export default function elementFromString(value: string): HTMLElement { export default function elementFromString(value: string): HTMLElement {
const htmlString = `<div>${value}</div>` const htmlString = `<div>${value}</div>`
const parser = new window.DOMParser const parser = new window.DOMParser()
const element = parser.parseFromString(htmlString, 'text/html').body const element = parser.parseFromString(htmlString, 'text/html').body
return element return element

View File

@@ -1,6 +1,6 @@
import { Node } from 'prosemirror-model'
import getSchema from './getSchema' import getSchema from './getSchema'
import getHtmlFromFragment from './getHtmlFromFragment' import getHtmlFromFragment from './getHtmlFromFragment'
import { Node } from 'prosemirror-model'
import { Extensions } from '../types' import { Extensions } from '../types'
export default function generateHtml(doc: object, extensions: Extensions): string { export default function generateHtml(doc: object, extensions: Extensions): string {

View File

@@ -1,9 +1,9 @@
export default function getAllMethodNames(obj: Object) { export default function getAllMethodNames(obj: Object) {
let methods = new Set() const methods = new Set()
while (obj = Reflect.getPrototypeOf(obj)) { while (obj = Reflect.getPrototypeOf(obj)) {
let keys = Reflect.ownKeys(obj) const keys = Reflect.ownKeys(obj)
keys.forEach((k) => methods.add(k)) keys.forEach(k => methods.add(k))
} }
return Array.from(methods) return Array.from(methods)

View File

@@ -1,5 +1,4 @@
import { Node, DOMSerializer } from 'prosemirror-model' import { Node, DOMSerializer, Schema } from 'prosemirror-model'
import { Schema } from 'prosemirror-model'
export default function getHtmlFromFragment(doc: Node, schema: Schema): string { export default function getHtmlFromFragment(doc: Node, schema: Schema): string {
const fragment = DOMSerializer const fragment = DOMSerializer

View File

@@ -1,5 +1,5 @@
import Mark from '../Mark'
import collect from 'collect.js' import collect from 'collect.js'
import Mark from '../Mark'
import { Extensions } from '../types' import { Extensions } from '../types'
export default function getMarksFromExtensions(extensions: Extensions): any { export default function getMarksFromExtensions(extensions: Extensions): any {

View File

@@ -1,5 +1,5 @@
import Node from '../Node'
import collect from 'collect.js' import collect from 'collect.js'
import Node from '../Node'
import { Extensions } from '../types' import { Extensions } from '../types'
export default function getNodesFromExtensions(extensions: Extensions): any { export default function getNodesFromExtensions(extensions: Extensions): any {

View File

@@ -12,7 +12,7 @@ export default function getSchema(extensions: Extensions): Schema {
resolveExtensionConfig(extension, 'defaults') resolveExtensionConfig(extension, 'defaults')
resolveExtensionConfig(extension, 'topNode') resolveExtensionConfig(extension, 'topNode')
const name = extension.config.name const { name } = extension.config
const options = deepmerge(extension.config.defaults, extension.options) const options = deepmerge(extension.config.defaults, extension.options)
resolveExtensionConfig(extension, 'schema', { name, options }) resolveExtensionConfig(extension, 'schema', { name, options })

View File

@@ -1,10 +1,10 @@
export default function magicMethods(clazz: any) { export default function magicMethods(Clazz: any) {
const classHandler = Object.create(null) const classHandler = Object.create(null)
classHandler.construct = (target: any, args: any) => { classHandler.construct = (_, args: any) => {
const instance = new clazz(...args) const instance = new Clazz(...args)
const instanceHandler = Object.create(null) const instanceHandler = Object.create(null)
const get = Object.getOwnPropertyDescriptor(clazz.prototype, '__get') const get = Object.getOwnPropertyDescriptor(Clazz.prototype, '__get')
if (get) { if (get) {
instanceHandler.get = (target: any, name: any) => { instanceHandler.get = (target: any, name: any) => {
@@ -18,9 +18,9 @@ export default function magicMethods(clazz: any) {
if (exists) { if (exists) {
return target[name] return target[name]
} else {
return get.value.call(target, name)
} }
return get.value.call(target, name)
} }
} }
@@ -30,5 +30,5 @@ export default function magicMethods(clazz: any) {
return instance.proxy return instance.proxy
} }
return new Proxy(clazz, classHandler) return new Proxy(Clazz, classHandler)
} }

View File

@@ -35,5 +35,3 @@ export default new Node()
textblockTypeInputRule(inputRegex, type), textblockTypeInputRule(inputRegex, type),
]) ])
.create() .create()

View File

@@ -1,4 +1,6 @@
import { Command, Mark, markInputRule, markPasteRule } from '@tiptap/core' import {
Command, Mark, markInputRule, markPasteRule,
} from '@tiptap/core'
export type BoldCommand = () => Command export type BoldCommand = () => Command
@@ -37,7 +39,7 @@ export default new Mark()
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Mod-b': () => editor.bold() 'Mod-b': () => editor.bold(),
})) }))
.inputRules(({ type }) => [ .inputRules(({ type }) => [
markInputRule(starInputRegex, type), markInputRule(starInputRegex, type),

View File

@@ -29,7 +29,7 @@ export default new Node()
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Shift-Ctrl-\\': () => editor.codeBlock() 'Shift-Ctrl-\\': () => editor.codeBlock(),
})) }))
.inputRules(({ type }) => [ .inputRules(({ type }) => [
textblockTypeInputRule(/^```$/, type), textblockTypeInputRule(/^```$/, type),

View File

@@ -1,4 +1,6 @@
import { Command, Mark, markInputRule, markPasteRule } from '@tiptap/core' import {
Command, Mark, markInputRule, markPasteRule,
} from '@tiptap/core'
export type CodeCommand = () => Command export type CodeCommand = () => Command
@@ -26,12 +28,12 @@ export default new Mark()
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Mod-`': () => editor.code() 'Mod-`': () => editor.code(),
})) }))
.inputRules(({ type }) => [ .inputRules(({ type }) => [
markInputRule(inputRegex, type) markInputRule(inputRegex, type),
]) ])
.pasteRules(({ type }) => [ .pasteRules(({ type }) => [
markPasteRule(inputRegex, type) markPasteRule(inputRegex, type),
]) ])
.create() .create()

View File

@@ -22,7 +22,7 @@ export default new Extension<FocusOptions>()
const decorations: Decoration[] = [] const decorations: Decoration[] = []
if (!isEditable || !isFocused) { if (!isEditable || !isFocused) {
return return DecorationSet.create(doc, [])
} }
doc.descendants((node, pos) => { doc.descendants((node, pos) => {

View File

@@ -20,8 +20,10 @@ export default new Node()
], ],
toDOM: () => ['br'], toDOM: () => ['br'],
})) }))
.commands(({ editor, type }) => ({ .commands(({ type }) => ({
hardBreak: () => ({ tr, state, dispatch, view }) => { hardBreak: () => ({
tr, state, dispatch, view,
}) => {
return chainCommands(exitCode, () => { return chainCommands(exitCode, () => {
dispatch(tr.replaceSelectionWith(type.create()).scrollIntoView()) dispatch(tr.replaceSelectionWith(type.create()).scrollIntoView())
return true return true

View File

@@ -3,8 +3,6 @@ import {
history, history,
undo, undo,
redo, redo,
undoDepth,
redoDepth,
} from 'prosemirror-history' } from 'prosemirror-history'
declare module '@tiptap/core/src/Editor' { declare module '@tiptap/core/src/Editor' {
@@ -37,6 +35,6 @@ export default new Extension<HistoryOptions>()
'Shift-Mod-z': () => editor.redo(), 'Shift-Mod-z': () => editor.redo(),
})) }))
.plugins(({ options }) => [ .plugins(({ options }) => [
history(options.historyPluginOptions) history(options.historyPluginOptions),
]) ])
.create() .create()

View File

@@ -1,4 +1,6 @@
import { Command, Mark, markInputRule, markPasteRule } from '@tiptap/core' import {
Command, Mark, markInputRule, markPasteRule,
} from '@tiptap/core'
export type ItalicCommand = () => Command export type ItalicCommand = () => Command
@@ -29,7 +31,7 @@ export default new Mark()
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Mod-i': () => editor.italic() 'Mod-i': () => editor.italic(),
})) }))
.inputRules(({ type }) => [ .inputRules(({ type }) => [
markInputRule(starInputRegex, type), markInputRule(starInputRegex, type),

View File

@@ -23,7 +23,7 @@ export default new Node()
tag: 'ol', tag: 'ol',
getAttrs: node => ({ getAttrs: node => ({
order: (node as HTMLElement).hasAttribute('start') order: (node as HTMLElement).hasAttribute('start')
? parseInt((node as HTMLElement).getAttribute('start') || '') ? parseInt((node as HTMLElement).getAttribute('start') || '', 10)
: 1, : 1,
}), }),
}], }],

View File

@@ -1,4 +1,6 @@
import { Command, Mark, markInputRule, markPasteRule } from '@tiptap/core' import {
Command, Mark, markInputRule, markPasteRule,
} from '@tiptap/core'
type StrikeCommand = () => Command type StrikeCommand = () => Command
@@ -26,7 +28,7 @@ export default new Mark()
}, },
{ {
style: 'text-decoration', style: 'text-decoration',
getAttrs: node => node === 'line-through' ? {} : false, getAttrs: node => (node === 'line-through' ? {} : false),
}, },
], ],
toDOM: () => ['s', 0], toDOM: () => ['s', 0],
@@ -37,12 +39,12 @@ export default new Mark()
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Mod-d': () => editor.strike() 'Mod-d': () => editor.strike(),
})) }))
.inputRules(({ type }) => [ .inputRules(({ type }) => [
markInputRule(inputRegex, type) markInputRule(inputRegex, type),
]) ])
.pasteRules(({ type }) => [ .pasteRules(({ type }) => [
markPasteRule(inputRegex, type) markPasteRule(inputRegex, type),
]) ])
.create() .create()

View File

@@ -17,17 +17,17 @@ export default new Mark()
}, },
{ {
style: 'text-decoration', style: 'text-decoration',
getAttrs: node => node === 'underline' ? {} : false, getAttrs: node => (node === 'underline' ? {} : false),
}, },
], ],
toDOM: () => ['u', 0], toDOM: () => ['u', 0],
})) }))
.commands(({ editor, name }) => ({ .commands(({ name }) => ({
underline: () => ({ commands }) => { underline: () => ({ commands }) => {
return commands.toggleMark(name) return commands.toggleMark(name)
}, },
})) }))
.keys(({ editor }) => ({ .keys(({ editor }) => ({
'Mod-u': () => editor.underline() 'Mod-u': () => editor.underline(),
})) }))
.create() .create()

View File

@@ -1,5 +1,5 @@
import { Node, DOMSerializer } from 'prosemirror-model' import { Node, DOMSerializer, Schema } from 'prosemirror-model'
import { Schema } from 'prosemirror-model'
import { JSDOM } from 'jsdom' import { JSDOM } from 'jsdom'
export default function getHtmlFromFragment(doc: Node, schema: Schema): string { export default function getHtmlFromFragment(doc: Node, schema: Schema): string {
@@ -7,7 +7,7 @@ export default function getHtmlFromFragment(doc: Node, schema: Schema): string {
.fromSchema(schema) .fromSchema(schema)
.serializeFragment(doc.content) .serializeFragment(doc.content)
const temporaryDocument = new JSDOM(`<!DOCTYPE html>`).window.document const temporaryDocument = new JSDOM('<!DOCTYPE html>').window.document
const container = temporaryDocument.createElement('div') const container = temporaryDocument.createElement('div')
container.appendChild(fragment) container.appendChild(fragment)

View File

@@ -1,6 +1,7 @@
export * from '@tiptap/vue'
import originalDefaultExtensions from '@tiptap/starter-kit' import originalDefaultExtensions from '@tiptap/starter-kit'
export * from '@tiptap/vue'
export function defaultExtensions() { export function defaultExtensions() {
return originalDefaultExtensions() return originalDefaultExtensions()
} }

View File

@@ -30,4 +30,3 @@ export default class Renderer extends ComponentRenderer {
} }
} }