diff --git a/gridsome.server.js b/gridsome.server.js index 51aab277..2d32bc49 100644 --- a/gridsome.server.js +++ b/gridsome.server.js @@ -5,6 +5,13 @@ module.exports = function (api) { api.chainWebpack(config => { config.resolve.extensions .add('.ts') + + config.module + .rule('typescript') + .test(/\.tsx?$/) + .use() + .loader('ts-loader') + .options({ appendTsSuffixTo: [/\.vue$/] }); globby.sync('./packages/*', { onlyDirectories: true }) .map(name => name.replace('./packages/tiptap-', '')) diff --git a/package.json b/package.json index 78210494..c3db4089 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,14 @@ "@gridsome/transformer-json": "^0.2.1", "@gridsome/vue-remark": "^0.1.9", "@noxify/gridsome-plugin-remark-embed": "^1.1.5", + "@types/prosemirror-commands": "^1.0.1", + "@types/prosemirror-history": "^1.0.1", + "@types/prosemirror-inputrules": "^1.0.2", + "@types/prosemirror-keymap": "^1.0.1", + "@types/prosemirror-model": "^1.7.2", + "@types/prosemirror-state": "^1.2.3", + "@types/prosemirror-transform": "^1.1.1", + "@types/prosemirror-view": "^1.11.2", "globby": "^10.0.1", "gridsome": "^0.7.0", "lerna": "^3.19.0", @@ -23,5 +31,8 @@ "parcel": "^1.12.4", "raw-loader": "^4.0.0", "typescript": "^3.7.2" + }, + "devDependencies": { + "ts-loader": "^6.2.1" } } diff --git a/packages/tiptap-core/index.ts b/packages/tiptap-core/index.ts index 90274b57..b1b8bdb7 100644 --- a/packages/tiptap-core/index.ts +++ b/packages/tiptap-core/index.ts @@ -1,3 +1,3 @@ -export default function() { - return 1 -} \ No newline at end of file +import { Editor } from './src/Editor' + +export default Editor \ No newline at end of file diff --git a/packages/tiptap-core/package.json b/packages/tiptap-core/package.json index 9d1e8377..ef306f26 100644 --- a/packages/tiptap-core/package.json +++ b/packages/tiptap-core/package.json @@ -4,11 +4,19 @@ "source": "index.ts", "main": "dist/tiptap-core.js", "umd:main": "dist/tiptap-core.umd.js", - "module": "dist/tiptap-core.mjs", + "module": "dist/tiptap-core.mjs", "unpkg": "dist/tiptap-core.js", "jsdelivr": "dist/tiptap-core.js", "files": [ "src", "dist" - ] + ], + "dependencies": { + "prosemirror-example-setup": "^1.1.2", + "prosemirror-model": "^1.8.2", + "prosemirror-schema-basic": "^1.1.2", + "prosemirror-schema-list": "^1.1.2", + "prosemirror-state": "^1.3.2", + "prosemirror-view": "^1.13.4" + } } diff --git a/packages/tiptap-core/src/Editor.ts b/packages/tiptap-core/src/Editor.ts new file mode 100644 index 00000000..230271f8 --- /dev/null +++ b/packages/tiptap-core/src/Editor.ts @@ -0,0 +1,132 @@ +import {EditorState, Plugin} from "prosemirror-state" +import {EditorView} from "prosemirror-view" +import {Schema, DOMParser} from "prosemirror-model" +// @ts-ignore +import {schema} from "prosemirror-schema-basic" +// @ts-ignore +import {addListNodes} from "prosemirror-schema-list" +// @ts-ignore +import {exampleSetup} from "prosemirror-example-setup" + +import insertText from './commands/insertText' +import focus from './commands/focus' + +interface EditorOptions { + element: Node + content: string +} + +export class Editor { + + private lastCommand = Promise.resolve() + + private schema: Schema = new Schema({ + nodes: addListNodes(schema.spec.nodes, "paragraph block*", "block"), + marks: schema.spec.marks + }) + + selection = { from: 0, to: 0 } + + view: EditorView + + options: EditorOptions + + constructor(options: EditorOptions) { + this.options = options + this.view = this.createView() + this.registerCommand('focus', focus) + this.registerCommand('insertText', insertText) + } + + get state() { + return this.view.state + } + + private createState() { + return EditorState.create({ + doc: this.createDocument(this.options.content), + plugins: [ + ...exampleSetup({schema: this.schema}), + ], + }) + } + + private createView() { + return new EditorView(this.options.element, { + state: this.createState(), + dispatchTransaction: this.dispatchTransaction.bind(this), + }) + } + + private chainCommand = (method: Function) => (...args: any) => { + this.lastCommand = this.lastCommand + .then(() => method.apply(this, args)) + .catch(console.error) + + return this + } + + registerCommand(name: string, method: Function): Editor { + // @ts-ignore + this[name] = this.chainCommand((...args: any) => { + return new Promise(resolve => { + return method(resolve as Function, this as Editor, ...args as any) + }) + }) + + return this + } + + command(name: string, ...args: any) { + // @ts-ignore + return this[name](...args) + } + + private createDocument(content: any): any { + // if (content === null) { + // return this.schema.nodeFromJSON(this.options.emptyDocument) + // } + + // if (typeof content === 'object') { + // try { + // return this.schema.nodeFromJSON(content) + // } catch (error) { + // console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error) + // return this.schema.nodeFromJSON(this.options.emptyDocument) + // } + // } + + if (typeof content === 'string') { + const element = document.createElement('div') + element.innerHTML = content.trim() + + return DOMParser.fromSchema(this.schema).parse(element) + } + + return false + } + + private dispatchTransaction(transaction: any): void { + const newState = this.state.apply(transaction) + this.view.updateState(newState) + this.selection = { + from: this.state.selection.from, + to: this.state.selection.to, + } + // this.setActiveNodesAndMarks() + + // this.emit('transaction', { + // getHTML: this.getHTML.bind(this), + // getJSON: this.getJSON.bind(this), + // state: this.state, + // transaction, + // }) + + if (!transaction.docChanged || transaction.getMeta('preventUpdate')) { + return + } + + // this.emitUpdate(transaction) + } + +} diff --git a/packages/tiptap-core/src/commands/focus.ts b/packages/tiptap-core/src/commands/focus.ts new file mode 100644 index 00000000..28931482 --- /dev/null +++ b/packages/tiptap-core/src/commands/focus.ts @@ -0,0 +1,65 @@ +import { Editor } from '../Editor' +import { TextSelection } from 'prosemirror-state' +import sleep from '../utils/sleep' +import minMax from '../utils/minMax' + +declare module '../Editor' { + interface Editor { + focus(position: any): Editor + } +} + +interface ResolvedSelection { + from: number, + to: number, +} + +type Position = 'start' | 'end' | number | null + +function resolveSelection(editor: Editor, position: Position = null): ResolvedSelection { + if (position === null) { + return editor.selection + } + + if (position === 'start') { + return { + from: 0, + to: 0, + } + } + + if (position === 'end') { + const { size } = editor.state.doc.content + + return { + from: size, + to: size, + } + } + + return { + from: position as number, + to: position as number, + } +} + +export default async function focus(next: Function, editor: Editor, position: Position = null): Promise { + const { view, state } = editor + + if ((view.hasFocus && position === null)) { + next() + return + } + + const { from, to } = resolveSelection(editor, position) + const { doc, tr } = state + const resolvedFrom = minMax(from, 0, doc.content.size) + const resolvedEnd = minMax(to, 0, doc.content.size) + const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd) + const transaction = tr.setSelection(selection) + + view.dispatch(transaction) + await sleep(10) + view.focus() + next() +} \ No newline at end of file diff --git a/packages/tiptap-core/src/commands/insertText.ts b/packages/tiptap-core/src/commands/insertText.ts new file mode 100644 index 00000000..3de4f713 --- /dev/null +++ b/packages/tiptap-core/src/commands/insertText.ts @@ -0,0 +1,12 @@ +import { Editor } from '../Editor' + +declare module "../Editor" { + interface Editor { + insertText(text: string): Editor, + } +} + +export default function insertText(next: Function, { state, view }: Editor, text: string): void { + view.dispatch(state.tr.insertText(text)) + next() +} diff --git a/packages/tiptap-core/src/utils/minMax.ts b/packages/tiptap-core/src/utils/minMax.ts new file mode 100644 index 00000000..4887b859 --- /dev/null +++ b/packages/tiptap-core/src/utils/minMax.ts @@ -0,0 +1,3 @@ +export default function minMax(value:number = 0, min:number = 0, max:number = 0): number { + return Math.min(Math.max(value, min), max) +} \ No newline at end of file diff --git a/packages/tiptap-core/src/utils/sleep.ts b/packages/tiptap-core/src/utils/sleep.ts new file mode 100644 index 00000000..e9a79bbc --- /dev/null +++ b/packages/tiptap-core/src/utils/sleep.ts @@ -0,0 +1,3 @@ +export default function sleep(milliseconds: number): Promise { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} \ No newline at end of file diff --git a/src/templates/Post.vue b/src/templates/Post.vue index efa15c1d..098aee20 100644 --- a/src/templates/Post.vue +++ b/src/templates/Post.vue @@ -14,11 +14,22 @@ query Post ($id: ID!) { \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..45d7d7c7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "baseUrl": ".", + "types": [ + ], + "paths": { + "@/*": [ + "packages/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "packages/**/*.ts", + "packages/**/*.tsx", + "packages/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index 15f9a27e..d7d77851 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1904,11 +1904,81 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== +"@types/orderedmap@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/orderedmap/-/orderedmap-1.0.0.tgz#807455a192bba52cbbb4517044bc82bdbfa8c596" + integrity sha512-dxKo80TqYx3YtBipHwA/SdFmMMyLCnP+5mkEqN0eMjcTBzHkiiX0ES118DsjDBjvD+zeSsSU9jULTZ+frog+Gw== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== +"@types/prosemirror-commands@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-commands/-/prosemirror-commands-1.0.1.tgz#e23f75629d90eef8c25132257b1ea1c5f978db9e" + integrity sha512-GeE12m8VT9N1JrzoY//946IX8ZyQOLNmvryJ+BNQs/HvhmXW9EWOcWUE6OBRtxK7Y8SrzSOwx4XmqSgVmK3tGQ== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-history@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-history/-/prosemirror-history-1.0.1.tgz#b8d7595f73788b63fc9f2b57a763ba8375abfe87" + integrity sha512-BYyPJlWDo3VEnWS5X2DCHXrrAKEjdbCe1DUjGL6R/8hmwMFe3iMJGYdBkOXU1FfkTpw7Z+PlwY/pMyeelVydmg== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-inputrules@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-inputrules/-/prosemirror-inputrules-1.0.2.tgz#60b946ca2782f0f453b65105e2ebfd1730324caa" + integrity sha512-bKFneQUPnkZmzCJ1uoitpKH6PFW0hc4q55NsC7mFUCvX0eZl0GRKxyfV47jkJbsbyUQoO/QFv0WwLDz2bo15sA== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + +"@types/prosemirror-keymap@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-keymap/-/prosemirror-keymap-1.0.1.tgz#5051bcf819ff017db3d82d032c8ac1ffc270b895" + integrity sha512-8IjM8ySmoZps9Tn+aKfB4ZR6zoNOjeQfAc9YLQujYXHJB6tdGWV0cbTuoT4QmZOR1iecN1EJ6E9RiRUBk796kQ== + dependencies: + "@types/prosemirror-state" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-model@*", "@types/prosemirror-model@^1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.7.2.tgz#9c7aff2fd62f0f56eb76e2e0eb27bf6996e6c28a" + integrity sha512-2l+yXvidg3AUHN07mO4Jd8Q84fo6ksFsy7LHUurLYrZ74uTahBp2fzcO49AKZMzww2EulXJ40Kl/OFaQ/7A1fw== + dependencies: + "@types/orderedmap" "*" + +"@types/prosemirror-state@*", "@types/prosemirror-state@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/prosemirror-state/-/prosemirror-state-1.2.3.tgz#7f5f871acf7b8c22e1862ff0068f9bf7e9682c0e" + integrity sha512-6m433Hubix9bx+JgcLW7zzyiZuzwjq5mBdSMYY4Yi5c5ZpV2RiVmg7Cy6f9Thtts8vuztilw+PczJAgDm1Frfw== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-transform" "*" + "@types/prosemirror-view" "*" + +"@types/prosemirror-transform@*", "@types/prosemirror-transform@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/prosemirror-transform/-/prosemirror-transform-1.1.1.tgz#5a0de16e8e0123b4c3d9559235e19f39cee85e5c" + integrity sha512-yYCYSoiRH+Wcbl8GJc0PFCzeyMzNQ1vL2xrHHSXZuNcIlH75VoiKrZFeZ6BS9cl8mYXjZrlmdBe8YOxYvyKM6A== + dependencies: + "@types/prosemirror-model" "*" + +"@types/prosemirror-view@*", "@types/prosemirror-view@^1.11.2": + version "1.11.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.11.2.tgz#58af5dcb7de20b7de874de99147552d5627209a1" + integrity sha512-EKcQmR4KdkFZU13wS5pWrkSojRCPGqz/l/uzpZFfW5cgdr7fQsftf2/ttvIjpk1a94ISifEY4UZwflVJ+uL4Rg== + dependencies: + "@types/prosemirror-model" "*" + "@types/prosemirror-state" "*" + "@types/prosemirror-transform" "*" + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" @@ -3332,7 +3402,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3959,6 +4029,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +crel@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/crel/-/crel-3.1.0.tgz#c0d5ed3df6b8017ff5ecc9f0743c60572e268c64" + integrity sha512-VIGY44ERxx8lXVkOEfcB0A49OkjxkQNK+j+fHvoLy7GsGX1KKgAaQ+p9N0YgvQXu+X+ryUWGDeLx/fSI+w7+eg== + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -4832,7 +4907,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== @@ -8249,7 +8324,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -9008,6 +9083,11 @@ ora@^2.1.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" +orderedmap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.0.tgz#dc41a147130b51e203e8523ea5ea57724af2b63d" + integrity sha512-abUlPCcmyI/17BWWoUWeAbnniTFUZuczP6iowD9XMBcUoD9jRtUO6w+KXkw64TDk+iHdyDfTAjIH7mTRzhXcaw== + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -10415,6 +10495,130 @@ property-information@^5.0.0, property-information@^5.2.0: dependencies: xtend "^4.0.1" +prosemirror-commands@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.1.2.tgz#6868cabc9f9112fba94c805139473527774b0dea" + integrity sha512-JBa06kjgX67d9JVUVJbCkxwvSGtQnWAN/85nq9csOMS5Z9WZLEvVDtVvZranNlu8l/XNVBWrZxOOK+pB03eTfA== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-dropcursor@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz#28738c4ed7102e814d7a8a26d70018523fc7cd6d" + integrity sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" + +prosemirror-example-setup@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz#0df63d14a26b174933345814cb6503ad72a4ccdb" + integrity sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ== + dependencies: + prosemirror-commands "^1.0.0" + prosemirror-dropcursor "^1.0.0" + prosemirror-gapcursor "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-inputrules "^1.0.0" + prosemirror-keymap "^1.0.0" + prosemirror-menu "^1.0.0" + prosemirror-schema-list "^1.0.0" + prosemirror-state "^1.0.0" + +prosemirror-gapcursor@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.2.tgz#a1400a86a51d4cccc065e68d5625a9fb5bc623e0" + integrity sha512-Z+eqk6RysZVxidGWN5aWoSTbn5bTHf1XZ+nQJVwUSdwdBVkfQMFdTHgfrXA8W5MhHHdNg/EEEYG3z3Zi/vE2QQ== + dependencies: + prosemirror-keymap "^1.0.0" + prosemirror-model "^1.0.0" + prosemirror-state "^1.0.0" + prosemirror-view "^1.0.0" + +prosemirror-history@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.1.2.tgz#3e8f11efbd316e98322028be67549df1f94fc6da" + integrity sha512-erhxYS5gm/6MiXP8jUoJBgc8IbaqjHDVPl9KGg5JrMZOSSOwHv85+4Fb0Q7sYtv2fYwAjOSw/kSA9vkxJ6wOwA== + dependencies: + prosemirror-state "^1.2.2" + prosemirror-transform "^1.0.0" + rope-sequence "^1.3.0" + +prosemirror-inputrules@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz#487e46c763e1212a4577397aba7706139084f012" + integrity sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g== + dependencies: + prosemirror-state "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-keymap@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.1.3.tgz#be22d6108df2521608e9216a87b1a810f0ed361e" + integrity sha512-PRA4NzkUMzV/NFf5pyQ6tmlIHiW/qjQ1kGWUlV2rF/dvlOxtpGpTEjIMhWgLuMf+HiDEFnUEP7uhYXu+t+491g== + dependencies: + prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" + +prosemirror-menu@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.1.2.tgz#a58c81e01fdf3e4e25347cea3db24d51d17579ec" + integrity sha512-iAPBMnxaj0AXzqgzxrJPrjo5njIqUaDQjyS17R/vb6zIBnEtH1ZDPanrmZnYkBEFvvM4fBtzDZSQct5iJNTcDQ== + dependencies: + crel "^3.1.0" + prosemirror-commands "^1.0.0" + prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" + +prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.2.0, prosemirror-model@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.8.2.tgz#c74eaacb0bbfea49b59a6d89fef5516181666a56" + integrity sha512-piffokzW7opZVCjf/9YaoXvTC0g7zMRWKJib1hpphPfC+4x6ZXe5CiExgycoWZJe59VxxP7uHX8aFiwg2i9mUQ== + dependencies: + orderedmap "^1.1.0" + +prosemirror-schema-basic@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.1.2.tgz#4bde5c339c845e0d08ec8fe473064e372ca51ae3" + integrity sha512-G4q8WflNsR1Q33QAV4MQO0xWrHLOJ+BQcKswGXMy626wlQj6c/1n1v4eC9ns+h2y1r/fJHZEgSZnsNhm9lbrDw== + dependencies: + prosemirror-model "^1.2.0" + +prosemirror-schema-list@^1.0.0, prosemirror-schema-list@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz#310809209094b03425da7f5c337105074913da6c" + integrity sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.3.2.tgz#1b910b0dc01c1f00926bb9ba1589f7b7ac0d658b" + integrity sha512-t/JqE3aR0SV9QrzFVkAXsQwsgrQBNs/BDbcFH20RssW0xauqNNdjTXxy/J/kM7F+0zYi6+BRmz7cMMQQFU3mwQ== + dependencies: + prosemirror-model "^1.0.0" + prosemirror-transform "^1.0.0" + +prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.3.tgz#239d17591af24d39ef3f1999daa09e1f1c76b06a" + integrity sha512-PUfayeskQfuUBXktvL6207ZWRwHBFNPNPiek4fR+LgCPnBofuEb2+L0FfbNtrAwffHVs6M3DaFvJB1W2VQdV0A== + dependencies: + prosemirror-model "^1.0.0" + +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.13.4.tgz#01d873db7731e0aacc410a9038447d1b7536fd07" + integrity sha512-mtgWEK16uYQFk3kijRlkSpAmDuy7rxYuv0pgyEBDmLT1PCPY8380CoaYnP8znUT6BXIGlJ8oTveK3M50U+B0vw== + dependencies: + prosemirror-model "^1.1.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -11331,6 +11535,11 @@ rollup@^0.67.3: "@types/estree" "0.0.39" "@types/node" "*" +rope-sequence@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b" + integrity sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -12596,6 +12805,17 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e" integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q== +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + tslib@1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -13223,6 +13443,11 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" +w3c-keyname@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.1.tgz#c4fe1a4b9e303c95e833b3d854b7d81070400db9" + integrity sha512-j5k4xGK6k8TCna/08778KUEL98WvTogiG/TN/YStl8GNeXg5tI3Dvq3+JjwJhP4l7ogs6KWo1VYEdc1Qaioy3Q== + w3c-xmlserializer@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"