fix deep clone

This commit is contained in:
Philipp Kühn
2020-09-04 23:45:50 +02:00
parent 6e33570530
commit 25cc01dcf3
3 changed files with 57 additions and 38 deletions

View File

@@ -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",

View File

@@ -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())

View File

@@ -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"