From 07079082c4915b5ee741b47374a49c7529dc3765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Wed, 26 Aug 2020 23:45:08 +0200 Subject: [PATCH] test class replacement --- docs/src/main.js | 2 + packages/core/package.json | 1 + packages/core/src/test.ts | 169 +++++++++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 packages/core/src/test.ts diff --git a/docs/src/main.js b/docs/src/main.js index ceb96a51..fea6e237 100644 --- a/docs/src/main.js +++ b/docs/src/main.js @@ -6,6 +6,8 @@ import Demo from '~/components/Demo' import Tab from '~/components/Tab' import ReactRenderer from '~/components/ReactRenderer' +import '@tiptap/core/../src/test.ts' + export default function (Vue, { router, head, isClient }) { Vue.component('Layout', App) Vue.component('Demo', Demo) diff --git a/packages/core/package.json b/packages/core/package.json index 3df06654..d326cb08 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -15,6 +15,7 @@ "@types/prosemirror-dropcursor": "^1.0.0", "@types/prosemirror-gapcursor": "^1.0.1", "collect.js": "^4.28.2", + "deepmerge": "^4.2.2", "prosemirror-commands": "^1.1.3", "prosemirror-dropcursor": "^1.3.2", "prosemirror-gapcursor": "^1.1.5", diff --git a/packages/core/src/test.ts b/packages/core/src/test.ts new file mode 100644 index 00000000..0cb61762 --- /dev/null +++ b/packages/core/src/test.ts @@ -0,0 +1,169 @@ +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 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}) + +// const bla = Extension(options => { +// name: 'heading', +// bla: () => { +// return [1, 2] +// }, +// }) + +// const Heading1 = Heading.extend({ +// name: 'heading 1' +// }) + +// console.log(Heading(1), Heading1(2)) + + + + +// interface ExtenstionClass { +// new (options?: T): ExtenstionClass +// name?: string +// bla?: number[] | (() => number[]) +// } + +// // class ExtenstionClass implements ExtenstionClass { +// class ExtenstionClass { +// // name: '124' + +// // bla() { +// // return [1, 2] +// // } +// } + +// class Whatever extends ExtenstionClass { +// name: '1243' +// } + +// new Whatever({ +// bla: 124, +// }) + + + + + +// interface ExxxtensionConstructor { +// new (options: Partial): any +// } + +// interface Exxxtension { +// name: string +// } + +// const Exxxtension: ExxxtensionConstructor = class Exxxtension implements Exxxtension { +// name = '1' +// }; + +// new Exxxtension({ +// levels: [1, 2], +// // test: 'bla', +// }) + + + + +// interface ExxxtensionConstructor { +// new (options: Partial): any +// } + +// interface Exxxtension { +// name: string +// } + +// interface NodeExtension extends Exxxtension { +// schema(): NodeSpec +// what: number +// } + +// class Exxxtension implements Exxxtension { +// // public topNode = false +// } + +// class NodeExtension implements NodeExtension { +// // public topNode = false +// } + +// const HeadingNode: ExxxtensionConstructor = class HeadingNode extends NodeExtension implements NodeExtension { +// name = 'heading' + +// // what = 's' + +// schema() { +// return { +// defining: true +// } +// } +// } + +// new HeadingNode({ +// levels: [1, 2], +// // test: 'bla', +// })