import { Entity, EntityOpts } from './entity'; import { EntityData } from './entity-data'; import type { EntityDataRegistry } from './entity-data'; import { Disposable } from '@gedit/utils'; export interface ConfigEntityProps { } export function createConfigDataRegistry

(entity: ConfigEntity): EntityDataRegistry { class ConfigData extends EntityData

{ getDefaultData(): P { return entity.getDefaultConfig(); } checkChanged(newProps: Partial

): boolean { return entity.checkChanged(this.data, newProps); } toJSON(): object { if (entity.toDataJSON) { return { type: this.type, data: entity.toDataJSON() }; } return super.toJSON(); } } Object.defineProperty(ConfigData, 'type', { value: '_' + entity.type + 'DataMixin' }); // eslint-disable-next-line @typescript-eslint/no-explicit-any return ConfigData as any; } /** * 用于专门的数据配置, 且是单例 */ export class ConfigEntity

extends Entity { static type = 'ConfigEntity'; protected ConfigDataRegistry: EntityDataRegistry; constructor( opts: EntityOpts ) { super(opts); this.isInitialized = true; this.ConfigDataRegistry = createConfigDataRegistry

(this); this.addData(this.ConfigDataRegistry); this.isInitialized = false; } getDefaultConfig(): P { return {} as P; } toDataJSON?(): P /** * 判断config数据是否变化 */ checkChanged(oldData: P, newData: Partial

): boolean { return Entity.checkDataChanged(oldData, newData); } get config(): P { return this.getData(this.ConfigDataRegistry)!.data as P; } updateConfig(props: Partial

): void { this.updateData(this.ConfigDataRegistry, props); } onConfigChanged(fn: (data: P) => void): Disposable { return this.getData(this.ConfigDataRegistry)!.onDataChanged(d => fn(d.data as P)); } }