{"version":3,"file":"schema-generator.cjs","sources":["../../../../../src/lib/schema-generator.ts"],"sourcesContent":["/**\r\n * Schema Generator\r\n * \r\n * Automatically generates A2UI Schema from component definitions.\r\n * Supports on-demand loading and batch generation.\r\n * \r\n * @module schema-generator\r\n * @see Requirements 8.1, 8.2, 8.3, 8.4\r\n */\r\n\r\nimport type { UISchema } from '../types';\r\nimport type { \r\n  ComponentDefinition, \r\n  PropSchema, \r\n  PlatformType,\r\n  ComponentRegistry \r\n} from './component-registry';\r\n\r\n/**\r\n * Options for schema generation\r\n */\r\nexport interface SchemaGeneratorOptions {\r\n  /** Include component examples in generated schema */\r\n  includeExamples?: boolean;\r\n  /** Include deprecated components */\r\n  includeDeprecated?: boolean;\r\n  /** Target platform filter */\r\n  platform?: PlatformType;\r\n}\r\n\r\n/**\r\n * Property schema definition in generated schema\r\n */\r\nexport interface PropSchemaDefinition {\r\n  /** Property type */\r\n  type: string;\r\n  /** Whether required */\r\n  required: boolean;\r\n  /** Default value */\r\n  default?: unknown;\r\n  /** Description */\r\n  description?: string;\r\n  /** Enum values */\r\n  enum?: string[];\r\n}\r\n\r\n/**\r\n * Event definition in generated schema\r\n */\r\nexport interface EventDefinition {\r\n  /** Event name */\r\n  name: string;\r\n  /** Event description */\r\n  description?: string;\r\n  /** Event payload type */\r\n  payloadType?: string;\r\n}\r\n\r\n/**\r\n * Slot definition in generated schema\r\n */\r\nexport interface SlotDefinition {\r\n  /** Slot name */\r\n  name: string;\r\n  /** Slot description */\r\n  description?: string;\r\n}\r\n\r\n/**\r\n * Generated schema for a component\r\n */\r\nexport interface GeneratedSchema {\r\n  /** Component name */\r\n  component: string;\r\n  /** Component version */\r\n  version: string;\r\n  /** Component category */\r\n  category?: string;\r\n  /** Component description */\r\n  description?: string;\r\n  /** Props definitions */\r\n  props: Record<string, PropSchemaDefinition>;\r\n  /** Event definitions */\r\n  events: EventDefinition[];\r\n  /** Slot definitions */\r\n  slots?: SlotDefinition[];\r\n  /** Example schemas */\r\n  examples?: UISchema[];\r\n  /** Supported platforms */\r\n  platforms?: PlatformType[];\r\n  /** Whether deprecated */\r\n  deprecated?: boolean;\r\n  /** Deprecation message */\r\n  deprecationMessage?: string;\r\n}\r\n\r\n/**\r\n * Schema cache for on-demand loading\r\n */\r\nconst schemaCache = new Map<string, GeneratedSchema>();\r\n\r\n/**\r\n * Convert PropSchema to PropSchemaDefinition\r\n */\r\nfunction convertPropSchema(schema: PropSchema): PropSchemaDefinition {\r\n  return {\r\n    type: schema.type,\r\n    required: schema.required ?? false,\r\n    default: schema.default,\r\n    description: schema.description,\r\n    enum: schema.enum,\r\n  };\r\n}\r\n\r\n/**\r\n * Extract events from component definition\r\n * Default events based on category\r\n */\r\nfunction extractEvents(definition: ComponentDefinition): EventDefinition[] {\r\n  const events: EventDefinition[] = [];\r\n  \r\n  // Add common events based on category\r\n  switch (definition.category) {\r\n    case 'input':\r\n      events.push(\r\n        { name: 'onChange', description: 'Fired when value changes' },\r\n        { name: 'onFocus', description: 'Fired when component receives focus' },\r\n        { name: 'onBlur', description: 'Fired when component loses focus' }\r\n      );\r\n      break;\r\n    case 'navigation':\r\n      events.push(\r\n        { name: 'onClick', description: 'Fired when clicked' },\r\n        { name: 'onNavigate', description: 'Fired on navigation' }\r\n      );\r\n      break;\r\n    case 'feedback':\r\n      events.push(\r\n        { name: 'onClose', description: 'Fired when closed' },\r\n        { name: 'onAction', description: 'Fired on action button click' }\r\n      );\r\n      break;\r\n    default:\r\n      events.push(\r\n        { name: 'onClick', description: 'Fired when clicked' }\r\n      );\r\n  }\r\n  \r\n  return events;\r\n}\r\n\r\n/**\r\n * Schema Generator class\r\n * \r\n * Generates A2UI Schema from component definitions with support for:\r\n * - Single component generation\r\n * - Batch generation\r\n * - On-demand loading with caching\r\n */\r\nexport class SchemaGenerator {\r\n  private registry: ComponentRegistry;\r\n\r\n  constructor(registry: ComponentRegistry) {\r\n    this.registry = registry;\r\n  }\r\n\r\n  /**\r\n   * Generate schema for a single component\r\n   * @param componentName - Name of the component\r\n   * @param options - Generation options\r\n   * @returns Generated schema or undefined if not found\r\n   */\r\n  generate(\r\n    componentName: string,\r\n    options: SchemaGeneratorOptions = {}\r\n  ): GeneratedSchema | undefined {\r\n    const definition = this.registry.get(componentName, options.platform);\r\n    \r\n    if (!definition) return undefined;\r\n    \r\n    // Skip deprecated if not included\r\n    if (definition.deprecated && !options.includeDeprecated) {\r\n      return undefined;\r\n    }\r\n\r\n    // Convert props schema\r\n    const props: Record<string, PropSchemaDefinition> = {};\r\n    if (definition.propsSchema) {\r\n      for (const [propName, propSchema] of Object.entries(definition.propsSchema)) {\r\n        props[propName] = convertPropSchema(propSchema);\r\n      }\r\n    }\r\n\r\n    // Build generated schema\r\n    const schema: GeneratedSchema = {\r\n      component: definition.name,\r\n      version: definition.version || '1.0.0',\r\n      category: definition.category,\r\n      description: definition.description,\r\n      props,\r\n      events: extractEvents(definition),\r\n      platforms: definition.platforms,\r\n      deprecated: definition.deprecated,\r\n      deprecationMessage: definition.deprecationMessage,\r\n    };\r\n\r\n    // Include examples if requested\r\n    if (options.includeExamples && definition.examples) {\r\n      schema.examples = definition.examples.map(ex => ex.schema);\r\n    }\r\n\r\n    return schema;\r\n  }\r\n\r\n  /**\r\n   * Generate schemas for all components\r\n   * @param options - Generation options\r\n   * @returns Map of component name to generated schema\r\n   */\r\n  generateAll(\r\n    options: SchemaGeneratorOptions = {}\r\n  ): Record<string, GeneratedSchema> {\r\n    const result: Record<string, GeneratedSchema> = {};\r\n    const components = this.registry.getAll(options.platform);\r\n\r\n    for (const definition of components) {\r\n      const schema = this.generate(definition.name, options);\r\n      if (schema) {\r\n        result[definition.name] = schema;\r\n      }\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Load schema on-demand with caching\r\n   * @param componentName - Name of the component\r\n   * @returns Promise resolving to generated schema\r\n   */\r\n  async loadOnDemand(componentName: string): Promise<GeneratedSchema | undefined> {\r\n    // Check cache first\r\n    const cached = schemaCache.get(componentName);\r\n    if (cached) return cached;\r\n\r\n    // Generate schema\r\n    const schema = this.generate(componentName, { includeExamples: true });\r\n    \r\n    if (schema) {\r\n      // Cache the result\r\n      schemaCache.set(componentName, schema);\r\n    }\r\n\r\n    return schema;\r\n  }\r\n\r\n  /**\r\n   * Clear schema cache\r\n   */\r\n  clearCache(): void {\r\n    schemaCache.clear();\r\n  }\r\n\r\n  /**\r\n   * Get cached schema count\r\n   */\r\n  getCacheSize(): number {\r\n    return schemaCache.size;\r\n  }\r\n}\r\n\r\n/**\r\n * Create a schema generator for a registry\r\n */\r\nexport function createSchemaGenerator(registry: ComponentRegistry): SchemaGenerator {\r\n  return new SchemaGenerator(registry);\r\n}\r\n"],"names":["schemaCache","convertPropSchema","schema","extractEvents","definition","events","SchemaGenerator","registry","__publicField","componentName","options","props","propName","propSchema","ex","result","components","cached","createSchemaGenerator"],"mappings":"oPAmGA,MAAMA,MAAkB,IAKxB,SAASC,EAAkBC,EAA0C,CACnE,MAAO,CACL,KAAMA,EAAO,KACb,SAAUA,EAAO,UAAY,GAC7B,QAASA,EAAO,QAChB,YAAaA,EAAO,YACpB,KAAMA,EAAO,IAAA,CAEjB,CAMA,SAASC,EAAcC,EAAoD,CACzE,MAAMC,EAA4B,CAAA,EAGlC,OAAQD,EAAW,SAAA,CACjB,IAAK,QACHC,EAAO,KACL,CAAE,KAAM,WAAY,YAAa,0BAAA,EACjC,CAAE,KAAM,UAAW,YAAa,qCAAA,EAChC,CAAE,KAAM,SAAU,YAAa,kCAAA,CAAmC,EAEpE,MACF,IAAK,aACHA,EAAO,KACL,CAAE,KAAM,UAAW,YAAa,oBAAA,EAChC,CAAE,KAAM,aAAc,YAAa,qBAAA,CAAsB,EAE3D,MACF,IAAK,WACHA,EAAO,KACL,CAAE,KAAM,UAAW,YAAa,mBAAA,EAChC,CAAE,KAAM,WAAY,YAAa,8BAAA,CAA+B,EAElE,MACF,QACEA,EAAO,KACL,CAAE,KAAM,UAAW,YAAa,oBAAA,CAAqB,CACvD,CAGJ,OAAOA,CACT,CAUO,MAAMC,CAAgB,CAG3B,YAAYC,EAA6B,CAFjCC,EAAA,iBAGN,KAAK,SAAWD,CAClB,CAQA,SACEE,EACAC,EAAkC,GACL,CAC7B,MAAMN,EAAa,KAAK,SAAS,IAAIK,EAAeC,EAAQ,QAAQ,EAKpE,GAHI,CAACN,GAGDA,EAAW,YAAc,CAACM,EAAQ,kBACpC,OAIF,MAAMC,EAA8C,CAAA,EACpD,GAAIP,EAAW,YACb,SAAW,CAACQ,EAAUC,CAAU,IAAK,OAAO,QAAQT,EAAW,WAAW,EACxEO,EAAMC,CAAQ,EAAIX,EAAkBY,CAAU,EAKlD,MAAMX,EAA0B,CAC9B,UAAWE,EAAW,KACtB,QAASA,EAAW,SAAW,QAC/B,SAAUA,EAAW,SACrB,YAAaA,EAAW,YACxB,MAAAO,EACA,OAAQR,EAAcC,CAAU,EAChC,UAAWA,EAAW,UACtB,WAAYA,EAAW,WACvB,mBAAoBA,EAAW,kBAAA,EAIjC,OAAIM,EAAQ,iBAAmBN,EAAW,WACxCF,EAAO,SAAWE,EAAW,SAAS,IAAIU,GAAMA,EAAG,MAAM,GAGpDZ,CACT,CAOA,YACEQ,EAAkC,GACD,CACjC,MAAMK,EAA0C,CAAA,EAC1CC,EAAa,KAAK,SAAS,OAAON,EAAQ,QAAQ,EAExD,UAAWN,KAAcY,EAAY,CACnC,MAAMd,EAAS,KAAK,SAASE,EAAW,KAAMM,CAAO,EACjDR,IACFa,EAAOX,EAAW,IAAI,EAAIF,EAE9B,CAEA,OAAOa,CACT,CAOA,MAAM,aAAaN,EAA6D,CAE9E,MAAMQ,EAASjB,EAAY,IAAIS,CAAa,EAC5C,GAAIQ,EAAQ,OAAOA,EAGnB,MAAMf,EAAS,KAAK,SAASO,EAAe,CAAE,gBAAiB,GAAM,EAErE,OAAIP,GAEFF,EAAY,IAAIS,EAAeP,CAAM,EAGhCA,CACT,CAKA,YAAmB,CACjBF,EAAY,MAAA,CACd,CAKA,cAAuB,CACrB,OAAOA,EAAY,IACrB,CACF,CAKO,SAASkB,EAAsBX,EAA8C,CAClF,OAAO,IAAID,EAAgBC,CAAQ,CACrC"}