@idealyst/tooling 1.2.26 → 1.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -274,7 +274,9 @@ function getDefaultThemeValues() {
274
274
  tabBar: ["xs", "sm", "md", "lg", "xl"],
275
275
  table: ["xs", "sm", "md", "lg", "xl"],
276
276
  tooltip: ["xs", "sm", "md", "lg", "xl"],
277
- view: ["xs", "sm", "md", "lg", "xl"]
277
+ view: ["xs", "sm", "md", "lg", "xl"],
278
+ // Typography sizes for Text component's $typography iterator
279
+ typography: ["h1", "h2", "h3", "h4", "h5", "h6", "subtitle1", "subtitle2", "body1", "body2", "caption"]
278
280
  },
279
281
  radii: ["none", "xs", "sm", "md", "lg", "xl"],
280
282
  shadows: ["none", "sm", "md", "lg", "xl"],
@@ -336,7 +338,8 @@ function loadThemeKeys(opts, rootDir, _babelTypes, verboseMode = false) {
336
338
  intents: themeValues.intents,
337
339
  sizes: themeValues.sizes,
338
340
  radii: themeValues.radii,
339
- shadows: themeValues.shadows
341
+ shadows: themeValues.shadows,
342
+ typography: themeValues.typography
340
343
  };
341
344
  if (verboseMode) {
342
345
  console.log("[idealyst-plugin] Extracted theme keys:");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/analyzer/index.ts","../../src/analyzer/component-analyzer.ts","../../src/analyzer/theme-analyzer.ts"],"sourcesContent":["/**\n * Component and Theme Analyzers\n *\n * Tools for extracting component metadata from TypeScript source code.\n * Used by both the Vite plugin (for docs generation) and MCP server (for IDE assistance).\n * Also used by the Babel plugin for $iterator expansion.\n */\n\nexport { analyzeComponents } from './component-analyzer';\nexport {\n analyzeTheme,\n loadThemeKeys,\n resetThemeCache,\n type BabelThemeKeys,\n} from './theme-analyzer';\nexport * from './types';\n","/**\n * Component Analyzer - Extracts component prop definitions using TypeScript Compiler API.\n *\n * Analyzes:\n * - types.ts files for prop interfaces\n * - JSDoc comments for descriptions\n * - Static .description properties on components\n * - Theme-derived types (Intent, Size) resolved to actual values\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n ComponentRegistry,\n ComponentDefinition,\n PropDefinition,\n ComponentAnalyzerOptions,\n ThemeValues,\n ComponentCategory,\n SampleProps,\n} from './types';\nimport { analyzeTheme } from './theme-analyzer';\n\n/**\n * Analyze components and generate a registry.\n */\nexport function analyzeComponents(options: ComponentAnalyzerOptions): ComponentRegistry {\n const { componentPaths, themePath, include, exclude, includeInternal = false } = options;\n\n const registry: ComponentRegistry = {};\n\n // First, analyze the theme to get valid values\n const themeValues = analyzeTheme(themePath, false);\n\n // Scan each component path\n for (const componentPath of componentPaths) {\n const resolvedPath = path.resolve(componentPath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.warn(`[component-analyzer] Path not found: ${resolvedPath}`);\n continue;\n }\n\n // Find all component directories (those with index.ts or types.ts)\n const componentDirs = findComponentDirs(resolvedPath);\n\n for (const dir of componentDirs) {\n const componentName = path.basename(dir);\n\n // Apply include/exclude filters\n if (include && !include.includes(componentName)) continue;\n if (exclude && exclude.includes(componentName)) continue;\n if (!includeInternal && componentName.startsWith('_')) continue;\n\n const definition = analyzeComponentDir(dir, componentName, themeValues);\n if (definition) {\n registry[componentName] = definition;\n }\n }\n }\n\n return registry;\n}\n\n/**\n * Find all component directories in a path.\n */\nfunction findComponentDirs(basePath: string): string[] {\n const dirs: string[] = [];\n\n const entries = fs.readdirSync(basePath, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const dirPath = path.join(basePath, entry.name);\n\n // Check if it's a component directory (has index.ts or types.ts)\n const hasIndex = fs.existsSync(path.join(dirPath, 'index.ts'));\n const hasTypes = fs.existsSync(path.join(dirPath, 'types.ts'));\n\n if (hasIndex || hasTypes) {\n dirs.push(dirPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Analyze a single component directory.\n */\nfunction analyzeComponentDir(\n dir: string,\n componentName: string,\n themeValues: ThemeValues\n): ComponentDefinition | null {\n // Find all TypeScript files in the component directory\n const tsFiles = fs.readdirSync(dir)\n .filter(f => f.endsWith('.ts') || f.endsWith('.tsx'))\n .map(f => path.join(dir, f));\n\n if (tsFiles.length === 0) {\n return null;\n }\n\n // Create TypeScript program with all files\n const program = ts.createProgram(tsFiles, {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n });\n\n const typeChecker = program.getTypeChecker();\n\n // Search all files for the props interface\n const propsInterfaceName = `${componentName}Props`;\n const altNames = [`${componentName}ComponentProps`, 'Props'];\n let propsInterface: ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null = null;\n let interfaceDescription: string | undefined;\n\n // Search each file for the props interface\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n // First try the main props interface name\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isInterfaceDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n if (ts.isTypeAliasDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n\n // If not found, try alternate naming conventions\n if (!propsInterface) {\n for (const altName of altNames) {\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n if ((ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) && node.name.text === altName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n if (propsInterface) break;\n }\n }\n\n // If we couldn't find a props interface, skip this component\n if (!propsInterface) {\n return null;\n }\n\n // Extract props\n const props: Record<string, PropDefinition> = {};\n\n if (propsInterface) {\n const type = typeChecker.getTypeAtLocation(propsInterface);\n const properties = type.getProperties();\n\n for (const prop of properties) {\n const propDef = analyzeProperty(prop, typeChecker, themeValues);\n if (propDef && !isInternalProp(propDef.name)) {\n props[propDef.name] = propDef;\n }\n }\n }\n\n // Get description from the props interface JSDoc (single source of truth in types.ts)\n const description = interfaceDescription;\n\n // Determine category\n const category = inferCategory(componentName);\n\n // Look for docs.ts to extract sample props\n const sampleProps = extractSampleProps(dir);\n\n return {\n name: componentName,\n description,\n props,\n category,\n filePath: path.relative(process.cwd(), dir),\n sampleProps,\n };\n}\n\n/**\n * Extract sample props from docs.ts file if it exists.\n * The docs.ts file should export a `sampleProps` object.\n */\nfunction extractSampleProps(dir: string): SampleProps | undefined {\n const docsPath = path.join(dir, 'docs.ts');\n\n if (!fs.existsSync(docsPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(docsPath, 'utf-8');\n\n // Create a simple TypeScript program to extract the sampleProps export\n const sourceFile = ts.createSourceFile(\n 'docs.ts',\n content,\n ts.ScriptTarget.ES2020,\n true,\n ts.ScriptKind.TS\n );\n\n let samplePropsNode: ts.ObjectLiteralExpression | null = null;\n\n // Find the sampleProps export\n ts.forEachChild(sourceFile, (node) => {\n // Handle: export const sampleProps = { ... }\n if (ts.isVariableStatement(node)) {\n const isExported = node.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword);\n if (isExported) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.name.text === 'sampleProps' && decl.initializer) {\n if (ts.isObjectLiteralExpression(decl.initializer)) {\n samplePropsNode = decl.initializer;\n }\n }\n }\n }\n }\n });\n\n if (!samplePropsNode) {\n return undefined;\n }\n\n // Extract the object literal as JSON-compatible structure\n // This is a simplified extraction - it handles basic literals\n const result: SampleProps = {};\n const propsNode = samplePropsNode as ts.ObjectLiteralExpression;\n\n for (const prop of propsNode.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const propName = prop.name.text;\n\n if (propName === 'props' && ts.isObjectLiteralExpression(prop.initializer)) {\n result.props = extractObjectLiteral(prop.initializer, content);\n } else if (propName === 'children') {\n // For children, we store the raw source text\n result.children = prop.initializer.getText(sourceFile);\n } else if (propName === 'state' && ts.isObjectLiteralExpression(prop.initializer)) {\n // Extract state configuration for controlled components\n result.state = extractObjectLiteral(prop.initializer, content);\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n } catch (e) {\n console.warn(`[component-analyzer] Error reading docs.ts in ${dir}:`, e);\n return undefined;\n }\n}\n\n/**\n * Extract an object literal to a plain object (for simple literal values).\n */\nfunction extractObjectLiteral(node: ts.ObjectLiteralExpression, sourceContent: string): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const key = prop.name.text;\n const init = prop.initializer;\n\n if (ts.isStringLiteral(init)) {\n result[key] = init.text;\n } else if (ts.isNumericLiteral(init)) {\n result[key] = Number(init.text);\n } else if (init.kind === ts.SyntaxKind.TrueKeyword) {\n result[key] = true;\n } else if (init.kind === ts.SyntaxKind.FalseKeyword) {\n result[key] = false;\n } else if (ts.isArrayLiteralExpression(init)) {\n result[key] = extractArrayLiteral(init, sourceContent);\n } else if (ts.isObjectLiteralExpression(init)) {\n result[key] = extractObjectLiteral(init, sourceContent);\n } else {\n // For complex expressions (JSX, functions), store the raw source\n result[key] = init.getText();\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extract an array literal to a plain array.\n */\nfunction extractArrayLiteral(node: ts.ArrayLiteralExpression, sourceContent: string): any[] {\n const result: any[] = [];\n\n for (const element of node.elements) {\n if (ts.isStringLiteral(element)) {\n result.push(element.text);\n } else if (ts.isNumericLiteral(element)) {\n result.push(Number(element.text));\n } else if (element.kind === ts.SyntaxKind.TrueKeyword) {\n result.push(true);\n } else if (element.kind === ts.SyntaxKind.FalseKeyword) {\n result.push(false);\n } else if (ts.isObjectLiteralExpression(element)) {\n result.push(extractObjectLiteral(element, sourceContent));\n } else if (ts.isArrayLiteralExpression(element)) {\n result.push(extractArrayLiteral(element, sourceContent));\n } else {\n // For complex expressions, store raw source\n result.push(element.getText());\n }\n }\n\n return result;\n}\n\n/**\n * Analyze a single property symbol.\n */\nfunction analyzeProperty(\n symbol: ts.Symbol,\n typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): PropDefinition | null {\n const name = symbol.getName();\n const declarations = symbol.getDeclarations();\n\n if (!declarations || declarations.length === 0) return null;\n\n const declaration = declarations[0];\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n const typeString = typeChecker.typeToString(type);\n\n // Get JSDoc description\n const description = ts.displayPartsToString(symbol.getDocumentationComment(typeChecker)) || undefined;\n\n // Check if required\n const required = !(symbol.flags & ts.SymbolFlags.Optional);\n\n // Extract values for union types / theme types\n const values = extractPropValues(type, typeString, typeChecker, themeValues);\n\n // Extract default value (from JSDoc @default tag)\n const defaultValue = extractDefaultValue(symbol);\n\n return {\n name,\n type: simplifyTypeName(typeString),\n values: values.length > 0 ? values : undefined,\n default: defaultValue,\n description,\n required,\n };\n}\n\n/**\n * Extract valid values for a prop type.\n */\nfunction extractPropValues(\n type: ts.Type,\n typeString: string,\n _typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): string[] {\n // Handle theme-derived types\n if (typeString === 'Intent' || typeString.includes('Intent')) {\n return themeValues.intents;\n }\n if (typeString === 'Size' || typeString.includes('Size')) {\n // Return generic sizes - most components use the same keys\n return ['xs', 'sm', 'md', 'lg', 'xl'];\n }\n\n // Handle union types\n if (type.isUnion()) {\n const values: string[] = [];\n for (const unionType of type.types) {\n if (unionType.isStringLiteral()) {\n values.push(unionType.value);\n } else if ((unionType as any).intrinsicName === 'true') {\n values.push('true');\n } else if ((unionType as any).intrinsicName === 'false') {\n values.push('false');\n }\n }\n if (values.length > 0) return values;\n }\n\n // Handle boolean\n if (typeString === 'boolean') {\n return ['true', 'false'];\n }\n\n return [];\n}\n\n/**\n * Extract default value from JSDoc @default tag.\n */\nfunction extractDefaultValue(symbol: ts.Symbol): string | number | boolean | undefined {\n const tags = symbol.getJsDocTags();\n for (const tag of tags) {\n if (tag.name === 'default' && tag.text) {\n const value = ts.displayPartsToString(tag.text);\n // Try to parse as JSON\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Get JSDoc description from a node.\n */\nfunction getJSDocDescription(node: ts.Node): string | undefined {\n const jsDocs = (node as any).jsDoc as ts.JSDoc[] | undefined;\n if (!jsDocs || jsDocs.length === 0) return undefined;\n\n const firstDoc = jsDocs[0];\n if (firstDoc.comment) {\n if (typeof firstDoc.comment === 'string') {\n return firstDoc.comment;\n }\n // Handle NodeArray of JSDocComment\n return (firstDoc.comment as ts.NodeArray<ts.JSDocComment>)\n .map(c => (c as any).text || '')\n .join('');\n }\n return undefined;\n}\n\n/**\n * Simplify type names for display.\n */\nfunction simplifyTypeName(typeString: string): string {\n // Remove import paths\n typeString = typeString.replace(/import\\([^)]+\\)\\./g, '');\n\n // Simplify common complex types\n if (typeString.includes('ReactNode')) return 'ReactNode';\n if (typeString.includes('StyleProp')) return 'Style';\n\n return typeString;\n}\n\n/**\n * Check if a prop should be excluded (internal/inherited).\n */\nfunction isInternalProp(name: string): boolean {\n const internalProps = [\n 'ref',\n 'key',\n 'children',\n 'style',\n 'testID',\n 'nativeID',\n 'accessible',\n 'accessibilityActions',\n 'accessibilityComponentType',\n 'accessibilityElementsHidden',\n 'accessibilityHint',\n 'accessibilityIgnoresInvertColors',\n 'accessibilityLabel',\n 'accessibilityLabelledBy',\n 'accessibilityLanguage',\n 'accessibilityLiveRegion',\n 'accessibilityRole',\n 'accessibilityState',\n 'accessibilityTraits',\n 'accessibilityValue',\n 'accessibilityViewIsModal',\n 'collapsable',\n 'focusable',\n 'hasTVPreferredFocus',\n 'hitSlop',\n 'importantForAccessibility',\n 'needsOffscreenAlphaCompositing',\n 'onAccessibilityAction',\n 'onAccessibilityEscape',\n 'onAccessibilityTap',\n 'onLayout',\n 'onMagicTap',\n 'onMoveShouldSetResponder',\n 'onMoveShouldSetResponderCapture',\n 'onResponderEnd',\n 'onResponderGrant',\n 'onResponderMove',\n 'onResponderReject',\n 'onResponderRelease',\n 'onResponderStart',\n 'onResponderTerminate',\n 'onResponderTerminationRequest',\n 'onStartShouldSetResponder',\n 'onStartShouldSetResponderCapture',\n 'pointerEvents',\n 'removeClippedSubviews',\n 'renderToHardwareTextureAndroid',\n 'shouldRasterizeIOS',\n 'tvParallaxMagnification',\n 'tvParallaxProperties',\n 'tvParallaxShiftDistanceX',\n 'tvParallaxShiftDistanceY',\n 'tvParallaxTiltAngle',\n ];\n\n return internalProps.includes(name) || name.startsWith('accessibility');\n}\n\n/**\n * Infer component category from name.\n */\nfunction inferCategory(componentName: string): ComponentCategory {\n const formComponents = ['Button', 'Input', 'Checkbox', 'Select', 'Switch', 'RadioButton', 'Slider', 'TextArea'];\n const displayComponents = ['Text', 'Card', 'Badge', 'Chip', 'Avatar', 'Icon', 'Skeleton', 'Alert', 'Tooltip'];\n const layoutComponents = ['View', 'Screen', 'Divider'];\n const navigationComponents = ['TabBar', 'Breadcrumb', 'Menu', 'List', 'Link'];\n const overlayComponents = ['Dialog', 'Popover', 'Modal'];\n const dataComponents = ['Table', 'Progress', 'Accordion'];\n\n if (formComponents.includes(componentName)) return 'form';\n if (displayComponents.includes(componentName)) return 'display';\n if (layoutComponents.includes(componentName)) return 'layout';\n if (navigationComponents.includes(componentName)) return 'navigation';\n if (overlayComponents.includes(componentName)) return 'overlay';\n if (dataComponents.includes(componentName)) return 'data';\n\n return 'display'; // Default\n}\n","/**\n * Theme Analyzer - Extracts theme keys by statically analyzing theme files.\n *\n * Uses TypeScript Compiler API to trace the declarative builder API:\n * - createTheme() / fromTheme(base)\n * - .addIntent('name', {...})\n * - .addRadius('name', value)\n * - .addShadow('name', {...})\n * - .setSizes({ button: { xs: {}, sm: {}, ... }, ... })\n * - .build()\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ThemeValues } from './types';\n\ninterface AnalyzerContext {\n program: ts.Program;\n typeChecker: ts.TypeChecker;\n verbose: boolean;\n}\n\n/**\n * Extract theme values from a theme file.\n */\nexport function analyzeTheme(themePath: string, verbose = false): ThemeValues {\n const resolvedPath = path.resolve(themePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Theme file not found: ${resolvedPath}`);\n }\n\n const log = (...args: any[]) => {\n if (verbose) console.log('[theme-analyzer]', ...args);\n };\n\n log('Analyzing theme file:', resolvedPath);\n\n // Create a TypeScript program\n const program = ts.createProgram([resolvedPath], {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n allowSyntheticDefaultImports: true,\n });\n\n const sourceFile = program.getSourceFile(resolvedPath);\n if (!sourceFile) {\n throw new Error(`Failed to parse theme file: ${resolvedPath}`);\n }\n\n const ctx: AnalyzerContext = {\n program,\n typeChecker: program.getTypeChecker(),\n verbose,\n };\n\n const values: ThemeValues = {\n intents: [],\n sizes: {},\n radii: [],\n shadows: [],\n breakpoints: [],\n typography: [],\n surfaceColors: [],\n textColors: [],\n borderColors: [],\n };\n\n // Track imports for base theme resolution\n const imports = new Map<string, { source: string; imported: string }>();\n\n // First pass: collect imports\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const source = (node.moduleSpecifier as ts.StringLiteral).text;\n const clause = node.importClause;\n if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n const localName = element.name.text;\n const importedName = element.propertyName?.text ?? localName;\n imports.set(localName, { source, imported: importedName });\n }\n }\n }\n });\n\n /**\n * Process a builder method call chain.\n */\n function processBuilderChain(node: ts.Node): void {\n if (!ts.isCallExpression(node)) return;\n\n // Check if this is a .build() call\n if (ts.isPropertyAccessExpression(node.expression)) {\n const methodName = node.expression.name.text;\n\n if (methodName === 'build') {\n // Trace the full chain\n const calls = traceBuilderCalls(node);\n processCalls(calls);\n return;\n }\n }\n\n // Recurse into children\n ts.forEachChild(node, processBuilderChain);\n }\n\n interface BuilderCall {\n method: string;\n args: ts.NodeArray<ts.Expression>;\n }\n\n /**\n * Trace a builder chain backwards to collect all method calls.\n */\n function traceBuilderCalls(node: ts.CallExpression, calls: BuilderCall[] = []): BuilderCall[] {\n if (!ts.isPropertyAccessExpression(node.expression)) {\n // Check for createTheme() or fromTheme()\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const fnName = node.expression.text;\n if (fnName === 'fromTheme' && node.arguments.length > 0) {\n const arg = node.arguments[0];\n if (ts.isIdentifier(arg)) {\n // Analyze base theme\n analyzeBaseTheme(arg.text, imports, values, ctx);\n }\n }\n }\n return calls;\n }\n\n const methodName = node.expression.name.text;\n calls.unshift({ method: methodName, args: node.arguments });\n\n // Recurse into the object being called\n const obj = node.expression.expression;\n if (ts.isCallExpression(obj)) {\n return traceBuilderCalls(obj, calls);\n }\n\n return calls;\n }\n\n /**\n * Process the collected builder method calls.\n */\n function processCalls(calls: BuilderCall[]): void {\n log('Processing', calls.length, 'builder method calls');\n\n for (const { method, args } of calls) {\n switch (method) {\n case 'addIntent': {\n const name = getStringValue(args[0]);\n if (name && !values.intents.includes(name)) {\n values.intents.push(name);\n log(' Found intent:', name);\n }\n break;\n }\n case 'addRadius': {\n const name = getStringValue(args[0]);\n if (name && !values.radii.includes(name)) {\n values.radii.push(name);\n log(' Found radius:', name);\n }\n break;\n }\n case 'addShadow': {\n const name = getStringValue(args[0]);\n if (name && !values.shadows.includes(name)) {\n values.shadows.push(name);\n log(' Found shadow:', name);\n }\n break;\n }\n case 'setSizes': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const componentName = getPropertyName(prop.name);\n if (componentName && ts.isObjectLiteralExpression(prop.initializer)) {\n values.sizes[componentName] = getObjectKeys(prop.initializer);\n log(' Found sizes for', componentName + ':', values.sizes[componentName]);\n }\n }\n }\n }\n break;\n }\n case 'setBreakpoints': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n values.breakpoints = getObjectKeys(args[0]);\n log(' Found breakpoints:', values.breakpoints);\n }\n break;\n }\n case 'setColors': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const colorType = getPropertyName(prop.name);\n if (ts.isObjectLiteralExpression(prop.initializer)) {\n const keys = getObjectKeys(prop.initializer);\n switch (colorType) {\n case 'surface':\n values.surfaceColors = keys;\n log(' Found surface colors:', keys);\n break;\n case 'text':\n values.textColors = keys;\n log(' Found text colors:', keys);\n break;\n case 'border':\n values.borderColors = keys;\n log(' Found border colors:', keys);\n break;\n }\n }\n }\n }\n }\n break;\n }\n case 'build':\n // End of chain\n break;\n default:\n log(' Skipping unknown method:', method);\n }\n }\n }\n\n // Second pass: find and process builder chains\n ts.forEachChild(sourceFile, (node) => {\n // Handle variable declarations\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n processBuilderChain(decl.initializer);\n }\n }\n }\n // Handle export statements\n if (ts.isExportAssignment(node)) {\n processBuilderChain(node.expression);\n }\n });\n\n // Extract typography keys from sizes if present\n if (values.sizes['typography']) {\n values.typography = values.sizes['typography'];\n }\n\n log('Extracted theme values:', values);\n\n return values;\n}\n\n/**\n * Analyze a base theme file referenced by an import.\n */\nfunction analyzeBaseTheme(\n varName: string,\n imports: Map<string, { source: string; imported: string }>,\n values: ThemeValues,\n ctx: AnalyzerContext\n): void {\n const log = (...args: any[]) => {\n if (ctx.verbose) console.log('[theme-analyzer]', ...args);\n };\n\n const importInfo = imports.get(varName);\n if (!importInfo) {\n log('Could not find import for base theme:', varName);\n return;\n }\n\n log('Base theme', varName, 'imported from', importInfo.source);\n\n // For @idealyst/theme imports, we know the structure\n if (importInfo.source === '@idealyst/theme' || importInfo.source.includes('@idealyst/theme')) {\n // Use default light theme values\n const defaultValues = getDefaultThemeValues();\n mergeThemeValues(values, defaultValues);\n log('Using default @idealyst/theme values');\n return;\n }\n\n // For relative imports, try to resolve and analyze\n // (This is simplified - full implementation would recursively analyze)\n log('Skipping base theme analysis for:', importInfo.source);\n}\n\n/**\n * Get default theme values from @idealyst/theme.\n */\nfunction getDefaultThemeValues(): ThemeValues {\n return {\n intents: ['primary', 'success', 'error', 'warning', 'neutral', 'info'],\n sizes: {\n button: ['xs', 'sm', 'md', 'lg', 'xl'],\n chip: ['xs', 'sm', 'md', 'lg', 'xl'],\n badge: ['xs', 'sm', 'md', 'lg', 'xl'],\n icon: ['xs', 'sm', 'md', 'lg', 'xl'],\n input: ['xs', 'sm', 'md', 'lg', 'xl'],\n radioButton: ['xs', 'sm', 'md', 'lg', 'xl'],\n select: ['xs', 'sm', 'md', 'lg', 'xl'],\n slider: ['xs', 'sm', 'md', 'lg', 'xl'],\n switch: ['xs', 'sm', 'md', 'lg', 'xl'],\n textarea: ['xs', 'sm', 'md', 'lg', 'xl'],\n avatar: ['xs', 'sm', 'md', 'lg', 'xl'],\n progress: ['xs', 'sm', 'md', 'lg', 'xl'],\n accordion: ['xs', 'sm', 'md', 'lg', 'xl'],\n activityIndicator: ['xs', 'sm', 'md', 'lg', 'xl'],\n breadcrumb: ['xs', 'sm', 'md', 'lg', 'xl'],\n list: ['xs', 'sm', 'md', 'lg', 'xl'],\n menu: ['xs', 'sm', 'md', 'lg', 'xl'],\n text: ['xs', 'sm', 'md', 'lg', 'xl'],\n tabBar: ['xs', 'sm', 'md', 'lg', 'xl'],\n table: ['xs', 'sm', 'md', 'lg', 'xl'],\n tooltip: ['xs', 'sm', 'md', 'lg', 'xl'],\n view: ['xs', 'sm', 'md', 'lg', 'xl'],\n },\n radii: ['none', 'xs', 'sm', 'md', 'lg', 'xl'],\n shadows: ['none', 'sm', 'md', 'lg', 'xl'],\n breakpoints: ['xs', 'sm', 'md', 'lg', 'xl'],\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n surfaceColors: ['screen', 'primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n textColors: ['primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n borderColors: ['primary', 'secondary', 'tertiary', 'disabled'],\n };\n}\n\n/**\n * Merge theme values, avoiding duplicates.\n */\nfunction mergeThemeValues(target: ThemeValues, source: ThemeValues): void {\n target.intents.push(...source.intents.filter(k => !target.intents.includes(k)));\n target.radii.push(...source.radii.filter(k => !target.radii.includes(k)));\n target.shadows.push(...source.shadows.filter(k => !target.shadows.includes(k)));\n target.breakpoints.push(...source.breakpoints.filter(k => !target.breakpoints.includes(k)));\n target.typography.push(...source.typography.filter(k => !target.typography.includes(k)));\n target.surfaceColors.push(...source.surfaceColors.filter(k => !target.surfaceColors.includes(k)));\n target.textColors.push(...source.textColors.filter(k => !target.textColors.includes(k)));\n target.borderColors.push(...source.borderColors.filter(k => !target.borderColors.includes(k)));\n\n for (const [comp, sizes] of Object.entries(source.sizes)) {\n if (!target.sizes[comp]) {\n target.sizes[comp] = sizes;\n }\n }\n}\n\n// Helper functions\n\nfunction getStringValue(node?: ts.Expression): string | null {\n if (!node) return null;\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isIdentifier(node)) return node.text;\n return null;\n}\n\nfunction getPropertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isStringLiteral(node)) return node.text;\n return null;\n}\n\nfunction getObjectKeys(node: ts.ObjectLiteralExpression): string[] {\n return node.properties\n .filter(ts.isPropertyAssignment)\n .map(prop => getPropertyName(prop.name))\n .filter((k): k is string => k !== null);\n}\n\n// ============================================================================\n// Babel Plugin Compatibility Layer\n// ============================================================================\n\n/**\n * Theme keys format expected by the Babel plugin.\n * This is a subset of ThemeValues for backwards compatibility.\n */\nexport interface BabelThemeKeys {\n intents: string[];\n sizes: Record<string, string[]>;\n radii: string[];\n shadows: string[];\n}\n\n// Cache for loadThemeKeys to avoid re-parsing\nlet themeKeysCache: BabelThemeKeys | null = null;\nlet themeLoadAttempted = false;\n\n/**\n * Load theme keys for the Babel plugin.\n * This is a compatibility wrapper around analyzeTheme() that:\n * - Provides caching (only parses once per build)\n * - Returns the subset of keys needed by the Babel plugin\n * - Handles path resolution based on babel opts\n *\n * @param opts - Babel plugin options (requires themePath)\n * @param rootDir - Root directory for path resolution\n * @param _babelTypes - Unused (kept for backwards compatibility)\n * @param verboseMode - Enable verbose logging\n */\nexport function loadThemeKeys(\n opts: { themePath?: string },\n rootDir: string,\n _babelTypes?: unknown,\n verboseMode = false\n): BabelThemeKeys {\n if (themeLoadAttempted && themeKeysCache) {\n return themeKeysCache;\n }\n themeLoadAttempted = true;\n\n const themePath = opts.themePath;\n\n if (!themePath) {\n throw new Error(\n '[idealyst-plugin] themePath is required!\\n' +\n 'Add it to your babel config:\\n' +\n ' [\"@idealyst/theme/plugin\", { themePath: \"./src/theme/styles.ts\" }]'\n );\n }\n\n // Resolve the path\n const resolvedPath = themePath.startsWith('.')\n ? path.resolve(rootDir, themePath)\n : themePath;\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Analyzing theme file via @idealyst/tooling:', resolvedPath);\n }\n\n // Use the TypeScript-based analyzer\n const themeValues = analyzeTheme(resolvedPath, verboseMode);\n\n // Convert to Babel-compatible format (subset of ThemeValues)\n themeKeysCache = {\n intents: themeValues.intents,\n sizes: themeValues.sizes,\n radii: themeValues.radii,\n shadows: themeValues.shadows,\n };\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Extracted theme keys:');\n console.log(' intents:', themeKeysCache.intents);\n console.log(' radii:', themeKeysCache.radii);\n console.log(' shadows:', themeKeysCache.shadows);\n console.log(' sizes:');\n for (const [component, sizes] of Object.entries(themeKeysCache.sizes)) {\n console.log(` ${component}:`, sizes);\n }\n }\n\n return themeKeysCache;\n}\n\n/**\n * Reset the theme cache. Useful for testing or hot reload.\n */\nexport function resetThemeCache(): void {\n themeKeysCache = null;\n themeLoadAttempted = false;\n}\n"],"mappings":"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","names":["ts","fs","path"]}
1
+ {"version":3,"sources":["../../src/analyzer/index.ts","../../src/analyzer/component-analyzer.ts","../../src/analyzer/theme-analyzer.ts"],"sourcesContent":["/**\n * Component and Theme Analyzers\n *\n * Tools for extracting component metadata from TypeScript source code.\n * Used by both the Vite plugin (for docs generation) and MCP server (for IDE assistance).\n * Also used by the Babel plugin for $iterator expansion.\n */\n\nexport { analyzeComponents } from './component-analyzer';\nexport {\n analyzeTheme,\n loadThemeKeys,\n resetThemeCache,\n type BabelThemeKeys,\n} from './theme-analyzer';\nexport * from './types';\n","/**\n * Component Analyzer - Extracts component prop definitions using TypeScript Compiler API.\n *\n * Analyzes:\n * - types.ts files for prop interfaces\n * - JSDoc comments for descriptions\n * - Static .description properties on components\n * - Theme-derived types (Intent, Size) resolved to actual values\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n ComponentRegistry,\n ComponentDefinition,\n PropDefinition,\n ComponentAnalyzerOptions,\n ThemeValues,\n ComponentCategory,\n SampleProps,\n} from './types';\nimport { analyzeTheme } from './theme-analyzer';\n\n/**\n * Analyze components and generate a registry.\n */\nexport function analyzeComponents(options: ComponentAnalyzerOptions): ComponentRegistry {\n const { componentPaths, themePath, include, exclude, includeInternal = false } = options;\n\n const registry: ComponentRegistry = {};\n\n // First, analyze the theme to get valid values\n const themeValues = analyzeTheme(themePath, false);\n\n // Scan each component path\n for (const componentPath of componentPaths) {\n const resolvedPath = path.resolve(componentPath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.warn(`[component-analyzer] Path not found: ${resolvedPath}`);\n continue;\n }\n\n // Find all component directories (those with index.ts or types.ts)\n const componentDirs = findComponentDirs(resolvedPath);\n\n for (const dir of componentDirs) {\n const componentName = path.basename(dir);\n\n // Apply include/exclude filters\n if (include && !include.includes(componentName)) continue;\n if (exclude && exclude.includes(componentName)) continue;\n if (!includeInternal && componentName.startsWith('_')) continue;\n\n const definition = analyzeComponentDir(dir, componentName, themeValues);\n if (definition) {\n registry[componentName] = definition;\n }\n }\n }\n\n return registry;\n}\n\n/**\n * Find all component directories in a path.\n */\nfunction findComponentDirs(basePath: string): string[] {\n const dirs: string[] = [];\n\n const entries = fs.readdirSync(basePath, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const dirPath = path.join(basePath, entry.name);\n\n // Check if it's a component directory (has index.ts or types.ts)\n const hasIndex = fs.existsSync(path.join(dirPath, 'index.ts'));\n const hasTypes = fs.existsSync(path.join(dirPath, 'types.ts'));\n\n if (hasIndex || hasTypes) {\n dirs.push(dirPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Analyze a single component directory.\n */\nfunction analyzeComponentDir(\n dir: string,\n componentName: string,\n themeValues: ThemeValues\n): ComponentDefinition | null {\n // Find all TypeScript files in the component directory\n const tsFiles = fs.readdirSync(dir)\n .filter(f => f.endsWith('.ts') || f.endsWith('.tsx'))\n .map(f => path.join(dir, f));\n\n if (tsFiles.length === 0) {\n return null;\n }\n\n // Create TypeScript program with all files\n const program = ts.createProgram(tsFiles, {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n });\n\n const typeChecker = program.getTypeChecker();\n\n // Search all files for the props interface\n const propsInterfaceName = `${componentName}Props`;\n const altNames = [`${componentName}ComponentProps`, 'Props'];\n let propsInterface: ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null = null;\n let interfaceDescription: string | undefined;\n\n // Search each file for the props interface\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n // First try the main props interface name\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isInterfaceDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n if (ts.isTypeAliasDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n\n // If not found, try alternate naming conventions\n if (!propsInterface) {\n for (const altName of altNames) {\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n if ((ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) && node.name.text === altName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n if (propsInterface) break;\n }\n }\n\n // If we couldn't find a props interface, skip this component\n if (!propsInterface) {\n return null;\n }\n\n // Extract props\n const props: Record<string, PropDefinition> = {};\n\n if (propsInterface) {\n const type = typeChecker.getTypeAtLocation(propsInterface);\n const properties = type.getProperties();\n\n for (const prop of properties) {\n const propDef = analyzeProperty(prop, typeChecker, themeValues);\n if (propDef && !isInternalProp(propDef.name)) {\n props[propDef.name] = propDef;\n }\n }\n }\n\n // Get description from the props interface JSDoc (single source of truth in types.ts)\n const description = interfaceDescription;\n\n // Determine category\n const category = inferCategory(componentName);\n\n // Look for docs.ts to extract sample props\n const sampleProps = extractSampleProps(dir);\n\n return {\n name: componentName,\n description,\n props,\n category,\n filePath: path.relative(process.cwd(), dir),\n sampleProps,\n };\n}\n\n/**\n * Extract sample props from docs.ts file if it exists.\n * The docs.ts file should export a `sampleProps` object.\n */\nfunction extractSampleProps(dir: string): SampleProps | undefined {\n const docsPath = path.join(dir, 'docs.ts');\n\n if (!fs.existsSync(docsPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(docsPath, 'utf-8');\n\n // Create a simple TypeScript program to extract the sampleProps export\n const sourceFile = ts.createSourceFile(\n 'docs.ts',\n content,\n ts.ScriptTarget.ES2020,\n true,\n ts.ScriptKind.TS\n );\n\n let samplePropsNode: ts.ObjectLiteralExpression | null = null;\n\n // Find the sampleProps export\n ts.forEachChild(sourceFile, (node) => {\n // Handle: export const sampleProps = { ... }\n if (ts.isVariableStatement(node)) {\n const isExported = node.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword);\n if (isExported) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.name.text === 'sampleProps' && decl.initializer) {\n if (ts.isObjectLiteralExpression(decl.initializer)) {\n samplePropsNode = decl.initializer;\n }\n }\n }\n }\n }\n });\n\n if (!samplePropsNode) {\n return undefined;\n }\n\n // Extract the object literal as JSON-compatible structure\n // This is a simplified extraction - it handles basic literals\n const result: SampleProps = {};\n const propsNode = samplePropsNode as ts.ObjectLiteralExpression;\n\n for (const prop of propsNode.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const propName = prop.name.text;\n\n if (propName === 'props' && ts.isObjectLiteralExpression(prop.initializer)) {\n result.props = extractObjectLiteral(prop.initializer, content);\n } else if (propName === 'children') {\n // For children, we store the raw source text\n result.children = prop.initializer.getText(sourceFile);\n } else if (propName === 'state' && ts.isObjectLiteralExpression(prop.initializer)) {\n // Extract state configuration for controlled components\n result.state = extractObjectLiteral(prop.initializer, content);\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n } catch (e) {\n console.warn(`[component-analyzer] Error reading docs.ts in ${dir}:`, e);\n return undefined;\n }\n}\n\n/**\n * Extract an object literal to a plain object (for simple literal values).\n */\nfunction extractObjectLiteral(node: ts.ObjectLiteralExpression, sourceContent: string): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const key = prop.name.text;\n const init = prop.initializer;\n\n if (ts.isStringLiteral(init)) {\n result[key] = init.text;\n } else if (ts.isNumericLiteral(init)) {\n result[key] = Number(init.text);\n } else if (init.kind === ts.SyntaxKind.TrueKeyword) {\n result[key] = true;\n } else if (init.kind === ts.SyntaxKind.FalseKeyword) {\n result[key] = false;\n } else if (ts.isArrayLiteralExpression(init)) {\n result[key] = extractArrayLiteral(init, sourceContent);\n } else if (ts.isObjectLiteralExpression(init)) {\n result[key] = extractObjectLiteral(init, sourceContent);\n } else {\n // For complex expressions (JSX, functions), store the raw source\n result[key] = init.getText();\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extract an array literal to a plain array.\n */\nfunction extractArrayLiteral(node: ts.ArrayLiteralExpression, sourceContent: string): any[] {\n const result: any[] = [];\n\n for (const element of node.elements) {\n if (ts.isStringLiteral(element)) {\n result.push(element.text);\n } else if (ts.isNumericLiteral(element)) {\n result.push(Number(element.text));\n } else if (element.kind === ts.SyntaxKind.TrueKeyword) {\n result.push(true);\n } else if (element.kind === ts.SyntaxKind.FalseKeyword) {\n result.push(false);\n } else if (ts.isObjectLiteralExpression(element)) {\n result.push(extractObjectLiteral(element, sourceContent));\n } else if (ts.isArrayLiteralExpression(element)) {\n result.push(extractArrayLiteral(element, sourceContent));\n } else {\n // For complex expressions, store raw source\n result.push(element.getText());\n }\n }\n\n return result;\n}\n\n/**\n * Analyze a single property symbol.\n */\nfunction analyzeProperty(\n symbol: ts.Symbol,\n typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): PropDefinition | null {\n const name = symbol.getName();\n const declarations = symbol.getDeclarations();\n\n if (!declarations || declarations.length === 0) return null;\n\n const declaration = declarations[0];\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n const typeString = typeChecker.typeToString(type);\n\n // Get JSDoc description\n const description = ts.displayPartsToString(symbol.getDocumentationComment(typeChecker)) || undefined;\n\n // Check if required\n const required = !(symbol.flags & ts.SymbolFlags.Optional);\n\n // Extract values for union types / theme types\n const values = extractPropValues(type, typeString, typeChecker, themeValues);\n\n // Extract default value (from JSDoc @default tag)\n const defaultValue = extractDefaultValue(symbol);\n\n return {\n name,\n type: simplifyTypeName(typeString),\n values: values.length > 0 ? values : undefined,\n default: defaultValue,\n description,\n required,\n };\n}\n\n/**\n * Extract valid values for a prop type.\n */\nfunction extractPropValues(\n type: ts.Type,\n typeString: string,\n _typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): string[] {\n // Handle theme-derived types\n if (typeString === 'Intent' || typeString.includes('Intent')) {\n return themeValues.intents;\n }\n if (typeString === 'Size' || typeString.includes('Size')) {\n // Return generic sizes - most components use the same keys\n return ['xs', 'sm', 'md', 'lg', 'xl'];\n }\n\n // Handle union types\n if (type.isUnion()) {\n const values: string[] = [];\n for (const unionType of type.types) {\n if (unionType.isStringLiteral()) {\n values.push(unionType.value);\n } else if ((unionType as any).intrinsicName === 'true') {\n values.push('true');\n } else if ((unionType as any).intrinsicName === 'false') {\n values.push('false');\n }\n }\n if (values.length > 0) return values;\n }\n\n // Handle boolean\n if (typeString === 'boolean') {\n return ['true', 'false'];\n }\n\n return [];\n}\n\n/**\n * Extract default value from JSDoc @default tag.\n */\nfunction extractDefaultValue(symbol: ts.Symbol): string | number | boolean | undefined {\n const tags = symbol.getJsDocTags();\n for (const tag of tags) {\n if (tag.name === 'default' && tag.text) {\n const value = ts.displayPartsToString(tag.text);\n // Try to parse as JSON\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Get JSDoc description from a node.\n */\nfunction getJSDocDescription(node: ts.Node): string | undefined {\n const jsDocs = (node as any).jsDoc as ts.JSDoc[] | undefined;\n if (!jsDocs || jsDocs.length === 0) return undefined;\n\n const firstDoc = jsDocs[0];\n if (firstDoc.comment) {\n if (typeof firstDoc.comment === 'string') {\n return firstDoc.comment;\n }\n // Handle NodeArray of JSDocComment\n return (firstDoc.comment as ts.NodeArray<ts.JSDocComment>)\n .map(c => (c as any).text || '')\n .join('');\n }\n return undefined;\n}\n\n/**\n * Simplify type names for display.\n */\nfunction simplifyTypeName(typeString: string): string {\n // Remove import paths\n typeString = typeString.replace(/import\\([^)]+\\)\\./g, '');\n\n // Simplify common complex types\n if (typeString.includes('ReactNode')) return 'ReactNode';\n if (typeString.includes('StyleProp')) return 'Style';\n\n return typeString;\n}\n\n/**\n * Check if a prop should be excluded (internal/inherited).\n */\nfunction isInternalProp(name: string): boolean {\n const internalProps = [\n 'ref',\n 'key',\n 'children',\n 'style',\n 'testID',\n 'nativeID',\n 'accessible',\n 'accessibilityActions',\n 'accessibilityComponentType',\n 'accessibilityElementsHidden',\n 'accessibilityHint',\n 'accessibilityIgnoresInvertColors',\n 'accessibilityLabel',\n 'accessibilityLabelledBy',\n 'accessibilityLanguage',\n 'accessibilityLiveRegion',\n 'accessibilityRole',\n 'accessibilityState',\n 'accessibilityTraits',\n 'accessibilityValue',\n 'accessibilityViewIsModal',\n 'collapsable',\n 'focusable',\n 'hasTVPreferredFocus',\n 'hitSlop',\n 'importantForAccessibility',\n 'needsOffscreenAlphaCompositing',\n 'onAccessibilityAction',\n 'onAccessibilityEscape',\n 'onAccessibilityTap',\n 'onLayout',\n 'onMagicTap',\n 'onMoveShouldSetResponder',\n 'onMoveShouldSetResponderCapture',\n 'onResponderEnd',\n 'onResponderGrant',\n 'onResponderMove',\n 'onResponderReject',\n 'onResponderRelease',\n 'onResponderStart',\n 'onResponderTerminate',\n 'onResponderTerminationRequest',\n 'onStartShouldSetResponder',\n 'onStartShouldSetResponderCapture',\n 'pointerEvents',\n 'removeClippedSubviews',\n 'renderToHardwareTextureAndroid',\n 'shouldRasterizeIOS',\n 'tvParallaxMagnification',\n 'tvParallaxProperties',\n 'tvParallaxShiftDistanceX',\n 'tvParallaxShiftDistanceY',\n 'tvParallaxTiltAngle',\n ];\n\n return internalProps.includes(name) || name.startsWith('accessibility');\n}\n\n/**\n * Infer component category from name.\n */\nfunction inferCategory(componentName: string): ComponentCategory {\n const formComponents = ['Button', 'Input', 'Checkbox', 'Select', 'Switch', 'RadioButton', 'Slider', 'TextArea'];\n const displayComponents = ['Text', 'Card', 'Badge', 'Chip', 'Avatar', 'Icon', 'Skeleton', 'Alert', 'Tooltip'];\n const layoutComponents = ['View', 'Screen', 'Divider'];\n const navigationComponents = ['TabBar', 'Breadcrumb', 'Menu', 'List', 'Link'];\n const overlayComponents = ['Dialog', 'Popover', 'Modal'];\n const dataComponents = ['Table', 'Progress', 'Accordion'];\n\n if (formComponents.includes(componentName)) return 'form';\n if (displayComponents.includes(componentName)) return 'display';\n if (layoutComponents.includes(componentName)) return 'layout';\n if (navigationComponents.includes(componentName)) return 'navigation';\n if (overlayComponents.includes(componentName)) return 'overlay';\n if (dataComponents.includes(componentName)) return 'data';\n\n return 'display'; // Default\n}\n","/**\n * Theme Analyzer - Extracts theme keys by statically analyzing theme files.\n *\n * Uses TypeScript Compiler API to trace the declarative builder API:\n * - createTheme() / fromTheme(base)\n * - .addIntent('name', {...})\n * - .addRadius('name', value)\n * - .addShadow('name', {...})\n * - .setSizes({ button: { xs: {}, sm: {}, ... }, ... })\n * - .build()\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ThemeValues } from './types';\n\ninterface AnalyzerContext {\n program: ts.Program;\n typeChecker: ts.TypeChecker;\n verbose: boolean;\n}\n\n/**\n * Extract theme values from a theme file.\n */\nexport function analyzeTheme(themePath: string, verbose = false): ThemeValues {\n const resolvedPath = path.resolve(themePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Theme file not found: ${resolvedPath}`);\n }\n\n const log = (...args: any[]) => {\n if (verbose) console.log('[theme-analyzer]', ...args);\n };\n\n log('Analyzing theme file:', resolvedPath);\n\n // Create a TypeScript program\n const program = ts.createProgram([resolvedPath], {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n allowSyntheticDefaultImports: true,\n });\n\n const sourceFile = program.getSourceFile(resolvedPath);\n if (!sourceFile) {\n throw new Error(`Failed to parse theme file: ${resolvedPath}`);\n }\n\n const ctx: AnalyzerContext = {\n program,\n typeChecker: program.getTypeChecker(),\n verbose,\n };\n\n const values: ThemeValues = {\n intents: [],\n sizes: {},\n radii: [],\n shadows: [],\n breakpoints: [],\n typography: [],\n surfaceColors: [],\n textColors: [],\n borderColors: [],\n };\n\n // Track imports for base theme resolution\n const imports = new Map<string, { source: string; imported: string }>();\n\n // First pass: collect imports\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const source = (node.moduleSpecifier as ts.StringLiteral).text;\n const clause = node.importClause;\n if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n const localName = element.name.text;\n const importedName = element.propertyName?.text ?? localName;\n imports.set(localName, { source, imported: importedName });\n }\n }\n }\n });\n\n /**\n * Process a builder method call chain.\n */\n function processBuilderChain(node: ts.Node): void {\n if (!ts.isCallExpression(node)) return;\n\n // Check if this is a .build() call\n if (ts.isPropertyAccessExpression(node.expression)) {\n const methodName = node.expression.name.text;\n\n if (methodName === 'build') {\n // Trace the full chain\n const calls = traceBuilderCalls(node);\n processCalls(calls);\n return;\n }\n }\n\n // Recurse into children\n ts.forEachChild(node, processBuilderChain);\n }\n\n interface BuilderCall {\n method: string;\n args: ts.NodeArray<ts.Expression>;\n }\n\n /**\n * Trace a builder chain backwards to collect all method calls.\n */\n function traceBuilderCalls(node: ts.CallExpression, calls: BuilderCall[] = []): BuilderCall[] {\n if (!ts.isPropertyAccessExpression(node.expression)) {\n // Check for createTheme() or fromTheme()\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const fnName = node.expression.text;\n if (fnName === 'fromTheme' && node.arguments.length > 0) {\n const arg = node.arguments[0];\n if (ts.isIdentifier(arg)) {\n // Analyze base theme\n analyzeBaseTheme(arg.text, imports, values, ctx);\n }\n }\n }\n return calls;\n }\n\n const methodName = node.expression.name.text;\n calls.unshift({ method: methodName, args: node.arguments });\n\n // Recurse into the object being called\n const obj = node.expression.expression;\n if (ts.isCallExpression(obj)) {\n return traceBuilderCalls(obj, calls);\n }\n\n return calls;\n }\n\n /**\n * Process the collected builder method calls.\n */\n function processCalls(calls: BuilderCall[]): void {\n log('Processing', calls.length, 'builder method calls');\n\n for (const { method, args } of calls) {\n switch (method) {\n case 'addIntent': {\n const name = getStringValue(args[0]);\n if (name && !values.intents.includes(name)) {\n values.intents.push(name);\n log(' Found intent:', name);\n }\n break;\n }\n case 'addRadius': {\n const name = getStringValue(args[0]);\n if (name && !values.radii.includes(name)) {\n values.radii.push(name);\n log(' Found radius:', name);\n }\n break;\n }\n case 'addShadow': {\n const name = getStringValue(args[0]);\n if (name && !values.shadows.includes(name)) {\n values.shadows.push(name);\n log(' Found shadow:', name);\n }\n break;\n }\n case 'setSizes': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const componentName = getPropertyName(prop.name);\n if (componentName && ts.isObjectLiteralExpression(prop.initializer)) {\n values.sizes[componentName] = getObjectKeys(prop.initializer);\n log(' Found sizes for', componentName + ':', values.sizes[componentName]);\n }\n }\n }\n }\n break;\n }\n case 'setBreakpoints': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n values.breakpoints = getObjectKeys(args[0]);\n log(' Found breakpoints:', values.breakpoints);\n }\n break;\n }\n case 'setColors': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const colorType = getPropertyName(prop.name);\n if (ts.isObjectLiteralExpression(prop.initializer)) {\n const keys = getObjectKeys(prop.initializer);\n switch (colorType) {\n case 'surface':\n values.surfaceColors = keys;\n log(' Found surface colors:', keys);\n break;\n case 'text':\n values.textColors = keys;\n log(' Found text colors:', keys);\n break;\n case 'border':\n values.borderColors = keys;\n log(' Found border colors:', keys);\n break;\n }\n }\n }\n }\n }\n break;\n }\n case 'build':\n // End of chain\n break;\n default:\n log(' Skipping unknown method:', method);\n }\n }\n }\n\n // Second pass: find and process builder chains\n ts.forEachChild(sourceFile, (node) => {\n // Handle variable declarations\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n processBuilderChain(decl.initializer);\n }\n }\n }\n // Handle export statements\n if (ts.isExportAssignment(node)) {\n processBuilderChain(node.expression);\n }\n });\n\n // Extract typography keys from sizes if present\n if (values.sizes['typography']) {\n values.typography = values.sizes['typography'];\n }\n\n log('Extracted theme values:', values);\n\n return values;\n}\n\n/**\n * Analyze a base theme file referenced by an import.\n */\nfunction analyzeBaseTheme(\n varName: string,\n imports: Map<string, { source: string; imported: string }>,\n values: ThemeValues,\n ctx: AnalyzerContext\n): void {\n const log = (...args: any[]) => {\n if (ctx.verbose) console.log('[theme-analyzer]', ...args);\n };\n\n const importInfo = imports.get(varName);\n if (!importInfo) {\n log('Could not find import for base theme:', varName);\n return;\n }\n\n log('Base theme', varName, 'imported from', importInfo.source);\n\n // For @idealyst/theme imports, we know the structure\n if (importInfo.source === '@idealyst/theme' || importInfo.source.includes('@idealyst/theme')) {\n // Use default light theme values\n const defaultValues = getDefaultThemeValues();\n mergeThemeValues(values, defaultValues);\n log('Using default @idealyst/theme values');\n return;\n }\n\n // For relative imports, try to resolve and analyze\n // (This is simplified - full implementation would recursively analyze)\n log('Skipping base theme analysis for:', importInfo.source);\n}\n\n/**\n * Get default theme values from @idealyst/theme.\n */\nfunction getDefaultThemeValues(): ThemeValues {\n return {\n intents: ['primary', 'success', 'error', 'warning', 'neutral', 'info'],\n sizes: {\n button: ['xs', 'sm', 'md', 'lg', 'xl'],\n chip: ['xs', 'sm', 'md', 'lg', 'xl'],\n badge: ['xs', 'sm', 'md', 'lg', 'xl'],\n icon: ['xs', 'sm', 'md', 'lg', 'xl'],\n input: ['xs', 'sm', 'md', 'lg', 'xl'],\n radioButton: ['xs', 'sm', 'md', 'lg', 'xl'],\n select: ['xs', 'sm', 'md', 'lg', 'xl'],\n slider: ['xs', 'sm', 'md', 'lg', 'xl'],\n switch: ['xs', 'sm', 'md', 'lg', 'xl'],\n textarea: ['xs', 'sm', 'md', 'lg', 'xl'],\n avatar: ['xs', 'sm', 'md', 'lg', 'xl'],\n progress: ['xs', 'sm', 'md', 'lg', 'xl'],\n accordion: ['xs', 'sm', 'md', 'lg', 'xl'],\n activityIndicator: ['xs', 'sm', 'md', 'lg', 'xl'],\n breadcrumb: ['xs', 'sm', 'md', 'lg', 'xl'],\n list: ['xs', 'sm', 'md', 'lg', 'xl'],\n menu: ['xs', 'sm', 'md', 'lg', 'xl'],\n text: ['xs', 'sm', 'md', 'lg', 'xl'],\n tabBar: ['xs', 'sm', 'md', 'lg', 'xl'],\n table: ['xs', 'sm', 'md', 'lg', 'xl'],\n tooltip: ['xs', 'sm', 'md', 'lg', 'xl'],\n view: ['xs', 'sm', 'md', 'lg', 'xl'],\n // Typography sizes for Text component's $typography iterator\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n },\n radii: ['none', 'xs', 'sm', 'md', 'lg', 'xl'],\n shadows: ['none', 'sm', 'md', 'lg', 'xl'],\n breakpoints: ['xs', 'sm', 'md', 'lg', 'xl'],\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n surfaceColors: ['screen', 'primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n textColors: ['primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n borderColors: ['primary', 'secondary', 'tertiary', 'disabled'],\n };\n}\n\n/**\n * Merge theme values, avoiding duplicates.\n */\nfunction mergeThemeValues(target: ThemeValues, source: ThemeValues): void {\n target.intents.push(...source.intents.filter(k => !target.intents.includes(k)));\n target.radii.push(...source.radii.filter(k => !target.radii.includes(k)));\n target.shadows.push(...source.shadows.filter(k => !target.shadows.includes(k)));\n target.breakpoints.push(...source.breakpoints.filter(k => !target.breakpoints.includes(k)));\n target.typography.push(...source.typography.filter(k => !target.typography.includes(k)));\n target.surfaceColors.push(...source.surfaceColors.filter(k => !target.surfaceColors.includes(k)));\n target.textColors.push(...source.textColors.filter(k => !target.textColors.includes(k)));\n target.borderColors.push(...source.borderColors.filter(k => !target.borderColors.includes(k)));\n\n for (const [comp, sizes] of Object.entries(source.sizes)) {\n if (!target.sizes[comp]) {\n target.sizes[comp] = sizes;\n }\n }\n}\n\n// Helper functions\n\nfunction getStringValue(node?: ts.Expression): string | null {\n if (!node) return null;\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isIdentifier(node)) return node.text;\n return null;\n}\n\nfunction getPropertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isStringLiteral(node)) return node.text;\n return null;\n}\n\nfunction getObjectKeys(node: ts.ObjectLiteralExpression): string[] {\n return node.properties\n .filter(ts.isPropertyAssignment)\n .map(prop => getPropertyName(prop.name))\n .filter((k): k is string => k !== null);\n}\n\n// ============================================================================\n// Babel Plugin Compatibility Layer\n// ============================================================================\n\n/**\n * Theme keys format expected by the Babel plugin.\n * This is a subset of ThemeValues for backwards compatibility.\n */\nexport interface BabelThemeKeys {\n intents: string[];\n sizes: Record<string, string[]>;\n radii: string[];\n shadows: string[];\n typography: string[];\n}\n\n// Cache for loadThemeKeys to avoid re-parsing\nlet themeKeysCache: BabelThemeKeys | null = null;\nlet themeLoadAttempted = false;\n\n/**\n * Load theme keys for the Babel plugin.\n * This is a compatibility wrapper around analyzeTheme() that:\n * - Provides caching (only parses once per build)\n * - Returns the subset of keys needed by the Babel plugin\n * - Handles path resolution based on babel opts\n *\n * @param opts - Babel plugin options (requires themePath)\n * @param rootDir - Root directory for path resolution\n * @param _babelTypes - Unused (kept for backwards compatibility)\n * @param verboseMode - Enable verbose logging\n */\nexport function loadThemeKeys(\n opts: { themePath?: string },\n rootDir: string,\n _babelTypes?: unknown,\n verboseMode = false\n): BabelThemeKeys {\n if (themeLoadAttempted && themeKeysCache) {\n return themeKeysCache;\n }\n themeLoadAttempted = true;\n\n const themePath = opts.themePath;\n\n if (!themePath) {\n throw new Error(\n '[idealyst-plugin] themePath is required!\\n' +\n 'Add it to your babel config:\\n' +\n ' [\"@idealyst/theme/plugin\", { themePath: \"./src/theme/styles.ts\" }]'\n );\n }\n\n // Resolve the path\n const resolvedPath = themePath.startsWith('.')\n ? path.resolve(rootDir, themePath)\n : themePath;\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Analyzing theme file via @idealyst/tooling:', resolvedPath);\n }\n\n // Use the TypeScript-based analyzer\n const themeValues = analyzeTheme(resolvedPath, verboseMode);\n\n // Convert to Babel-compatible format (subset of ThemeValues)\n themeKeysCache = {\n intents: themeValues.intents,\n sizes: themeValues.sizes,\n radii: themeValues.radii,\n shadows: themeValues.shadows,\n typography: themeValues.typography,\n };\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Extracted theme keys:');\n console.log(' intents:', themeKeysCache.intents);\n console.log(' radii:', themeKeysCache.radii);\n console.log(' shadows:', themeKeysCache.shadows);\n console.log(' sizes:');\n for (const [component, sizes] of Object.entries(themeKeysCache.sizes)) {\n console.log(` ${component}:`, sizes);\n }\n }\n\n return themeKeysCache;\n}\n\n/**\n * Reset the theme cache. Useful for testing or hot reload.\n */\nexport function resetThemeCache(): void {\n themeKeysCache = null;\n themeLoadAttempted = false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUA,IAAAA,MAAoB;AACpB,IAAAC,MAAoB;AACpB,IAAAC,QAAsB;;;ACAtB,SAAoB;AACpB,SAAoB;AACpB,WAAsB;AAYf,SAAS,aAAa,WAAmB,UAAU,OAAoB;AAC5E,QAAM,eAAoB,aAAQ,SAAS;AAE3C,MAAI,CAAI,cAAW,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB,YAAY,EAAE;AAAA,EACzD;AAEA,QAAM,MAAM,IAAI,SAAgB;AAC9B,QAAI,QAAS,SAAQ,IAAI,oBAAoB,GAAG,IAAI;AAAA,EACtD;AAEA,MAAI,yBAAyB,YAAY;AAGzC,QAAM,UAAa,iBAAc,CAAC,YAAY,GAAG;AAAA,IAC/C,QAAW,gBAAa;AAAA,IACxB,QAAW,cAAW;AAAA,IACtB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,8BAA8B;AAAA,EAChC,CAAC;AAED,QAAM,aAAa,QAAQ,cAAc,YAAY;AACrD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,EAC/D;AAEA,QAAM,MAAuB;AAAA,IAC3B;AAAA,IACA,aAAa,QAAQ,eAAe;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,SAAsB;AAAA,IAC1B,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,YAAY,CAAC;AAAA,IACb,eAAe,CAAC;AAAA,IAChB,YAAY,CAAC;AAAA,IACb,cAAc,CAAC;AAAA,EACjB;AAGA,QAAM,UAAU,oBAAI,IAAkD;AAGtE,EAAG,gBAAa,YAAY,CAAC,SAAS;AACpC,QAAO,uBAAoB,IAAI,GAAG;AAChC,YAAM,SAAU,KAAK,gBAAqC;AAC1D,YAAM,SAAS,KAAK;AACpB,UAAI,QAAQ,iBAAoB,kBAAe,OAAO,aAAa,GAAG;AACpE,mBAAW,WAAW,OAAO,cAAc,UAAU;AACnD,gBAAM,YAAY,QAAQ,KAAK;AAC/B,gBAAM,eAAe,QAAQ,cAAc,QAAQ;AACnD,kBAAQ,IAAI,WAAW,EAAE,QAAQ,UAAU,aAAa,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAKD,WAAS,oBAAoB,MAAqB;AAChD,QAAI,CAAI,oBAAiB,IAAI,EAAG;AAGhC,QAAO,8BAA2B,KAAK,UAAU,GAAG;AAClD,YAAM,aAAa,KAAK,WAAW,KAAK;AAExC,UAAI,eAAe,SAAS;AAE1B,cAAM,QAAQ,kBAAkB,IAAI;AACpC,qBAAa,KAAK;AAClB;AAAA,MACF;AAAA,IACF;AAGA,IAAG,gBAAa,MAAM,mBAAmB;AAAA,EAC3C;AAUA,WAAS,kBAAkB,MAAyB,QAAuB,CAAC,GAAkB;AAC5F,QAAI,CAAI,8BAA2B,KAAK,UAAU,GAAG;AAEnD,UAAO,oBAAiB,IAAI,KAAQ,gBAAa,KAAK,UAAU,GAAG;AACjE,cAAM,SAAS,KAAK,WAAW;AAC/B,YAAI,WAAW,eAAe,KAAK,UAAU,SAAS,GAAG;AACvD,gBAAM,MAAM,KAAK,UAAU,CAAC;AAC5B,cAAO,gBAAa,GAAG,GAAG;AAExB,6BAAiB,IAAI,MAAM,SAAS,QAAQ,GAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,WAAW,KAAK;AACxC,UAAM,QAAQ,EAAE,QAAQ,YAAY,MAAM,KAAK,UAAU,CAAC;AAG1D,UAAM,MAAM,KAAK,WAAW;AAC5B,QAAO,oBAAiB,GAAG,GAAG;AAC5B,aAAO,kBAAkB,KAAK,KAAK;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAKA,WAAS,aAAa,OAA4B;AAChD,QAAI,cAAc,MAAM,QAAQ,sBAAsB;AAEtD,eAAW,EAAE,QAAQ,KAAK,KAAK,OAAO;AACpC,cAAQ,QAAQ;AAAA,QACd,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,QAAQ,SAAS,IAAI,GAAG;AAC1C,mBAAO,QAAQ,KAAK,IAAI;AACxB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,MAAM,SAAS,IAAI,GAAG;AACxC,mBAAO,MAAM,KAAK,IAAI;AACtB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,QAAQ,SAAS,IAAI,GAAG;AAC1C,mBAAO,QAAQ,KAAK,IAAI;AACxB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,uBAAW,QAAQ,KAAK,CAAC,EAAE,YAAY;AACrC,kBAAO,wBAAqB,IAAI,GAAG;AACjC,sBAAM,gBAAgB,gBAAgB,KAAK,IAAI;AAC/C,oBAAI,iBAAoB,6BAA0B,KAAK,WAAW,GAAG;AACnE,yBAAO,MAAM,aAAa,IAAI,cAAc,KAAK,WAAW;AAC5D,sBAAI,qBAAqB,gBAAgB,KAAK,OAAO,MAAM,aAAa,CAAC;AAAA,gBAC3E;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,mBAAO,cAAc,cAAc,KAAK,CAAC,CAAC;AAC1C,gBAAI,wBAAwB,OAAO,WAAW;AAAA,UAChD;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,uBAAW,QAAQ,KAAK,CAAC,EAAE,YAAY;AACrC,kBAAO,wBAAqB,IAAI,GAAG;AACjC,sBAAM,YAAY,gBAAgB,KAAK,IAAI;AAC3C,oBAAO,6BAA0B,KAAK,WAAW,GAAG;AAClD,wBAAM,OAAO,cAAc,KAAK,WAAW;AAC3C,0BAAQ,WAAW;AAAA,oBACjB,KAAK;AACH,6BAAO,gBAAgB;AACvB,0BAAI,2BAA2B,IAAI;AACnC;AAAA,oBACF,KAAK;AACH,6BAAO,aAAa;AACpB,0BAAI,wBAAwB,IAAI;AAChC;AAAA,oBACF,KAAK;AACH,6BAAO,eAAe;AACtB,0BAAI,0BAA0B,IAAI;AAClC;AAAA,kBACJ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK;AAEH;AAAA,QACF;AACE,cAAI,8BAA8B,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,EAAG,gBAAa,YAAY,CAAC,SAAS;AAEpC,QAAO,uBAAoB,IAAI,GAAG;AAChC,iBAAW,QAAQ,KAAK,gBAAgB,cAAc;AACpD,YAAI,KAAK,aAAa;AACpB,8BAAoB,KAAK,WAAW;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,QAAO,sBAAmB,IAAI,GAAG;AAC/B,0BAAoB,KAAK,UAAU;AAAA,IACrC;AAAA,EACF,CAAC;AAGD,MAAI,OAAO,MAAM,YAAY,GAAG;AAC9B,WAAO,aAAa,OAAO,MAAM,YAAY;AAAA,EAC/C;AAEA,MAAI,2BAA2B,MAAM;AAErC,SAAO;AACT;AAKA,SAAS,iBACP,SACA,SACA,QACA,KACM;AACN,QAAM,MAAM,IAAI,SAAgB;AAC9B,QAAI,IAAI,QAAS,SAAQ,IAAI,oBAAoB,GAAG,IAAI;AAAA,EAC1D;AAEA,QAAM,aAAa,QAAQ,IAAI,OAAO;AACtC,MAAI,CAAC,YAAY;AACf,QAAI,yCAAyC,OAAO;AACpD;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,iBAAiB,WAAW,MAAM;AAG7D,MAAI,WAAW,WAAW,qBAAqB,WAAW,OAAO,SAAS,iBAAiB,GAAG;AAE5F,UAAM,gBAAgB,sBAAsB;AAC5C,qBAAiB,QAAQ,aAAa;AACtC,QAAI,sCAAsC;AAC1C;AAAA,EACF;AAIA,MAAI,qCAAqC,WAAW,MAAM;AAC5D;AAKA,SAAS,wBAAqC;AAC5C,SAAO;AAAA,IACL,SAAS,CAAC,WAAW,WAAW,SAAS,WAAW,WAAW,MAAM;AAAA,IACrE,OAAO;AAAA,MACL,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MAC1C,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACvC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACvC,WAAW,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACxC,mBAAmB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MAChD,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACzC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACtC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA;AAAA,MAEnC,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,aAAa,aAAa,SAAS,SAAS,SAAS;AAAA,IACxG;AAAA,IACA,OAAO,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IAC5C,SAAS,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI;AAAA,IACxC,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IAC1C,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,aAAa,aAAa,SAAS,SAAS,SAAS;AAAA,IACtG,eAAe,CAAC,UAAU,WAAW,aAAa,YAAY,WAAW,qBAAqB,kBAAkB;AAAA,IAChH,YAAY,CAAC,WAAW,aAAa,YAAY,WAAW,qBAAqB,kBAAkB;AAAA,IACnG,cAAc,CAAC,WAAW,aAAa,YAAY,UAAU;AAAA,EAC/D;AACF;AAKA,SAAS,iBAAiB,QAAqB,QAA2B;AACxE,SAAO,QAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC;AAC9E,SAAO,MAAM,KAAK,GAAG,OAAO,MAAM,OAAO,OAAK,CAAC,OAAO,MAAM,SAAS,CAAC,CAAC,CAAC;AACxE,SAAO,QAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC;AAC9E,SAAO,YAAY,KAAK,GAAG,OAAO,YAAY,OAAO,OAAK,CAAC,OAAO,YAAY,SAAS,CAAC,CAAC,CAAC;AAC1F,SAAO,WAAW,KAAK,GAAG,OAAO,WAAW,OAAO,OAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC;AACvF,SAAO,cAAc,KAAK,GAAG,OAAO,cAAc,OAAO,OAAK,CAAC,OAAO,cAAc,SAAS,CAAC,CAAC,CAAC;AAChG,SAAO,WAAW,KAAK,GAAG,OAAO,WAAW,OAAO,OAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC;AACvF,SAAO,aAAa,KAAK,GAAG,OAAO,aAAa,OAAO,OAAK,CAAC,OAAO,aAAa,SAAS,CAAC,CAAC,CAAC;AAE7F,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACxD,QAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB,aAAO,MAAM,IAAI,IAAI;AAAA,IACvB;AAAA,EACF;AACF;AAIA,SAAS,eAAe,MAAqC;AAC3D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAO,mBAAgB,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAO,gBAAa,IAAI,EAAG,QAAO,KAAK;AACvC,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAsC;AAC7D,MAAO,gBAAa,IAAI,EAAG,QAAO,KAAK;AACvC,MAAO,mBAAgB,IAAI,EAAG,QAAO,KAAK;AAC1C,SAAO;AACT;AAEA,SAAS,cAAc,MAA4C;AACjE,SAAO,KAAK,WACT,OAAU,uBAAoB,EAC9B,IAAI,UAAQ,gBAAgB,KAAK,IAAI,CAAC,EACtC,OAAO,CAAC,MAAmB,MAAM,IAAI;AAC1C;AAmBA,IAAI,iBAAwC;AAC5C,IAAI,qBAAqB;AAclB,SAAS,cACd,MACA,SACA,aACA,cAAc,OACE;AAChB,MAAI,sBAAsB,gBAAgB;AACxC,WAAO;AAAA,EACT;AACA,uBAAqB;AAErB,QAAM,YAAY,KAAK;AAEvB,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAGA,QAAM,eAAe,UAAU,WAAW,GAAG,IACpC,aAAQ,SAAS,SAAS,IAC/B;AAEJ,MAAI,aAAa;AACf,YAAQ,IAAI,iEAAiE,YAAY;AAAA,EAC3F;AAGA,QAAM,cAAc,aAAa,cAAc,WAAW;AAG1D,mBAAiB;AAAA,IACf,SAAS,YAAY;AAAA,IACrB,OAAO,YAAY;AAAA,IACnB,OAAO,YAAY;AAAA,IACnB,SAAS,YAAY;AAAA,IACrB,YAAY,YAAY;AAAA,EAC1B;AAEA,MAAI,aAAa;AACf,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,cAAc,eAAe,OAAO;AAChD,YAAQ,IAAI,YAAY,eAAe,KAAK;AAC5C,YAAQ,IAAI,cAAc,eAAe,OAAO;AAChD,YAAQ,IAAI,UAAU;AACtB,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,eAAe,KAAK,GAAG;AACrE,cAAQ,IAAI,OAAO,SAAS,KAAK,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,kBAAwB;AACtC,mBAAiB;AACjB,uBAAqB;AACvB;;;ADjcO,SAAS,kBAAkB,SAAsD;AACtF,QAAM,EAAE,gBAAgB,WAAW,SAAS,SAAS,kBAAkB,MAAM,IAAI;AAEjF,QAAM,WAA8B,CAAC;AAGrC,QAAM,cAAc,aAAa,WAAW,KAAK;AAGjD,aAAW,iBAAiB,gBAAgB;AAC1C,UAAM,eAAoB,cAAQ,aAAa;AAE/C,QAAI,CAAI,eAAW,YAAY,GAAG;AAChC,cAAQ,KAAK,wCAAwC,YAAY,EAAE;AACnE;AAAA,IACF;AAGA,UAAM,gBAAgB,kBAAkB,YAAY;AAEpD,eAAW,OAAO,eAAe;AAC/B,YAAM,gBAAqB,eAAS,GAAG;AAGvC,UAAI,WAAW,CAAC,QAAQ,SAAS,aAAa,EAAG;AACjD,UAAI,WAAW,QAAQ,SAAS,aAAa,EAAG;AAChD,UAAI,CAAC,mBAAmB,cAAc,WAAW,GAAG,EAAG;AAEvD,YAAM,aAAa,oBAAoB,KAAK,eAAe,WAAW;AACtE,UAAI,YAAY;AACd,iBAAS,aAAa,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,OAAiB,CAAC;AAExB,QAAM,UAAa,gBAAY,UAAU,EAAE,eAAe,KAAK,CAAC;AAChE,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,UAAM,UAAe,WAAK,UAAU,MAAM,IAAI;AAG9C,UAAM,WAAc,eAAgB,WAAK,SAAS,UAAU,CAAC;AAC7D,UAAM,WAAc,eAAgB,WAAK,SAAS,UAAU,CAAC;AAE7D,QAAI,YAAY,UAAU;AACxB,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,oBACP,KACA,eACA,aAC4B;AAE5B,QAAM,UAAa,gBAAY,GAAG,EAC/B,OAAO,OAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC,EACnD,IAAI,OAAU,WAAK,KAAK,CAAC,CAAC;AAE7B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,UAAa,kBAAc,SAAS;AAAA,IACxC,QAAW,iBAAa;AAAA,IACxB,QAAW,eAAW;AAAA,IACtB,KAAQ,YAAQ;AAAA,IAChB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,QAAQ,eAAe;AAG3C,QAAM,qBAAqB,GAAG,aAAa;AAC3C,QAAM,WAAW,CAAC,GAAG,aAAa,kBAAkB,OAAO;AAC3D,MAAI,iBAA2E;AAC/E,MAAI;AAGJ,aAAW,YAAY,SAAS;AAC9B,UAAM,aAAa,QAAQ,cAAc,QAAQ;AACjD,QAAI,CAAC,WAAY;AAGjB,IAAG,iBAAa,YAAY,CAAC,SAAS;AACpC,UAAO,2BAAuB,IAAI,KAAK,KAAK,KAAK,SAAS,oBAAoB;AAC5E,yBAAiB;AACjB,+BAAuB,oBAAoB,IAAI;AAAA,MACjD;AACA,UAAO,2BAAuB,IAAI,KAAK,KAAK,KAAK,SAAS,oBAAoB;AAC5E,yBAAiB;AACjB,+BAAuB,oBAAoB,IAAI;AAAA,MACjD;AAAA,IACF,CAAC;AAED,QAAI,eAAgB;AAAA,EACtB;AAGA,MAAI,CAAC,gBAAgB;AACnB,eAAW,WAAW,UAAU;AAC9B,iBAAW,YAAY,SAAS;AAC9B,cAAM,aAAa,QAAQ,cAAc,QAAQ;AACjD,YAAI,CAAC,WAAY;AAEjB,QAAG,iBAAa,YAAY,CAAC,SAAS;AACpC,eAAQ,2BAAuB,IAAI,KAAQ,2BAAuB,IAAI,MAAM,KAAK,KAAK,SAAS,SAAS;AACtG,6BAAiB;AACjB,mCAAuB,oBAAoB,IAAI;AAAA,UACjD;AAAA,QACF,CAAC;AAED,YAAI,eAAgB;AAAA,MACtB;AACA,UAAI,eAAgB;AAAA,IACtB;AAAA,EACF;AAGA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,QAAwC,CAAC;AAE/C,MAAI,gBAAgB;AAClB,UAAM,OAAO,YAAY,kBAAkB,cAAc;AACzD,UAAM,aAAa,KAAK,cAAc;AAEtC,eAAW,QAAQ,YAAY;AAC7B,YAAM,UAAU,gBAAgB,MAAM,aAAa,WAAW;AAC9D,UAAI,WAAW,CAAC,eAAe,QAAQ,IAAI,GAAG;AAC5C,cAAM,QAAQ,IAAI,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc;AAGpB,QAAM,WAAW,cAAc,aAAa;AAG5C,QAAM,cAAc,mBAAmB,GAAG;AAE1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAe,eAAS,QAAQ,IAAI,GAAG,GAAG;AAAA,IAC1C;AAAA,EACF;AACF;AAMA,SAAS,mBAAmB,KAAsC;AAChE,QAAM,WAAgB,WAAK,KAAK,SAAS;AAEzC,MAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAa,iBAAa,UAAU,OAAO;AAGjD,UAAM,aAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACG,iBAAa;AAAA,MAChB;AAAA,MACG,eAAW;AAAA,IAChB;AAEA,QAAI,kBAAqD;AAGzD,IAAG,iBAAa,YAAY,CAAC,SAAS;AAEpC,UAAO,wBAAoB,IAAI,GAAG;AAChC,cAAM,aAAa,KAAK,WAAW,KAAK,OAAK,EAAE,SAAY,eAAW,aAAa;AACnF,YAAI,YAAY;AACd,qBAAW,QAAQ,KAAK,gBAAgB,cAAc;AACpD,gBAAO,iBAAa,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,iBAAiB,KAAK,aAAa;AACtF,kBAAO,8BAA0B,KAAK,WAAW,GAAG;AAClD,kCAAkB,KAAK;AAAA,cACzB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAIA,UAAM,SAAsB,CAAC;AAC7B,UAAM,YAAY;AAElB,eAAW,QAAQ,UAAU,YAAY;AACvC,UAAO,yBAAqB,IAAI,KAAQ,iBAAa,KAAK,IAAI,GAAG;AAC/D,cAAM,WAAW,KAAK,KAAK;AAE3B,YAAI,aAAa,WAAc,8BAA0B,KAAK,WAAW,GAAG;AAC1E,iBAAO,QAAQ,qBAAqB,KAAK,aAAa,OAAO;AAAA,QAC/D,WAAW,aAAa,YAAY;AAElC,iBAAO,WAAW,KAAK,YAAY,QAAQ,UAAU;AAAA,QACvD,WAAW,aAAa,WAAc,8BAA0B,KAAK,WAAW,GAAG;AAEjF,iBAAO,QAAQ,qBAAqB,KAAK,aAAa,OAAO;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,EACnD,SAAS,GAAG;AACV,YAAQ,KAAK,iDAAiD,GAAG,KAAK,CAAC;AACvE,WAAO;AAAA,EACT;AACF;AAKA,SAAS,qBAAqB,MAAkC,eAA4C;AAC1G,QAAM,SAA8B,CAAC;AAErC,aAAW,QAAQ,KAAK,YAAY;AAClC,QAAO,yBAAqB,IAAI,KAAQ,iBAAa,KAAK,IAAI,GAAG;AAC/D,YAAM,MAAM,KAAK,KAAK;AACtB,YAAM,OAAO,KAAK;AAElB,UAAO,oBAAgB,IAAI,GAAG;AAC5B,eAAO,GAAG,IAAI,KAAK;AAAA,MACrB,WAAc,qBAAiB,IAAI,GAAG;AACpC,eAAO,GAAG,IAAI,OAAO,KAAK,IAAI;AAAA,MAChC,WAAW,KAAK,SAAY,eAAW,aAAa;AAClD,eAAO,GAAG,IAAI;AAAA,MAChB,WAAW,KAAK,SAAY,eAAW,cAAc;AACnD,eAAO,GAAG,IAAI;AAAA,MAChB,WAAc,6BAAyB,IAAI,GAAG;AAC5C,eAAO,GAAG,IAAI,oBAAoB,MAAM,aAAa;AAAA,MACvD,WAAc,8BAA0B,IAAI,GAAG;AAC7C,eAAO,GAAG,IAAI,qBAAqB,MAAM,aAAa;AAAA,MACxD,OAAO;AAEL,eAAO,GAAG,IAAI,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAiC,eAA8B;AAC1F,QAAM,SAAgB,CAAC;AAEvB,aAAW,WAAW,KAAK,UAAU;AACnC,QAAO,oBAAgB,OAAO,GAAG;AAC/B,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B,WAAc,qBAAiB,OAAO,GAAG;AACvC,aAAO,KAAK,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClC,WAAW,QAAQ,SAAY,eAAW,aAAa;AACrD,aAAO,KAAK,IAAI;AAAA,IAClB,WAAW,QAAQ,SAAY,eAAW,cAAc;AACtD,aAAO,KAAK,KAAK;AAAA,IACnB,WAAc,8BAA0B,OAAO,GAAG;AAChD,aAAO,KAAK,qBAAqB,SAAS,aAAa,CAAC;AAAA,IAC1D,WAAc,6BAAyB,OAAO,GAAG;AAC/C,aAAO,KAAK,oBAAoB,SAAS,aAAa,CAAC;AAAA,IACzD,OAAO;AAEL,aAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,gBACP,QACA,aACA,aACuB;AACvB,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,eAAe,OAAO,gBAAgB;AAE5C,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,QAAM,cAAc,aAAa,CAAC;AAClC,QAAM,OAAO,YAAY,0BAA0B,QAAQ,WAAW;AACtE,QAAM,aAAa,YAAY,aAAa,IAAI;AAGhD,QAAM,cAAiB,yBAAqB,OAAO,wBAAwB,WAAW,CAAC,KAAK;AAG5F,QAAM,WAAW,EAAE,OAAO,QAAW,gBAAY;AAGjD,QAAM,SAAS,kBAAkB,MAAM,YAAY,aAAa,WAAW;AAG3E,QAAM,eAAe,oBAAoB,MAAM;AAE/C,SAAO;AAAA,IACL;AAAA,IACA,MAAM,iBAAiB,UAAU;AAAA,IACjC,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,IACrC,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,kBACP,MACA,YACA,cACA,aACU;AAEV,MAAI,eAAe,YAAY,WAAW,SAAS,QAAQ,GAAG;AAC5D,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,eAAe,UAAU,WAAW,SAAS,MAAM,GAAG;AAExD,WAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACtC;AAGA,MAAI,KAAK,QAAQ,GAAG;AAClB,UAAM,SAAmB,CAAC;AAC1B,eAAW,aAAa,KAAK,OAAO;AAClC,UAAI,UAAU,gBAAgB,GAAG;AAC/B,eAAO,KAAK,UAAU,KAAK;AAAA,MAC7B,WAAY,UAAkB,kBAAkB,QAAQ;AACtD,eAAO,KAAK,MAAM;AAAA,MACpB,WAAY,UAAkB,kBAAkB,SAAS;AACvD,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IACF;AACA,QAAI,OAAO,SAAS,EAAG,QAAO;AAAA,EAChC;AAGA,MAAI,eAAe,WAAW;AAC5B,WAAO,CAAC,QAAQ,OAAO;AAAA,EACzB;AAEA,SAAO,CAAC;AACV;AAKA,SAAS,oBAAoB,QAA0D;AACrF,QAAM,OAAO,OAAO,aAAa;AACjC,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,aAAa,IAAI,MAAM;AACtC,YAAM,QAAW,yBAAqB,IAAI,IAAI;AAE9C,UAAI;AACF,eAAO,KAAK,MAAM,KAAK;AAAA,MACzB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAmC;AAC9D,QAAM,SAAU,KAAa;AAC7B,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAE3C,QAAM,WAAW,OAAO,CAAC;AACzB,MAAI,SAAS,SAAS;AACpB,QAAI,OAAO,SAAS,YAAY,UAAU;AACxC,aAAO,SAAS;AAAA,IAClB;AAEA,WAAQ,SAAS,QACd,IAAI,OAAM,EAAU,QAAQ,EAAE,EAC9B,KAAK,EAAE;AAAA,EACZ;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,YAA4B;AAEpD,eAAa,WAAW,QAAQ,sBAAsB,EAAE;AAGxD,MAAI,WAAW,SAAS,WAAW,EAAG,QAAO;AAC7C,MAAI,WAAW,SAAS,WAAW,EAAG,QAAO;AAE7C,SAAO;AACT;AAKA,SAAS,eAAe,MAAuB;AAC7C,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,SAAS,IAAI,KAAK,KAAK,WAAW,eAAe;AACxE;AAKA,SAAS,cAAc,eAA0C;AAC/D,QAAM,iBAAiB,CAAC,UAAU,SAAS,YAAY,UAAU,UAAU,eAAe,UAAU,UAAU;AAC9G,QAAM,oBAAoB,CAAC,QAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,YAAY,SAAS,SAAS;AAC5G,QAAM,mBAAmB,CAAC,QAAQ,UAAU,SAAS;AACrD,QAAM,uBAAuB,CAAC,UAAU,cAAc,QAAQ,QAAQ,MAAM;AAC5E,QAAM,oBAAoB,CAAC,UAAU,WAAW,OAAO;AACvD,QAAM,iBAAiB,CAAC,SAAS,YAAY,WAAW;AAExD,MAAI,eAAe,SAAS,aAAa,EAAG,QAAO;AACnD,MAAI,kBAAkB,SAAS,aAAa,EAAG,QAAO;AACtD,MAAI,iBAAiB,SAAS,aAAa,EAAG,QAAO;AACrD,MAAI,qBAAqB,SAAS,aAAa,EAAG,QAAO;AACzD,MAAI,kBAAkB,SAAS,aAAa,EAAG,QAAO;AACtD,MAAI,eAAe,SAAS,aAAa,EAAG,QAAO;AAEnD,SAAO;AACT;","names":["ts","fs","path"]}
@@ -41,6 +41,7 @@ interface BabelThemeKeys {
41
41
  sizes: Record<string, string[]>;
42
42
  radii: string[];
43
43
  shadows: string[];
44
+ typography: string[];
44
45
  }
45
46
  /**
46
47
  * Load theme keys for the Babel plugin.
@@ -41,6 +41,7 @@ interface BabelThemeKeys {
41
41
  sizes: Record<string, string[]>;
42
42
  radii: string[];
43
43
  shadows: string[];
44
+ typography: string[];
44
45
  }
45
46
  /**
46
47
  * Load theme keys for the Babel plugin.
@@ -235,7 +235,9 @@ function getDefaultThemeValues() {
235
235
  tabBar: ["xs", "sm", "md", "lg", "xl"],
236
236
  table: ["xs", "sm", "md", "lg", "xl"],
237
237
  tooltip: ["xs", "sm", "md", "lg", "xl"],
238
- view: ["xs", "sm", "md", "lg", "xl"]
238
+ view: ["xs", "sm", "md", "lg", "xl"],
239
+ // Typography sizes for Text component's $typography iterator
240
+ typography: ["h1", "h2", "h3", "h4", "h5", "h6", "subtitle1", "subtitle2", "body1", "body2", "caption"]
239
241
  },
240
242
  radii: ["none", "xs", "sm", "md", "lg", "xl"],
241
243
  shadows: ["none", "sm", "md", "lg", "xl"],
@@ -297,7 +299,8 @@ function loadThemeKeys(opts, rootDir, _babelTypes, verboseMode = false) {
297
299
  intents: themeValues.intents,
298
300
  sizes: themeValues.sizes,
299
301
  radii: themeValues.radii,
300
- shadows: themeValues.shadows
302
+ shadows: themeValues.shadows,
303
+ typography: themeValues.typography
301
304
  };
302
305
  if (verboseMode) {
303
306
  console.log("[idealyst-plugin] Extracted theme keys:");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/analyzer/component-analyzer.ts","../../src/analyzer/theme-analyzer.ts"],"sourcesContent":["/**\n * Component Analyzer - Extracts component prop definitions using TypeScript Compiler API.\n *\n * Analyzes:\n * - types.ts files for prop interfaces\n * - JSDoc comments for descriptions\n * - Static .description properties on components\n * - Theme-derived types (Intent, Size) resolved to actual values\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n ComponentRegistry,\n ComponentDefinition,\n PropDefinition,\n ComponentAnalyzerOptions,\n ThemeValues,\n ComponentCategory,\n SampleProps,\n} from './types';\nimport { analyzeTheme } from './theme-analyzer';\n\n/**\n * Analyze components and generate a registry.\n */\nexport function analyzeComponents(options: ComponentAnalyzerOptions): ComponentRegistry {\n const { componentPaths, themePath, include, exclude, includeInternal = false } = options;\n\n const registry: ComponentRegistry = {};\n\n // First, analyze the theme to get valid values\n const themeValues = analyzeTheme(themePath, false);\n\n // Scan each component path\n for (const componentPath of componentPaths) {\n const resolvedPath = path.resolve(componentPath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.warn(`[component-analyzer] Path not found: ${resolvedPath}`);\n continue;\n }\n\n // Find all component directories (those with index.ts or types.ts)\n const componentDirs = findComponentDirs(resolvedPath);\n\n for (const dir of componentDirs) {\n const componentName = path.basename(dir);\n\n // Apply include/exclude filters\n if (include && !include.includes(componentName)) continue;\n if (exclude && exclude.includes(componentName)) continue;\n if (!includeInternal && componentName.startsWith('_')) continue;\n\n const definition = analyzeComponentDir(dir, componentName, themeValues);\n if (definition) {\n registry[componentName] = definition;\n }\n }\n }\n\n return registry;\n}\n\n/**\n * Find all component directories in a path.\n */\nfunction findComponentDirs(basePath: string): string[] {\n const dirs: string[] = [];\n\n const entries = fs.readdirSync(basePath, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const dirPath = path.join(basePath, entry.name);\n\n // Check if it's a component directory (has index.ts or types.ts)\n const hasIndex = fs.existsSync(path.join(dirPath, 'index.ts'));\n const hasTypes = fs.existsSync(path.join(dirPath, 'types.ts'));\n\n if (hasIndex || hasTypes) {\n dirs.push(dirPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Analyze a single component directory.\n */\nfunction analyzeComponentDir(\n dir: string,\n componentName: string,\n themeValues: ThemeValues\n): ComponentDefinition | null {\n // Find all TypeScript files in the component directory\n const tsFiles = fs.readdirSync(dir)\n .filter(f => f.endsWith('.ts') || f.endsWith('.tsx'))\n .map(f => path.join(dir, f));\n\n if (tsFiles.length === 0) {\n return null;\n }\n\n // Create TypeScript program with all files\n const program = ts.createProgram(tsFiles, {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n });\n\n const typeChecker = program.getTypeChecker();\n\n // Search all files for the props interface\n const propsInterfaceName = `${componentName}Props`;\n const altNames = [`${componentName}ComponentProps`, 'Props'];\n let propsInterface: ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null = null;\n let interfaceDescription: string | undefined;\n\n // Search each file for the props interface\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n // First try the main props interface name\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isInterfaceDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n if (ts.isTypeAliasDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n\n // If not found, try alternate naming conventions\n if (!propsInterface) {\n for (const altName of altNames) {\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n if ((ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) && node.name.text === altName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n if (propsInterface) break;\n }\n }\n\n // If we couldn't find a props interface, skip this component\n if (!propsInterface) {\n return null;\n }\n\n // Extract props\n const props: Record<string, PropDefinition> = {};\n\n if (propsInterface) {\n const type = typeChecker.getTypeAtLocation(propsInterface);\n const properties = type.getProperties();\n\n for (const prop of properties) {\n const propDef = analyzeProperty(prop, typeChecker, themeValues);\n if (propDef && !isInternalProp(propDef.name)) {\n props[propDef.name] = propDef;\n }\n }\n }\n\n // Get description from the props interface JSDoc (single source of truth in types.ts)\n const description = interfaceDescription;\n\n // Determine category\n const category = inferCategory(componentName);\n\n // Look for docs.ts to extract sample props\n const sampleProps = extractSampleProps(dir);\n\n return {\n name: componentName,\n description,\n props,\n category,\n filePath: path.relative(process.cwd(), dir),\n sampleProps,\n };\n}\n\n/**\n * Extract sample props from docs.ts file if it exists.\n * The docs.ts file should export a `sampleProps` object.\n */\nfunction extractSampleProps(dir: string): SampleProps | undefined {\n const docsPath = path.join(dir, 'docs.ts');\n\n if (!fs.existsSync(docsPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(docsPath, 'utf-8');\n\n // Create a simple TypeScript program to extract the sampleProps export\n const sourceFile = ts.createSourceFile(\n 'docs.ts',\n content,\n ts.ScriptTarget.ES2020,\n true,\n ts.ScriptKind.TS\n );\n\n let samplePropsNode: ts.ObjectLiteralExpression | null = null;\n\n // Find the sampleProps export\n ts.forEachChild(sourceFile, (node) => {\n // Handle: export const sampleProps = { ... }\n if (ts.isVariableStatement(node)) {\n const isExported = node.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword);\n if (isExported) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.name.text === 'sampleProps' && decl.initializer) {\n if (ts.isObjectLiteralExpression(decl.initializer)) {\n samplePropsNode = decl.initializer;\n }\n }\n }\n }\n }\n });\n\n if (!samplePropsNode) {\n return undefined;\n }\n\n // Extract the object literal as JSON-compatible structure\n // This is a simplified extraction - it handles basic literals\n const result: SampleProps = {};\n const propsNode = samplePropsNode as ts.ObjectLiteralExpression;\n\n for (const prop of propsNode.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const propName = prop.name.text;\n\n if (propName === 'props' && ts.isObjectLiteralExpression(prop.initializer)) {\n result.props = extractObjectLiteral(prop.initializer, content);\n } else if (propName === 'children') {\n // For children, we store the raw source text\n result.children = prop.initializer.getText(sourceFile);\n } else if (propName === 'state' && ts.isObjectLiteralExpression(prop.initializer)) {\n // Extract state configuration for controlled components\n result.state = extractObjectLiteral(prop.initializer, content);\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n } catch (e) {\n console.warn(`[component-analyzer] Error reading docs.ts in ${dir}:`, e);\n return undefined;\n }\n}\n\n/**\n * Extract an object literal to a plain object (for simple literal values).\n */\nfunction extractObjectLiteral(node: ts.ObjectLiteralExpression, sourceContent: string): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const key = prop.name.text;\n const init = prop.initializer;\n\n if (ts.isStringLiteral(init)) {\n result[key] = init.text;\n } else if (ts.isNumericLiteral(init)) {\n result[key] = Number(init.text);\n } else if (init.kind === ts.SyntaxKind.TrueKeyword) {\n result[key] = true;\n } else if (init.kind === ts.SyntaxKind.FalseKeyword) {\n result[key] = false;\n } else if (ts.isArrayLiteralExpression(init)) {\n result[key] = extractArrayLiteral(init, sourceContent);\n } else if (ts.isObjectLiteralExpression(init)) {\n result[key] = extractObjectLiteral(init, sourceContent);\n } else {\n // For complex expressions (JSX, functions), store the raw source\n result[key] = init.getText();\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extract an array literal to a plain array.\n */\nfunction extractArrayLiteral(node: ts.ArrayLiteralExpression, sourceContent: string): any[] {\n const result: any[] = [];\n\n for (const element of node.elements) {\n if (ts.isStringLiteral(element)) {\n result.push(element.text);\n } else if (ts.isNumericLiteral(element)) {\n result.push(Number(element.text));\n } else if (element.kind === ts.SyntaxKind.TrueKeyword) {\n result.push(true);\n } else if (element.kind === ts.SyntaxKind.FalseKeyword) {\n result.push(false);\n } else if (ts.isObjectLiteralExpression(element)) {\n result.push(extractObjectLiteral(element, sourceContent));\n } else if (ts.isArrayLiteralExpression(element)) {\n result.push(extractArrayLiteral(element, sourceContent));\n } else {\n // For complex expressions, store raw source\n result.push(element.getText());\n }\n }\n\n return result;\n}\n\n/**\n * Analyze a single property symbol.\n */\nfunction analyzeProperty(\n symbol: ts.Symbol,\n typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): PropDefinition | null {\n const name = symbol.getName();\n const declarations = symbol.getDeclarations();\n\n if (!declarations || declarations.length === 0) return null;\n\n const declaration = declarations[0];\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n const typeString = typeChecker.typeToString(type);\n\n // Get JSDoc description\n const description = ts.displayPartsToString(symbol.getDocumentationComment(typeChecker)) || undefined;\n\n // Check if required\n const required = !(symbol.flags & ts.SymbolFlags.Optional);\n\n // Extract values for union types / theme types\n const values = extractPropValues(type, typeString, typeChecker, themeValues);\n\n // Extract default value (from JSDoc @default tag)\n const defaultValue = extractDefaultValue(symbol);\n\n return {\n name,\n type: simplifyTypeName(typeString),\n values: values.length > 0 ? values : undefined,\n default: defaultValue,\n description,\n required,\n };\n}\n\n/**\n * Extract valid values for a prop type.\n */\nfunction extractPropValues(\n type: ts.Type,\n typeString: string,\n _typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): string[] {\n // Handle theme-derived types\n if (typeString === 'Intent' || typeString.includes('Intent')) {\n return themeValues.intents;\n }\n if (typeString === 'Size' || typeString.includes('Size')) {\n // Return generic sizes - most components use the same keys\n return ['xs', 'sm', 'md', 'lg', 'xl'];\n }\n\n // Handle union types\n if (type.isUnion()) {\n const values: string[] = [];\n for (const unionType of type.types) {\n if (unionType.isStringLiteral()) {\n values.push(unionType.value);\n } else if ((unionType as any).intrinsicName === 'true') {\n values.push('true');\n } else if ((unionType as any).intrinsicName === 'false') {\n values.push('false');\n }\n }\n if (values.length > 0) return values;\n }\n\n // Handle boolean\n if (typeString === 'boolean') {\n return ['true', 'false'];\n }\n\n return [];\n}\n\n/**\n * Extract default value from JSDoc @default tag.\n */\nfunction extractDefaultValue(symbol: ts.Symbol): string | number | boolean | undefined {\n const tags = symbol.getJsDocTags();\n for (const tag of tags) {\n if (tag.name === 'default' && tag.text) {\n const value = ts.displayPartsToString(tag.text);\n // Try to parse as JSON\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Get JSDoc description from a node.\n */\nfunction getJSDocDescription(node: ts.Node): string | undefined {\n const jsDocs = (node as any).jsDoc as ts.JSDoc[] | undefined;\n if (!jsDocs || jsDocs.length === 0) return undefined;\n\n const firstDoc = jsDocs[0];\n if (firstDoc.comment) {\n if (typeof firstDoc.comment === 'string') {\n return firstDoc.comment;\n }\n // Handle NodeArray of JSDocComment\n return (firstDoc.comment as ts.NodeArray<ts.JSDocComment>)\n .map(c => (c as any).text || '')\n .join('');\n }\n return undefined;\n}\n\n/**\n * Simplify type names for display.\n */\nfunction simplifyTypeName(typeString: string): string {\n // Remove import paths\n typeString = typeString.replace(/import\\([^)]+\\)\\./g, '');\n\n // Simplify common complex types\n if (typeString.includes('ReactNode')) return 'ReactNode';\n if (typeString.includes('StyleProp')) return 'Style';\n\n return typeString;\n}\n\n/**\n * Check if a prop should be excluded (internal/inherited).\n */\nfunction isInternalProp(name: string): boolean {\n const internalProps = [\n 'ref',\n 'key',\n 'children',\n 'style',\n 'testID',\n 'nativeID',\n 'accessible',\n 'accessibilityActions',\n 'accessibilityComponentType',\n 'accessibilityElementsHidden',\n 'accessibilityHint',\n 'accessibilityIgnoresInvertColors',\n 'accessibilityLabel',\n 'accessibilityLabelledBy',\n 'accessibilityLanguage',\n 'accessibilityLiveRegion',\n 'accessibilityRole',\n 'accessibilityState',\n 'accessibilityTraits',\n 'accessibilityValue',\n 'accessibilityViewIsModal',\n 'collapsable',\n 'focusable',\n 'hasTVPreferredFocus',\n 'hitSlop',\n 'importantForAccessibility',\n 'needsOffscreenAlphaCompositing',\n 'onAccessibilityAction',\n 'onAccessibilityEscape',\n 'onAccessibilityTap',\n 'onLayout',\n 'onMagicTap',\n 'onMoveShouldSetResponder',\n 'onMoveShouldSetResponderCapture',\n 'onResponderEnd',\n 'onResponderGrant',\n 'onResponderMove',\n 'onResponderReject',\n 'onResponderRelease',\n 'onResponderStart',\n 'onResponderTerminate',\n 'onResponderTerminationRequest',\n 'onStartShouldSetResponder',\n 'onStartShouldSetResponderCapture',\n 'pointerEvents',\n 'removeClippedSubviews',\n 'renderToHardwareTextureAndroid',\n 'shouldRasterizeIOS',\n 'tvParallaxMagnification',\n 'tvParallaxProperties',\n 'tvParallaxShiftDistanceX',\n 'tvParallaxShiftDistanceY',\n 'tvParallaxTiltAngle',\n ];\n\n return internalProps.includes(name) || name.startsWith('accessibility');\n}\n\n/**\n * Infer component category from name.\n */\nfunction inferCategory(componentName: string): ComponentCategory {\n const formComponents = ['Button', 'Input', 'Checkbox', 'Select', 'Switch', 'RadioButton', 'Slider', 'TextArea'];\n const displayComponents = ['Text', 'Card', 'Badge', 'Chip', 'Avatar', 'Icon', 'Skeleton', 'Alert', 'Tooltip'];\n const layoutComponents = ['View', 'Screen', 'Divider'];\n const navigationComponents = ['TabBar', 'Breadcrumb', 'Menu', 'List', 'Link'];\n const overlayComponents = ['Dialog', 'Popover', 'Modal'];\n const dataComponents = ['Table', 'Progress', 'Accordion'];\n\n if (formComponents.includes(componentName)) return 'form';\n if (displayComponents.includes(componentName)) return 'display';\n if (layoutComponents.includes(componentName)) return 'layout';\n if (navigationComponents.includes(componentName)) return 'navigation';\n if (overlayComponents.includes(componentName)) return 'overlay';\n if (dataComponents.includes(componentName)) return 'data';\n\n return 'display'; // Default\n}\n","/**\n * Theme Analyzer - Extracts theme keys by statically analyzing theme files.\n *\n * Uses TypeScript Compiler API to trace the declarative builder API:\n * - createTheme() / fromTheme(base)\n * - .addIntent('name', {...})\n * - .addRadius('name', value)\n * - .addShadow('name', {...})\n * - .setSizes({ button: { xs: {}, sm: {}, ... }, ... })\n * - .build()\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ThemeValues } from './types';\n\ninterface AnalyzerContext {\n program: ts.Program;\n typeChecker: ts.TypeChecker;\n verbose: boolean;\n}\n\n/**\n * Extract theme values from a theme file.\n */\nexport function analyzeTheme(themePath: string, verbose = false): ThemeValues {\n const resolvedPath = path.resolve(themePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Theme file not found: ${resolvedPath}`);\n }\n\n const log = (...args: any[]) => {\n if (verbose) console.log('[theme-analyzer]', ...args);\n };\n\n log('Analyzing theme file:', resolvedPath);\n\n // Create a TypeScript program\n const program = ts.createProgram([resolvedPath], {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n allowSyntheticDefaultImports: true,\n });\n\n const sourceFile = program.getSourceFile(resolvedPath);\n if (!sourceFile) {\n throw new Error(`Failed to parse theme file: ${resolvedPath}`);\n }\n\n const ctx: AnalyzerContext = {\n program,\n typeChecker: program.getTypeChecker(),\n verbose,\n };\n\n const values: ThemeValues = {\n intents: [],\n sizes: {},\n radii: [],\n shadows: [],\n breakpoints: [],\n typography: [],\n surfaceColors: [],\n textColors: [],\n borderColors: [],\n };\n\n // Track imports for base theme resolution\n const imports = new Map<string, { source: string; imported: string }>();\n\n // First pass: collect imports\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const source = (node.moduleSpecifier as ts.StringLiteral).text;\n const clause = node.importClause;\n if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n const localName = element.name.text;\n const importedName = element.propertyName?.text ?? localName;\n imports.set(localName, { source, imported: importedName });\n }\n }\n }\n });\n\n /**\n * Process a builder method call chain.\n */\n function processBuilderChain(node: ts.Node): void {\n if (!ts.isCallExpression(node)) return;\n\n // Check if this is a .build() call\n if (ts.isPropertyAccessExpression(node.expression)) {\n const methodName = node.expression.name.text;\n\n if (methodName === 'build') {\n // Trace the full chain\n const calls = traceBuilderCalls(node);\n processCalls(calls);\n return;\n }\n }\n\n // Recurse into children\n ts.forEachChild(node, processBuilderChain);\n }\n\n interface BuilderCall {\n method: string;\n args: ts.NodeArray<ts.Expression>;\n }\n\n /**\n * Trace a builder chain backwards to collect all method calls.\n */\n function traceBuilderCalls(node: ts.CallExpression, calls: BuilderCall[] = []): BuilderCall[] {\n if (!ts.isPropertyAccessExpression(node.expression)) {\n // Check for createTheme() or fromTheme()\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const fnName = node.expression.text;\n if (fnName === 'fromTheme' && node.arguments.length > 0) {\n const arg = node.arguments[0];\n if (ts.isIdentifier(arg)) {\n // Analyze base theme\n analyzeBaseTheme(arg.text, imports, values, ctx);\n }\n }\n }\n return calls;\n }\n\n const methodName = node.expression.name.text;\n calls.unshift({ method: methodName, args: node.arguments });\n\n // Recurse into the object being called\n const obj = node.expression.expression;\n if (ts.isCallExpression(obj)) {\n return traceBuilderCalls(obj, calls);\n }\n\n return calls;\n }\n\n /**\n * Process the collected builder method calls.\n */\n function processCalls(calls: BuilderCall[]): void {\n log('Processing', calls.length, 'builder method calls');\n\n for (const { method, args } of calls) {\n switch (method) {\n case 'addIntent': {\n const name = getStringValue(args[0]);\n if (name && !values.intents.includes(name)) {\n values.intents.push(name);\n log(' Found intent:', name);\n }\n break;\n }\n case 'addRadius': {\n const name = getStringValue(args[0]);\n if (name && !values.radii.includes(name)) {\n values.radii.push(name);\n log(' Found radius:', name);\n }\n break;\n }\n case 'addShadow': {\n const name = getStringValue(args[0]);\n if (name && !values.shadows.includes(name)) {\n values.shadows.push(name);\n log(' Found shadow:', name);\n }\n break;\n }\n case 'setSizes': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const componentName = getPropertyName(prop.name);\n if (componentName && ts.isObjectLiteralExpression(prop.initializer)) {\n values.sizes[componentName] = getObjectKeys(prop.initializer);\n log(' Found sizes for', componentName + ':', values.sizes[componentName]);\n }\n }\n }\n }\n break;\n }\n case 'setBreakpoints': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n values.breakpoints = getObjectKeys(args[0]);\n log(' Found breakpoints:', values.breakpoints);\n }\n break;\n }\n case 'setColors': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const colorType = getPropertyName(prop.name);\n if (ts.isObjectLiteralExpression(prop.initializer)) {\n const keys = getObjectKeys(prop.initializer);\n switch (colorType) {\n case 'surface':\n values.surfaceColors = keys;\n log(' Found surface colors:', keys);\n break;\n case 'text':\n values.textColors = keys;\n log(' Found text colors:', keys);\n break;\n case 'border':\n values.borderColors = keys;\n log(' Found border colors:', keys);\n break;\n }\n }\n }\n }\n }\n break;\n }\n case 'build':\n // End of chain\n break;\n default:\n log(' Skipping unknown method:', method);\n }\n }\n }\n\n // Second pass: find and process builder chains\n ts.forEachChild(sourceFile, (node) => {\n // Handle variable declarations\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n processBuilderChain(decl.initializer);\n }\n }\n }\n // Handle export statements\n if (ts.isExportAssignment(node)) {\n processBuilderChain(node.expression);\n }\n });\n\n // Extract typography keys from sizes if present\n if (values.sizes['typography']) {\n values.typography = values.sizes['typography'];\n }\n\n log('Extracted theme values:', values);\n\n return values;\n}\n\n/**\n * Analyze a base theme file referenced by an import.\n */\nfunction analyzeBaseTheme(\n varName: string,\n imports: Map<string, { source: string; imported: string }>,\n values: ThemeValues,\n ctx: AnalyzerContext\n): void {\n const log = (...args: any[]) => {\n if (ctx.verbose) console.log('[theme-analyzer]', ...args);\n };\n\n const importInfo = imports.get(varName);\n if (!importInfo) {\n log('Could not find import for base theme:', varName);\n return;\n }\n\n log('Base theme', varName, 'imported from', importInfo.source);\n\n // For @idealyst/theme imports, we know the structure\n if (importInfo.source === '@idealyst/theme' || importInfo.source.includes('@idealyst/theme')) {\n // Use default light theme values\n const defaultValues = getDefaultThemeValues();\n mergeThemeValues(values, defaultValues);\n log('Using default @idealyst/theme values');\n return;\n }\n\n // For relative imports, try to resolve and analyze\n // (This is simplified - full implementation would recursively analyze)\n log('Skipping base theme analysis for:', importInfo.source);\n}\n\n/**\n * Get default theme values from @idealyst/theme.\n */\nfunction getDefaultThemeValues(): ThemeValues {\n return {\n intents: ['primary', 'success', 'error', 'warning', 'neutral', 'info'],\n sizes: {\n button: ['xs', 'sm', 'md', 'lg', 'xl'],\n chip: ['xs', 'sm', 'md', 'lg', 'xl'],\n badge: ['xs', 'sm', 'md', 'lg', 'xl'],\n icon: ['xs', 'sm', 'md', 'lg', 'xl'],\n input: ['xs', 'sm', 'md', 'lg', 'xl'],\n radioButton: ['xs', 'sm', 'md', 'lg', 'xl'],\n select: ['xs', 'sm', 'md', 'lg', 'xl'],\n slider: ['xs', 'sm', 'md', 'lg', 'xl'],\n switch: ['xs', 'sm', 'md', 'lg', 'xl'],\n textarea: ['xs', 'sm', 'md', 'lg', 'xl'],\n avatar: ['xs', 'sm', 'md', 'lg', 'xl'],\n progress: ['xs', 'sm', 'md', 'lg', 'xl'],\n accordion: ['xs', 'sm', 'md', 'lg', 'xl'],\n activityIndicator: ['xs', 'sm', 'md', 'lg', 'xl'],\n breadcrumb: ['xs', 'sm', 'md', 'lg', 'xl'],\n list: ['xs', 'sm', 'md', 'lg', 'xl'],\n menu: ['xs', 'sm', 'md', 'lg', 'xl'],\n text: ['xs', 'sm', 'md', 'lg', 'xl'],\n tabBar: ['xs', 'sm', 'md', 'lg', 'xl'],\n table: ['xs', 'sm', 'md', 'lg', 'xl'],\n tooltip: ['xs', 'sm', 'md', 'lg', 'xl'],\n view: ['xs', 'sm', 'md', 'lg', 'xl'],\n },\n radii: ['none', 'xs', 'sm', 'md', 'lg', 'xl'],\n shadows: ['none', 'sm', 'md', 'lg', 'xl'],\n breakpoints: ['xs', 'sm', 'md', 'lg', 'xl'],\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n surfaceColors: ['screen', 'primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n textColors: ['primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n borderColors: ['primary', 'secondary', 'tertiary', 'disabled'],\n };\n}\n\n/**\n * Merge theme values, avoiding duplicates.\n */\nfunction mergeThemeValues(target: ThemeValues, source: ThemeValues): void {\n target.intents.push(...source.intents.filter(k => !target.intents.includes(k)));\n target.radii.push(...source.radii.filter(k => !target.radii.includes(k)));\n target.shadows.push(...source.shadows.filter(k => !target.shadows.includes(k)));\n target.breakpoints.push(...source.breakpoints.filter(k => !target.breakpoints.includes(k)));\n target.typography.push(...source.typography.filter(k => !target.typography.includes(k)));\n target.surfaceColors.push(...source.surfaceColors.filter(k => !target.surfaceColors.includes(k)));\n target.textColors.push(...source.textColors.filter(k => !target.textColors.includes(k)));\n target.borderColors.push(...source.borderColors.filter(k => !target.borderColors.includes(k)));\n\n for (const [comp, sizes] of Object.entries(source.sizes)) {\n if (!target.sizes[comp]) {\n target.sizes[comp] = sizes;\n }\n }\n}\n\n// Helper functions\n\nfunction getStringValue(node?: ts.Expression): string | null {\n if (!node) return null;\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isIdentifier(node)) return node.text;\n return null;\n}\n\nfunction getPropertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isStringLiteral(node)) return node.text;\n return null;\n}\n\nfunction getObjectKeys(node: ts.ObjectLiteralExpression): string[] {\n return node.properties\n .filter(ts.isPropertyAssignment)\n .map(prop => getPropertyName(prop.name))\n .filter((k): k is string => k !== null);\n}\n\n// ============================================================================\n// Babel Plugin Compatibility Layer\n// ============================================================================\n\n/**\n * Theme keys format expected by the Babel plugin.\n * This is a subset of ThemeValues for backwards compatibility.\n */\nexport interface BabelThemeKeys {\n intents: string[];\n sizes: Record<string, string[]>;\n radii: string[];\n shadows: string[];\n}\n\n// Cache for loadThemeKeys to avoid re-parsing\nlet themeKeysCache: BabelThemeKeys | null = null;\nlet themeLoadAttempted = false;\n\n/**\n * Load theme keys for the Babel plugin.\n * This is a compatibility wrapper around analyzeTheme() that:\n * - Provides caching (only parses once per build)\n * - Returns the subset of keys needed by the Babel plugin\n * - Handles path resolution based on babel opts\n *\n * @param opts - Babel plugin options (requires themePath)\n * @param rootDir - Root directory for path resolution\n * @param _babelTypes - Unused (kept for backwards compatibility)\n * @param verboseMode - Enable verbose logging\n */\nexport function loadThemeKeys(\n opts: { themePath?: string },\n rootDir: string,\n _babelTypes?: unknown,\n verboseMode = false\n): BabelThemeKeys {\n if (themeLoadAttempted && themeKeysCache) {\n return themeKeysCache;\n }\n themeLoadAttempted = true;\n\n const themePath = opts.themePath;\n\n if (!themePath) {\n throw new Error(\n '[idealyst-plugin] themePath is required!\\n' +\n 'Add it to your babel config:\\n' +\n ' [\"@idealyst/theme/plugin\", { themePath: \"./src/theme/styles.ts\" }]'\n );\n }\n\n // Resolve the path\n const resolvedPath = themePath.startsWith('.')\n ? path.resolve(rootDir, themePath)\n : themePath;\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Analyzing theme file via @idealyst/tooling:', resolvedPath);\n }\n\n // Use the TypeScript-based analyzer\n const themeValues = analyzeTheme(resolvedPath, verboseMode);\n\n // Convert to Babel-compatible format (subset of ThemeValues)\n themeKeysCache = {\n intents: themeValues.intents,\n sizes: themeValues.sizes,\n radii: themeValues.radii,\n shadows: themeValues.shadows,\n };\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Extracted theme keys:');\n console.log(' intents:', themeKeysCache.intents);\n console.log(' radii:', themeKeysCache.radii);\n console.log(' shadows:', themeKeysCache.shadows);\n console.log(' sizes:');\n for (const [component, sizes] of Object.entries(themeKeysCache.sizes)) {\n console.log(` ${component}:`, sizes);\n }\n }\n\n return themeKeysCache;\n}\n\n/**\n * Reset the theme cache. Useful for testing or hot reload.\n */\nexport function resetThemeCache(): void {\n themeKeysCache = null;\n themeLoadAttempted = false;\n}\n"],"mappings":";AAUA,YAAYA,SAAQ;AACpB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;;;ACAtB,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAYf,SAAS,aAAa,WAAmB,UAAU,OAAoB;AAC5E,QAAM,eAAoB,aAAQ,SAAS;AAE3C,MAAI,CAAI,cAAW,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,yBAAyB,YAAY,EAAE;AAAA,EACzD;AAEA,QAAM,MAAM,IAAI,SAAgB;AAC9B,QAAI,QAAS,SAAQ,IAAI,oBAAoB,GAAG,IAAI;AAAA,EACtD;AAEA,MAAI,yBAAyB,YAAY;AAGzC,QAAM,UAAa,iBAAc,CAAC,YAAY,GAAG;AAAA,IAC/C,QAAW,gBAAa;AAAA,IACxB,QAAW,cAAW;AAAA,IACtB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,8BAA8B;AAAA,EAChC,CAAC;AAED,QAAM,aAAa,QAAQ,cAAc,YAAY;AACrD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,+BAA+B,YAAY,EAAE;AAAA,EAC/D;AAEA,QAAM,MAAuB;AAAA,IAC3B;AAAA,IACA,aAAa,QAAQ,eAAe;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,SAAsB;AAAA,IAC1B,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,YAAY,CAAC;AAAA,IACb,eAAe,CAAC;AAAA,IAChB,YAAY,CAAC;AAAA,IACb,cAAc,CAAC;AAAA,EACjB;AAGA,QAAM,UAAU,oBAAI,IAAkD;AAGtE,EAAG,gBAAa,YAAY,CAAC,SAAS;AACpC,QAAO,uBAAoB,IAAI,GAAG;AAChC,YAAM,SAAU,KAAK,gBAAqC;AAC1D,YAAM,SAAS,KAAK;AACpB,UAAI,QAAQ,iBAAoB,kBAAe,OAAO,aAAa,GAAG;AACpE,mBAAW,WAAW,OAAO,cAAc,UAAU;AACnD,gBAAM,YAAY,QAAQ,KAAK;AAC/B,gBAAM,eAAe,QAAQ,cAAc,QAAQ;AACnD,kBAAQ,IAAI,WAAW,EAAE,QAAQ,UAAU,aAAa,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAKD,WAAS,oBAAoB,MAAqB;AAChD,QAAI,CAAI,oBAAiB,IAAI,EAAG;AAGhC,QAAO,8BAA2B,KAAK,UAAU,GAAG;AAClD,YAAM,aAAa,KAAK,WAAW,KAAK;AAExC,UAAI,eAAe,SAAS;AAE1B,cAAM,QAAQ,kBAAkB,IAAI;AACpC,qBAAa,KAAK;AAClB;AAAA,MACF;AAAA,IACF;AAGA,IAAG,gBAAa,MAAM,mBAAmB;AAAA,EAC3C;AAUA,WAAS,kBAAkB,MAAyB,QAAuB,CAAC,GAAkB;AAC5F,QAAI,CAAI,8BAA2B,KAAK,UAAU,GAAG;AAEnD,UAAO,oBAAiB,IAAI,KAAQ,gBAAa,KAAK,UAAU,GAAG;AACjE,cAAM,SAAS,KAAK,WAAW;AAC/B,YAAI,WAAW,eAAe,KAAK,UAAU,SAAS,GAAG;AACvD,gBAAM,MAAM,KAAK,UAAU,CAAC;AAC5B,cAAO,gBAAa,GAAG,GAAG;AAExB,6BAAiB,IAAI,MAAM,SAAS,QAAQ,GAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,WAAW,KAAK;AACxC,UAAM,QAAQ,EAAE,QAAQ,YAAY,MAAM,KAAK,UAAU,CAAC;AAG1D,UAAM,MAAM,KAAK,WAAW;AAC5B,QAAO,oBAAiB,GAAG,GAAG;AAC5B,aAAO,kBAAkB,KAAK,KAAK;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAKA,WAAS,aAAa,OAA4B;AAChD,QAAI,cAAc,MAAM,QAAQ,sBAAsB;AAEtD,eAAW,EAAE,QAAQ,KAAK,KAAK,OAAO;AACpC,cAAQ,QAAQ;AAAA,QACd,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,QAAQ,SAAS,IAAI,GAAG;AAC1C,mBAAO,QAAQ,KAAK,IAAI;AACxB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,MAAM,SAAS,IAAI,GAAG;AACxC,mBAAO,MAAM,KAAK,IAAI;AACtB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,gBAAM,OAAO,eAAe,KAAK,CAAC,CAAC;AACnC,cAAI,QAAQ,CAAC,OAAO,QAAQ,SAAS,IAAI,GAAG;AAC1C,mBAAO,QAAQ,KAAK,IAAI;AACxB,gBAAI,mBAAmB,IAAI;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,uBAAW,QAAQ,KAAK,CAAC,EAAE,YAAY;AACrC,kBAAO,wBAAqB,IAAI,GAAG;AACjC,sBAAM,gBAAgB,gBAAgB,KAAK,IAAI;AAC/C,oBAAI,iBAAoB,6BAA0B,KAAK,WAAW,GAAG;AACnE,yBAAO,MAAM,aAAa,IAAI,cAAc,KAAK,WAAW;AAC5D,sBAAI,qBAAqB,gBAAgB,KAAK,OAAO,MAAM,aAAa,CAAC;AAAA,gBAC3E;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,kBAAkB;AACrB,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,mBAAO,cAAc,cAAc,KAAK,CAAC,CAAC;AAC1C,gBAAI,wBAAwB,OAAO,WAAW;AAAA,UAChD;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,cAAI,KAAK,CAAC,KAAQ,6BAA0B,KAAK,CAAC,CAAC,GAAG;AACpD,uBAAW,QAAQ,KAAK,CAAC,EAAE,YAAY;AACrC,kBAAO,wBAAqB,IAAI,GAAG;AACjC,sBAAM,YAAY,gBAAgB,KAAK,IAAI;AAC3C,oBAAO,6BAA0B,KAAK,WAAW,GAAG;AAClD,wBAAM,OAAO,cAAc,KAAK,WAAW;AAC3C,0BAAQ,WAAW;AAAA,oBACjB,KAAK;AACH,6BAAO,gBAAgB;AACvB,0BAAI,2BAA2B,IAAI;AACnC;AAAA,oBACF,KAAK;AACH,6BAAO,aAAa;AACpB,0BAAI,wBAAwB,IAAI;AAChC;AAAA,oBACF,KAAK;AACH,6BAAO,eAAe;AACtB,0BAAI,0BAA0B,IAAI;AAClC;AAAA,kBACJ;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK;AAEH;AAAA,QACF;AACE,cAAI,8BAA8B,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAGA,EAAG,gBAAa,YAAY,CAAC,SAAS;AAEpC,QAAO,uBAAoB,IAAI,GAAG;AAChC,iBAAW,QAAQ,KAAK,gBAAgB,cAAc;AACpD,YAAI,KAAK,aAAa;AACpB,8BAAoB,KAAK,WAAW;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,QAAO,sBAAmB,IAAI,GAAG;AAC/B,0BAAoB,KAAK,UAAU;AAAA,IACrC;AAAA,EACF,CAAC;AAGD,MAAI,OAAO,MAAM,YAAY,GAAG;AAC9B,WAAO,aAAa,OAAO,MAAM,YAAY;AAAA,EAC/C;AAEA,MAAI,2BAA2B,MAAM;AAErC,SAAO;AACT;AAKA,SAAS,iBACP,SACA,SACA,QACA,KACM;AACN,QAAM,MAAM,IAAI,SAAgB;AAC9B,QAAI,IAAI,QAAS,SAAQ,IAAI,oBAAoB,GAAG,IAAI;AAAA,EAC1D;AAEA,QAAM,aAAa,QAAQ,IAAI,OAAO;AACtC,MAAI,CAAC,YAAY;AACf,QAAI,yCAAyC,OAAO;AACpD;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,iBAAiB,WAAW,MAAM;AAG7D,MAAI,WAAW,WAAW,qBAAqB,WAAW,OAAO,SAAS,iBAAiB,GAAG;AAE5F,UAAM,gBAAgB,sBAAsB;AAC5C,qBAAiB,QAAQ,aAAa;AACtC,QAAI,sCAAsC;AAC1C;AAAA,EACF;AAIA,MAAI,qCAAqC,WAAW,MAAM;AAC5D;AAKA,SAAS,wBAAqC;AAC5C,SAAO;AAAA,IACL,SAAS,CAAC,WAAW,WAAW,SAAS,WAAW,WAAW,MAAM;AAAA,IACrE,OAAO;AAAA,MACL,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MAC1C,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACvC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACvC,WAAW,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACxC,mBAAmB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MAChD,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACzC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACnC,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACrC,OAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACpC,SAAS,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,MACtC,MAAM,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IACrC;AAAA,IACA,OAAO,CAAC,QAAQ,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IAC5C,SAAS,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI;AAAA,IACxC,aAAa,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IAC1C,YAAY,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,aAAa,aAAa,SAAS,SAAS,SAAS;AAAA,IACtG,eAAe,CAAC,UAAU,WAAW,aAAa,YAAY,WAAW,qBAAqB,kBAAkB;AAAA,IAChH,YAAY,CAAC,WAAW,aAAa,YAAY,WAAW,qBAAqB,kBAAkB;AAAA,IACnG,cAAc,CAAC,WAAW,aAAa,YAAY,UAAU;AAAA,EAC/D;AACF;AAKA,SAAS,iBAAiB,QAAqB,QAA2B;AACxE,SAAO,QAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC;AAC9E,SAAO,MAAM,KAAK,GAAG,OAAO,MAAM,OAAO,OAAK,CAAC,OAAO,MAAM,SAAS,CAAC,CAAC,CAAC;AACxE,SAAO,QAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC;AAC9E,SAAO,YAAY,KAAK,GAAG,OAAO,YAAY,OAAO,OAAK,CAAC,OAAO,YAAY,SAAS,CAAC,CAAC,CAAC;AAC1F,SAAO,WAAW,KAAK,GAAG,OAAO,WAAW,OAAO,OAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC;AACvF,SAAO,cAAc,KAAK,GAAG,OAAO,cAAc,OAAO,OAAK,CAAC,OAAO,cAAc,SAAS,CAAC,CAAC,CAAC;AAChG,SAAO,WAAW,KAAK,GAAG,OAAO,WAAW,OAAO,OAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,CAAC;AACvF,SAAO,aAAa,KAAK,GAAG,OAAO,aAAa,OAAO,OAAK,CAAC,OAAO,aAAa,SAAS,CAAC,CAAC,CAAC;AAE7F,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACxD,QAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB,aAAO,MAAM,IAAI,IAAI;AAAA,IACvB;AAAA,EACF;AACF;AAIA,SAAS,eAAe,MAAqC;AAC3D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAO,mBAAgB,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAO,gBAAa,IAAI,EAAG,QAAO,KAAK;AACvC,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAsC;AAC7D,MAAO,gBAAa,IAAI,EAAG,QAAO,KAAK;AACvC,MAAO,mBAAgB,IAAI,EAAG,QAAO,KAAK;AAC1C,SAAO;AACT;AAEA,SAAS,cAAc,MAA4C;AACjE,SAAO,KAAK,WACT,OAAU,uBAAoB,EAC9B,IAAI,UAAQ,gBAAgB,KAAK,IAAI,CAAC,EACtC,OAAO,CAAC,MAAmB,MAAM,IAAI;AAC1C;AAkBA,IAAI,iBAAwC;AAC5C,IAAI,qBAAqB;AAclB,SAAS,cACd,MACA,SACA,aACA,cAAc,OACE;AAChB,MAAI,sBAAsB,gBAAgB;AACxC,WAAO;AAAA,EACT;AACA,uBAAqB;AAErB,QAAM,YAAY,KAAK;AAEvB,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAGA,QAAM,eAAe,UAAU,WAAW,GAAG,IACpC,aAAQ,SAAS,SAAS,IAC/B;AAEJ,MAAI,aAAa;AACf,YAAQ,IAAI,iEAAiE,YAAY;AAAA,EAC3F;AAGA,QAAM,cAAc,aAAa,cAAc,WAAW;AAG1D,mBAAiB;AAAA,IACf,SAAS,YAAY;AAAA,IACrB,OAAO,YAAY;AAAA,IACnB,OAAO,YAAY;AAAA,IACnB,SAAS,YAAY;AAAA,EACvB;AAEA,MAAI,aAAa;AACf,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,cAAc,eAAe,OAAO;AAChD,YAAQ,IAAI,YAAY,eAAe,KAAK;AAC5C,YAAQ,IAAI,cAAc,eAAe,OAAO;AAChD,YAAQ,IAAI,UAAU;AACtB,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,eAAe,KAAK,GAAG;AACrE,cAAQ,IAAI,OAAO,SAAS,KAAK,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,kBAAwB;AACtC,mBAAiB;AACjB,uBAAqB;AACvB;;;AD7bO,SAAS,kBAAkB,SAAsD;AACtF,QAAM,EAAE,gBAAgB,WAAW,SAAS,SAAS,kBAAkB,MAAM,IAAI;AAEjF,QAAM,WAA8B,CAAC;AAGrC,QAAM,cAAc,aAAa,WAAW,KAAK;AAGjD,aAAW,iBAAiB,gBAAgB;AAC1C,UAAM,eAAoB,cAAQ,aAAa;AAE/C,QAAI,CAAI,eAAW,YAAY,GAAG;AAChC,cAAQ,KAAK,wCAAwC,YAAY,EAAE;AACnE;AAAA,IACF;AAGA,UAAM,gBAAgB,kBAAkB,YAAY;AAEpD,eAAW,OAAO,eAAe;AAC/B,YAAM,gBAAqB,eAAS,GAAG;AAGvC,UAAI,WAAW,CAAC,QAAQ,SAAS,aAAa,EAAG;AACjD,UAAI,WAAW,QAAQ,SAAS,aAAa,EAAG;AAChD,UAAI,CAAC,mBAAmB,cAAc,WAAW,GAAG,EAAG;AAEvD,YAAM,aAAa,oBAAoB,KAAK,eAAe,WAAW;AACtE,UAAI,YAAY;AACd,iBAAS,aAAa,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,OAAiB,CAAC;AAExB,QAAM,UAAa,gBAAY,UAAU,EAAE,eAAe,KAAK,CAAC;AAChE,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,UAAM,UAAe,WAAK,UAAU,MAAM,IAAI;AAG9C,UAAM,WAAc,eAAgB,WAAK,SAAS,UAAU,CAAC;AAC7D,UAAM,WAAc,eAAgB,WAAK,SAAS,UAAU,CAAC;AAE7D,QAAI,YAAY,UAAU;AACxB,WAAK,KAAK,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,oBACP,KACA,eACA,aAC4B;AAE5B,QAAM,UAAa,gBAAY,GAAG,EAC/B,OAAO,OAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC,EACnD,IAAI,OAAU,WAAK,KAAK,CAAC,CAAC;AAE7B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,UAAa,kBAAc,SAAS;AAAA,IACxC,QAAW,iBAAa;AAAA,IACxB,QAAW,eAAW;AAAA,IACtB,KAAQ,YAAQ;AAAA,IAChB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,QAAQ,eAAe;AAG3C,QAAM,qBAAqB,GAAG,aAAa;AAC3C,QAAM,WAAW,CAAC,GAAG,aAAa,kBAAkB,OAAO;AAC3D,MAAI,iBAA2E;AAC/E,MAAI;AAGJ,aAAW,YAAY,SAAS;AAC9B,UAAM,aAAa,QAAQ,cAAc,QAAQ;AACjD,QAAI,CAAC,WAAY;AAGjB,IAAG,iBAAa,YAAY,CAAC,SAAS;AACpC,UAAO,2BAAuB,IAAI,KAAK,KAAK,KAAK,SAAS,oBAAoB;AAC5E,yBAAiB;AACjB,+BAAuB,oBAAoB,IAAI;AAAA,MACjD;AACA,UAAO,2BAAuB,IAAI,KAAK,KAAK,KAAK,SAAS,oBAAoB;AAC5E,yBAAiB;AACjB,+BAAuB,oBAAoB,IAAI;AAAA,MACjD;AAAA,IACF,CAAC;AAED,QAAI,eAAgB;AAAA,EACtB;AAGA,MAAI,CAAC,gBAAgB;AACnB,eAAW,WAAW,UAAU;AAC9B,iBAAW,YAAY,SAAS;AAC9B,cAAM,aAAa,QAAQ,cAAc,QAAQ;AACjD,YAAI,CAAC,WAAY;AAEjB,QAAG,iBAAa,YAAY,CAAC,SAAS;AACpC,eAAQ,2BAAuB,IAAI,KAAQ,2BAAuB,IAAI,MAAM,KAAK,KAAK,SAAS,SAAS;AACtG,6BAAiB;AACjB,mCAAuB,oBAAoB,IAAI;AAAA,UACjD;AAAA,QACF,CAAC;AAED,YAAI,eAAgB;AAAA,MACtB;AACA,UAAI,eAAgB;AAAA,IACtB;AAAA,EACF;AAGA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAGA,QAAM,QAAwC,CAAC;AAE/C,MAAI,gBAAgB;AAClB,UAAM,OAAO,YAAY,kBAAkB,cAAc;AACzD,UAAM,aAAa,KAAK,cAAc;AAEtC,eAAW,QAAQ,YAAY;AAC7B,YAAM,UAAU,gBAAgB,MAAM,aAAa,WAAW;AAC9D,UAAI,WAAW,CAAC,eAAe,QAAQ,IAAI,GAAG;AAC5C,cAAM,QAAQ,IAAI,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc;AAGpB,QAAM,WAAW,cAAc,aAAa;AAG5C,QAAM,cAAc,mBAAmB,GAAG;AAE1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAe,eAAS,QAAQ,IAAI,GAAG,GAAG;AAAA,IAC1C;AAAA,EACF;AACF;AAMA,SAAS,mBAAmB,KAAsC;AAChE,QAAM,WAAgB,WAAK,KAAK,SAAS;AAEzC,MAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAa,iBAAa,UAAU,OAAO;AAGjD,UAAM,aAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACG,iBAAa;AAAA,MAChB;AAAA,MACG,eAAW;AAAA,IAChB;AAEA,QAAI,kBAAqD;AAGzD,IAAG,iBAAa,YAAY,CAAC,SAAS;AAEpC,UAAO,wBAAoB,IAAI,GAAG;AAChC,cAAM,aAAa,KAAK,WAAW,KAAK,OAAK,EAAE,SAAY,eAAW,aAAa;AACnF,YAAI,YAAY;AACd,qBAAW,QAAQ,KAAK,gBAAgB,cAAc;AACpD,gBAAO,iBAAa,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,iBAAiB,KAAK,aAAa;AACtF,kBAAO,8BAA0B,KAAK,WAAW,GAAG;AAClD,kCAAkB,KAAK;AAAA,cACzB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAIA,UAAM,SAAsB,CAAC;AAC7B,UAAM,YAAY;AAElB,eAAW,QAAQ,UAAU,YAAY;AACvC,UAAO,yBAAqB,IAAI,KAAQ,iBAAa,KAAK,IAAI,GAAG;AAC/D,cAAM,WAAW,KAAK,KAAK;AAE3B,YAAI,aAAa,WAAc,8BAA0B,KAAK,WAAW,GAAG;AAC1E,iBAAO,QAAQ,qBAAqB,KAAK,aAAa,OAAO;AAAA,QAC/D,WAAW,aAAa,YAAY;AAElC,iBAAO,WAAW,KAAK,YAAY,QAAQ,UAAU;AAAA,QACvD,WAAW,aAAa,WAAc,8BAA0B,KAAK,WAAW,GAAG;AAEjF,iBAAO,QAAQ,qBAAqB,KAAK,aAAa,OAAO;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,EACnD,SAAS,GAAG;AACV,YAAQ,KAAK,iDAAiD,GAAG,KAAK,CAAC;AACvE,WAAO;AAAA,EACT;AACF;AAKA,SAAS,qBAAqB,MAAkC,eAA4C;AAC1G,QAAM,SAA8B,CAAC;AAErC,aAAW,QAAQ,KAAK,YAAY;AAClC,QAAO,yBAAqB,IAAI,KAAQ,iBAAa,KAAK,IAAI,GAAG;AAC/D,YAAM,MAAM,KAAK,KAAK;AACtB,YAAM,OAAO,KAAK;AAElB,UAAO,oBAAgB,IAAI,GAAG;AAC5B,eAAO,GAAG,IAAI,KAAK;AAAA,MACrB,WAAc,qBAAiB,IAAI,GAAG;AACpC,eAAO,GAAG,IAAI,OAAO,KAAK,IAAI;AAAA,MAChC,WAAW,KAAK,SAAY,eAAW,aAAa;AAClD,eAAO,GAAG,IAAI;AAAA,MAChB,WAAW,KAAK,SAAY,eAAW,cAAc;AACnD,eAAO,GAAG,IAAI;AAAA,MAChB,WAAc,6BAAyB,IAAI,GAAG;AAC5C,eAAO,GAAG,IAAI,oBAAoB,MAAM,aAAa;AAAA,MACvD,WAAc,8BAA0B,IAAI,GAAG;AAC7C,eAAO,GAAG,IAAI,qBAAqB,MAAM,aAAa;AAAA,MACxD,OAAO;AAEL,eAAO,GAAG,IAAI,KAAK,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAiC,eAA8B;AAC1F,QAAM,SAAgB,CAAC;AAEvB,aAAW,WAAW,KAAK,UAAU;AACnC,QAAO,oBAAgB,OAAO,GAAG;AAC/B,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B,WAAc,qBAAiB,OAAO,GAAG;AACvC,aAAO,KAAK,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClC,WAAW,QAAQ,SAAY,eAAW,aAAa;AACrD,aAAO,KAAK,IAAI;AAAA,IAClB,WAAW,QAAQ,SAAY,eAAW,cAAc;AACtD,aAAO,KAAK,KAAK;AAAA,IACnB,WAAc,8BAA0B,OAAO,GAAG;AAChD,aAAO,KAAK,qBAAqB,SAAS,aAAa,CAAC;AAAA,IAC1D,WAAc,6BAAyB,OAAO,GAAG;AAC/C,aAAO,KAAK,oBAAoB,SAAS,aAAa,CAAC;AAAA,IACzD,OAAO;AAEL,aAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,gBACP,QACA,aACA,aACuB;AACvB,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,eAAe,OAAO,gBAAgB;AAE5C,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,QAAM,cAAc,aAAa,CAAC;AAClC,QAAM,OAAO,YAAY,0BAA0B,QAAQ,WAAW;AACtE,QAAM,aAAa,YAAY,aAAa,IAAI;AAGhD,QAAM,cAAiB,yBAAqB,OAAO,wBAAwB,WAAW,CAAC,KAAK;AAG5F,QAAM,WAAW,EAAE,OAAO,QAAW,gBAAY;AAGjD,QAAM,SAAS,kBAAkB,MAAM,YAAY,aAAa,WAAW;AAG3E,QAAM,eAAe,oBAAoB,MAAM;AAE/C,SAAO;AAAA,IACL;AAAA,IACA,MAAM,iBAAiB,UAAU;AAAA,IACjC,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,IACrC,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,kBACP,MACA,YACA,cACA,aACU;AAEV,MAAI,eAAe,YAAY,WAAW,SAAS,QAAQ,GAAG;AAC5D,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,eAAe,UAAU,WAAW,SAAS,MAAM,GAAG;AAExD,WAAO,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,EACtC;AAGA,MAAI,KAAK,QAAQ,GAAG;AAClB,UAAM,SAAmB,CAAC;AAC1B,eAAW,aAAa,KAAK,OAAO;AAClC,UAAI,UAAU,gBAAgB,GAAG;AAC/B,eAAO,KAAK,UAAU,KAAK;AAAA,MAC7B,WAAY,UAAkB,kBAAkB,QAAQ;AACtD,eAAO,KAAK,MAAM;AAAA,MACpB,WAAY,UAAkB,kBAAkB,SAAS;AACvD,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IACF;AACA,QAAI,OAAO,SAAS,EAAG,QAAO;AAAA,EAChC;AAGA,MAAI,eAAe,WAAW;AAC5B,WAAO,CAAC,QAAQ,OAAO;AAAA,EACzB;AAEA,SAAO,CAAC;AACV;AAKA,SAAS,oBAAoB,QAA0D;AACrF,QAAM,OAAO,OAAO,aAAa;AACjC,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,aAAa,IAAI,MAAM;AACtC,YAAM,QAAW,yBAAqB,IAAI,IAAI;AAE9C,UAAI;AACF,eAAO,KAAK,MAAM,KAAK;AAAA,MACzB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAmC;AAC9D,QAAM,SAAU,KAAa;AAC7B,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAE3C,QAAM,WAAW,OAAO,CAAC;AACzB,MAAI,SAAS,SAAS;AACpB,QAAI,OAAO,SAAS,YAAY,UAAU;AACxC,aAAO,SAAS;AAAA,IAClB;AAEA,WAAQ,SAAS,QACd,IAAI,OAAM,EAAU,QAAQ,EAAE,EAC9B,KAAK,EAAE;AAAA,EACZ;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,YAA4B;AAEpD,eAAa,WAAW,QAAQ,sBAAsB,EAAE;AAGxD,MAAI,WAAW,SAAS,WAAW,EAAG,QAAO;AAC7C,MAAI,WAAW,SAAS,WAAW,EAAG,QAAO;AAE7C,SAAO;AACT;AAKA,SAAS,eAAe,MAAuB;AAC7C,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,cAAc,SAAS,IAAI,KAAK,KAAK,WAAW,eAAe;AACxE;AAKA,SAAS,cAAc,eAA0C;AAC/D,QAAM,iBAAiB,CAAC,UAAU,SAAS,YAAY,UAAU,UAAU,eAAe,UAAU,UAAU;AAC9G,QAAM,oBAAoB,CAAC,QAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,YAAY,SAAS,SAAS;AAC5G,QAAM,mBAAmB,CAAC,QAAQ,UAAU,SAAS;AACrD,QAAM,uBAAuB,CAAC,UAAU,cAAc,QAAQ,QAAQ,MAAM;AAC5E,QAAM,oBAAoB,CAAC,UAAU,WAAW,OAAO;AACvD,QAAM,iBAAiB,CAAC,SAAS,YAAY,WAAW;AAExD,MAAI,eAAe,SAAS,aAAa,EAAG,QAAO;AACnD,MAAI,kBAAkB,SAAS,aAAa,EAAG,QAAO;AACtD,MAAI,iBAAiB,SAAS,aAAa,EAAG,QAAO;AACrD,MAAI,qBAAqB,SAAS,aAAa,EAAG,QAAO;AACzD,MAAI,kBAAkB,SAAS,aAAa,EAAG,QAAO;AACtD,MAAI,eAAe,SAAS,aAAa,EAAG,QAAO;AAEnD,SAAO;AACT;","names":["ts","fs","path"]}
1
+ {"version":3,"sources":["../../src/analyzer/component-analyzer.ts","../../src/analyzer/theme-analyzer.ts"],"sourcesContent":["/**\n * Component Analyzer - Extracts component prop definitions using TypeScript Compiler API.\n *\n * Analyzes:\n * - types.ts files for prop interfaces\n * - JSDoc comments for descriptions\n * - Static .description properties on components\n * - Theme-derived types (Intent, Size) resolved to actual values\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n ComponentRegistry,\n ComponentDefinition,\n PropDefinition,\n ComponentAnalyzerOptions,\n ThemeValues,\n ComponentCategory,\n SampleProps,\n} from './types';\nimport { analyzeTheme } from './theme-analyzer';\n\n/**\n * Analyze components and generate a registry.\n */\nexport function analyzeComponents(options: ComponentAnalyzerOptions): ComponentRegistry {\n const { componentPaths, themePath, include, exclude, includeInternal = false } = options;\n\n const registry: ComponentRegistry = {};\n\n // First, analyze the theme to get valid values\n const themeValues = analyzeTheme(themePath, false);\n\n // Scan each component path\n for (const componentPath of componentPaths) {\n const resolvedPath = path.resolve(componentPath);\n\n if (!fs.existsSync(resolvedPath)) {\n console.warn(`[component-analyzer] Path not found: ${resolvedPath}`);\n continue;\n }\n\n // Find all component directories (those with index.ts or types.ts)\n const componentDirs = findComponentDirs(resolvedPath);\n\n for (const dir of componentDirs) {\n const componentName = path.basename(dir);\n\n // Apply include/exclude filters\n if (include && !include.includes(componentName)) continue;\n if (exclude && exclude.includes(componentName)) continue;\n if (!includeInternal && componentName.startsWith('_')) continue;\n\n const definition = analyzeComponentDir(dir, componentName, themeValues);\n if (definition) {\n registry[componentName] = definition;\n }\n }\n }\n\n return registry;\n}\n\n/**\n * Find all component directories in a path.\n */\nfunction findComponentDirs(basePath: string): string[] {\n const dirs: string[] = [];\n\n const entries = fs.readdirSync(basePath, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const dirPath = path.join(basePath, entry.name);\n\n // Check if it's a component directory (has index.ts or types.ts)\n const hasIndex = fs.existsSync(path.join(dirPath, 'index.ts'));\n const hasTypes = fs.existsSync(path.join(dirPath, 'types.ts'));\n\n if (hasIndex || hasTypes) {\n dirs.push(dirPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Analyze a single component directory.\n */\nfunction analyzeComponentDir(\n dir: string,\n componentName: string,\n themeValues: ThemeValues\n): ComponentDefinition | null {\n // Find all TypeScript files in the component directory\n const tsFiles = fs.readdirSync(dir)\n .filter(f => f.endsWith('.ts') || f.endsWith('.tsx'))\n .map(f => path.join(dir, f));\n\n if (tsFiles.length === 0) {\n return null;\n }\n\n // Create TypeScript program with all files\n const program = ts.createProgram(tsFiles, {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n jsx: ts.JsxEmit.React,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n });\n\n const typeChecker = program.getTypeChecker();\n\n // Search all files for the props interface\n const propsInterfaceName = `${componentName}Props`;\n const altNames = [`${componentName}ComponentProps`, 'Props'];\n let propsInterface: ts.InterfaceDeclaration | ts.TypeAliasDeclaration | null = null;\n let interfaceDescription: string | undefined;\n\n // Search each file for the props interface\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n // First try the main props interface name\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isInterfaceDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n if (ts.isTypeAliasDeclaration(node) && node.name.text === propsInterfaceName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n\n // If not found, try alternate naming conventions\n if (!propsInterface) {\n for (const altName of altNames) {\n for (const filePath of tsFiles) {\n const sourceFile = program.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n if ((ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) && node.name.text === altName) {\n propsInterface = node;\n interfaceDescription = getJSDocDescription(node);\n }\n });\n\n if (propsInterface) break;\n }\n if (propsInterface) break;\n }\n }\n\n // If we couldn't find a props interface, skip this component\n if (!propsInterface) {\n return null;\n }\n\n // Extract props\n const props: Record<string, PropDefinition> = {};\n\n if (propsInterface) {\n const type = typeChecker.getTypeAtLocation(propsInterface);\n const properties = type.getProperties();\n\n for (const prop of properties) {\n const propDef = analyzeProperty(prop, typeChecker, themeValues);\n if (propDef && !isInternalProp(propDef.name)) {\n props[propDef.name] = propDef;\n }\n }\n }\n\n // Get description from the props interface JSDoc (single source of truth in types.ts)\n const description = interfaceDescription;\n\n // Determine category\n const category = inferCategory(componentName);\n\n // Look for docs.ts to extract sample props\n const sampleProps = extractSampleProps(dir);\n\n return {\n name: componentName,\n description,\n props,\n category,\n filePath: path.relative(process.cwd(), dir),\n sampleProps,\n };\n}\n\n/**\n * Extract sample props from docs.ts file if it exists.\n * The docs.ts file should export a `sampleProps` object.\n */\nfunction extractSampleProps(dir: string): SampleProps | undefined {\n const docsPath = path.join(dir, 'docs.ts');\n\n if (!fs.existsSync(docsPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(docsPath, 'utf-8');\n\n // Create a simple TypeScript program to extract the sampleProps export\n const sourceFile = ts.createSourceFile(\n 'docs.ts',\n content,\n ts.ScriptTarget.ES2020,\n true,\n ts.ScriptKind.TS\n );\n\n let samplePropsNode: ts.ObjectLiteralExpression | null = null;\n\n // Find the sampleProps export\n ts.forEachChild(sourceFile, (node) => {\n // Handle: export const sampleProps = { ... }\n if (ts.isVariableStatement(node)) {\n const isExported = node.modifiers?.some(m => m.kind === ts.SyntaxKind.ExportKeyword);\n if (isExported) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.name.text === 'sampleProps' && decl.initializer) {\n if (ts.isObjectLiteralExpression(decl.initializer)) {\n samplePropsNode = decl.initializer;\n }\n }\n }\n }\n }\n });\n\n if (!samplePropsNode) {\n return undefined;\n }\n\n // Extract the object literal as JSON-compatible structure\n // This is a simplified extraction - it handles basic literals\n const result: SampleProps = {};\n const propsNode = samplePropsNode as ts.ObjectLiteralExpression;\n\n for (const prop of propsNode.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const propName = prop.name.text;\n\n if (propName === 'props' && ts.isObjectLiteralExpression(prop.initializer)) {\n result.props = extractObjectLiteral(prop.initializer, content);\n } else if (propName === 'children') {\n // For children, we store the raw source text\n result.children = prop.initializer.getText(sourceFile);\n } else if (propName === 'state' && ts.isObjectLiteralExpression(prop.initializer)) {\n // Extract state configuration for controlled components\n result.state = extractObjectLiteral(prop.initializer, content);\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n } catch (e) {\n console.warn(`[component-analyzer] Error reading docs.ts in ${dir}:`, e);\n return undefined;\n }\n}\n\n/**\n * Extract an object literal to a plain object (for simple literal values).\n */\nfunction extractObjectLiteral(node: ts.ObjectLiteralExpression, sourceContent: string): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const prop of node.properties) {\n if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n const key = prop.name.text;\n const init = prop.initializer;\n\n if (ts.isStringLiteral(init)) {\n result[key] = init.text;\n } else if (ts.isNumericLiteral(init)) {\n result[key] = Number(init.text);\n } else if (init.kind === ts.SyntaxKind.TrueKeyword) {\n result[key] = true;\n } else if (init.kind === ts.SyntaxKind.FalseKeyword) {\n result[key] = false;\n } else if (ts.isArrayLiteralExpression(init)) {\n result[key] = extractArrayLiteral(init, sourceContent);\n } else if (ts.isObjectLiteralExpression(init)) {\n result[key] = extractObjectLiteral(init, sourceContent);\n } else {\n // For complex expressions (JSX, functions), store the raw source\n result[key] = init.getText();\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extract an array literal to a plain array.\n */\nfunction extractArrayLiteral(node: ts.ArrayLiteralExpression, sourceContent: string): any[] {\n const result: any[] = [];\n\n for (const element of node.elements) {\n if (ts.isStringLiteral(element)) {\n result.push(element.text);\n } else if (ts.isNumericLiteral(element)) {\n result.push(Number(element.text));\n } else if (element.kind === ts.SyntaxKind.TrueKeyword) {\n result.push(true);\n } else if (element.kind === ts.SyntaxKind.FalseKeyword) {\n result.push(false);\n } else if (ts.isObjectLiteralExpression(element)) {\n result.push(extractObjectLiteral(element, sourceContent));\n } else if (ts.isArrayLiteralExpression(element)) {\n result.push(extractArrayLiteral(element, sourceContent));\n } else {\n // For complex expressions, store raw source\n result.push(element.getText());\n }\n }\n\n return result;\n}\n\n/**\n * Analyze a single property symbol.\n */\nfunction analyzeProperty(\n symbol: ts.Symbol,\n typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): PropDefinition | null {\n const name = symbol.getName();\n const declarations = symbol.getDeclarations();\n\n if (!declarations || declarations.length === 0) return null;\n\n const declaration = declarations[0];\n const type = typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n const typeString = typeChecker.typeToString(type);\n\n // Get JSDoc description\n const description = ts.displayPartsToString(symbol.getDocumentationComment(typeChecker)) || undefined;\n\n // Check if required\n const required = !(symbol.flags & ts.SymbolFlags.Optional);\n\n // Extract values for union types / theme types\n const values = extractPropValues(type, typeString, typeChecker, themeValues);\n\n // Extract default value (from JSDoc @default tag)\n const defaultValue = extractDefaultValue(symbol);\n\n return {\n name,\n type: simplifyTypeName(typeString),\n values: values.length > 0 ? values : undefined,\n default: defaultValue,\n description,\n required,\n };\n}\n\n/**\n * Extract valid values for a prop type.\n */\nfunction extractPropValues(\n type: ts.Type,\n typeString: string,\n _typeChecker: ts.TypeChecker,\n themeValues: ThemeValues\n): string[] {\n // Handle theme-derived types\n if (typeString === 'Intent' || typeString.includes('Intent')) {\n return themeValues.intents;\n }\n if (typeString === 'Size' || typeString.includes('Size')) {\n // Return generic sizes - most components use the same keys\n return ['xs', 'sm', 'md', 'lg', 'xl'];\n }\n\n // Handle union types\n if (type.isUnion()) {\n const values: string[] = [];\n for (const unionType of type.types) {\n if (unionType.isStringLiteral()) {\n values.push(unionType.value);\n } else if ((unionType as any).intrinsicName === 'true') {\n values.push('true');\n } else if ((unionType as any).intrinsicName === 'false') {\n values.push('false');\n }\n }\n if (values.length > 0) return values;\n }\n\n // Handle boolean\n if (typeString === 'boolean') {\n return ['true', 'false'];\n }\n\n return [];\n}\n\n/**\n * Extract default value from JSDoc @default tag.\n */\nfunction extractDefaultValue(symbol: ts.Symbol): string | number | boolean | undefined {\n const tags = symbol.getJsDocTags();\n for (const tag of tags) {\n if (tag.name === 'default' && tag.text) {\n const value = ts.displayPartsToString(tag.text);\n // Try to parse as JSON\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Get JSDoc description from a node.\n */\nfunction getJSDocDescription(node: ts.Node): string | undefined {\n const jsDocs = (node as any).jsDoc as ts.JSDoc[] | undefined;\n if (!jsDocs || jsDocs.length === 0) return undefined;\n\n const firstDoc = jsDocs[0];\n if (firstDoc.comment) {\n if (typeof firstDoc.comment === 'string') {\n return firstDoc.comment;\n }\n // Handle NodeArray of JSDocComment\n return (firstDoc.comment as ts.NodeArray<ts.JSDocComment>)\n .map(c => (c as any).text || '')\n .join('');\n }\n return undefined;\n}\n\n/**\n * Simplify type names for display.\n */\nfunction simplifyTypeName(typeString: string): string {\n // Remove import paths\n typeString = typeString.replace(/import\\([^)]+\\)\\./g, '');\n\n // Simplify common complex types\n if (typeString.includes('ReactNode')) return 'ReactNode';\n if (typeString.includes('StyleProp')) return 'Style';\n\n return typeString;\n}\n\n/**\n * Check if a prop should be excluded (internal/inherited).\n */\nfunction isInternalProp(name: string): boolean {\n const internalProps = [\n 'ref',\n 'key',\n 'children',\n 'style',\n 'testID',\n 'nativeID',\n 'accessible',\n 'accessibilityActions',\n 'accessibilityComponentType',\n 'accessibilityElementsHidden',\n 'accessibilityHint',\n 'accessibilityIgnoresInvertColors',\n 'accessibilityLabel',\n 'accessibilityLabelledBy',\n 'accessibilityLanguage',\n 'accessibilityLiveRegion',\n 'accessibilityRole',\n 'accessibilityState',\n 'accessibilityTraits',\n 'accessibilityValue',\n 'accessibilityViewIsModal',\n 'collapsable',\n 'focusable',\n 'hasTVPreferredFocus',\n 'hitSlop',\n 'importantForAccessibility',\n 'needsOffscreenAlphaCompositing',\n 'onAccessibilityAction',\n 'onAccessibilityEscape',\n 'onAccessibilityTap',\n 'onLayout',\n 'onMagicTap',\n 'onMoveShouldSetResponder',\n 'onMoveShouldSetResponderCapture',\n 'onResponderEnd',\n 'onResponderGrant',\n 'onResponderMove',\n 'onResponderReject',\n 'onResponderRelease',\n 'onResponderStart',\n 'onResponderTerminate',\n 'onResponderTerminationRequest',\n 'onStartShouldSetResponder',\n 'onStartShouldSetResponderCapture',\n 'pointerEvents',\n 'removeClippedSubviews',\n 'renderToHardwareTextureAndroid',\n 'shouldRasterizeIOS',\n 'tvParallaxMagnification',\n 'tvParallaxProperties',\n 'tvParallaxShiftDistanceX',\n 'tvParallaxShiftDistanceY',\n 'tvParallaxTiltAngle',\n ];\n\n return internalProps.includes(name) || name.startsWith('accessibility');\n}\n\n/**\n * Infer component category from name.\n */\nfunction inferCategory(componentName: string): ComponentCategory {\n const formComponents = ['Button', 'Input', 'Checkbox', 'Select', 'Switch', 'RadioButton', 'Slider', 'TextArea'];\n const displayComponents = ['Text', 'Card', 'Badge', 'Chip', 'Avatar', 'Icon', 'Skeleton', 'Alert', 'Tooltip'];\n const layoutComponents = ['View', 'Screen', 'Divider'];\n const navigationComponents = ['TabBar', 'Breadcrumb', 'Menu', 'List', 'Link'];\n const overlayComponents = ['Dialog', 'Popover', 'Modal'];\n const dataComponents = ['Table', 'Progress', 'Accordion'];\n\n if (formComponents.includes(componentName)) return 'form';\n if (displayComponents.includes(componentName)) return 'display';\n if (layoutComponents.includes(componentName)) return 'layout';\n if (navigationComponents.includes(componentName)) return 'navigation';\n if (overlayComponents.includes(componentName)) return 'overlay';\n if (dataComponents.includes(componentName)) return 'data';\n\n return 'display'; // Default\n}\n","/**\n * Theme Analyzer - Extracts theme keys by statically analyzing theme files.\n *\n * Uses TypeScript Compiler API to trace the declarative builder API:\n * - createTheme() / fromTheme(base)\n * - .addIntent('name', {...})\n * - .addRadius('name', value)\n * - .addShadow('name', {...})\n * - .setSizes({ button: { xs: {}, sm: {}, ... }, ... })\n * - .build()\n */\n\nimport * as ts from 'typescript';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ThemeValues } from './types';\n\ninterface AnalyzerContext {\n program: ts.Program;\n typeChecker: ts.TypeChecker;\n verbose: boolean;\n}\n\n/**\n * Extract theme values from a theme file.\n */\nexport function analyzeTheme(themePath: string, verbose = false): ThemeValues {\n const resolvedPath = path.resolve(themePath);\n\n if (!fs.existsSync(resolvedPath)) {\n throw new Error(`Theme file not found: ${resolvedPath}`);\n }\n\n const log = (...args: any[]) => {\n if (verbose) console.log('[theme-analyzer]', ...args);\n };\n\n log('Analyzing theme file:', resolvedPath);\n\n // Create a TypeScript program\n const program = ts.createProgram([resolvedPath], {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n allowSyntheticDefaultImports: true,\n });\n\n const sourceFile = program.getSourceFile(resolvedPath);\n if (!sourceFile) {\n throw new Error(`Failed to parse theme file: ${resolvedPath}`);\n }\n\n const ctx: AnalyzerContext = {\n program,\n typeChecker: program.getTypeChecker(),\n verbose,\n };\n\n const values: ThemeValues = {\n intents: [],\n sizes: {},\n radii: [],\n shadows: [],\n breakpoints: [],\n typography: [],\n surfaceColors: [],\n textColors: [],\n borderColors: [],\n };\n\n // Track imports for base theme resolution\n const imports = new Map<string, { source: string; imported: string }>();\n\n // First pass: collect imports\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isImportDeclaration(node)) {\n const source = (node.moduleSpecifier as ts.StringLiteral).text;\n const clause = node.importClause;\n if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n const localName = element.name.text;\n const importedName = element.propertyName?.text ?? localName;\n imports.set(localName, { source, imported: importedName });\n }\n }\n }\n });\n\n /**\n * Process a builder method call chain.\n */\n function processBuilderChain(node: ts.Node): void {\n if (!ts.isCallExpression(node)) return;\n\n // Check if this is a .build() call\n if (ts.isPropertyAccessExpression(node.expression)) {\n const methodName = node.expression.name.text;\n\n if (methodName === 'build') {\n // Trace the full chain\n const calls = traceBuilderCalls(node);\n processCalls(calls);\n return;\n }\n }\n\n // Recurse into children\n ts.forEachChild(node, processBuilderChain);\n }\n\n interface BuilderCall {\n method: string;\n args: ts.NodeArray<ts.Expression>;\n }\n\n /**\n * Trace a builder chain backwards to collect all method calls.\n */\n function traceBuilderCalls(node: ts.CallExpression, calls: BuilderCall[] = []): BuilderCall[] {\n if (!ts.isPropertyAccessExpression(node.expression)) {\n // Check for createTheme() or fromTheme()\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const fnName = node.expression.text;\n if (fnName === 'fromTheme' && node.arguments.length > 0) {\n const arg = node.arguments[0];\n if (ts.isIdentifier(arg)) {\n // Analyze base theme\n analyzeBaseTheme(arg.text, imports, values, ctx);\n }\n }\n }\n return calls;\n }\n\n const methodName = node.expression.name.text;\n calls.unshift({ method: methodName, args: node.arguments });\n\n // Recurse into the object being called\n const obj = node.expression.expression;\n if (ts.isCallExpression(obj)) {\n return traceBuilderCalls(obj, calls);\n }\n\n return calls;\n }\n\n /**\n * Process the collected builder method calls.\n */\n function processCalls(calls: BuilderCall[]): void {\n log('Processing', calls.length, 'builder method calls');\n\n for (const { method, args } of calls) {\n switch (method) {\n case 'addIntent': {\n const name = getStringValue(args[0]);\n if (name && !values.intents.includes(name)) {\n values.intents.push(name);\n log(' Found intent:', name);\n }\n break;\n }\n case 'addRadius': {\n const name = getStringValue(args[0]);\n if (name && !values.radii.includes(name)) {\n values.radii.push(name);\n log(' Found radius:', name);\n }\n break;\n }\n case 'addShadow': {\n const name = getStringValue(args[0]);\n if (name && !values.shadows.includes(name)) {\n values.shadows.push(name);\n log(' Found shadow:', name);\n }\n break;\n }\n case 'setSizes': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const componentName = getPropertyName(prop.name);\n if (componentName && ts.isObjectLiteralExpression(prop.initializer)) {\n values.sizes[componentName] = getObjectKeys(prop.initializer);\n log(' Found sizes for', componentName + ':', values.sizes[componentName]);\n }\n }\n }\n }\n break;\n }\n case 'setBreakpoints': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n values.breakpoints = getObjectKeys(args[0]);\n log(' Found breakpoints:', values.breakpoints);\n }\n break;\n }\n case 'setColors': {\n if (args[0] && ts.isObjectLiteralExpression(args[0])) {\n for (const prop of args[0].properties) {\n if (ts.isPropertyAssignment(prop)) {\n const colorType = getPropertyName(prop.name);\n if (ts.isObjectLiteralExpression(prop.initializer)) {\n const keys = getObjectKeys(prop.initializer);\n switch (colorType) {\n case 'surface':\n values.surfaceColors = keys;\n log(' Found surface colors:', keys);\n break;\n case 'text':\n values.textColors = keys;\n log(' Found text colors:', keys);\n break;\n case 'border':\n values.borderColors = keys;\n log(' Found border colors:', keys);\n break;\n }\n }\n }\n }\n }\n break;\n }\n case 'build':\n // End of chain\n break;\n default:\n log(' Skipping unknown method:', method);\n }\n }\n }\n\n // Second pass: find and process builder chains\n ts.forEachChild(sourceFile, (node) => {\n // Handle variable declarations\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (decl.initializer) {\n processBuilderChain(decl.initializer);\n }\n }\n }\n // Handle export statements\n if (ts.isExportAssignment(node)) {\n processBuilderChain(node.expression);\n }\n });\n\n // Extract typography keys from sizes if present\n if (values.sizes['typography']) {\n values.typography = values.sizes['typography'];\n }\n\n log('Extracted theme values:', values);\n\n return values;\n}\n\n/**\n * Analyze a base theme file referenced by an import.\n */\nfunction analyzeBaseTheme(\n varName: string,\n imports: Map<string, { source: string; imported: string }>,\n values: ThemeValues,\n ctx: AnalyzerContext\n): void {\n const log = (...args: any[]) => {\n if (ctx.verbose) console.log('[theme-analyzer]', ...args);\n };\n\n const importInfo = imports.get(varName);\n if (!importInfo) {\n log('Could not find import for base theme:', varName);\n return;\n }\n\n log('Base theme', varName, 'imported from', importInfo.source);\n\n // For @idealyst/theme imports, we know the structure\n if (importInfo.source === '@idealyst/theme' || importInfo.source.includes('@idealyst/theme')) {\n // Use default light theme values\n const defaultValues = getDefaultThemeValues();\n mergeThemeValues(values, defaultValues);\n log('Using default @idealyst/theme values');\n return;\n }\n\n // For relative imports, try to resolve and analyze\n // (This is simplified - full implementation would recursively analyze)\n log('Skipping base theme analysis for:', importInfo.source);\n}\n\n/**\n * Get default theme values from @idealyst/theme.\n */\nfunction getDefaultThemeValues(): ThemeValues {\n return {\n intents: ['primary', 'success', 'error', 'warning', 'neutral', 'info'],\n sizes: {\n button: ['xs', 'sm', 'md', 'lg', 'xl'],\n chip: ['xs', 'sm', 'md', 'lg', 'xl'],\n badge: ['xs', 'sm', 'md', 'lg', 'xl'],\n icon: ['xs', 'sm', 'md', 'lg', 'xl'],\n input: ['xs', 'sm', 'md', 'lg', 'xl'],\n radioButton: ['xs', 'sm', 'md', 'lg', 'xl'],\n select: ['xs', 'sm', 'md', 'lg', 'xl'],\n slider: ['xs', 'sm', 'md', 'lg', 'xl'],\n switch: ['xs', 'sm', 'md', 'lg', 'xl'],\n textarea: ['xs', 'sm', 'md', 'lg', 'xl'],\n avatar: ['xs', 'sm', 'md', 'lg', 'xl'],\n progress: ['xs', 'sm', 'md', 'lg', 'xl'],\n accordion: ['xs', 'sm', 'md', 'lg', 'xl'],\n activityIndicator: ['xs', 'sm', 'md', 'lg', 'xl'],\n breadcrumb: ['xs', 'sm', 'md', 'lg', 'xl'],\n list: ['xs', 'sm', 'md', 'lg', 'xl'],\n menu: ['xs', 'sm', 'md', 'lg', 'xl'],\n text: ['xs', 'sm', 'md', 'lg', 'xl'],\n tabBar: ['xs', 'sm', 'md', 'lg', 'xl'],\n table: ['xs', 'sm', 'md', 'lg', 'xl'],\n tooltip: ['xs', 'sm', 'md', 'lg', 'xl'],\n view: ['xs', 'sm', 'md', 'lg', 'xl'],\n // Typography sizes for Text component's $typography iterator\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n },\n radii: ['none', 'xs', 'sm', 'md', 'lg', 'xl'],\n shadows: ['none', 'sm', 'md', 'lg', 'xl'],\n breakpoints: ['xs', 'sm', 'md', 'lg', 'xl'],\n typography: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'subtitle1', 'subtitle2', 'body1', 'body2', 'caption'],\n surfaceColors: ['screen', 'primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n textColors: ['primary', 'secondary', 'tertiary', 'inverse', 'inverse-secondary', 'inverse-tertiary'],\n borderColors: ['primary', 'secondary', 'tertiary', 'disabled'],\n };\n}\n\n/**\n * Merge theme values, avoiding duplicates.\n */\nfunction mergeThemeValues(target: ThemeValues, source: ThemeValues): void {\n target.intents.push(...source.intents.filter(k => !target.intents.includes(k)));\n target.radii.push(...source.radii.filter(k => !target.radii.includes(k)));\n target.shadows.push(...source.shadows.filter(k => !target.shadows.includes(k)));\n target.breakpoints.push(...source.breakpoints.filter(k => !target.breakpoints.includes(k)));\n target.typography.push(...source.typography.filter(k => !target.typography.includes(k)));\n target.surfaceColors.push(...source.surfaceColors.filter(k => !target.surfaceColors.includes(k)));\n target.textColors.push(...source.textColors.filter(k => !target.textColors.includes(k)));\n target.borderColors.push(...source.borderColors.filter(k => !target.borderColors.includes(k)));\n\n for (const [comp, sizes] of Object.entries(source.sizes)) {\n if (!target.sizes[comp]) {\n target.sizes[comp] = sizes;\n }\n }\n}\n\n// Helper functions\n\nfunction getStringValue(node?: ts.Expression): string | null {\n if (!node) return null;\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isIdentifier(node)) return node.text;\n return null;\n}\n\nfunction getPropertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node)) return node.text;\n if (ts.isStringLiteral(node)) return node.text;\n return null;\n}\n\nfunction getObjectKeys(node: ts.ObjectLiteralExpression): string[] {\n return node.properties\n .filter(ts.isPropertyAssignment)\n .map(prop => getPropertyName(prop.name))\n .filter((k): k is string => k !== null);\n}\n\n// ============================================================================\n// Babel Plugin Compatibility Layer\n// ============================================================================\n\n/**\n * Theme keys format expected by the Babel plugin.\n * This is a subset of ThemeValues for backwards compatibility.\n */\nexport interface BabelThemeKeys {\n intents: string[];\n sizes: Record<string, string[]>;\n radii: string[];\n shadows: string[];\n typography: string[];\n}\n\n// Cache for loadThemeKeys to avoid re-parsing\nlet themeKeysCache: BabelThemeKeys | null = null;\nlet themeLoadAttempted = false;\n\n/**\n * Load theme keys for the Babel plugin.\n * This is a compatibility wrapper around analyzeTheme() that:\n * - Provides caching (only parses once per build)\n * - Returns the subset of keys needed by the Babel plugin\n * - Handles path resolution based on babel opts\n *\n * @param opts - Babel plugin options (requires themePath)\n * @param rootDir - Root directory for path resolution\n * @param _babelTypes - Unused (kept for backwards compatibility)\n * @param verboseMode - Enable verbose logging\n */\nexport function loadThemeKeys(\n opts: { themePath?: string },\n rootDir: string,\n _babelTypes?: unknown,\n verboseMode = false\n): BabelThemeKeys {\n if (themeLoadAttempted && themeKeysCache) {\n return themeKeysCache;\n }\n themeLoadAttempted = true;\n\n const themePath = opts.themePath;\n\n if (!themePath) {\n throw new Error(\n '[idealyst-plugin] themePath is required!\\n' +\n 'Add it to your babel config:\\n' +\n ' [\"@idealyst/theme/plugin\", { themePath: \"./src/theme/styles.ts\" }]'\n );\n }\n\n // Resolve the path\n const resolvedPath = themePath.startsWith('.')\n ? path.resolve(rootDir, themePath)\n : themePath;\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Analyzing theme file via @idealyst/tooling:', resolvedPath);\n }\n\n // Use the TypeScript-based analyzer\n const themeValues = analyzeTheme(resolvedPath, verboseMode);\n\n // Convert to Babel-compatible format (subset of ThemeValues)\n themeKeysCache = {\n intents: themeValues.intents,\n sizes: themeValues.sizes,\n radii: themeValues.radii,\n shadows: themeValues.shadows,\n typography: themeValues.typography,\n };\n\n if (verboseMode) {\n console.log('[idealyst-plugin] Extracted theme keys:');\n console.log(' intents:', themeKeysCache.intents);\n console.log(' radii:', themeKeysCache.radii);\n console.log(' shadows:', themeKeysCache.shadows);\n console.log(' sizes:');\n for (const [component, sizes] of Object.entries(themeKeysCache.sizes)) {\n console.log(` ${component}:`, sizes);\n }\n }\n\n return themeKeysCache;\n}\n\n/**\n * Reset the theme cache. Useful for testing or hot reload.\n */\nexport function resetThemeCache(): void {\n themeKeysCache = null;\n themeLoadAttempted = false;\n}\n"],"mappings":"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","names":["ts","fs","path"]}
package/dist/index.cjs CHANGED
@@ -316,7 +316,9 @@ function getDefaultThemeValues() {
316
316
  tabBar: ["xs", "sm", "md", "lg", "xl"],
317
317
  table: ["xs", "sm", "md", "lg", "xl"],
318
318
  tooltip: ["xs", "sm", "md", "lg", "xl"],
319
- view: ["xs", "sm", "md", "lg", "xl"]
319
+ view: ["xs", "sm", "md", "lg", "xl"],
320
+ // Typography sizes for Text component's $typography iterator
321
+ typography: ["h1", "h2", "h3", "h4", "h5", "h6", "subtitle1", "subtitle2", "body1", "body2", "caption"]
320
322
  },
321
323
  radii: ["none", "xs", "sm", "md", "lg", "xl"],
322
324
  shadows: ["none", "sm", "md", "lg", "xl"],
@@ -378,7 +380,8 @@ function loadThemeKeys(opts, rootDir, _babelTypes, verboseMode = false) {
378
380
  intents: themeValues.intents,
379
381
  sizes: themeValues.sizes,
380
382
  radii: themeValues.radii,
381
- shadows: themeValues.shadows
383
+ shadows: themeValues.shadows,
384
+ typography: themeValues.typography
382
385
  };
383
386
  if (verboseMode) {
384
387
  console.log("[idealyst-plugin] Extracted theme keys:");