import type { PropertyMetaConfig } from '@blocksuite/data-view'; import type { Disposable } from '@blocksuite/global/utils'; import type { Block, BlockModel } from '@blocksuite/store'; type PropertyMeta< T extends BlockModel = BlockModel, Value = unknown, ColumnData extends NonNullable = NonNullable, > = { name: string; key: string; metaConfig: PropertyMetaConfig; getColumnData?: (block: T) => ColumnData; setColumnData?: (block: T, data: ColumnData) => void; get: (block: T) => Value; set?: (block: T, value: Value) => void; updated: (block: T, callback: () => void) => Disposable; }; export type BlockMeta = { selector: (block: Block) => boolean; properties: PropertyMeta[]; }; export const createBlockMeta = ( options: Omit, 'properties'> ) => { const meta: BlockMeta = { ...options, properties: [], }; return { ...meta, addProperty: (property: PropertyMeta) => { meta.properties.push(property as PropertyMeta); }, }; };