diff --git a/packages/core/src/test.ts b/packages/core/src/test.ts index 0cb61762..9e479728 100644 --- a/packages/core/src/test.ts +++ b/packages/core/src/test.ts @@ -1,71 +1,81 @@ import { NodeSpec } from "prosemirror-model"; import deepmerge from 'deepmerge' -type RecursivePartial = { - [P in keyof T]?: - T[P] extends (infer U)[] ? RecursivePartial[] : - T[P] extends object ? RecursivePartial : - T[P]; -} +// type RecursivePartial = { +// [P in keyof T]?: +// T[P] extends (infer U)[] ? RecursivePartial[] : +// T[P] extends object ? RecursivePartial : +// T[P]; +// } -type Extension = { - name: string - defaultOptions?: Options | (() => Options) - bla?: number[] | ((this: ExtensionOptions) => number[]) - blub?: number[] | (() => number[]) - schema?: () => NodeSpec -} +// type Extension = { +// name: string +// defaultOptions?: Options | (() => Options) +// bla?: number[] | ((this: ExtensionOptions) => number[]) +// blub?: number[] | (() => number[]) +// schema?: () => NodeSpec +// } + +// type ExtensionOptions = { +// options: T +// } + +// function Extension(config: Extension) { +// const instance = (options: Options) => { +// const extensionInstance = { +// ...config, +// options, +// } + +// if (typeof extensionInstance.name === 'function') { +// // @ts-ignore +// extensionInstance.name() +// } + +// return extensionInstance +// } + +// instance.extend = (extendConfig: RecursivePartial) => { +// return Extension(deepmerge({...config}, {...extendConfig}) as Extension) +// } + +// return instance +// } + +// type HeadingOptions = { +// levels?: number[] +// } + +// const Heading = Extension({ +// 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 = { - options: T -} -function Extension(config: Extension) { - const instance = (options: Options) => { - const extensionInstance = { - ...config, - options, - } - if (typeof extensionInstance.name === 'function') { - // @ts-ignore - extensionInstance.name() - } - return extensionInstance - } - instance.extend = (extendConfig: RecursivePartial) => { - return Extension(deepmerge({...config}, {...extendConfig}) as Extension) - } - return instance -} -type HeadingOptions = { - levels?: number[] -} -const Heading = Extension({ - 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 => { // name: 'heading', @@ -167,3 +177,226 @@ console.log({h}) // levels: [1, 2], // // test: 'bla', // }) + + + + +// interface ExtenstionClass { +// // new (options?: T): ExtenstionClass +// name?: string +// schema?: () => NodeSpec +// } + + + + + + + + + + +// type ExtensionConfig = { +// name: string +// defaultOptions: Options +// } + +// type NodeConfig = ExtensionConfig & { +// schema?: () => NodeSpec +// } + +// class BaseExtension { +// // 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) { +// console.log(this.config.defaultOptions) +// this.options = { +// ...this.config.defaultOptions, +// ...options, +// } as Options + +// console.log(this) +// } +// } + +// // class Extension extends BaseExtension> { +// // defaultConfig: ExtensionConfig = { +// // name: 'extension', +// // defaultOptions: {}, +// // } +// // } + +// class Node extends BaseExtension> { +// // defaultConfig: NodeConfig = { +// // name: 'extension', +// // defaultOptions: {}, +// // schema() { +// // return {} +// // } +// // } +// } + +// type HeadingOptions = { +// levels: number[] +// } + +// const Headingg = new Node({ +// name: 'heading', +// defaultOptions: { +// levels: [1, 2, 3, 4, 5, 6] +// }, +// }) + +// Headingg.set({ +// levels: [1, 2] +// }) + + + + + + +type AnyObject = { + [key: string]: any +} + +type ExtensionConfig = { + name: string + defaultOptions: Options +} + +type NodeConfig = ExtensionConfig & { + schema?: () => NodeSpec +} + + + +class BaseExtension { + 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) { + // this.options = { + // ...this.options, + // ...options, + // } + } + + extend(config: Partial) { + this.storeConfig(config, 'extend') + + return this + } + + overwrite(config: Partial) { + this.storeConfig(config, 'overwrite') + + return this + } +} + +// class Extension extends BaseExtension { +// defaultConfig: ExtensionConfig = { +// name: 'extension', +// defaultOptions: {}, +// } + +// constructor(config: ExtensionConfig) { +// super(config) +// } +// } + +class Node extends BaseExtension> { + defaultConfig: NodeConfig = { + name: 'extension', + defaultOptions: {}, + schema() { + return {} + } + } + + constructor(config: NodeConfig) { + super(config) + } +} + +type HeadingOptions = { + levels: number[] +} + +const Headingg = new Node({ + name: 'heading', + defaultOptions: { + levels: [1, 2, 3, 4, 5, 6] + }, +}) + +// Headingg.set({ +// levels: [1, 2] +// }) + +Headingg.extend({ + name: 'headliiiine', +}) + +console.log(Headingg) \ No newline at end of file