diff --git a/packages/core/package.json b/packages/core/package.json index d326cb08..5e395aff 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -12,8 +12,10 @@ "dist" ], "dependencies": { + "@types/clone-deep": "^4.0.1", "@types/prosemirror-dropcursor": "^1.0.0", "@types/prosemirror-gapcursor": "^1.0.1", + "clone-deep": "^4.0.1", "collect.js": "^4.28.2", "deepmerge": "^4.2.2", "prosemirror-commands": "^1.1.3", diff --git a/packages/core/src/test.ts b/packages/core/src/test.ts index f99864ba..4fceba2b 100644 --- a/packages/core/src/test.ts +++ b/packages/core/src/test.ts @@ -1,7 +1,8 @@ import { NodeSpec } from "prosemirror-model"; import deepmerge from 'deepmerge' -import { merge } from 'merge-anything' import collect from 'collect.js' +import { Editor, CommandSpec } from '@tiptap/core' +import cloneDeep from 'clone-deep' // type RecursivePartial = { // [P in keyof T]?: @@ -778,33 +779,23 @@ let three = copyProperties(one, two) - - -function cloneInstance(instance: T): T { - return Object.assign( - Object.create( - Object.getPrototypeOf(instance), - ), - JSON.parse(JSON.stringify(instance)), - ) -} - - -type Bla = { +interface ExtensionCallback { + editor: Editor name: string - options: any } interface ExtensionExtends { name: string + options: AnyObject + commands: (params: ExtensionCallback) => CommandSpec } class ExtensionTest { type = 'extension' configs: any = {} - options: Partial = {} + usedOptions: Partial = {} - protected storeConfig(key: string, value: any, stategy: ('extend' | 'overwrite')) { + protected storeConfig(key: string, value: any, stategy: 'extend' | 'overwrite') { const item = { stategy, value, @@ -817,8 +808,8 @@ class ExtensionTest { } } - private storeOptions(options: Partial) { - this.options = { ...this.options, ...options } + private useOptions(options: Partial) { + this.usedOptions = { ...this.usedOptions, ...options } return this } @@ -827,6 +818,16 @@ class ExtensionTest { return this } + public options(value: Options) { + this.storeConfig('options', value, 'overwrite') + return this + } + + public commands(value: NodeExtends['commands']) { + this.storeConfig('commands', value, 'overwrite') + return this + } + public extend>(key: T, value: Extends[T]) { this.storeConfig(key, value, 'extend') return this @@ -836,14 +837,14 @@ class ExtensionTest { const self = this return function(options2?: Partial): ExtensionTest { - return cloneInstance(self as unknown as ExtensionTest) - .storeOptions({...options, ...options2} as Options2) + return cloneDeep(self as unknown as ExtensionTest, true) + .useOptions({...options, ...options2} as Options2) } } } interface NodeExtends extends ExtensionExtends { - schema: (bla: Bla) => NodeSpec + schema: (params: ExtensionCallback) => NodeSpec } class NodeTest extends ExtensionTest { @@ -860,32 +861,43 @@ interface TestOptions { } const Suggestion = new NodeTest() + .name('suggestion') + .options({ + trigger: '@' + }) .schema(() => ({ toDOM: () => ['div', 0] })) - .name('suggestion') + .commands(({ editor, name }) => ({ + [name]: next => () => { + editor.toggleMark(name) + next() + }, + })) .extend('schema', () => ({ - toDOM: () => ['div', 0], + toDOM: () => ['span', 0], })) .create() -interface MentionOptions { - trigger: string - foo: string -} +console.log(Suggestion(), Suggestion().name('bla').create()()) -const Mention = Suggestion() - .name('mention') - .create({ - trigger: '@' - }) +// interface MentionOptions { +// trigger: string +// foo: string +// } -const Hashtag = Suggestion({ - trigger: '#' -}) -.create() +// const Mention = Suggestion() +// .name('mention') +// .create({ +// trigger: '@' +// }) -console.log(Mention(), Hashtag()) +// const Hashtag = Suggestion({ +// trigger: '#' +// }) +// .create() + +// console.log(Mention(), Hashtag()) diff --git a/yarn.lock b/yarn.lock index 581c9f8e..3b481661 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2178,6 +2178,11 @@ dependencies: defer-to-connect "^1.0.1" +"@types/clone-deep@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/clone-deep/-/clone-deep-4.0.1.tgz#7c488443ab9f571cd343d774551b78e9264ea990" + integrity sha512-bdkCSkyVHsgl3Goe1y16T9k6JuQx7SiDREkq728QjKmTZkGJZuS8R3gGcnGzVuGBP0mssKrzM/GlMOQxtip9cg== + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"