import type * as glassEasel from 'glass-easel' import { type GeneralComponentDefinition, type utils as typeUtils } from './types' import { type AllData, determineComponentExports, type GeneralComponent, type PropertyValues, } from './component' type DataList = typeUtils.DataList type PropertyList = typeUtils.PropertyList type MethodList = typeUtils.MethodList type ChainingFilterType = typeUtils.ChainingFilterType export type DefinitionFilter = ( target: GeneralComponentDefinition, childFilters: (((target: GeneralComponentDefinition) => void) | null)[], ) => void export type GeneralBehavior = Behavior< /* TData */ Record, /* TProperty */ Record, /* TMethod */ Record, /* TChainingFilter */ any, /* TComponentExport */ any, /* TExtraThisFields */ Record > export class Behavior< TData extends DataList, TProperty extends PropertyList, TMethod extends MethodList, TChainingFilter extends ChainingFilterType, TComponentExport, TExtraThisFields extends DataList, > { /** @internal */ _$: glassEasel.GeneralBehavior /** @internal */ _$chainingFilter?: typeUtils.ChainingFilterFunc /** @internal */ _$boundDefinitionFilter?: (target: GeneralComponentDefinition) => void /** @internal */ _$export?: (source: GeneralComponent | null) => TComponentExport /** @internal */ constructor( inner: glassEasel.Behavior, parents: GeneralBehavior[], definitionFilter: DefinitionFilter | undefined, chainingFilter: typeUtils.ChainingFilterFunc | undefined, componentExport: ((source: GeneralComponent | null) => TComponentExport) | undefined, ) { this._$ = inner as glassEasel.GeneralBehavior this._$chainingFilter = chainingFilter this._$export = determineComponentExports(parents, componentExport) // processing definition filter if (definitionFilter !== undefined) { const definitionFilterArgs = parents.map((p) => p._$boundDefinitionFilter ?? null) this._$boundDefinitionFilter = (childDef) => { definitionFilter(childDef, definitionFilterArgs) } } } } export type ComponentFieldTypes< TData extends DataList, TProperty extends PropertyList, TMethod extends MethodList, > = { propertyValues: PropertyValues dataWithProperties: AllData methods: TMethod } export class ComponentType< TData extends DataList, TProperty extends PropertyList, TMethod extends MethodList, // eslint-disable-next-line @typescript-eslint/no-unused-vars TComponentExport, // eslint-disable-next-line @typescript-eslint/no-unused-vars TExtraThisFields extends DataList, > { /** @internal */ _$: glassEasel.ComponentDefinition // this field is designed for type identification in some external modules, such as glass-easel-analyzer // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment protected readonly _$fieldTypes: ComponentFieldTypes = undefined as any /** @internal */ constructor(inner: glassEasel.ComponentDefinition) { this._$ = inner } } export type GeneralComponentType = ComponentType< /* TData */ Record, /* TProperty */ Record, /* TMethod */ Record, /* TComponentExport */ any, /* TExtraThisFields */ Record > export class TraitBehavior< TIn extends { [key: string]: any }, TOut extends { [key: string]: any } = TIn, > { /** @internal */ _$: glassEasel.TraitBehavior /** @internal */ constructor(inner: glassEasel.TraitBehavior) constructor(inner: glassEasel.TraitBehavior) constructor(inner: glassEasel.TraitBehavior) { this._$ = inner } }