add more tests

This commit is contained in:
Philipp Kühn
2020-08-27 23:24:31 +02:00
parent 07079082c4
commit 26651a956d

View File

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