import { isExpression, TypeInfo } from '@cloudpss/expression'; import type { PinDefinition, PinMap } from '../pin.js'; import type { DiagramComponentConfiguration, Model } from '../index.js'; import { fillArgumentMap } from '@cloudpss/expression/definitions'; const { isArray } = Array; export { fillArgumentMap }; /** 获取引脚默认值,修复现有的引脚,填充缺失的引脚,删除未定义的引脚 */ export function fillPinMap( definition: readonly PinDefinition[] | undefined, pins?: PinMap | null, ): PinMap { pins ??= {}; if (definition == null || !isArray(definition as unknown[])) return pins; const keys = new Set(Object.keys(pins) as K[]); // 根据定义填充或修复引脚 for (const def of definition) { const key = def.key as K; const value = keys.has(key) ? pins[key] : undefined; if (value == null) { pins[key] = ''; } else if (typeof value != 'string' && !isExpression(value)) { pins[key] = TypeInfo.toString(value); } keys.delete(key); } // 删除多余的引脚 for (const key of keys) { // 保留私有字段和特殊字段 const k0 = key[0]; if (k0 === '_' || k0 === '$' || k0 === '@' || k0 === 'ɵ') continue; delete pins[key]; } return pins; } /** 填充元件默认值字段 */ type FillableDiagramComponentConfiguration = Pick; /** 填充元件默认值 */ export function fillDiagramComponent>( definition: Model, component?: T, ): T & FillableDiagramComponentConfiguration { if (component == null) { return { args: fillArgumentMap(definition.revision.parameters), pins: fillPinMap(definition.revision.pins), context: {}, props: { enabled: true, outlineLevel: 0 }, } satisfies FillableDiagramComponentConfiguration as T & FillableDiagramComponentConfiguration; } const comp = component as T & Partial; comp.args = fillArgumentMap(definition.revision.parameters, comp.args); comp.pins = fillPinMap(definition.revision.pins, comp.pins); comp.context ??= {}; if (comp.props) { comp.props.enabled ??= true; comp.props.outlineLevel ??= 0; } else { comp.props = { enabled: true, outlineLevel: 0 }; } return comp as T & FillableDiagramComponentConfiguration; }