import * as t from '@rekajs/types'; import { Extension } from './extension'; export type ExtensionStateDefinition = Record; type Require = T & { [P in K]-?: T[P] }; export interface ExtensionConfig< S extends ExtensionStateDefinition | any = undefined > { key: string; state: S; init: (extension: Extension>) => void; dispose: (extension: Extension>) => void; fromJSON: (state: any) => S; } export type ExtensionStateFromDefinition = D['state']; export class ExtensionDefinition< S extends ExtensionStateDefinition | any = any > { declare key: string; declare globals: Record; declare components: t.Component[]; declare state: S; declare fromJSON: (state: any) => S; declare init: (extension: Extension>) => void; declare dispose: (extension: Extension>) => void; constructor(config: Require>, 'key'>) { this.key = config.key; this.state = config.state as S; this.fromJSON = config.fromJSON || ((state) => { return state; }); /* eslint-disable no-alert, @typescript-eslint/no-empty-function */ this.init = config.init || (() => {}); this.dispose = config.dispose || (() => {}); /* eslint-enable no-alert, @typescript-eslint/no-empty-function */ } } export const createExtension = ( config: Require>, 'key'> ) => { return new ExtensionDefinition(config); };