import type { Renderer } from './renderer.js'; import type { PropertyConfig } from './types.js'; export type PropertyMetaConfig< Type extends string = string, PropertyData extends NonNullable = NonNullable, RawValue = unknown, JsonValue = unknown, > = { type: Type; config: PropertyConfig; create: Create; renderer: Renderer; }; type CreatePropertyMeta< Type extends string = string, PropertyData extends Record = Record, RawValue = unknown, JsonValue = unknown, > = ( renderer: Omit, 'type'> ) => PropertyMetaConfig; type Create< PropertyData extends Record = Record, > = ( name: string, data?: PropertyData ) => { type: string; name: string; statCalcOp?: string; data: PropertyData; }; export type PropertyModel< Type extends string = string, PropertyData extends Record = Record, RawValue = unknown, JsonValue = unknown, > = { type: Type; config: PropertyConfig; create: Create; createPropertyMeta: CreatePropertyMeta< Type, PropertyData, RawValue, JsonValue >; }; export const propertyType = (type: Type) => ({ type: type, modelConfig: < PropertyData extends Record = Record, RawValue = unknown, JsonValue = unknown, >( ops: PropertyConfig ): PropertyModel => { const create: Create = (name, data) => { return { type, name, data: data ?? ops.propertyData.default(), }; }; return { type, config: ops, create, createPropertyMeta: renderer => ({ type, config: ops, create, renderer: { type, ...renderer, }, }), }; }, });