add more tests
This commit is contained in:
@@ -1,71 +1,81 @@
|
|||||||
import { NodeSpec } from "prosemirror-model";
|
import { NodeSpec } from "prosemirror-model";
|
||||||
import deepmerge from 'deepmerge'
|
import deepmerge from 'deepmerge'
|
||||||
|
|
||||||
type RecursivePartial<T> = {
|
// type RecursivePartial<T> = {
|
||||||
[P in keyof T]?:
|
// [P in keyof T]?:
|
||||||
T[P] extends (infer U)[] ? RecursivePartial<U>[] :
|
// T[P] extends (infer U)[] ? RecursivePartial<U>[] :
|
||||||
T[P] extends object ? RecursivePartial<T[P]> :
|
// T[P] extends object ? RecursivePartial<T[P]> :
|
||||||
T[P];
|
// T[P];
|
||||||
}
|
// }
|
||||||
|
|
||||||
type Extension<Options = any> = {
|
// type Extension<Options = any> = {
|
||||||
name: string
|
// name: string
|
||||||
defaultOptions?: Options | (() => Options)
|
// defaultOptions?: Options | (() => Options)
|
||||||
bla?: number[] | ((this: ExtensionOptions<Options>) => number[])
|
// bla?: number[] | ((this: ExtensionOptions<Options>) => number[])
|
||||||
blub?: number[] | (() => number[])
|
// blub?: number[] | (() => number[])
|
||||||
schema?: () => NodeSpec
|
// schema?: () => NodeSpec
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
// type ExtensionOptions<T> = {
|
||||||
|
// options: T
|
||||||
|
// }
|
||||||
|
|
||||||
|
// function Extension<Options>(config: Extension<Options>) {
|
||||||
|
// const instance = (options: Options) => {
|
||||||
|
// const extensionInstance = {
|
||||||
|
// ...config,
|
||||||
|
// options,
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (typeof extensionInstance.name === 'function') {
|
||||||
|
// // @ts-ignore
|
||||||
|
// extensionInstance.name()
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return extensionInstance
|
||||||
|
// }
|
||||||
|
|
||||||
|
// instance.extend = (extendConfig: RecursivePartial<Extension>) => {
|
||||||
|
// return Extension<Options>(deepmerge({...config}, {...extendConfig}) as Extension)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return instance
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type HeadingOptions = {
|
||||||
|
// levels?: number[]
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const Heading = Extension<HeadingOptions>({
|
||||||
|
// name: 'heading',
|
||||||
|
// defaultOptions: {
|
||||||
|
// levels: [1, 2, 3, 4, 5, 6],
|
||||||
|
// },
|
||||||
|
// schema() {
|
||||||
|
// return {
|
||||||
|
// defining: true
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
|
||||||
|
// // Heading
|
||||||
|
// const h = Heading.extend({
|
||||||
|
// name: '123',
|
||||||
|
// })({
|
||||||
|
// levels: [1, 2]
|
||||||
|
// })
|
||||||
|
|
||||||
|
// console.log({h})
|
||||||
|
|
||||||
type ExtensionOptions<T> = {
|
|
||||||
options: T
|
|
||||||
}
|
|
||||||
|
|
||||||
function Extension<Options>(config: Extension<Options>) {
|
|
||||||
const instance = (options: Options) => {
|
|
||||||
const extensionInstance = {
|
|
||||||
...config,
|
|
||||||
options,
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof extensionInstance.name === 'function') {
|
|
||||||
// @ts-ignore
|
|
||||||
extensionInstance.name()
|
|
||||||
}
|
|
||||||
|
|
||||||
return extensionInstance
|
|
||||||
}
|
|
||||||
|
|
||||||
instance.extend = (extendConfig: RecursivePartial<Extension>) => {
|
|
||||||
return Extension<Options>(deepmerge({...config}, {...extendConfig}) as Extension)
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance
|
|
||||||
}
|
|
||||||
|
|
||||||
type HeadingOptions = {
|
|
||||||
levels?: number[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const Heading = Extension<HeadingOptions>({
|
|
||||||
name: 'heading',
|
|
||||||
defaultOptions: {
|
|
||||||
levels: [1, 2, 3, 4, 5, 6],
|
|
||||||
},
|
|
||||||
schema() {
|
|
||||||
return {
|
|
||||||
defining: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Heading
|
|
||||||
const h = Heading.extend({
|
|
||||||
name: '123',
|
|
||||||
})({
|
|
||||||
levels: [1, 2]
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log({h})
|
|
||||||
|
|
||||||
// const bla = Extension(options => {
|
// const bla = Extension(options => {
|
||||||
// name: 'heading',
|
// name: 'heading',
|
||||||
@@ -167,3 +177,226 @@ console.log({h})
|
|||||||
// levels: [1, 2],
|
// levels: [1, 2],
|
||||||
// // test: 'bla',
|
// // test: 'bla',
|
||||||
// })
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// interface ExtenstionClass {
|
||||||
|
// // new (options?: T): ExtenstionClass<T>
|
||||||
|
// name?: string
|
||||||
|
// schema?: () => NodeSpec
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// type ExtensionConfig<Options = any> = {
|
||||||
|
// name: string
|
||||||
|
// defaultOptions: Options
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type NodeConfig<Options = any> = ExtensionConfig<Options> & {
|
||||||
|
// schema?: () => NodeSpec
|
||||||
|
// }
|
||||||
|
|
||||||
|
// class BaseExtension<Options, Config> {
|
||||||
|
// // config: Config
|
||||||
|
// options!: Options
|
||||||
|
|
||||||
|
// // config = {
|
||||||
|
// // name: 'extension',
|
||||||
|
// // defaultOptions: {},
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // defaultConfig = {
|
||||||
|
// // name: 'extension',
|
||||||
|
// // defaultOptions: {},
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // get defaultConfig(): Config {
|
||||||
|
// // return {
|
||||||
|
// // name: 'extension',
|
||||||
|
// // // defaultOptions: {},
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// config: Config
|
||||||
|
|
||||||
|
// constructor(config: Config) {
|
||||||
|
// this.config = {
|
||||||
|
// // ...this.defaultConfig,
|
||||||
|
// ...{
|
||||||
|
// name: 'extension',
|
||||||
|
// defaultOptions: {},
|
||||||
|
// },
|
||||||
|
// ...config,
|
||||||
|
// }
|
||||||
|
// this.options = this.config.defaultOptions
|
||||||
|
// }
|
||||||
|
|
||||||
|
// set(options: Partial<Options>) {
|
||||||
|
// console.log(this.config.defaultOptions)
|
||||||
|
// this.options = {
|
||||||
|
// ...this.config.defaultOptions,
|
||||||
|
// ...options,
|
||||||
|
// } as Options
|
||||||
|
|
||||||
|
// console.log(this)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // class Extension<Options> extends BaseExtension<Options, ExtensionConfig<Options>> {
|
||||||
|
// // defaultConfig: ExtensionConfig<Options> = {
|
||||||
|
// // name: 'extension',
|
||||||
|
// // defaultOptions: {},
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// class Node<Options> extends BaseExtension<Options, NodeConfig<Options>> {
|
||||||
|
// // defaultConfig: NodeConfig<Options> = {
|
||||||
|
// // name: 'extension',
|
||||||
|
// // defaultOptions: {},
|
||||||
|
// // schema() {
|
||||||
|
// // return {}
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// type HeadingOptions = {
|
||||||
|
// levels: number[]
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const Headingg = new Node<HeadingOptions>({
|
||||||
|
// name: 'heading',
|
||||||
|
// defaultOptions: {
|
||||||
|
// levels: [1, 2, 3, 4, 5, 6]
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
|
||||||
|
// Headingg.set({
|
||||||
|
// levels: [1, 2]
|
||||||
|
// })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type AnyObject = {
|
||||||
|
[key: string]: any
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExtensionConfig<Options = AnyObject> = {
|
||||||
|
name: string
|
||||||
|
defaultOptions: Options
|
||||||
|
}
|
||||||
|
|
||||||
|
type NodeConfig<Options = AnyObject> = ExtensionConfig<Options> & {
|
||||||
|
schema?: () => NodeSpec
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BaseExtension<Options, Config> {
|
||||||
|
options!: Options
|
||||||
|
|
||||||
|
defaultConfig = {
|
||||||
|
name: 'extension',
|
||||||
|
defaultOptions: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
configs: AnyObject = {}
|
||||||
|
|
||||||
|
constructor(config: AnyObject) {
|
||||||
|
this.storeConfig({
|
||||||
|
...this.defaultConfig,
|
||||||
|
...config,
|
||||||
|
}, 'overwrite')
|
||||||
|
}
|
||||||
|
|
||||||
|
storeConfig(config: AnyObject, stategy: ('extend' | 'overwrite')) {
|
||||||
|
Object.entries(config).forEach(([key, value]) => {
|
||||||
|
const item = {
|
||||||
|
stategy,
|
||||||
|
value,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.configs[key]) {
|
||||||
|
this.configs[key].push(item)
|
||||||
|
} else {
|
||||||
|
this.configs[key] = [item]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
set(options: Partial<Options>) {
|
||||||
|
// this.options = {
|
||||||
|
// ...this.options,
|
||||||
|
// ...options,
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
extend(config: Partial<Config>) {
|
||||||
|
this.storeConfig(config, 'extend')
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
overwrite(config: Partial<Config>) {
|
||||||
|
this.storeConfig(config, 'overwrite')
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// class Extension<Options> extends BaseExtension<Options> {
|
||||||
|
// defaultConfig: ExtensionConfig = {
|
||||||
|
// name: 'extension',
|
||||||
|
// defaultOptions: {},
|
||||||
|
// }
|
||||||
|
|
||||||
|
// constructor(config: ExtensionConfig<Options>) {
|
||||||
|
// super(config)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
class Node<Options> extends BaseExtension<Options, NodeConfig<Options>> {
|
||||||
|
defaultConfig: NodeConfig = {
|
||||||
|
name: 'extension',
|
||||||
|
defaultOptions: {},
|
||||||
|
schema() {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(config: NodeConfig<Options>) {
|
||||||
|
super(config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type HeadingOptions = {
|
||||||
|
levels: number[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const Headingg = new Node<HeadingOptions>({
|
||||||
|
name: 'heading',
|
||||||
|
defaultOptions: {
|
||||||
|
levels: [1, 2, 3, 4, 5, 6]
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Headingg.set({
|
||||||
|
// levels: [1, 2]
|
||||||
|
// })
|
||||||
|
|
||||||
|
Headingg.extend({
|
||||||
|
name: 'headliiiine',
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(Headingg)
|
||||||
Reference in New Issue
Block a user