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