import { isObjectLike as isRecord } from '../utils/records' import { extractTemplateCollection } from './templateEnvelopes' import { getBioTemplateInfo } from './catalog' import { getBioTemplatePackInfo } from './packs' import { getBioTemplatePresetInfo } from './presets' import type { BioTemplateEnvelope, TemplateCollectionEnvelope, TemplateId, TemplatePackId, TemplatePresetId, } from './types' type BioTemplateComponentTarget = | TemplateId | TemplatePackId | TemplatePresetId | string | BioTemplateEnvelope | TemplateCollectionEnvelope export function resolveComponentTemplateIds(target: BioTemplateComponentTarget): TemplateId[] { if (typeof target === 'string') { const preset = getBioTemplatePresetInfo(target) if (preset) return [...preset.templates] const pack = getBioTemplatePackInfo(target) if (pack) return [...pack.templates] const template = getBioTemplateInfo(target) return template ? [template.template_id] : [] } if (isTemplateEnvelope(target)) { const template = getBioTemplateInfo(target.template_id) return template ? [template.template_id] : [] } const presetName = collectionPresetName(target) if (presetName) { const preset = getBioTemplatePresetInfo(presetName) if (preset) return [...preset.templates] } const packName = collectionPackName(target) if (packName) { const pack = getBioTemplatePackInfo(packName) if (pack) return [...pack.templates] } return Object.keys(extractTemplateCollection(target)) .map(templateId => getBioTemplateInfo(templateId)?.template_id) .filter((templateId): templateId is TemplateId => templateId !== undefined) } export function isTemplateEnvelope(value: unknown): value is BioTemplateEnvelope { return isRecord(value) && typeof value.template_id === 'string' && 'data' in value } function collectionPresetName(value: unknown): string | undefined { if (!isRecord(value) || !isRecord(value.metadata)) return undefined return typeof value.metadata.preset === 'string' ? value.metadata.preset : undefined } function collectionPackName(value: unknown): string | undefined { if (!isRecord(value) || !isRecord(value.metadata)) return undefined return typeof value.metadata.pack === 'string' ? value.metadata.pack : undefined }