{"version":3,"file":"template-manager.cjs","sources":["../../../../../src/lib/template-manager.ts"],"sourcesContent":["/**\r\n * Template Manager\r\n * \r\n * Manages component templates with layered architecture:\r\n * Base → Platform → Theme\r\n * \r\n * @module template-manager\r\n * @see Requirements 9.1, 9.2, 9.3, 9.4\r\n */\r\n\r\nimport type { UISchema, UIComponent, StyleProps } from '../types';\r\nimport type { PlatformType } from './component-registry';\r\n\r\n/**\r\n * Template layer types\r\n */\r\nexport type TemplateLayer = 'base' | 'platform' | 'theme';\r\n\r\n/**\r\n * Component template definition\r\n */\r\nexport interface ComponentTemplate {\r\n  /** Template layer */\r\n  layer: TemplateLayer;\r\n  /** Target platform (for platform layer) */\r\n  platform?: PlatformType;\r\n  /** Theme name (for theme layer) */\r\n  theme?: string;\r\n  /** Template UI schema */\r\n  template: UISchema;\r\n  /** Additional styles */\r\n  styles?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Template storage key\r\n */\r\nfunction createTemplateKey(\r\n  componentName: string,\r\n  layer: TemplateLayer,\r\n  platform?: PlatformType,\r\n  theme?: string\r\n): string {\r\n  const parts = [componentName, layer];\r\n  if (platform) parts.push(platform);\r\n  if (theme) parts.push(theme);\r\n  return parts.join(':');\r\n}\r\n\r\n/**\r\n * Deep merge two objects\r\n */\r\nfunction deepMerge<T extends Record<string, unknown>>(base: T, override: Partial<T>): T {\r\n  const result = { ...base };\r\n  \r\n  for (const key of Object.keys(override) as (keyof T)[]) {\r\n    const baseValue = base[key];\r\n    const overrideValue = override[key];\r\n    \r\n    if (\r\n      overrideValue !== undefined &&\r\n      typeof baseValue === 'object' &&\r\n      baseValue !== null &&\r\n      typeof overrideValue === 'object' &&\r\n      overrideValue !== null &&\r\n      !Array.isArray(baseValue) &&\r\n      !Array.isArray(overrideValue)\r\n    ) {\r\n      result[key] = deepMerge(\r\n        baseValue as Record<string, unknown>,\r\n        overrideValue as Record<string, unknown>\r\n      ) as T[keyof T];\r\n    } else if (overrideValue !== undefined) {\r\n      result[key] = overrideValue as T[keyof T];\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\n/**\r\n * Merge UIComponent with override\r\n */\r\nfunction mergeComponent(base: UIComponent, override: Partial<UIComponent>): UIComponent {\r\n  const result: UIComponent = {\r\n    ...base,\r\n    ...override,\r\n    id: override.id || base.id,\r\n    type: override.type || base.type,\r\n  };\r\n\r\n  // Merge props\r\n  if (base.props || override.props) {\r\n    result.props = deepMerge(\r\n      (base.props || {}) as Record<string, unknown>,\r\n      (override.props || {}) as Record<string, unknown>\r\n    );\r\n  }\r\n\r\n  // Merge styles\r\n  if (base.style || override.style) {\r\n    result.style = deepMerge(\r\n      (base.style || {}) as unknown as Record<string, unknown>,\r\n      (override.style || {}) as unknown as Record<string, unknown>\r\n    ) as unknown as StyleProps;\r\n  }\r\n\r\n  // Merge children recursively\r\n  if (override.children) {\r\n    result.children = override.children;\r\n  } else if (base.children) {\r\n    result.children = base.children;\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Merge two UISchemas\r\n */\r\nfunction mergeSchemas(base: UISchema, override: UISchema): UISchema {\r\n  return {\r\n    version: override.version || base.version,\r\n    root: mergeComponent(base.root, override.root),\r\n    data: override.data ? deepMerge(base.data || {}, override.data) : base.data,\r\n    meta: override.meta ? deepMerge(base.meta || {}, override.meta) : base.meta,\r\n  };\r\n}\r\n\r\n/**\r\n * Template Manager class\r\n * \r\n * Manages component templates with three-layer architecture:\r\n * 1. Base - Common component structure\r\n * 2. Platform - Platform-specific overrides\r\n * 3. Theme - Theme-specific styling\r\n */\r\nexport class TemplateManager {\r\n  private templates: Map<string, ComponentTemplate> = new Map();\r\n\r\n  /**\r\n   * Register a template\r\n   * @param componentName - Component name\r\n   * @param template - Template definition\r\n   */\r\n  registerTemplate(componentName: string, template: ComponentTemplate): void {\r\n    const key = createTemplateKey(\r\n      componentName,\r\n      template.layer,\r\n      template.platform,\r\n      template.theme\r\n    );\r\n    this.templates.set(key, template);\r\n  }\r\n\r\n  /**\r\n   * Get a specific template\r\n   * @param componentName - Component name\r\n   * @param layer - Template layer\r\n   * @param platform - Platform (for platform layer)\r\n   * @param theme - Theme (for theme layer)\r\n   */\r\n  getTemplateByLayer(\r\n    componentName: string,\r\n    layer: TemplateLayer,\r\n    platform?: PlatformType,\r\n    theme?: string\r\n  ): ComponentTemplate | undefined {\r\n    const key = createTemplateKey(componentName, layer, platform, theme);\r\n    return this.templates.get(key);\r\n  }\r\n\r\n  /**\r\n   * Get merged template for a component\r\n   * Merges Base → Platform → Theme layers\r\n   * @param componentName - Component name\r\n   * @param platform - Target platform\r\n   * @param theme - Theme name\r\n   * @returns Merged UISchema or undefined\r\n   */\r\n  getTemplate(\r\n    componentName: string,\r\n    platform: PlatformType,\r\n    theme?: string\r\n  ): UISchema | undefined {\r\n    // Get base template\r\n    const baseTemplate = this.getTemplateByLayer(componentName, 'base');\r\n    if (!baseTemplate) return undefined;\r\n\r\n    let result = baseTemplate.template;\r\n\r\n    // Merge platform template\r\n    const platformTemplate = this.getTemplateByLayer(componentName, 'platform', platform);\r\n    if (platformTemplate) {\r\n      result = mergeSchemas(result, platformTemplate.template);\r\n    }\r\n\r\n    // Merge theme template\r\n    if (theme) {\r\n      const themeTemplate = this.getTemplateByLayer(componentName, 'theme', undefined, theme);\r\n      if (themeTemplate) {\r\n        result = mergeSchemas(result, themeTemplate.template);\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Merge multiple templates\r\n   * @param base - Base schema\r\n   * @param overrides - Override schemas\r\n   * @returns Merged schema\r\n   */\r\n  mergeTemplates(base: UISchema, ...overrides: UISchema[]): UISchema {\r\n    let result = base;\r\n    for (const override of overrides) {\r\n      result = mergeSchemas(result, override);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Check if a template exists\r\n   */\r\n  hasTemplate(\r\n    componentName: string,\r\n    layer: TemplateLayer,\r\n    platform?: PlatformType,\r\n    theme?: string\r\n  ): boolean {\r\n    const key = createTemplateKey(componentName, layer, platform, theme);\r\n    return this.templates.has(key);\r\n  }\r\n\r\n  /**\r\n   * Remove a template\r\n   */\r\n  removeTemplate(\r\n    componentName: string,\r\n    layer: TemplateLayer,\r\n    platform?: PlatformType,\r\n    theme?: string\r\n  ): boolean {\r\n    const key = createTemplateKey(componentName, layer, platform, theme);\r\n    return this.templates.delete(key);\r\n  }\r\n\r\n  /**\r\n   * Get all templates for a component\r\n   */\r\n  getComponentTemplates(componentName: string): ComponentTemplate[] {\r\n    const result: ComponentTemplate[] = [];\r\n    for (const [key, template] of this.templates) {\r\n      if (key.startsWith(componentName + ':')) {\r\n        result.push(template);\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Clear all templates\r\n   */\r\n  clear(): void {\r\n    this.templates.clear();\r\n  }\r\n\r\n  /**\r\n   * Get template count\r\n   */\r\n  get size(): number {\r\n    return this.templates.size;\r\n  }\r\n}\r\n\r\n/**\r\n * Default template manager instance\r\n */\r\nexport const defaultTemplateManager = new TemplateManager();\r\n"],"names":["createTemplateKey","componentName","layer","platform","theme","parts","deepMerge","base","override","result","key","baseValue","overrideValue","mergeComponent","mergeSchemas","TemplateManager","__publicField","template","baseTemplate","platformTemplate","themeTemplate","overrides","defaultTemplateManager"],"mappings":"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"}