@dsai-io/tools 1.3.0 → 1.3.1
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.
- package/dist/cli/index.cjs +104 -77
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +104 -77
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +104 -69
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +104 -67
- package/dist/index.js.map +1 -1
- package/dist/tokens/index.cjs +104 -69
- package/dist/tokens/index.cjs.map +1 -1
- package/dist/tokens/index.d.cts +6 -0
- package/dist/tokens/index.d.ts +6 -0
- package/dist/tokens/index.js +104 -67
- package/dist/tokens/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tokens/style-dictionary/formats/css-dark-mode.ts","../../src/tokens/style-dictionary/formats/css-variables.ts","../../src/tokens/style-dictionary/formats/javascript.ts","../../src/tokens/framework-mappers/bootstrap.ts","../../src/tokens/framework-mappers/shadcn.ts","../../src/tokens/framework-mappers/mapper.ts","../../src/tokens/style-dictionary/formats/scss-framework.ts","../../src/tokens/style-dictionary/formats/typescript.ts","../../src/tokens/style-dictionary/formats/index.ts","../../src/tokens/style-dictionary/transforms/dimension.ts","../../src/tokens/style-dictionary/transforms/font-weight.ts","../../src/tokens/style-dictionary/transforms/line-height.ts","../../src/tokens/style-dictionary/transforms/name-js-identifier.ts","../../src/tokens/style-dictionary/transforms/name.ts","../../src/tokens/style-dictionary/transforms/index.ts","../../src/tokens/style-dictionary/groups/css.ts","../../src/tokens/style-dictionary/groups/js.ts","../../src/tokens/style-dictionary/groups/scss.ts","../../src/tokens/style-dictionary/groups/index.ts","../../src/tokens/diff.ts","../../src/tokens/types.ts","../../src/tokens/validate.ts","../../src/tokens/schemas/dtcg-token.schema.ts","../../src/tokens/schemas/figma-export.schema.ts","../../src/tokens/schemas/style-dictionary.schema.ts","../../src/tokens/schemas/index.ts","../../src/tokens/validate-figma.ts","../../src/tokens/transform.ts","../../src/tokens/sync.ts","../../src/tokens/cache.ts","../../src/tokens/incremental.ts","../../src/tokens/mode-extractor.ts","../../src/tokens/mode-preprocessor.ts","../../src/tokens/postprocess.ts","../../src/tokens/snapshot.ts","../../src/tokens/theme-builder.ts","../../src/tokens/theme-discovery.ts","../../src/tokens/build.ts","../../src/tokens/clean.ts","../../src/tokens/merge.ts","../../src/tokens/merge/scanner.ts","../../src/tokens/merge/merger.ts","../../src/tokens/merge/bundler.ts","../../src/tokens/output/resolver.ts","../../src/tokens/style-dictionary/types.ts","../../src/tokens/style-dictionary/config.ts","../../src/tokens/style-dictionary/preprocessors/fix-references.ts","../../src/tokens/style-dictionary/preprocessors/index.ts","../../src/tokens/style-dictionary/index.ts","../../src/tokens/framework-mappers/index.ts","../../src/tokens/changelog.ts","../../src/tokens/index.ts"],"names":["cssVariablesWithComments","path","BOOTSTRAP_MAPPINGS","BOOTSTRAP_PATTERNS","bootstrapMapper","SHADCN_MAPPINGS","shadcnMapper","mapper","toPascalCaseSegment","toJsIdentifier","typescriptDeclarations","builtInFormats","dimensionRem","fontWeightUnitless","DEFAULT_BASE_FONT_SIZE","lineHeightUnitless","nameKebab","builtInTransforms","cssTransformGroup","jsTransformGroup","scssTransformGroup","transformGroups","isToken","getTokenValue","getTokenType","getTokenDescription","readFileSync","existsSync","readdirSync","join","statSync","relative","z","basename","extname","countTokens","DEFAULT_COLLECTIONS","dirname","mkdirSync","detectModes","writeFileSync","createHash","fs","getNestedValue","parse","rmSync","resolve","registerTransformGroups","fg","execSync","outputDir","duration","path2","fs2","path3","path4","fs3","path5","fs4","readFile","writeFile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * CSS Dark Mode Variables Format\r\n *\r\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\r\n * following Bootstrap 5.3+ color mode pattern.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-dark-mode\r\n * @see https://getbootstrap.com/docs/5.3/customize/color-modes/\r\n */\r\n\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * css/variables-dark-mode format\r\n *\r\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\r\n * for Bootstrap-compatible dark mode theming.\r\n *\r\n * @example\r\n * Output:\r\n * ```css\r\n * [data-bs-theme=\"dark\"] {\r\n * --dsai-body-bg: #212529;\r\n * --dsai-body-color: #dee2e6;\r\n * }\r\n * ```\r\n */\r\nexport const cssDarkModeVariables: FormatDefinition = {\r\n name: 'css/variables-dark-mode',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const prefix = (options['prefix'] as string) ?? '--';\r\n const selector = (options['selector'] as string) ?? '[data-bs-theme=\"dark\"]';\r\n\r\n const variables = dictionary.allTokens.map((token) => {\r\n const lines: string[] = [];\r\n\r\n // Add comment if present\r\n if (token.comment) {\r\n lines.push(` /* ${token.comment} */`);\r\n }\r\n\r\n // Add description if present (DTCG $description or legacy description)\r\n const description = token.$description ?? token.description;\r\n if (description && description !== token.comment) {\r\n lines.push(` /* ${description} */`);\r\n }\r\n\r\n // Get value (DTCG $value or legacy value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add variable\r\n lines.push(` ${prefix}${token.name}: ${value};`);\r\n\r\n return lines.join('\\n');\r\n });\r\n\r\n return `${selector} {\\n${variables.join('\\n')}\\n}\\n`;\r\n },\r\n};\r\n","/**\r\n * CSS Variables Format\r\n *\r\n * Generates CSS custom properties with descriptive comments.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-variables\r\n */\r\n\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * css/variables-with-comments format\r\n *\r\n * Generates CSS custom properties with descriptive comments.\r\n * Supports configurable prefix via options.\r\n *\r\n * @example\r\n * Output:\r\n * ```css\r\n * :root {\r\n * /* Primary brand color *\\/\r\n * --dsai-color-primary: #007bff;\r\n * --dsai-spacing-md: 1rem;\r\n * }\r\n * ```\r\n */\r\nexport const cssVariablesWithComments: FormatDefinition = {\r\n name: 'css/variables-with-comments',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const prefix = (options['prefix'] as string) ?? '--';\r\n\r\n const variables = dictionary.allTokens.map((token) => {\r\n const lines: string[] = [];\r\n\r\n // Add comment if present\r\n if (token.comment) {\r\n lines.push(` /* ${token.comment} */`);\r\n }\r\n\r\n // Add description if present (DTCG $description or legacy description)\r\n const description = token.$description ?? token.description;\r\n if (description && description !== token.comment) {\r\n lines.push(` /* ${description} */`);\r\n }\r\n\r\n // Get value (DTCG $value or legacy value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add variable\r\n lines.push(` ${prefix}${token.name}: ${value};`);\r\n\r\n return lines.join('\\n');\r\n });\r\n\r\n return `:root {\\n${variables.join('\\n')}\\n}\\n`;\r\n },\r\n};\r\n","/**\r\n * JavaScript Format\r\n *\r\n * Custom JavaScript ES6 format that uses the transformed token.name\r\n * to ensure valid JavaScript identifiers.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/javascript\r\n */\r\n\r\nimport type { FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Prefix numeric identifiers with underscore to make them valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * Convert token path to valid JavaScript identifier\r\n */\r\nfunction toJsIdentifier(path: string[]): string {\r\n return path.map(toPascalCaseSegment).join('');\r\n}\r\n\r\n/**\r\n * JavaScript ES6 format with valid identifiers\r\n *\r\n * Manually applies the name transformation to ensure valid JS variable names.\r\n */\r\nexport const javascriptEsm: FormatDefinition = {\r\n name: 'javascript/esm-safe',\r\n format: ({ dictionary, file, options }) => {\r\n const tokens = dictionary.allTokens;\r\n // Check if tokens are in DTCG format (auto-detected by Style Dictionary)\r\n const usesDtcg = options?.['usesDtcg'] ?? false;\r\n\r\n let output = `/**\\n * ${file.destination}\\n * Design Tokens - Generated\\n * DO NOT EDIT\\n */\\n\\n`;\r\n\r\n for (const token of tokens) {\r\n // Use the transformed name or generate it from path\r\n const name = toJsIdentifier(token.path);\r\n\r\n // For DTCG tokens, use $value; for regular tokens, use value\r\n const tokenValue = usesDtcg ? token.$value : token.value;\r\n const value = JSON.stringify(tokenValue);\r\n\r\n // Handle DTCG $description or regular description/comment\r\n const comment = token.comment || token.$description || token.description || '';\r\n\r\n if (comment) {\r\n output += `// ${comment}\\n`;\r\n }\r\n output += `export const ${name} = ${value};\\n`;\r\n }\r\n\r\n return output;\r\n },\r\n};\r\n","/**\r\n * Bootstrap Framework Mapper\r\n *\r\n * Maps Figma/DTCG token names to Bootstrap 5.x variable names.\r\n * This is the complete mapping list extracted from the playground's\r\n * _variables.scss compatibility layer.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// Bootstrap Name Mappings\r\n// ============================================================================\r\n\r\n/**\r\n * Complete token name → Bootstrap variable name mappings\r\n *\r\n * These mappings handle cases where Figma/DTCG token naming conventions\r\n * differ from Bootstrap 5.x variable naming conventions.\r\n *\r\n * The mappings are extracted from the playground's manual _variables.scss\r\n * compatibility layer to ensure complete parity.\r\n *\r\n * CATEGORIES:\r\n * - Typography: Font sizes, weights, headings, display, line heights, letter spacing\r\n * - Colors: Pass through (no mapping needed - names match)\r\n * - Spacing: Pass through (no mapping needed - names match)\r\n * - Layout: Pass through (no mapping needed - names match)\r\n * - Shadows: Custom mappings to Bootstrap shadow variable names\r\n * - Border Radius: Custom mappings to Bootstrap radius variable names\r\n */\r\nexport const BOOTSTRAP_MAPPINGS: Record<string, string> = {\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Sizes\r\n // ==========================================================================\r\n // Figma uses \"text\" prefix, Bootstrap uses \"font-size\" prefix\r\n 'typography-text-base': 'font-size-base',\r\n 'typography-text-sm': 'font-size-sm',\r\n 'typography-text-lead': 'font-size-lg',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Weights\r\n // ==========================================================================\r\n // Figma uses descriptive names, Bootstrap uses semantic names\r\n 'typography-font-weight-thin': 'font-weight-lighter',\r\n 'typography-font-weight-extra-light': 'font-weight-lighter',\r\n 'typography-font-weight-light': 'font-weight-light',\r\n 'typography-font-weight-regular': 'font-weight-normal',\r\n 'typography-font-weight-medium': 'font-weight-medium',\r\n 'typography-font-weight-semi-bold': 'font-weight-semibold',\r\n 'typography-font-weight-bold': 'font-weight-bold',\r\n 'typography-font-weight-extra-bold': 'font-weight-bold',\r\n 'typography-font-weight-black': 'font-weight-bolder',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Families\r\n // ==========================================================================\r\n 'typography-font-family-base': 'font-family-base',\r\n 'typography-font-family-monospace': 'font-family-monospace',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Headings (h1-h6)\r\n // ==========================================================================\r\n // Figma: heading-h1 → Bootstrap: h1-font-size\r\n 'typography-heading-h1': 'h1-font-size',\r\n 'typography-heading-h2': 'h2-font-size',\r\n 'typography-heading-h3': 'h3-font-size',\r\n 'typography-heading-h4': 'h4-font-size',\r\n 'typography-heading-h5': 'h5-font-size',\r\n 'typography-heading-h6': 'h6-font-size',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Display Headings (d1-d6)\r\n // ==========================================================================\r\n // Figma: display-d1 → Bootstrap: display1-size (part of $display-font-sizes map)\r\n 'typography-display-d1': 'display1-size',\r\n 'typography-display-d2': 'display2-size',\r\n 'typography-display-d3': 'display3-size',\r\n 'typography-display-d4': 'display4-size',\r\n 'typography-display-d5': 'display5-size',\r\n 'typography-display-d6': 'display6-size',\r\n // Alternative naming: display-h1 → display1-size\r\n 'typography-display-h1': 'display1-size',\r\n 'typography-display-h2': 'display2-size',\r\n 'typography-display-h3': 'display3-size',\r\n 'typography-display-h4': 'display4-size',\r\n 'typography-display-h5': 'display5-size',\r\n 'typography-display-h6': 'display6-size',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Line Heights\r\n // ==========================================================================\r\n 'typography-line-height-xs': 'line-height-xs',\r\n 'typography-line-height-sm': 'line-height-sm',\r\n 'typography-line-height-tight': 'headings-line-height',\r\n 'typography-line-height-base': 'line-height-base',\r\n 'typography-line-height-relaxed': 'line-height-relaxed',\r\n 'typography-line-height-lg': 'line-height-lg',\r\n 'typography-line-height-display-sm': 'display-line-height',\r\n 'typography-line-height-display-md': 'display-line-height-md',\r\n 'typography-line-height-display-lg': 'display-line-height-lg',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Letter Spacing\r\n // ==========================================================================\r\n 'typography-letter-spacing-tighter': 'letter-spacing-tighter',\r\n 'typography-letter-spacing-tightest': 'letter-spacing-tighter',\r\n 'typography-letter-spacing-tight': 'letter-spacing-tight',\r\n 'typography-letter-spacing-normal': 'letter-spacing-normal',\r\n 'typography-letter-spacing-wide': 'letter-spacing-wide',\r\n 'typography-letter-spacing-wider': 'letter-spacing-wider',\r\n 'typography-letter-spacing-widest': 'letter-spacing-widest',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Lead\r\n // ==========================================================================\r\n 'typography-lead-font-size': 'lead-font-size',\r\n\r\n // ==========================================================================\r\n // SHADOWS\r\n // ==========================================================================\r\n // Figma: shadow-default → Bootstrap: box-shadow\r\n 'shadow-default': 'box-shadow',\r\n 'shadow-sm': 'box-shadow-sm',\r\n 'shadow-lg': 'box-shadow-lg',\r\n 'shadow-inset': 'box-shadow-inset',\r\n\r\n // ==========================================================================\r\n // BORDER WIDTH\r\n // ==========================================================================\r\n // Figma: border-width-0 → Bootstrap: border-width-0\r\n 'border-width-0': 'border-width-0',\r\n 'border-width-1': 'border-width-1',\r\n 'border-width-2': 'border-width-2',\r\n 'border-width-3': 'border-width-3',\r\n 'border-width-4': 'border-width-4',\r\n 'border-width-5': 'border-width-5',\r\n\r\n // ==========================================================================\r\n // BORDER RADIUS\r\n // ==========================================================================\r\n // Figma: border-radius-default → Bootstrap: border-radius\r\n 'border-radius-0': 'border-radius-0',\r\n 'border-radius-default': 'border-radius',\r\n 'border-radius-sm': 'border-radius-sm',\r\n 'border-radius-lg': 'border-radius-lg',\r\n 'border-radius-xl': 'border-radius-xl',\r\n 'border-radius-xxl': 'border-radius-xxl',\r\n 'border-radius-pill': 'border-radius-pill',\r\n 'border-radius-circle': 'border-radius-circle',\r\n\r\n // ==========================================================================\r\n // SEMANTIC / THEME COLORS\r\n // ==========================================================================\r\n // Figma: theme-primary → Bootstrap uses these directly\r\n 'theme-primary': 'primary',\r\n 'theme-secondary': 'secondary',\r\n 'theme-success': 'success',\r\n 'theme-danger': 'danger',\r\n 'theme-warning': 'warning',\r\n 'theme-info': 'info',\r\n 'theme-light': 'light',\r\n 'theme-dark': 'dark',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Grid\r\n // ==========================================================================\r\n 'layout-grid-columns': 'grid-columns',\r\n 'layout-grid-gutter-width': 'grid-gutter-width',\r\n 'layout-grid-row-columns': 'grid-row-columns',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Container\r\n // ==========================================================================\r\n 'layout-container-padding-x': 'container-padding-x',\r\n 'layout-container-max-width-sm': 'container-max-width-sm',\r\n 'layout-container-max-width-md': 'container-max-width-md',\r\n 'layout-container-max-width-lg': 'container-max-width-lg',\r\n 'layout-container-max-width-xl': 'container-max-width-xl',\r\n 'layout-container-max-width-xxl': 'container-max-width-xxl',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Breakpoints (for reference, typically used in maps)\r\n // ==========================================================================\r\n 'layout-breakpoints-xs': 'breakpoint-xs',\r\n 'layout-breakpoints-sm': 'breakpoint-sm',\r\n 'layout-breakpoints-md': 'breakpoint-md',\r\n 'layout-breakpoints-lg': 'breakpoint-lg',\r\n 'layout-breakpoints-xl': 'breakpoint-xl',\r\n 'layout-breakpoints-xxl': 'breakpoint-xxl',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Gutters\r\n // ==========================================================================\r\n 'layout-gutters-0': 'gutters-0',\r\n 'layout-gutters-1': 'gutters-1',\r\n 'layout-gutters-2': 'gutters-2',\r\n 'layout-gutters-3': 'gutters-3',\r\n 'layout-gutters-4': 'gutters-4',\r\n 'layout-gutters-5': 'gutters-5',\r\n};\r\n\r\n/**\r\n * Pattern-based mappings for Bootstrap\r\n *\r\n * Applied after explicit mappings for tokens that follow\r\n * predictable naming patterns. These handle bulk transformations\r\n * for categories with consistent naming.\r\n */\r\nexport const BOOTSTRAP_PATTERNS: FrameworkMappingPattern[] = [\r\n // ==========================================================================\r\n // COLOR SCALES - Pass through unchanged\r\n // ==========================================================================\r\n // color-blue-500 → color-blue-500 (no transformation needed)\r\n // These tokens keep their original names as Bootstrap color scales\r\n // match the DSAi/Figma naming convention.\r\n // ==========================================================================\r\n // SPACING SCALE - Strip \"spacing-\" prefix for Bootstrap $spacer map\r\n // ==========================================================================\r\n // spacing-1 → spacer-1 (Bootstrap uses $spacers map)\r\n // Note: Not applied by default since playground keeps spacing- prefix\r\n // ==========================================================================\r\n // LAYOUT BREAKPOINTS - Already handled in explicit mappings\r\n // ==========================================================================\r\n];\r\n\r\n/**\r\n * Bootstrap framework mapping configuration\r\n */\r\nexport const bootstrapMapper: FrameworkMappingConfig = {\r\n framework: 'bootstrap',\r\n mappings: BOOTSTRAP_MAPPINGS,\r\n patterns: BOOTSTRAP_PATTERNS,\r\n variablePrefix: '$',\r\n header: `// ============================================================================\r\n// DSAi Design Tokens for Bootstrap 5.x\r\n// ============================================================================\r\n// Auto-generated from Figma design tokens via @dsai-io/tools\r\n// DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\r\n//\r\n// These variables are mapped to Bootstrap 5.x naming conventions.\r\n// Use with Bootstrap's SCSS customization workflow:\r\n//\r\n// @use './_variables' as dsai;\r\n// @use 'bootstrap/scss/bootstrap' with (\r\n// $primary: dsai.$primary,\r\n// $font-size-base: dsai.$font-size-base,\r\n// );\r\n//\r\n// @see https://getbootstrap.com/docs/5.3/customize/sass/\r\n// ============================================================================\r\n\r\n`,\r\n};\r\n\r\n/**\r\n * Apply Bootstrap-specific name mapping to a token name\r\n *\r\n * @param tokenName - Original token name (e.g., 'typography-heading-h1')\r\n * @returns Mapped name (e.g., 'h1-font-size')\r\n *\r\n * @example\r\n * ```typescript\r\n * mapToBootstrapName('typography-text-base')\r\n * // Returns: 'font-size-base'\r\n *\r\n * mapToBootstrapName('typography-heading-h1')\r\n * // Returns: 'h1-font-size'\r\n *\r\n * mapToBootstrapName('color-blue-500')\r\n * // Returns: 'color-blue-500' (pass through)\r\n * ```\r\n */\r\nexport function mapToBootstrapName(tokenName: string): string {\r\n // Check explicit mappings first using Map for safe access\r\n const mappingsMap = new Map(Object.entries(BOOTSTRAP_MAPPINGS));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of BOOTSTRAP_PATTERNS) {\r\n // Pre-compiled regex patterns only - no dynamic construction from untrusted input\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n}\r\n","/**\r\n * shadcn/ui Framework Mapper\r\n *\r\n * Maps Figma/DTCG token names to shadcn/ui CSS variable names.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// shadcn/ui Name Mappings\r\n// ============================================================================\r\n\r\n/**\r\n * Explicit token name → shadcn/ui variable name mappings\r\n *\r\n * shadcn/ui uses a simplified naming convention with CSS custom properties.\r\n * @see https://ui.shadcn.com/docs/theming\r\n */\r\nexport const SHADCN_MAPPINGS: Record<string, string> = {\r\n // Semantic Colors → shadcn theme colors\r\n 'semantic-primary': 'primary',\r\n 'semantic-secondary': 'secondary',\r\n 'semantic-success': 'success',\r\n 'semantic-danger': 'destructive',\r\n 'semantic-warning': 'warning',\r\n 'semantic-info': 'info',\r\n 'semantic-body-bg': 'background',\r\n 'semantic-body-color': 'foreground',\r\n 'theme-primary': 'primary',\r\n 'theme-secondary': 'secondary',\r\n\r\n // Neutral colors\r\n 'neutral-white': 'background',\r\n 'neutral-black': 'foreground',\r\n 'color-gray-100': 'muted',\r\n 'color-gray-600': 'muted-foreground',\r\n\r\n // Card colors\r\n 'semantic-light': 'card',\r\n 'color-gray-900': 'card-foreground',\r\n\r\n // Border\r\n 'semantic-border-color': 'border',\r\n 'color-gray-200': 'input',\r\n\r\n // Focus ring\r\n 'color-blue-500': 'ring',\r\n\r\n // Border radius\r\n 'border-radius': 'radius',\r\n 'border-radius-sm': 'radius-sm',\r\n 'border-radius-lg': 'radius-lg',\r\n\r\n // Typography\r\n 'typography-font-family-base': 'font-sans',\r\n 'typography-font-family-monospace': 'font-mono',\r\n};\r\n\r\n/**\r\n * Pattern-based mappings for shadcn/ui\r\n */\r\nexport const SHADCN_PATTERNS: FrameworkMappingPattern[] = [\r\n // Accent colors from color scales\r\n {\r\n pattern: /^color-blue-500$/,\r\n replacement: 'accent',\r\n description: 'Primary accent color',\r\n },\r\n {\r\n pattern: /^color-blue-100$/,\r\n replacement: 'accent-foreground',\r\n description: 'Accent foreground color',\r\n },\r\n];\r\n\r\n/**\r\n * shadcn/ui framework mapping configuration\r\n */\r\nexport const shadcnMapper: FrameworkMappingConfig = {\r\n framework: 'shadcn',\r\n mappings: SHADCN_MAPPINGS,\r\n patterns: SHADCN_PATTERNS,\r\n variablePrefix: '--',\r\n header: `/* ============================================================================\r\n * DSAi Design Tokens for shadcn/ui\r\n * ============================================================================\r\n * Auto-generated from Figma design tokens via @dsai-io/tools\r\n * DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\r\n *\r\n * Usage in CSS:\r\n * background-color: hsl(var(--background));\r\n * color: hsl(var(--foreground));\r\n *\r\n * @see https://ui.shadcn.com/docs/theming\r\n * ============================================================================ */\r\n`,\r\n};\r\n\r\n/**\r\n * Apply shadcn-specific name mapping to a token name\r\n *\r\n * @param tokenName - Original token name (e.g., 'semantic-primary')\r\n * @returns Mapped name (e.g., 'primary')\r\n */\r\nexport function mapToShadcnName(tokenName: string): string {\r\n // Check explicit mappings first using Map for safe access\r\n const mappingsMap = new Map(Object.entries(SHADCN_MAPPINGS));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of SHADCN_PATTERNS) {\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n}\r\n","/**\r\n * Framework Mapper Utilities\r\n *\r\n * Core utilities for applying framework-specific name mappings to tokens.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { bootstrapMapper, mapToBootstrapName } from './bootstrap.js';\r\nimport { mapToShadcnName, shadcnMapper } from './shadcn.js';\r\n\r\nimport type {\r\n FrameworkMappingConfig,\r\n FrameworkMappingPattern,\r\n FrameworkTarget,\r\n} from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Framework mapper function type\r\n */\r\nexport type FrameworkMapper = (tokenName: string) => string;\r\n\r\n/**\r\n * Framework mapper with configuration\r\n */\r\nexport interface FrameworkMapperWithConfig {\r\n /** The mapping function */\r\n map: FrameworkMapper;\r\n /** The framework configuration */\r\n config: FrameworkMappingConfig;\r\n}\r\n\r\n// ============================================================================\r\n// Framework Registry\r\n// ============================================================================\r\n\r\n/**\r\n * Built-in framework mappers\r\n */\r\nconst FRAMEWORK_MAPPERS: Record<FrameworkTarget, FrameworkMapperWithConfig> = {\r\n bootstrap: {\r\n map: mapToBootstrapName,\r\n config: bootstrapMapper,\r\n },\r\n shadcn: {\r\n map: mapToShadcnName,\r\n config: shadcnMapper,\r\n },\r\n tailwind: {\r\n // Tailwind uses config.js format, not SCSS variables\r\n // Pass through names as-is for now\r\n map: (name) => name,\r\n config: {\r\n framework: 'tailwind',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '',\r\n header: '// Tailwind config - use tokens.js instead\\n',\r\n },\r\n },\r\n mui: {\r\n // MUI uses JavaScript theme objects\r\n // Pass through names as-is for now\r\n map: (name) => name,\r\n config: {\r\n framework: 'mui',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '',\r\n header: '// MUI theme - use tokens.js instead\\n',\r\n },\r\n },\r\n custom: {\r\n // Custom uses user-provided mappings only\r\n map: (name) => name,\r\n config: {\r\n framework: 'custom',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '$',\r\n header: '// Custom token mappings\\n',\r\n },\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n\r\n/**\r\n * Valid framework targets for safe lookup\r\n */\r\nconst VALID_FRAMEWORKS = new Set<FrameworkTarget>([\r\n 'bootstrap',\r\n 'shadcn',\r\n 'tailwind',\r\n 'mui',\r\n 'custom',\r\n]);\r\n\r\n/**\r\n * Get the framework mapper for a specific target\r\n *\r\n * @param framework - Target framework\r\n * @returns Framework mapper with config\r\n */\r\nexport function getFrameworkMapper(framework: FrameworkTarget): FrameworkMapperWithConfig {\r\n // Use safe lookup with validated key\r\n if (VALID_FRAMEWORKS.has(framework)) {\r\n switch (framework) {\r\n case 'bootstrap':\r\n return FRAMEWORK_MAPPERS.bootstrap;\r\n case 'shadcn':\r\n return FRAMEWORK_MAPPERS.shadcn;\r\n case 'tailwind':\r\n return FRAMEWORK_MAPPERS.tailwind;\r\n case 'mui':\r\n return FRAMEWORK_MAPPERS.mui;\r\n case 'custom':\r\n return FRAMEWORK_MAPPERS.custom;\r\n }\r\n }\r\n return FRAMEWORK_MAPPERS.custom;\r\n}\r\n\r\n/**\r\n * Create a custom framework mapper with user-provided mappings\r\n *\r\n * @param baseFramework - Base framework to extend (or 'custom' for empty)\r\n * @param customMappings - Additional name mappings\r\n * @param customPatterns - Additional pattern mappings\r\n * @returns Combined framework mapper\r\n */\r\nexport function createFrameworkMapper(\r\n baseFramework: FrameworkTarget,\r\n customMappings?: Record<string, string>,\r\n customPatterns?: FrameworkMappingPattern[]\r\n): FrameworkMapperWithConfig {\r\n const base = getFrameworkMapper(baseFramework);\r\n\r\n // Merge custom mappings (custom takes precedence)\r\n const mergedMappings = {\r\n ...base.config.mappings,\r\n ...customMappings,\r\n };\r\n\r\n // Merge patterns (custom patterns applied after base patterns)\r\n const mergedPatterns = [...(base.config.patterns ?? []), ...(customPatterns ?? [])];\r\n\r\n // Create the combined mapper function\r\n const map: FrameworkMapper = (tokenName: string) => {\r\n // Check custom mappings first\r\n const mappingsMap = new Map(Object.entries(mergedMappings));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of mergedPatterns) {\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n };\r\n\r\n return {\r\n map,\r\n config: {\r\n ...base.config,\r\n mappings: mergedMappings,\r\n patterns: mergedPatterns,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Apply name mapping to a token name using specified framework\r\n *\r\n * @param tokenName - Original token name\r\n * @param framework - Target framework\r\n * @param customMappings - Optional custom mappings to merge\r\n * @returns Mapped token name\r\n */\r\nexport function applyNameMapping(\r\n tokenName: string,\r\n framework: FrameworkTarget = 'bootstrap',\r\n customMappings?: Record<string, string>\r\n): string {\r\n if (customMappings) {\r\n const mapper = createFrameworkMapper(framework, customMappings);\r\n return mapper.map(tokenName);\r\n }\r\n\r\n const mapper = getFrameworkMapper(framework);\r\n return mapper.map(tokenName);\r\n}\r\n\r\n/**\r\n * Apply name mappings to all tokens in a collection\r\n *\r\n * @param tokens - Map of token names to values\r\n * @param framework - Target framework\r\n * @param customMappings - Optional custom mappings\r\n * @returns New map with mapped token names\r\n */\r\nexport function applyNameMappingsToTokens<T>(\r\n tokens: Map<string, T>,\r\n framework: FrameworkTarget = 'bootstrap',\r\n customMappings?: Record<string, string>\r\n): Map<string, T> {\r\n const mapper = customMappings\r\n ? createFrameworkMapper(framework, customMappings)\r\n : getFrameworkMapper(framework);\r\n\r\n const result = new Map<string, T>();\r\n\r\n for (const [name, value] of tokens) {\r\n const mappedName = mapper.map(name);\r\n result.set(mappedName, value);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * SCSS Framework Variables Format\r\n *\r\n * Generates SCSS variables with framework-specific name mappings.\r\n * Transforms Figma token names to match target framework conventions.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/scss-framework\r\n */\r\n\r\nimport { getFrameworkMapper, applyNameMapping } from '../../framework-mappers/mapper.js';\r\n\r\nimport type { FrameworkTarget } from '../../../config/types.js';\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * Format options for scss/framework-variables\r\n */\r\nexport interface ScssFrameworkOptions {\r\n /**\r\n * Target framework for name mapping\r\n * @default 'bootstrap'\r\n */\r\n framework?: FrameworkTarget;\r\n\r\n /**\r\n * Custom name mappings to apply in addition to framework defaults\r\n * Key: original token name pattern, Value: mapped name\r\n */\r\n customMappings?: Record<string, string>;\r\n\r\n /**\r\n * Whether to output references for alias tokens\r\n * @default true\r\n */\r\n outputReferences?: boolean;\r\n\r\n /**\r\n * Variable prefix (without $)\r\n * @default ''\r\n */\r\n variablePrefix?: string;\r\n\r\n /**\r\n * Include header comment in output\r\n * @default true\r\n */\r\n includeHeader?: boolean;\r\n\r\n /**\r\n * Custom header comment\r\n */\r\n customHeader?: string;\r\n}\r\n\r\n/**\r\n * scss/framework-variables format\r\n *\r\n * Generates SCSS variables with framework-specific name mappings.\r\n * Supports Bootstrap, shadcn, and custom frameworks.\r\n *\r\n * @example\r\n * ```typescript\r\n * // In Style Dictionary config\r\n * {\r\n * format: 'scss/framework-variables',\r\n * options: {\r\n * framework: 'bootstrap',\r\n * customMappings: {\r\n * 'my-custom-token': 'bs-custom-var'\r\n * }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * Output for Bootstrap:\r\n * ```scss\r\n * // Generated by DSAi - Bootstrap 5.x compatible variables\r\n * // Do not edit manually - regenerate with: pnpm tokens:build\r\n *\r\n * $font-size-base: 1rem;\r\n * $headings-font-weight: 600;\r\n * $primary: #007bff;\r\n * ```\r\n */\r\nexport const scssFrameworkVariables: FormatDefinition = {\r\n name: 'scss/framework-variables',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const framework = (options['framework'] as FrameworkTarget) ?? 'bootstrap';\r\n const customMappings = (options['customMappings'] as Record<string, string>) ?? {};\r\n const variablePrefix = (options['variablePrefix'] as string) ?? '';\r\n const includeHeader = (options['includeHeader'] as boolean) ?? true;\r\n const customHeader = options['customHeader'] as string | undefined;\r\n\r\n // Get framework mapper\r\n const mapper = getFrameworkMapper(framework);\r\n\r\n // Build header\r\n const lines: string[] = [];\r\n\r\n if (includeHeader) {\r\n if (customHeader) {\r\n lines.push(customHeader);\r\n } else {\r\n lines.push(mapper.config.header || `// ${framework} variables generated by DSAi`);\r\n lines.push('// Do not edit manually - regenerate with: pnpm tokens:build');\r\n lines.push('');\r\n }\r\n }\r\n\r\n // Process each token\r\n for (const token of dictionary.allTokens) {\r\n // Apply framework name mapping\r\n const mappedName = applyNameMapping(token.name, framework, customMappings);\r\n\r\n // Format the mapped name: remove dashes and apply prefix\r\n const scssVarName = `$${variablePrefix}${mappedName}`;\r\n\r\n // Get token value (DTCG format uses $value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add description comment if present\r\n const description = token.$description ?? token.description;\r\n if (description) {\r\n lines.push(`// ${description}`);\r\n }\r\n\r\n // Add the variable\r\n lines.push(`${scssVarName}: ${value};`);\r\n }\r\n\r\n return lines.join('\\n') + '\\n';\r\n },\r\n};\r\n\r\n/**\r\n * scss/bootstrap-variables format\r\n *\r\n * Convenience format that uses Bootstrap mappings by default.\r\n *\r\n * @example\r\n * ```typescript\r\n * {\r\n * format: 'scss/bootstrap-variables'\r\n * }\r\n * ```\r\n */\r\nexport const scssBootstrapVariables: FormatDefinition = {\r\n name: 'scss/bootstrap-variables',\r\n format: (args: SDFormatArgs): string => {\r\n const optionsWithBootstrap = {\r\n ...args.options,\r\n framework: 'bootstrap' as FrameworkTarget,\r\n };\r\n return scssFrameworkVariables.format({ ...args, options: optionsWithBootstrap });\r\n },\r\n};\r\n\r\n/**\r\n * scss/shadcn-variables format\r\n *\r\n * Convenience format that uses shadcn/ui mappings by default.\r\n * Outputs CSS custom properties in SCSS for compatibility.\r\n *\r\n * @example\r\n * ```typescript\r\n * {\r\n * format: 'scss/shadcn-variables'\r\n * }\r\n * ```\r\n */\r\nexport const scssShadcnVariables: FormatDefinition = {\r\n name: 'scss/shadcn-variables',\r\n format: (args: SDFormatArgs): string => {\r\n const optionsWithShadcn = {\r\n ...args.options,\r\n framework: 'shadcn' as FrameworkTarget,\r\n };\r\n return scssFrameworkVariables.format({ ...args, options: optionsWithShadcn });\r\n },\r\n};\r\n","/**\r\n * TypeScript Declarations Format\r\n *\r\n * Generates TypeScript type declarations for design tokens.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/typescript\r\n */\r\n\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport type { SDFormatArgs, FormatDefinition, SDToken } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Prefix numeric identifiers with underscore to make them valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * Convert token path to valid JavaScript identifier\r\n */\r\nfunction toJsIdentifier(path: string[]): string {\r\n return path.map(toPascalCaseSegment).join('');\r\n}\r\n\r\n/**\r\n * Get TypeScript type from token value\r\n */\r\nfunction getTypeScriptType(token: SDToken): string {\r\n const value = token.value;\r\n if (typeof value === 'number') {\r\n return 'number';\r\n }\r\n if (typeof value === 'boolean') {\r\n return 'boolean';\r\n }\r\n return 'string';\r\n}\r\n\r\n/**\r\n * Token tree node for building interfaces\r\n */\r\ninterface TokenTreeNode {\r\n _isToken?: boolean;\r\n _type?: string;\r\n [key: string]: TokenTreeNode | boolean | string | undefined;\r\n}\r\n\r\n/**\r\n * Build nested interface structure\r\n */\r\nfunction buildTokenInterface(obj: TokenTreeNode, indent = 0): string {\r\n const spaces = ' '.repeat(indent);\r\n let output = '{\\n';\r\n\r\n for (const key of Object.keys(obj)) {\r\n // Skip internal markers\r\n if (key.startsWith('_')) {\r\n continue;\r\n }\r\n\r\n const value = obj[key];\r\n if (!value || typeof value !== 'object') {\r\n continue;\r\n }\r\n\r\n // Quote keys that need it (contain hyphens or start with numbers)\r\n const quotedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `\"${key}\"`;\r\n\r\n const typedValue = value as TokenTreeNode;\r\n\r\n // Check if this is a leaf token (has _isToken marker)\r\n if (typedValue._isToken) {\r\n output += `${spaces} ${quotedKey}: ${typedValue._type};\\n`;\r\n } else {\r\n // Nested object\r\n output += `${spaces} ${quotedKey}: ${buildTokenInterface(typedValue, indent + 1)}\\n`;\r\n }\r\n }\r\n\r\n output += `${spaces}}`;\r\n return output;\r\n}\r\n\r\n/**\r\n * Capitalize first letter\r\n */\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * typescript/declarations format\r\n *\r\n * Generates TypeScript declarations with:\r\n * - DesignTokens interface with nested structure\r\n * - String literal types for each token category\r\n * - Flat token exports with proper types\r\n *\r\n * @example\r\n * Output:\r\n * ```typescript\r\n * export type ColorTokenName =\r\n * | 'color.primary'\r\n * | 'color.secondary';\r\n *\r\n * export interface DesignTokens {\r\n * color: {\r\n * primary: string;\r\n * secondary: string;\r\n * };\r\n * }\r\n *\r\n * export declare const colorPrimary: string;\r\n * export declare const tokens: DesignTokens;\r\n * ```\r\n */\r\nexport const typescriptDeclarations: FormatDefinition = {\r\n name: 'typescript/declarations',\r\n format: ({ dictionary }: SDFormatArgs): string => {\r\n // Build nested structure with type markers\r\n const tokenTree: TokenTreeNode = {};\r\n\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n for (const token of dictionary.allTokens) {\r\n let current: TokenTreeNode = tokenTree;\r\n for (let i = 0; i < token.path.length - 1; i++) {\r\n const key = token.path[i] as string;\r\n // Guard against prototype pollution\r\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\r\n continue;\r\n }\r\n if (!hasOwn.call(current, key) || typeof current[key] !== 'object') {\r\n current[key] = {};\r\n }\r\n current = current[key] as TokenTreeNode;\r\n }\r\n\r\n const lastKey = token.path[token.path.length - 1];\r\n if (lastKey) {\r\n current[lastKey] = {\r\n _isToken: true,\r\n _type: getTypeScriptType(token),\r\n };\r\n }\r\n }\r\n\r\n // Group tokens by category for string literal types\r\n const categories: Record<string, string[]> = {};\r\n for (const token of dictionary.allTokens) {\r\n const category = token.path[0];\r\n if (category) {\r\n if (!categories[category]) {\r\n categories[category] = [];\r\n }\r\n categories[category].push(token.path.join('.'));\r\n }\r\n }\r\n\r\n // Generate category types\r\n let literalTypes = '';\r\n for (const category of Object.keys(categories).sort()) {\r\n const categoryTokens = categories[category];\r\n if (!categoryTokens) {\r\n continue;\r\n }\r\n const typeName = `${capitalize(category)}TokenName`;\r\n literalTypes += `/**\\n * All ${category} token names as string literals\\n */\\n`;\r\n literalTypes += `export type ${typeName} =\\n`;\r\n literalTypes += categoryTokens.map((t) => ` | '${t}'`).join('\\n');\r\n literalTypes += ';\\n\\n';\r\n }\r\n\r\n // Generate all token names type\r\n const allTokenNames = dictionary.allTokens.map((t) => t.path.join('.'));\r\n literalTypes += `/**\\n * All token names as string literals\\n */\\n`;\r\n literalTypes += `export type TokenName =\\n`;\r\n literalTypes += allTokenNames.map((t) => ` | '${t}'`).join('\\n');\r\n literalTypes += ';\\n\\n';\r\n\r\n // Generate flat token exports\r\n let flatExports = '/**\\n * Flat token exports (camelCase names)\\n */\\n';\r\n for (const token of dictionary.allTokens) {\r\n const type = getTypeScriptType(token);\r\n const name = toJsIdentifier(token.path); // Generate valid identifier from path\r\n flatExports += `export declare const ${name}: ${type};\\n`;\r\n }\r\n\r\n return `/**\r\n * Design Tokens - TypeScript Declarations\r\n * Auto-generated by @dsai-io/tools\r\n * DO NOT EDIT DIRECTLY\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// ============================================================================\r\n// String Literal Types (for type-safe token access)\r\n// ============================================================================\r\n\r\n${literalTypes}\r\n// ============================================================================\r\n// Nested Token Interface\r\n// ============================================================================\r\n\r\n/**\r\n * Design tokens organized by category\r\n */\r\nexport interface DesignTokens ${buildTokenInterface(tokenTree)}\r\n\r\n// ============================================================================\r\n// Flat Token Exports\r\n// ============================================================================\r\n\r\n${flatExports}\r\n// ============================================================================\r\n// Default Export\r\n// ============================================================================\r\n\r\nexport declare const tokens: DesignTokens;\r\nexport default tokens;\r\n`;\r\n },\r\n};\r\n","/**\r\n * Style Dictionary Formats\r\n *\r\n * Exports all built-in formats and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats\r\n */\r\n\r\nimport { cssDarkModeVariables } from './css-dark-mode.js';\r\nimport { cssVariablesWithComments } from './css-variables.js';\r\nimport { javascriptEsm } from './javascript.js';\r\nimport {\r\n scssBootstrapVariables,\r\n scssFrameworkVariables,\r\n scssShadcnVariables,\r\n} from './scss-framework.js';\r\nimport { typescriptDeclarations } from './typescript.js';\r\n\r\nimport type { FormatDefinition, StyleDictionaryInstance } from '../types.js';\r\n\r\n/**\r\n * All built-in formats\r\n */\r\nexport const builtInFormats: FormatDefinition[] = [\r\n cssDarkModeVariables,\r\n cssVariablesWithComments,\r\n javascriptEsm,\r\n typescriptDeclarations,\r\n scssFrameworkVariables,\r\n scssBootstrapVariables,\r\n scssShadcnVariables,\r\n];\r\n\r\n/**\r\n * Register all formats with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customFormats - Additional custom formats to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerFormats } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerFormats(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerFormats(\r\n sd: StyleDictionaryInstance,\r\n customFormats: FormatDefinition[] = []\r\n): void {\r\n const allFormats = [...builtInFormats, ...customFormats];\r\n\r\n for (const format of allFormats) {\r\n sd.registerFormat({\r\n name: format.name,\r\n format: format.format,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual formats\r\nexport { cssDarkModeVariables } from './css-dark-mode.js';\r\nexport { cssVariablesWithComments } from './css-variables.js';\r\nexport { javascriptEsm } from './javascript.js';\r\nexport {\r\n scssBootstrapVariables,\r\n scssFrameworkVariables,\r\n scssShadcnVariables,\r\n} from './scss-framework.js';\r\nexport type { ScssFrameworkOptions } from './scss-framework.js';\r\nexport { typescriptDeclarations } from './typescript.js';\r\n","/**\r\n * Dimension Transform\r\n *\r\n * Converts dimension values to rem units.\r\n * Handles raw numbers and pixel strings.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/dimension\r\n */\r\n\r\nimport type { SDToken, SDTransformOptions, TransformDefinition } from '../types.js';\r\n\r\n/** Default base font size for rem conversion */\r\nconst DEFAULT_BASE_FONT_SIZE = 16;\r\n\r\n/**\r\n * Check if token is a dimension (but not font-weight or line-height)\r\n */\r\nfunction isDimension(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Exclude font-weights\r\n if (tokenType === 'fontWeight') {\r\n return false;\r\n }\r\n const pathHasFontWeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower.includes('fontweight') || lower.includes('font-weight');\r\n });\r\n if (pathHasFontWeight) {\r\n return false;\r\n }\r\n\r\n // Exclude line-heights\r\n if (tokenType === 'lineHeight') {\r\n return false;\r\n }\r\n const pathHasLineHeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower.includes('lineheight') || lower.includes('line-height');\r\n });\r\n if (pathHasLineHeight) {\r\n return false;\r\n }\r\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\r\n if (scopeHasLineHeight) {\r\n return false;\r\n }\r\n\r\n // Exclude grid config (unitless counts)\r\n const pathHasGridConfig = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'columns' || lower === 'row-columns';\r\n });\r\n if (pathHasGridConfig) {\r\n return false;\r\n }\r\n\r\n // Include dimension, spacing, sizing types\r\n return tokenType === 'dimension' || tokenType === 'spacing' || tokenType === 'sizing';\r\n}\r\n\r\n/**\r\n * dimension/rem transform\r\n *\r\n * Converts dimension values to rem.\r\n * Uses basePxFontSize from options (default: 16).\r\n *\r\n * @example\r\n * // Numeric input\r\n * Input: { $value: 16, $type: \"dimension\" }\r\n * Output: \"1rem\"\r\n *\r\n * @example\r\n * // Pixel string\r\n * Input: { $value: \"24px\", $type: \"dimension\" }\r\n * Output: \"1.5rem\"\r\n *\r\n * @example\r\n * // Zero value\r\n * Input: { $value: 0, $type: \"dimension\" }\r\n * Output: \"0\"\r\n */\r\nexport const dimensionRem: TransformDefinition = {\r\n name: 'dimension/rem',\r\n type: 'value',\r\n filter: isDimension,\r\n transform: (token, options?: SDTransformOptions) => {\r\n const value = token.$value ?? token.value;\r\n const baseFontSize = options?.basePxFontSize ?? DEFAULT_BASE_FONT_SIZE;\r\n\r\n // Handle raw numbers\r\n if (typeof value === 'number') {\r\n if (value === 0) {\r\n return '0';\r\n }\r\n return `${value / baseFontSize}rem`;\r\n }\r\n\r\n // Handle px strings\r\n if (typeof value === 'string' && value.endsWith('px')) {\r\n const numValue = Number.parseFloat(value);\r\n if (numValue === 0) {\r\n return '0';\r\n }\r\n return `${numValue / baseFontSize}rem`;\r\n }\r\n\r\n // Return as-is if not convertible\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Font Weight Transform\r\n *\r\n * Keeps font-weight values as unitless numbers (300, 400, 700, etc.)\r\n * CSS font-weight must be unitless for proper inheritance.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/font-weight\r\n */\r\n\r\nimport type { SDToken, TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * Named font weight values mapped to numeric values\r\n */\r\nconst NAMED_WEIGHTS: Record<string, number> = {\r\n thin: 100,\r\n hairline: 100,\r\n extralight: 200,\r\n ultralight: 200,\r\n light: 300,\r\n normal: 400,\r\n regular: 400,\r\n medium: 500,\r\n semibold: 600,\r\n demibold: 600,\r\n bold: 700,\r\n extrabold: 800,\r\n ultrabold: 800,\r\n black: 900,\r\n heavy: 900,\r\n};\r\n\r\n/**\r\n * Check if token is a font weight\r\n */\r\nfunction isFontWeight(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Direct type match\r\n if (tokenType === 'fontWeight' || tokenType === 'number') {\r\n return true;\r\n }\r\n\r\n // Path-based detection\r\n const pathHasFontWeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'fontweight' || lower.includes('font-weight') || lower.includes('fontweight');\r\n });\r\n\r\n return pathHasFontWeight ?? false;\r\n}\r\n\r\n/**\r\n * fontWeight/unitless transform\r\n *\r\n * Ensures font-weight values are unitless numbers.\r\n * Handles numeric values, string values, and named weights.\r\n *\r\n * @example\r\n * // Numeric input\r\n * Input: { $value: 700, $type: \"fontWeight\" }\r\n * Output: 700\r\n *\r\n * @example\r\n * // String input\r\n * Input: { $value: \"700\", $type: \"fontWeight\" }\r\n * Output: 700\r\n *\r\n * @example\r\n * // Named weight\r\n * Input: { $value: \"bold\", $type: \"fontWeight\" }\r\n * Output: 700\r\n */\r\nexport const fontWeightUnitless: TransformDefinition = {\r\n name: 'fontWeight/unitless',\r\n type: 'value',\r\n filter: isFontWeight,\r\n transform: (token) => {\r\n const value = token.$value ?? token.value;\r\n\r\n // Already a number - return as-is\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n // String value\r\n if (typeof value === 'string') {\r\n // Try to parse as number\r\n const parsed = Number.parseInt(value, 10);\r\n if (!Number.isNaN(parsed)) {\r\n return parsed;\r\n }\r\n\r\n // Handle named weights\r\n const normalized = value.toLowerCase().replace(/[^a-z]/g, '');\r\n if (Object.hasOwn(NAMED_WEIGHTS, normalized)) {\r\n // eslint-disable-next-line security/detect-object-injection\r\n const namedWeight = NAMED_WEIGHTS[normalized];\r\n if (namedWeight !== undefined) {\r\n return namedWeight;\r\n }\r\n }\r\n }\r\n\r\n // Fallback - return as-is\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Line Height Transform\r\n *\r\n * Keeps line-height values as unitless ratios (1, 1.5, 2, etc.)\r\n * CSS line-height should be unitless for proper inheritance.\r\n *\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/line-height\r\n */\r\n\r\nimport type { SDToken, TransformDefinition } from '../types.js';\r\n\r\n/** Default base font size for conversion */\r\nconst DEFAULT_BASE_FONT_SIZE = 16;\r\n\r\n/**\r\n * Check if token is a line height\r\n */\r\nfunction isLineHeight(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Direct type match\r\n if (tokenType === 'lineHeight') {\r\n return true;\r\n }\r\n\r\n // Path-based detection\r\n const pathHasLineHeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'lineheight' || lower.includes('line-height') || lower.includes('lineheight');\r\n });\r\n\r\n // Scope-based detection (from Figma Variables)\r\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\r\n\r\n return (pathHasLineHeight ?? false) || (scopeHasLineHeight ?? false);\r\n}\r\n\r\n/**\r\n * lineHeight/unitless transform\r\n *\r\n * Converts line-height values to unitless ratios.\r\n * Handles numbers, percentages, and pixel values.\r\n *\r\n * @example\r\n * // Percentage input\r\n * Input: { $value: \"150%\", $type: \"lineHeight\" }\r\n * Output: 1.5\r\n *\r\n * @example\r\n * // Already unitless\r\n * Input: { $value: 1.5, $type: \"lineHeight\" }\r\n * Output: 1.5\r\n *\r\n * @example\r\n * // Pixel value from Figma\r\n * Input: { $value: 24, $type: \"lineHeight\" }\r\n * Output: 1.5 (assuming 16px base)\r\n */\r\nexport const lineHeightUnitless: TransformDefinition = {\r\n name: 'lineHeight/unitless',\r\n type: 'value',\r\n filter: isLineHeight,\r\n transform: (token) => {\r\n const value = token.$value ?? token.value;\r\n\r\n // Already a number\r\n if (typeof value === 'number') {\r\n // If <= 3, already a multiplier (1, 1.5, 2)\r\n if (value <= 3) {\r\n return value;\r\n }\r\n // If > 3, likely px from Figma - convert to unitless\r\n return value / DEFAULT_BASE_FONT_SIZE;\r\n }\r\n\r\n // Handle percentage strings (e.g., \"150%\" -> 1.5)\r\n if (typeof value === 'string' && value.endsWith('%')) {\r\n return Number.parseFloat(value) / 100;\r\n }\r\n\r\n // Handle strings with units\r\n if (typeof value === 'string') {\r\n const numValue = Number.parseFloat(value);\r\n if (!Number.isNaN(numValue)) {\r\n if (numValue <= 3) {\r\n return numValue;\r\n }\r\n return numValue / DEFAULT_BASE_FONT_SIZE;\r\n }\r\n }\r\n\r\n // Fallback - return as-is\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Name transform for JavaScript/TypeScript that ensures valid identifiers\r\n *\r\n * Converts token paths to PascalCase, prefixing numeric-only segments\r\n * to ensure valid JavaScript identifiers.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name-js-identifier\r\n */\r\n\r\nimport type { TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Preserve underscore prefix for numeric identifiers so they stay valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * name/js-identifier transform\r\n *\r\n * Converts token path to a valid JavaScript identifier in PascalCase.\r\n * Handles numeric segments by prefixing with underscore.\r\n *\r\n * @example\r\n * ```\r\n * colors.neutral.gray.100 → ColorsNeutralGray_100\r\n * spacing.0 → Spacing_0\r\n * typography.fontSize.base → TypographyFontSizeBase\r\n * ```\r\n */\r\nexport const nameJsIdentifier: TransformDefinition = {\r\n name: 'name/js-identifier',\r\n type: 'name',\r\n transform: ({ path }) => {\r\n return path.map(toPascalCaseSegment).join('');\r\n },\r\n};\r\n","/**\r\n * Name Transform\r\n *\r\n * Converts token paths to kebab-case names.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name\r\n */\r\n\r\nimport type { TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * name/kebab transform\r\n *\r\n * Converts token path to kebab-case CSS variable name.\r\n * Replaces underscores with hyphens and lowercases.\r\n *\r\n * @example\r\n * Input: path = ['color', 'blue', '500']\r\n * Output: \"color-blue-500\"\r\n *\r\n * @example\r\n * Input: path = ['typography', 'fontWeight', 'bold']\r\n * Output: \"typography-fontweight-bold\"\r\n */\r\nexport const nameKebab: TransformDefinition = {\r\n name: 'name/kebab',\r\n type: 'name',\r\n transform: (token) => {\r\n return token.path.join('-').replace(/_/g, '-').toLowerCase();\r\n },\r\n};\r\n","/**\r\n * Style Dictionary Transforms\r\n *\r\n * Exports all built-in transforms and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms\r\n */\r\n\r\nimport { dimensionRem } from './dimension.js';\r\nimport { fontWeightUnitless } from './font-weight.js';\r\nimport { lineHeightUnitless } from './line-height.js';\r\nimport { nameJsIdentifier } from './name-js-identifier.js';\r\nimport { nameKebab } from './name.js';\r\n\r\nimport type { StyleDictionaryInstance, TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * All built-in transforms\r\n */\r\nexport const builtInTransforms: TransformDefinition[] = [\r\n fontWeightUnitless,\r\n lineHeightUnitless,\r\n dimensionRem,\r\n nameKebab,\r\n nameJsIdentifier,\r\n];\r\n\r\n/**\r\n * Register all transforms with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customTransforms - Additional custom transforms to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerTransforms } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerTransforms(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerTransforms(\r\n sd: StyleDictionaryInstance,\r\n customTransforms: TransformDefinition[] = []\r\n): void {\r\n const allTransforms = [...builtInTransforms, ...customTransforms];\r\n\r\n for (const transform of allTransforms) {\r\n sd.registerTransform({\r\n name: transform.name,\r\n type: transform.type,\r\n filter: transform.filter,\r\n transform: transform.transform,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual transforms\r\nexport { fontWeightUnitless } from './font-weight.js';\r\nexport { lineHeightUnitless } from './line-height.js';\r\nexport { dimensionRem } from './dimension.js';\r\nexport { nameKebab } from './name.js';\r\nexport { nameJsIdentifier } from './name-js-identifier.js';\r\n","/**\r\n * CSS Transform Group\r\n *\r\n * Transform group for generating CSS output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/css\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * custom/css transform group\r\n *\r\n * Transforms for generating CSS custom properties:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/kebab: kebab-case names\r\n * - time/seconds: Convert time to seconds\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n */\r\nexport const cssTransformGroup: TransformGroupDefinition = {\r\n name: 'custom/css',\r\n transforms: [\r\n 'attribute/cti',\r\n 'name/kebab',\r\n 'time/seconds',\r\n 'fontWeight/unitless', // Must run before dimension/rem\r\n 'lineHeight/unitless', // Must run before dimension/rem\r\n 'dimension/rem',\r\n 'color/css',\r\n ],\r\n};\r\n","/**\r\n * JavaScript Transform Group\r\n *\r\n * Transform group for generating JavaScript output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/js\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * js-custom transform group\r\n *\r\n * Transforms for generating JavaScript/TypeScript exports:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/js-identifier: PascalCase names with numeric segment handling\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n */\r\nexport const jsTransformGroup: TransformGroupDefinition = {\r\n name: 'js-custom',\r\n transforms: [\r\n 'attribute/cti',\r\n 'name/js-identifier', // Use custom transform for valid JS identifiers\r\n 'fontWeight/unitless', // Must run before dimension/rem\r\n 'lineHeight/unitless', // Must run before dimension/rem\r\n 'dimension/rem',\r\n 'color/css',\r\n ],\r\n};\r\n","/**\r\n * SCSS Transform Group\r\n *\r\n * Transform group for generating SCSS output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/scss\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * custom/scss transform group\r\n *\r\n * Transforms for generating SCSS variables:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/kebab: kebab-case names\r\n * - time/seconds: Convert time to seconds\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n *\r\n * This follows Style Dictionary v5 best practices:\r\n * - Source tokens are raw numbers\r\n * - Transforms add appropriate units (or keep unitless for font-weight/line-height)\r\n */\r\nexport const scssTransformGroup: TransformGroupDefinition = {\r\n name: 'custom/scss',\r\n transforms: [\r\n 'attribute/cti', // Add CTI attributes\r\n 'name/kebab', // kebab-case names\r\n 'time/seconds', // Convert time to seconds\r\n 'fontWeight/unitless', // Font weights stay unitless (MUST run before dimension/rem)\r\n 'lineHeight/unitless', // Line heights stay unitless (MUST run before dimension/rem)\r\n 'dimension/rem', // Convert dimensions to rem\r\n 'color/css', // Convert colors to CSS format\r\n ],\r\n};\r\n","/**\r\n * Style Dictionary Transform Groups\r\n *\r\n * Exports all built-in transform groups and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups\r\n */\r\n\r\nimport { cssTransformGroup } from './css.js';\r\nimport { jsTransformGroup } from './js.js';\r\nimport { scssTransformGroup } from './scss.js';\r\n\r\nimport type { StyleDictionaryInstance, TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * All built-in transform groups\r\n */\r\nexport const transformGroups: TransformGroupDefinition[] = [\r\n cssTransformGroup,\r\n jsTransformGroup,\r\n scssTransformGroup,\r\n];\r\n\r\n/**\r\n * Register all transform groups with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customGroups - Additional custom transform groups to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerTransformGroups } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerTransformGroups(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerTransformGroups(\r\n sd: StyleDictionaryInstance,\r\n customGroups: TransformGroupDefinition[] = []\r\n): void {\r\n const allGroups = [...transformGroups, ...customGroups];\r\n\r\n for (const group of allGroups) {\r\n sd.registerTransformGroup({\r\n name: group.name,\r\n transforms: group.transforms,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual transform groups\r\nexport { cssTransformGroup } from './css.js';\r\nexport { jsTransformGroup } from './js.js';\r\nexport { scssTransformGroup } from './scss.js';\r\n","/**\r\n * Token Diff Utility\r\n *\r\n * Compares token collections to detect changes for changelog generation.\r\n * Identifies added, removed, modified, and type-changed tokens.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { TokenCollection } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Types of changes that can occur to tokens\r\n */\r\nexport type TokenChangeType = 'added' | 'removed' | 'modified' | 'type-changed' | 'deprecated';\r\n\r\n/**\r\n * Details about a token value change\r\n */\r\nexport interface TokenValueChange {\r\n /** Previous value */\r\n oldValue: unknown;\r\n /** New value */\r\n newValue: unknown;\r\n /** Previous type */\r\n oldType?: string;\r\n /** New type */\r\n newType?: string;\r\n}\r\n\r\n/**\r\n * Information about a single token change\r\n */\r\nexport interface TokenChange {\r\n /** Full token path (e.g., 'color.brand.primary') */\r\n path: string;\r\n /** Type of change */\r\n type: TokenChangeType;\r\n /** Value change details (for modified/type-changed) */\r\n valueChange?: TokenValueChange;\r\n /** Token description */\r\n description?: string;\r\n /** Whether this is a breaking change */\r\n breaking: boolean;\r\n}\r\n\r\n/**\r\n * Result of comparing two token collections\r\n */\r\nexport interface TokenDiff {\r\n /** Tokens that were added */\r\n added: TokenChange[];\r\n /** Tokens that were removed */\r\n removed: TokenChange[];\r\n /** Tokens whose values changed */\r\n modified: TokenChange[];\r\n /** Tokens whose types changed (breaking) */\r\n typeChanged: TokenChange[];\r\n /** Tokens marked as deprecated */\r\n deprecated: TokenChange[];\r\n /** Total number of changes */\r\n totalChanges: number;\r\n /** Whether there are breaking changes */\r\n hasBreaking: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a value is a token (has $value or value property)\r\n */\r\nfunction isToken(\r\n obj: unknown\r\n): obj is { $value?: unknown; value?: unknown; $type?: string; type?: string } {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const token = obj as Record<string, unknown>;\r\n return '$value' in token || 'value' in token;\r\n}\r\n\r\n/**\r\n * Get token value (supports both DTCG and legacy formats)\r\n */\r\nfunction getTokenValue(token: unknown): unknown {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n return token.$value ?? token.value;\r\n}\r\n\r\n/**\r\n * Get token type (supports both DTCG and legacy formats)\r\n */\r\nfunction getTokenType(token: unknown): string | undefined {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n return token.$type ?? token.type;\r\n}\r\n\r\n/**\r\n * Get token description\r\n */\r\nfunction getTokenDescription(token: unknown): string | undefined {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n const t = token as { $description?: string; description?: string; comment?: string };\r\n return t.$description ?? t.description ?? t.comment;\r\n}\r\n\r\n/**\r\n * Flatten nested token collection into path-value pairs\r\n */\r\nfunction flattenTokens(\r\n collection: TokenCollection,\r\n prefix = ''\r\n): Map<string, { value: unknown; type?: string; description?: string; token: unknown }> {\r\n const result = new Map<\r\n string,\r\n { value: unknown; type?: string; description?: string; token: unknown }\r\n >();\r\n\r\n for (const [key, value] of Object.entries(collection)) {\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (isToken(value)) {\r\n result.set(path, {\r\n value: getTokenValue(value),\r\n type: getTokenType(value),\r\n description: getTokenDescription(value),\r\n token: value,\r\n });\r\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n // Recurse into nested objects\r\n const nested = flattenTokens(value as TokenCollection, path);\r\n for (const [nestedPath, nestedValue] of nested) {\r\n result.set(nestedPath, nestedValue);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Check if a token is deprecated\r\n */\r\nfunction isDeprecated(token: unknown): boolean {\r\n if (!isToken(token)) {\r\n return false;\r\n }\r\n\r\n const t = token as {\r\n $deprecated?: boolean;\r\n deprecated?: boolean;\r\n $extensions?: { deprecated?: boolean };\r\n };\r\n return t.$deprecated === true || t.deprecated === true || t.$extensions?.deprecated === true;\r\n}\r\n\r\n/**\r\n * Deep equality check for values\r\n */\r\nfunction isEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n if (typeof a !== typeof b) {\r\n return false;\r\n }\r\n\r\n if (typeof a === 'object' && a !== null && b !== null) {\r\n const aKeys = Object.keys(a as object);\r\n const bKeys = Object.keys(b as object);\r\n\r\n if (aKeys.length !== bKeys.length) {\r\n return false;\r\n }\r\n\r\n return aKeys.every((key) => {\r\n const aObj = a as Record<string, unknown>;\r\n const bObj = b as Record<string, unknown>;\r\n // eslint-disable-next-line security/detect-object-injection\r\n const aValue = aObj[key];\r\n // eslint-disable-next-line security/detect-object-injection\r\n const bValue = bObj[key];\r\n return isEqual(aValue, bValue);\r\n });\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Main Diff Function\r\n// ============================================================================\r\n\r\n/**\r\n * Compare two token collections and return the differences\r\n *\r\n * @param oldTokens - Previous version of tokens\r\n * @param newTokens - New version of tokens\r\n * @returns Detailed diff of all changes\r\n */\r\nexport function diffTokens(oldTokens: TokenCollection, newTokens: TokenCollection): TokenDiff {\r\n const oldFlat = flattenTokens(oldTokens);\r\n const newFlat = flattenTokens(newTokens);\r\n\r\n const added: TokenChange[] = [];\r\n const removed: TokenChange[] = [];\r\n const modified: TokenChange[] = [];\r\n const typeChanged: TokenChange[] = [];\r\n const deprecated: TokenChange[] = [];\r\n\r\n // Find added and modified tokens\r\n for (const [path, newData] of newFlat) {\r\n const oldData = oldFlat.get(path);\r\n\r\n if (!oldData) {\r\n // Token was added\r\n added.push({\r\n path,\r\n type: 'added',\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n } else {\r\n // Check for type change (breaking)\r\n if (oldData.type && newData.type && oldData.type !== newData.type) {\r\n typeChanged.push({\r\n path,\r\n type: 'type-changed',\r\n valueChange: {\r\n oldValue: oldData.value,\r\n newValue: newData.value,\r\n oldType: oldData.type,\r\n newType: newData.type,\r\n },\r\n description: newData.description,\r\n breaking: true,\r\n });\r\n }\r\n // Check for value change\r\n else if (!isEqual(oldData.value, newData.value)) {\r\n modified.push({\r\n path,\r\n type: 'modified',\r\n valueChange: {\r\n oldValue: oldData.value,\r\n newValue: newData.value,\r\n oldType: oldData.type,\r\n newType: newData.type,\r\n },\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n }\r\n // Check for deprecation\r\n else if (isDeprecated(newData.token) && !isDeprecated(oldData.token)) {\r\n deprecated.push({\r\n path,\r\n type: 'deprecated',\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Find removed tokens (breaking)\r\n for (const [path, oldData] of oldFlat) {\r\n if (!newFlat.has(path)) {\r\n removed.push({\r\n path,\r\n type: 'removed',\r\n description: oldData.description,\r\n breaking: true,\r\n });\r\n }\r\n }\r\n\r\n const totalChanges =\r\n added.length + removed.length + modified.length + typeChanged.length + deprecated.length;\r\n const hasBreaking = removed.length > 0 || typeChanged.length > 0;\r\n\r\n return {\r\n added,\r\n removed,\r\n modified,\r\n typeChanged,\r\n deprecated,\r\n totalChanges,\r\n hasBreaking,\r\n };\r\n}\r\n\r\n/**\r\n * Get a summary of changes as a plain text description\r\n */\r\nexport function summarizeDiff(diff: TokenDiff): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`Total changes: ${diff.totalChanges}`);\r\n\r\n if (diff.hasBreaking) {\r\n lines.push('⚠️ Contains breaking changes');\r\n }\r\n\r\n if (diff.added.length > 0) {\r\n lines.push(`Added: ${diff.added.length}`);\r\n }\r\n\r\n if (diff.removed.length > 0) {\r\n lines.push(`Removed: ${diff.removed.length} (breaking)`);\r\n }\r\n\r\n if (diff.modified.length > 0) {\r\n lines.push(`Modified: ${diff.modified.length}`);\r\n }\r\n\r\n if (diff.typeChanged.length > 0) {\r\n lines.push(`Type changed: ${diff.typeChanged.length} (breaking)`);\r\n }\r\n\r\n if (diff.deprecated.length > 0) {\r\n lines.push(`Deprecated: ${diff.deprecated.length}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Filter diff by change type\r\n */\r\nexport function filterDiff(diff: TokenDiff, types: TokenChangeType[]): TokenChange[] {\r\n const changes: TokenChange[] = [];\r\n\r\n if (types.includes('added')) {\r\n changes.push(...diff.added);\r\n }\r\n if (types.includes('removed')) {\r\n changes.push(...diff.removed);\r\n }\r\n if (types.includes('modified')) {\r\n changes.push(...diff.modified);\r\n }\r\n if (types.includes('type-changed')) {\r\n changes.push(...diff.typeChanged);\r\n }\r\n if (types.includes('deprecated')) {\r\n changes.push(...diff.deprecated);\r\n }\r\n\r\n return changes;\r\n}\r\n\r\n/**\r\n * Get only breaking changes\r\n */\r\nexport function getBreakingChanges(diff: TokenDiff): TokenChange[] {\r\n return [...diff.removed, ...diff.typeChanged];\r\n}\r\n","/**\r\n * Token-specific type definitions\r\n *\r\n * Defines types for DTCG-compliant tokens, validation, transformation,\r\n * and build processes.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// ============================================================================\r\n// DTCG Token Types\r\n// ============================================================================\r\n\r\n/**\r\n * DTCG-compliant token value\r\n * @see https://www.designtokens.org/\r\n */\r\nexport interface DTCGToken {\r\n /** The resolved value of the token */\r\n $value: unknown;\r\n\r\n /** Token type (color, dimension, etc.) */\r\n $type?: TokenType;\r\n\r\n /** Human-readable description */\r\n $description?: string;\r\n\r\n /** Extension data */\r\n $extensions?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Legacy Style Dictionary token format\r\n */\r\nexport interface LegacyToken {\r\n /** The resolved value of the token */\r\n value: unknown;\r\n\r\n /** Token type */\r\n type?: string;\r\n\r\n /** Human-readable description */\r\n description?: string;\r\n\r\n /** Comment (older format) */\r\n comment?: string;\r\n}\r\n\r\n/**\r\n * Combined token type supporting both DTCG and legacy formats\r\n */\r\nexport type Token = DTCGToken | LegacyToken;\r\n\r\n/**\r\n * Token collection (nested structure of tokens or groups)\r\n */\r\nexport interface TokenCollection {\r\n [key: string]: Token | TokenCollection | unknown;\r\n}\r\n\r\n/**\r\n * Figma export format (from Tokens Studio)\r\n */\r\nexport interface FigmaExport {\r\n [collectionName: string]: FigmaCollection;\r\n}\r\n\r\n/**\r\n * Single Figma collection with optional modes\r\n */\r\nexport interface FigmaCollection {\r\n /** Mode-specific token values */\r\n modes?: Record<string, TokenCollection>;\r\n\r\n /** Direct tokens if no modes */\r\n [key: string]: unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Token Type Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Valid token types per DTCG specification\r\n */\r\nexport const VALID_TOKEN_TYPES = [\r\n 'color',\r\n 'dimension',\r\n 'fontFamily',\r\n 'fontWeight',\r\n 'fontStyle',\r\n 'shadow',\r\n 'number',\r\n 'string',\r\n 'duration',\r\n 'cubicBezier',\r\n 'strokeStyle',\r\n 'border',\r\n 'transition',\r\n 'gradient',\r\n 'typography',\r\n 'letterSpacing',\r\n 'lineHeight',\r\n 'paragraphSpacing',\r\n 'textDecoration',\r\n 'textCase',\r\n] as const;\r\n\r\n/**\r\n * Token type (DTCG specification)\r\n */\r\nexport type TokenType = (typeof VALID_TOKEN_TYPES)[number];\r\n\r\n// ============================================================================\r\n// Validation Types\r\n// ============================================================================\r\n\r\n/**\r\n * Severity level for validation issues\r\n */\r\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\r\n\r\n/**\r\n * A single validation issue\r\n */\r\nexport interface ValidationIssue {\r\n /** Token path (e.g., \"color.brand.primary\") */\r\n path: string;\r\n\r\n /** Human-readable message */\r\n message: string;\r\n\r\n /** Issue severity */\r\n severity: ValidationSeverity;\r\n\r\n /** The problematic value (if applicable) */\r\n value?: unknown;\r\n\r\n /** Suggested fix (if applicable) */\r\n suggestion?: string;\r\n}\r\n\r\n/**\r\n * Result of token validation\r\n */\r\nexport interface ValidationResult {\r\n /** Whether validation passed (no errors) */\r\n valid: boolean;\r\n\r\n /** Validation errors (blocking issues) */\r\n errors: ValidationIssue[];\r\n\r\n /** Validation warnings (non-blocking) */\r\n warnings: ValidationIssue[];\r\n\r\n /** Total number of tokens validated */\r\n tokenCount: number;\r\n\r\n /** Number of files validated */\r\n fileCount: number;\r\n\r\n /** Validation duration in milliseconds */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Options for validation\r\n */\r\nexport interface ValidateOptions {\r\n /** Directory containing token files */\r\n collectionsDir?: string;\r\n\r\n /** File patterns to validate */\r\n patterns?: string[];\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Suppress output */\r\n quiet?: boolean;\r\n\r\n /** Treat warnings as errors */\r\n strict?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Transform Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Figma token transformation\r\n */\r\nexport interface TransformOptions {\r\n /** Source directory with Figma exports */\r\n sourceDir: string;\r\n\r\n /** Output directory for collections */\r\n collectionsDir: string;\r\n\r\n /**\r\n * Glob patterns for finding source files\r\n * @example ['theme.json', '*.tokens.json', 'figma-variables-*.json']\r\n */\r\n sourcePatterns?: string[];\r\n\r\n /**\r\n * Map of collection names to specific file paths\r\n * @example { 'primitives': './colors.json', 'semantic': './semantic.json' }\r\n */\r\n collectionMapping?: Record<string, string>;\r\n\r\n /** Preserve $codeSyntax references from Figma */\r\n preserveCodeSyntax?: boolean;\r\n\r\n /** Modes to ignore during transformation */\r\n ignoreModes?: string[];\r\n\r\n /** Default mode name */\r\n defaultMode?: string;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Enable strict schema validation */\r\n strict?: boolean;\r\n\r\n /** Enable incremental build (only process changed files) */\r\n incremental?: boolean;\r\n\r\n /** Force full rebuild (ignore cache) */\r\n force?: boolean;\r\n\r\n /** Cache directory for incremental builds */\r\n cacheDir?: string;\r\n}\r\n\r\n/**\r\n * Result of token transformation\r\n */\r\nexport interface TransformResult {\r\n /** Whether transformation succeeded */\r\n success: boolean;\r\n\r\n /** Files written during transformation */\r\n filesWritten: string[];\r\n\r\n /** Number of tokens processed */\r\n tokensProcessed: number;\r\n\r\n /** Modes detected in Figma export */\r\n modesDetected: string[];\r\n\r\n /** Errors encountered */\r\n errors: string[];\r\n\r\n /** Warnings generated */\r\n warnings: string[];\r\n\r\n /** Duration in milliseconds */\r\n duration?: number;\r\n}\r\n\r\n// ============================================================================\r\n// Build Types\r\n// ============================================================================\r\n\r\n/**\r\n * A single build step\r\n */\r\nexport interface BuildStep {\r\n /** Step name for display */\r\n name: string;\r\n\r\n /** Shell command to run (if external) */\r\n command?: string;\r\n\r\n /** Function to execute (if internal). Returns boolean for success/failure, or undefined */\r\n fn?: () => boolean | undefined | Promise<boolean | undefined>;\r\n\r\n /** Whether to skip this step */\r\n skip?: boolean;\r\n\r\n /** Working directory for command */\r\n cwd?: string;\r\n}\r\n\r\n/**\r\n * Options for token build\r\n */\r\nexport interface BuildOptions {\r\n /** Skip validation step */\r\n skipValidate?: boolean;\r\n\r\n /** Skip transformation step */\r\n skipTransform?: boolean;\r\n\r\n /** Only build theme CSS */\r\n onlyTheme?: boolean;\r\n\r\n /** Source directory for Figma exports */\r\n sourceDir?: string;\r\n\r\n /** Enable watch mode */\r\n watch?: boolean;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Suppress output */\r\n quiet?: boolean;\r\n\r\n /** Enable strict schema validation */\r\n strict?: boolean;\r\n\r\n /** Enable incremental build (only process changed files) */\r\n incremental?: boolean;\r\n\r\n /** Force full rebuild (ignore cache) */\r\n force?: boolean;\r\n\r\n /** Cache directory for incremental builds */\r\n cacheDir?: string;\r\n\r\n /** Output directory for all formats */\r\n outputDir?: string;\r\n\r\n /** Output formats to generate (default: ['css', 'scss', 'json']) */\r\n formats?: Array<'css' | 'scss' | 'js' | 'ts' | 'json' | 'android' | 'ios'>;\r\n\r\n /** Per-format output directories */\r\n outputDirs?: Partial<Record<string, string>>;\r\n\r\n /** Per-format output file names */\r\n outputFileNames?: Partial<Record<string, string>>;\r\n\r\n /** Additional SCSS directories to merge */\r\n additionalScssDirectories?: string[];\r\n\r\n /** Additional CSS directories to merge */\r\n additionalCssDirectories?: string[];\r\n\r\n /** Merge order for additional styles */\r\n mergeOrder?: 'before' | 'after';\r\n\r\n /** Create combined bundle files */\r\n createBundle?: boolean;\r\n\r\n /** Custom SCSS import header */\r\n scssImportHeader?: string;\r\n\r\n /** Additional directories to watch */\r\n watchDirectories?: string[];\r\n\r\n /** Build pipeline configuration */\r\n pipeline?: {\r\n /** Steps to include in the build */\r\n steps?: Array<\r\n | 'validate'\r\n | 'transform'\r\n | 'style-dictionary'\r\n | 'sync'\r\n | 'sass-theme'\r\n | 'sass-theme-minified'\r\n | 'postprocess'\r\n | 'sass-utilities'\r\n | 'sass-utilities-minified'\r\n | 'bundle'\r\n >;\r\n /** Paths configuration for build steps */\r\n paths?: {\r\n syncSource?: string;\r\n syncTarget?: string;\r\n sassThemeInput?: string;\r\n sassThemeOutput?: string;\r\n sassThemeMinifiedOutput?: string;\r\n sassUtilitiesInput?: string;\r\n sassUtilitiesOutput?: string;\r\n sassUtilitiesMinifiedOutput?: string;\r\n };\r\n /** Style Dictionary config file name */\r\n styleDictionaryConfig?: string;\r\n };\r\n\r\n /**\r\n * Themes configuration for multi-theme builds.\r\n * When provided with enabled: true, the 'multi-theme' step will\r\n * use config-driven theme definitions instead of hardcoded themes.\r\n */\r\n themesConfig?: {\r\n /** Whether theme building is enabled */\r\n enabled?: boolean;\r\n /** Theme definitions by name */\r\n definitions?: Record<\r\n string,\r\n {\r\n isDefault?: boolean;\r\n suffix?: string | null;\r\n selector: string;\r\n mediaQuery?: string;\r\n dataAttribute?: string;\r\n outputFiles?: Partial<Record<string, string>>;\r\n }\r\n >;\r\n };\r\n\r\n /**\r\n * Post-process configuration for CSS files\r\n */\r\n postprocessConfig?: {\r\n /** Whether postprocessing is enabled */\r\n enabled?: boolean;\r\n /** CSS output directory */\r\n cssDir?: string;\r\n /** CSS files to process */\r\n files?: string[];\r\n /** Text replacements to apply */\r\n replacements?: Array<{\r\n description?: string;\r\n from: string | RegExp;\r\n to: string;\r\n }>;\r\n };\r\n\r\n /**\r\n * CSS output directory (from SCSS config)\r\n */\r\n cssOutputDir?: string;\r\n}\r\n\r\n/**\r\n * Result of token build\r\n */\r\nexport interface BuildResult {\r\n /** Whether build succeeded */\r\n success: boolean;\r\n\r\n /** Steps that completed successfully */\r\n stepsCompleted: string[];\r\n\r\n /** Steps that failed */\r\n stepsFailed: string[];\r\n\r\n /** Total duration in milliseconds */\r\n duration: number;\r\n\r\n /** Errors encountered */\r\n errors: string[];\r\n\r\n /** Warnings generated */\r\n warnings: string[];\r\n\r\n /** Generated output files */\r\n outputFiles?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Sync Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for token sync\r\n */\r\nexport interface SyncOptions {\r\n /** Source file (Style Dictionary output) */\r\n sourceFile: string;\r\n\r\n /** Target file (TypeScript source) */\r\n targetFile: string;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of token sync\r\n */\r\nexport interface SyncResult {\r\n /** Whether sync succeeded */\r\n success: boolean;\r\n\r\n /** Number of tokens synced */\r\n tokensCount: number;\r\n\r\n /** Whether file was changed */\r\n changed: boolean;\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Postprocess Types\r\n// ============================================================================\r\n\r\n/**\r\n * A text replacement rule\r\n */\r\nexport interface ReplacementRule {\r\n /** Pattern to search for (string or regex) */\r\n from: string | RegExp;\r\n\r\n /** Replacement string */\r\n to: string;\r\n\r\n /** Optional description */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Options for CSS post-processing\r\n */\r\nexport interface PostprocessOptions {\r\n /** Input CSS file */\r\n inputFile: string;\r\n\r\n /** Output CSS file (defaults to input) */\r\n outputFile?: string;\r\n\r\n /** Replacements to make */\r\n replacements?: ReplacementRule[];\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of post-processing\r\n */\r\nexport interface PostprocessResult {\r\n /** Whether post-processing succeeded */\r\n success: boolean;\r\n\r\n /** Number of replacements made */\r\n replacementsMade: number;\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Merge Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for merging collections\r\n */\r\nexport interface MergeOptions {\r\n /** Source files to merge */\r\n sourceFiles: string[];\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Merge strategy for conflicts */\r\n strategy?: 'first' | 'last' | 'error';\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of collection merge\r\n */\r\nexport interface MergeResult {\r\n /** Whether merge succeeded */\r\n success: boolean;\r\n\r\n /** Number of collections merged */\r\n collectionsCount: number;\r\n\r\n /** Number of tokens in result */\r\n tokensCount: number;\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Conflicts detected */\r\n conflicts?: string[];\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an object is a DTCG token\r\n */\r\nexport function isDTCGToken(obj: unknown): obj is DTCGToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n return '$value' in obj;\r\n}\r\n\r\n/**\r\n * Check if an object is a legacy token\r\n */\r\nexport function isLegacyToken(obj: unknown): obj is LegacyToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n return 'value' in obj && !('$value' in obj);\r\n}\r\n\r\n/**\r\n * Check if an object is any token type\r\n */\r\nexport function isToken(obj: unknown): obj is Token {\r\n return isDTCGToken(obj) || isLegacyToken(obj);\r\n}\r\n\r\n/**\r\n * Check if a string is a valid token type\r\n */\r\nexport function isValidTokenType(type: string): type is TokenType {\r\n return VALID_TOKEN_TYPES.includes(type as TokenType);\r\n}\r\n\r\n/**\r\n * Check if a value is a token reference\r\n */\r\nexport function isTokenReference(value: unknown): boolean {\r\n return typeof value === 'string' && value.startsWith('{') && value.endsWith('}');\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Get the value from a token regardless of format\r\n */\r\nexport function getTokenValue(token: Token): unknown {\r\n return isDTCGToken(token) ? token.$value : token.value;\r\n}\r\n\r\n/**\r\n * Get the type from a token regardless of format\r\n */\r\nexport function getTokenType(token: Token): string | undefined {\r\n if (isDTCGToken(token)) {\r\n return token.$type;\r\n }\r\n return (token as LegacyToken).type;\r\n}\r\n\r\n/**\r\n * Get the description from a token regardless of format\r\n */\r\nexport function getTokenDescription(token: Token): string | undefined {\r\n if (isDTCGToken(token)) {\r\n return token.$description;\r\n }\r\n const legacy = token as LegacyToken;\r\n return legacy.description ?? legacy.comment;\r\n}\r\n\r\n/**\r\n * Convert a legacy token to DTCG format\r\n */\r\nexport function toDTCGToken(token: LegacyToken): DTCGToken {\r\n const dtcg: DTCGToken = {\r\n $value: token.value,\r\n };\r\n\r\n if (token.type && isValidTokenType(token.type)) {\r\n dtcg.$type = token.type;\r\n }\r\n\r\n const desc = token.description ?? token.comment;\r\n if (desc) {\r\n dtcg.$description = desc;\r\n }\r\n\r\n return dtcg;\r\n}\r\n\r\n/**\r\n * Parse a token reference string\r\n * @param ref - Reference string like \"{color.brand.primary}\"\r\n * @returns Path segments like [\"color\", \"brand\", \"primary\"]\r\n */\r\nexport function parseTokenReference(ref: string): string[] | null {\r\n if (!isTokenReference(ref)) {\r\n return null;\r\n }\r\n const inner = ref.slice(1, -1);\r\n return inner.split('.');\r\n}\r\n","/**\r\n * Token validation module\r\n *\r\n * Validates design tokens for DTCG compliance and structural integrity.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\n\r\nimport {\r\n getTokenType,\r\n getTokenValue,\r\n isDTCGToken,\r\n isToken,\r\n isTokenReference,\r\n isValidTokenType,\r\n VALID_TOKEN_TYPES,\r\n} from './types.js';\r\n\r\nimport type {\r\n Token,\r\n TokenCollection,\r\n TokenType,\r\n ValidateOptions,\r\n ValidationIssue,\r\n ValidationResult,\r\n} from './types.js';\r\nimport type { ResolvedConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Color Validation\r\n// ============================================================================\r\n\r\n/** Hex color pattern */\r\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\r\n\r\n/** RGB/RGBA pattern */\r\nconst RGB_PATTERN = /^rgba?\\s*\\(/i;\r\n\r\n/** HSL/HSLA pattern */\r\nconst HSL_PATTERN = /^hsla?\\s*\\(/i;\r\n\r\n/** Named colors (common subset) */\r\nconst NAMED_COLORS = new Set([\r\n 'transparent',\r\n 'currentcolor',\r\n 'inherit',\r\n 'initial',\r\n 'unset',\r\n 'black',\r\n 'white',\r\n 'red',\r\n 'green',\r\n 'blue',\r\n 'yellow',\r\n 'orange',\r\n 'purple',\r\n 'pink',\r\n 'gray',\r\n 'grey',\r\n]);\r\n\r\n/**\r\n * Check if a value is a valid color\r\n */\r\nfunction isValidColor(value: string): boolean {\r\n // Hex colors\r\n if (HEX_COLOR_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // RGB/RGBA\r\n if (RGB_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // HSL/HSLA\r\n if (HSL_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // Token references\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n // Named colors\r\n if (NAMED_COLORS.has(value.toLowerCase())) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Dimension Validation\r\n// ============================================================================\r\n\r\n/** Valid dimension units */\r\nconst VALID_UNITS = new Set([\r\n 'px',\r\n 'rem',\r\n 'em',\r\n '%',\r\n 'vh',\r\n 'vw',\r\n 'vmin',\r\n 'vmax',\r\n 'pt',\r\n 'cm',\r\n 'mm',\r\n 'in',\r\n 'ch',\r\n 'ex',\r\n]);\r\n\r\n/**\r\n * Check if a value is a valid dimension\r\n */\r\nfunction isValidDimension(value: string): boolean {\r\n // Zero without unit\r\n if (value === '0') {\r\n return true;\r\n }\r\n // Token reference\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n // Parse numeric value and unit manually (safer than regex)\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return false;\r\n }\r\n // Find where the numeric part ends\r\n let i = 0;\r\n const firstChar = trimmed.charAt(0);\r\n if (firstChar === '-' || firstChar === '+') {\r\n i = 1;\r\n }\r\n let hasDigits = false;\r\n let hasDot = false;\r\n while (i < trimmed.length) {\r\n const char = trimmed.charAt(i);\r\n if (char >= '0' && char <= '9') {\r\n hasDigits = true;\r\n i++;\r\n } else if (char === '.' && !hasDot) {\r\n hasDot = true;\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n if (!hasDigits) {\r\n return false;\r\n }\r\n // Extract unit part\r\n const unit = trimmed.slice(i).toLowerCase();\r\n // Pure number (for unitless values like line-height)\r\n if (unit === '') {\r\n return true;\r\n }\r\n // Check valid units\r\n return VALID_UNITS.has(unit);\r\n}\r\n\r\n// ============================================================================\r\n// Token Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single token\r\n */\r\nfunction validateSingleToken(\r\n path: string,\r\n token: Token,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n const value = getTokenValue(token);\r\n const type = getTokenType(token);\r\n const isDtcg = isDTCGToken(token);\r\n\r\n // Warn if not using DTCG format\r\n if (!isDtcg) {\r\n warnings.push({\r\n path,\r\n message: 'Token uses legacy format. Consider migrating to DTCG ($value, $type).',\r\n severity: 'warning',\r\n suggestion: 'Use $value instead of value, $type instead of type',\r\n });\r\n }\r\n\r\n // Check for missing value\r\n if (value === undefined || value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has no value',\r\n severity: 'error',\r\n });\r\n return;\r\n }\r\n\r\n // Check for empty string value\r\n if (value === '') {\r\n warnings.push({\r\n path,\r\n message: 'Token has empty string value',\r\n severity: 'warning',\r\n value,\r\n });\r\n }\r\n\r\n // Check for missing type\r\n if (!type) {\r\n warnings.push({\r\n path,\r\n message: 'Token has no type specified',\r\n severity: 'warning',\r\n suggestion: `Add $type property with one of: ${VALID_TOKEN_TYPES.slice(0, 5).join(', ')}...`,\r\n });\r\n } else if (!isValidTokenType(type)) {\r\n warnings.push({\r\n path,\r\n message: `Unknown token type: \"${type}\"`,\r\n severity: 'warning',\r\n value: type,\r\n suggestion: `Valid types: ${VALID_TOKEN_TYPES.join(', ')}`,\r\n });\r\n }\r\n\r\n // Type-specific validation\r\n if (type && typeof value === 'string') {\r\n validateTypedValue(path, value, type as TokenType, errors);\r\n }\r\n}\r\n\r\n/**\r\n * Validate a typed value\r\n */\r\nfunction validateTypedValue(\r\n path: string,\r\n value: string,\r\n type: TokenType,\r\n errors: ValidationIssue[]\r\n): void {\r\n switch (type) {\r\n case 'color':\r\n if (!isValidColor(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid color value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use hex (#fff), rgb(), hsl(), or token reference',\r\n });\r\n }\r\n break;\r\n\r\n case 'dimension':\r\n if (!isValidDimension(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid dimension value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use value with unit (16px, 1rem) or token reference',\r\n });\r\n }\r\n break;\r\n\r\n case 'fontWeight':\r\n if (!isValidFontWeight(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid fontWeight value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use numeric (100-900) or keyword (normal, bold)',\r\n });\r\n }\r\n break;\r\n\r\n // Add more type-specific validations as needed\r\n default:\r\n // Other types pass through\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a value is a valid font weight\r\n */\r\nfunction isValidFontWeight(value: string): boolean {\r\n // Numeric weights\r\n const numeric = parseInt(value, 10);\r\n if (!Number.isNaN(numeric) && numeric >= 1 && numeric <= 1000) {\r\n return true;\r\n }\r\n // Keywords\r\n const keywords = ['normal', 'bold', 'lighter', 'bolder'];\r\n if (keywords.includes(value.toLowerCase())) {\r\n return true;\r\n }\r\n // Token reference\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Collection Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Recursively validate a token collection\r\n */\r\nfunction validateCollection(\r\n collection: TokenCollection,\r\n basePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[],\r\n tokenCount: { count: number }\r\n): void {\r\n for (const [key, value] of Object.entries(collection)) {\r\n // Skip metadata keys\r\n if (key.startsWith('$')) {\r\n continue;\r\n }\r\n\r\n const path = basePath ? `${basePath}.${key}` : key;\r\n\r\n if (isToken(value)) {\r\n tokenCount.count += 1;\r\n validateSingleToken(path, value, errors, warnings);\r\n } else if (typeof value === 'object' && value !== null) {\r\n validateCollection(value as TokenCollection, path, errors, warnings, tokenCount);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate a JSON token file\r\n */\r\nfunction validateFile(\r\n filePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): number {\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n const data = JSON.parse(content) as TokenCollection;\r\n const tokenCount = { count: 0 };\r\n\r\n validateCollection(data, '', errors, warnings, tokenCount);\r\n\r\n return tokenCount.count;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n errors.push({\r\n path: filePath,\r\n message: `Failed to parse file: ${errorMessage}`,\r\n severity: 'error',\r\n });\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Find all JSON files recursively in a directory\r\n */\r\nfunction findJsonFiles(dir: string, files: string[] = []): string[] {\r\n if (!existsSync(dir)) {\r\n return files;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n findJsonFiles(fullPath, files);\r\n } else if (entry.endsWith('.json')) {\r\n files.push(fullPath);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Main Validation Function\r\n// ============================================================================\r\n\r\n/**\r\n * Validate all tokens in a directory\r\n *\r\n * @param config - Resolved configuration\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * import { validateTokens, loadConfig } from '@dsai-io/tools';\r\n *\r\n * const { config } = await loadConfig();\r\n * const result = await validateTokens(config);\r\n *\r\n * if (!result.valid) {\r\n * console.error('Validation failed:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport async function validateTokens(\r\n config: ResolvedConfig,\r\n options: ValidateOptions = {}\r\n): Promise<ValidationResult> {\r\n const startTime = Date.now();\r\n const { verbose = false, quiet = false, strict = false } = options;\r\n\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n let totalTokens = 0;\r\n let fileCount = 0;\r\n\r\n // Use provided directory or config\r\n const collectionsDir = options.collectionsDir ?? config.tokens.collectionsDir;\r\n\r\n if (!existsSync(collectionsDir)) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: collectionsDir,\r\n message: 'Collections directory does not exist',\r\n severity: 'error',\r\n },\r\n ],\r\n warnings: [],\r\n tokenCount: 0,\r\n fileCount: 0,\r\n duration: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Find all JSON files\r\n const jsonFiles = findJsonFiles(collectionsDir);\r\n\r\n if (!quiet) {\r\n logInfo(`Validating ${jsonFiles.length} token files...`);\r\n }\r\n\r\n // Validate each file\r\n for (const file of jsonFiles) {\r\n fileCount += 1;\r\n const relativePath = relative(collectionsDir, file);\r\n\r\n if (verbose) {\r\n logDebug(`Validating: ${relativePath}`);\r\n }\r\n\r\n const tokenCount = validateFile(file, errors, warnings);\r\n totalTokens += tokenCount;\r\n }\r\n\r\n // Determine validity\r\n const valid = strict ? errors.length === 0 && warnings.length === 0 : errors.length === 0;\r\n\r\n // Report results\r\n if (!quiet) {\r\n if (valid) {\r\n logSuccess(`Validated ${totalTokens} tokens in ${fileCount} files`);\r\n if (warnings.length > 0) {\r\n logWarn(`${warnings.length} warnings found`);\r\n }\r\n } else {\r\n logError(`Validation failed with ${errors.length} errors`);\r\n }\r\n }\r\n\r\n return {\r\n valid,\r\n errors,\r\n warnings,\r\n tokenCount: totalTokens,\r\n fileCount,\r\n duration: Date.now() - startTime,\r\n };\r\n}\r\n\r\n/**\r\n * Validate tokens and exit with code (for CLI usage)\r\n *\r\n * @param config - Resolved configuration\r\n * @param options - Validation options\r\n */\r\nexport async function validateTokensCLI(\r\n config: ResolvedConfig,\r\n options: ValidateOptions = {}\r\n): Promise<void> {\r\n const result = await validateTokens(config, { ...options, verbose: true });\r\n\r\n if (!result.valid) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error.path}: ${error.message}`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n for (const warning of result.warnings) {\r\n console.warn(`⚠️ ${warning.path}: ${warning.message}`);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Simple Logging (will be replaced with proper logger in future)\r\n// ============================================================================\r\n\r\nfunction logInfo(message: string): void {\r\n console.info(`ℹ️ ${message}`);\r\n}\r\n\r\nfunction logDebug(message: string): void {\r\n console.info(`🔍 ${message}`);\r\n}\r\n\r\nfunction logSuccess(message: string): void {\r\n console.info(`✅ ${message}`);\r\n}\r\n\r\nfunction logWarn(message: string): void {\r\n console.warn(`⚠️ ${message}`);\r\n}\r\n\r\nfunction logError(message: string): void {\r\n console.error(`❌ ${message}`);\r\n}\r\n","/**\r\n * @fileoverview Zod schemas for DTCG (Design Tokens Community Group) token format\r\n * @see https://design-tokens.github.io/community-group/format/\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * DTCG token types as specified in the DTCG specification\r\n */\r\nexport const tokenTypeSchema = z.enum([\r\n 'color',\r\n 'dimension',\r\n 'fontFamily',\r\n 'fontWeight',\r\n 'duration',\r\n 'cubicBezier',\r\n 'number',\r\n 'string',\r\n 'shadow',\r\n 'typography',\r\n 'transition',\r\n 'strokeStyle',\r\n 'border',\r\n 'gradient',\r\n]);\r\n\r\nexport type TokenType = z.infer<typeof tokenTypeSchema>;\r\n\r\n/**\r\n * DTCG color value (can be hex string or object)\r\n */\r\nexport const colorValueSchema = z.union([\r\n z.string().regex(/^#[0-9A-Fa-f]{3,8}$/),\r\n z.string().regex(/^rgba?\\(/),\r\n z.string().regex(/^hsla?\\(/),\r\n z.object({\r\n r: z.number().min(0).max(1),\r\n g: z.number().min(0).max(1),\r\n b: z.number().min(0).max(1),\r\n a: z.number().min(0).max(1).optional(),\r\n }),\r\n]);\r\n\r\n/**\r\n * DTCG dimension value (number with unit)\r\n */\r\nexport const dimensionValueSchema = z.union([\r\n z.string().regex(/^-?\\d+\\.?\\d*px$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*rem$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*em$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*%$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*vh$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*vw$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*pt$/),\r\n z.number(),\r\n]);\r\n\r\n/**\r\n * DTCG duration value (time with unit)\r\n */\r\nexport const durationValueSchema = z.union([\r\n z.string().regex(/^\\d+\\.?\\d*ms$/),\r\n z.string().regex(/^\\d+\\.?\\d*s$/),\r\n]);\r\n\r\n/**\r\n * DTCG cubic bezier value\r\n */\r\nexport const cubicBezierValueSchema = z.tuple([\r\n z.number().min(0).max(1),\r\n z.number(),\r\n z.number().min(0).max(1),\r\n z.number(),\r\n]);\r\n\r\n/**\r\n * DTCG shadow value\r\n */\r\nexport const shadowValueSchema = z.object({\r\n color: colorValueSchema,\r\n offsetX: dimensionValueSchema,\r\n offsetY: dimensionValueSchema,\r\n blur: dimensionValueSchema,\r\n spread: dimensionValueSchema.optional(),\r\n inset: z.boolean().optional(),\r\n});\r\n\r\n/**\r\n * DTCG typography value\r\n */\r\nexport const typographyValueSchema = z.object({\r\n fontFamily: z.union([z.string(), z.array(z.string())]),\r\n fontSize: dimensionValueSchema,\r\n fontWeight: z.union([z.number().int().min(1).max(1000), z.string()]),\r\n lineHeight: z.union([dimensionValueSchema, z.number()]),\r\n letterSpacing: dimensionValueSchema.optional(),\r\n textTransform: z.enum(['none', 'uppercase', 'lowercase', 'capitalize']).optional(),\r\n textDecoration: z.enum(['none', 'underline', 'overline', 'line-through']).optional(),\r\n});\r\n\r\n/**\r\n * DTCG stroke style value\r\n */\r\nexport const strokeStyleValueSchema = z.union([\r\n z.enum(['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset']),\r\n z.object({\r\n dashArray: z.array(dimensionValueSchema),\r\n lineCap: z.enum(['round', 'butt', 'square']).optional(),\r\n }),\r\n]);\r\n\r\n/**\r\n * DTCG border value\r\n */\r\nexport const borderValueSchema = z.object({\r\n color: colorValueSchema,\r\n width: dimensionValueSchema,\r\n style: strokeStyleValueSchema,\r\n});\r\n\r\n/**\r\n * DTCG gradient stop\r\n */\r\nexport const gradientStopSchema = z.object({\r\n color: colorValueSchema,\r\n position: z.number().min(0).max(1),\r\n});\r\n\r\n/**\r\n * DTCG gradient value\r\n */\r\nexport const gradientValueSchema = z.array(gradientStopSchema);\r\n\r\n/**\r\n * Token alias/reference (e.g., \"{colors.primary}\")\r\n */\r\nexport const tokenReferenceSchema = z.string().regex(/^\\{[^}]+\\}$/);\r\n\r\n/**\r\n * Base DTCG token structure\r\n */\r\nexport const dtcgTokenBaseSchema = z.object({\r\n $value: z.unknown(),\r\n $type: tokenTypeSchema.optional(),\r\n $description: z.string().optional(),\r\n $extensions: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\nexport type DTCGTokenBase = z.infer<typeof dtcgTokenBaseSchema>;\r\n\r\n/**\r\n * DTCG color token\r\n */\r\nexport const dtcgColorTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('color').optional(),\r\n $value: z.union([colorValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG dimension token\r\n */\r\nexport const dtcgDimensionTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('dimension').optional(),\r\n $value: z.union([dimensionValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG font family token\r\n */\r\nexport const dtcgFontFamilyTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('fontFamily').optional(),\r\n $value: z.union([z.string(), z.array(z.string()), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG font weight token\r\n */\r\nexport const dtcgFontWeightTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('fontWeight').optional(),\r\n $value: z.union([\r\n z.number().int().min(1).max(1000),\r\n z.enum(['thin', 'light', 'regular', 'medium', 'semibold', 'bold', 'extrabold', 'black']),\r\n tokenReferenceSchema,\r\n ]),\r\n});\r\n\r\n/**\r\n * DTCG duration token\r\n */\r\nexport const dtcgDurationTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('duration').optional(),\r\n $value: z.union([durationValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG cubic bezier token\r\n */\r\nexport const dtcgCubicBezierTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('cubicBezier').optional(),\r\n $value: z.union([cubicBezierValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG number token\r\n */\r\nexport const dtcgNumberTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('number').optional(),\r\n $value: z.union([z.number(), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG string token\r\n */\r\nexport const dtcgStringTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('string').optional(),\r\n $value: z.union([z.string(), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG shadow token\r\n */\r\nexport const dtcgShadowTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('shadow').optional(),\r\n $value: z.union([\r\n shadowValueSchema,\r\n z.array(shadowValueSchema), // Multiple shadows\r\n tokenReferenceSchema,\r\n ]),\r\n});\r\n\r\n/**\r\n * DTCG typography token\r\n */\r\nexport const dtcgTypographyTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('typography').optional(),\r\n $value: z.union([typographyValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG stroke style token\r\n */\r\nexport const dtcgStrokeStyleTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('strokeStyle').optional(),\r\n $value: z.union([strokeStyleValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG border token\r\n */\r\nexport const dtcgBorderTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('border').optional(),\r\n $value: z.union([borderValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG gradient token\r\n */\r\nexport const dtcgGradientTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('gradient').optional(),\r\n $value: z.union([gradientValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * Union of all specific DTCG token schemas\r\n */\r\nexport const dtcgTypedTokenSchema = z.union([\r\n dtcgColorTokenSchema,\r\n dtcgDimensionTokenSchema,\r\n dtcgFontFamilyTokenSchema,\r\n dtcgFontWeightTokenSchema,\r\n dtcgDurationTokenSchema,\r\n dtcgCubicBezierTokenSchema,\r\n dtcgNumberTokenSchema,\r\n dtcgStringTokenSchema,\r\n dtcgShadowTokenSchema,\r\n dtcgTypographyTokenSchema,\r\n dtcgStrokeStyleTokenSchema,\r\n dtcgBorderTokenSchema,\r\n dtcgGradientTokenSchema,\r\n]);\r\n\r\n/**\r\n * Generic DTCG token (allows any token or group)\r\n */\r\nexport const dtcgTokenSchema: z.ZodType<DTCGTokenOrGroup> = z.lazy(() =>\r\n z.union([dtcgTokenBaseSchema, z.record(z.string(), dtcgTokenSchema)])\r\n);\r\n\r\nexport type DTCGTokenOrGroup = DTCGTokenBase | { [key: string]: DTCGTokenOrGroup };\r\n\r\n/**\r\n * DTCG token collection (root level)\r\n */\r\nexport const dtcgTokenCollectionSchema = z.record(z.string(), dtcgTokenSchema);\r\n\r\nexport type DTCGTokenCollection = z.infer<typeof dtcgTokenCollectionSchema>;\r\n\r\n/**\r\n * DTCG file format with optional metadata\r\n */\r\nexport const dtcgFileSchema = z\r\n .object({\r\n $schema: z.string().optional(),\r\n $description: z.string().optional(),\r\n $extensions: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .catchall(dtcgTokenSchema);\r\n\r\nexport type DTCGFile = z.infer<typeof dtcgFileSchema>;\r\n","/**\r\n * @fileoverview Zod schemas for Figma token export format\r\n * Validates the structure of tokens exported from Figma Variables API\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Figma color value (RGBA object)\r\n */\r\nexport const figmaColorSchema = z.object({\r\n r: z.number().min(0).max(1),\r\n g: z.number().min(0).max(1),\r\n b: z.number().min(0).max(1),\r\n a: z.number().min(0).max(1),\r\n});\r\n\r\n/**\r\n * Figma variable alias reference\r\n */\r\nexport const figmaAliasSchema = z.object({\r\n type: z.literal('VARIABLE_ALIAS'),\r\n id: z.string(),\r\n});\r\n\r\n/**\r\n * Figma variable value (can be primitive or alias)\r\n */\r\nexport const figmaVariableValueSchema = z.union([\r\n z.string(),\r\n z.number(),\r\n z.boolean(),\r\n figmaColorSchema,\r\n figmaAliasSchema,\r\n]);\r\n\r\n/**\r\n * Figma variable mode\r\n */\r\nexport const figmaModeSchema = z.object({\r\n modeId: z.string(),\r\n name: z.string(),\r\n});\r\n\r\n/**\r\n * Figma variable collection\r\n */\r\nexport const figmaCollectionSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n modes: z.array(figmaModeSchema),\r\n defaultModeId: z.string(),\r\n remote: z.boolean(),\r\n hiddenFromPublishing: z.boolean(),\r\n variableIds: z.array(z.string()),\r\n});\r\n\r\n/**\r\n * Figma variable resolved type\r\n */\r\nexport const figmaResolvedTypeSchema = z.enum(['BOOLEAN', 'FLOAT', 'STRING', 'COLOR']);\r\n\r\n/**\r\n * Figma variable\r\n */\r\nexport const figmaVariableSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n key: z.string().optional(),\r\n resolvedType: figmaResolvedTypeSchema,\r\n valuesByMode: z.record(z.string(), figmaVariableValueSchema),\r\n variableCollectionId: z.string(),\r\n remote: z.boolean(),\r\n description: z.string(),\r\n hiddenFromPublishing: z.boolean(),\r\n scopes: z.array(z.string()),\r\n codeSyntax: z.record(z.string(), z.string()),\r\n});\r\n\r\n/**\r\n * Figma style type\r\n */\r\nexport const figmaStyleTypeSchema = z.enum(['FILL', 'TEXT', 'EFFECT', 'GRID']);\r\n\r\n/**\r\n * Figma style\r\n */\r\nexport const figmaStyleSchema = z.object({\r\n key: z.string(),\r\n name: z.string(),\r\n styleType: figmaStyleTypeSchema,\r\n description: z.string().optional(),\r\n remote: z.boolean().optional(),\r\n node_id: z.string().optional(),\r\n});\r\n\r\n/**\r\n * Figma node document (simplified - contains style data)\r\n */\r\nexport const figmaNodeDocumentSchema = z\r\n .object({\r\n id: z.string(),\r\n name: z.string(),\r\n type: z.string(),\r\n fills: z.array(z.unknown()).optional(),\r\n effects: z.array(z.unknown()).optional(),\r\n style: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Figma node (as returned by getFileNodes)\r\n */\r\nexport const figmaNodeSchema = z.object({\r\n document: figmaNodeDocumentSchema,\r\n components: z.record(z.string(), z.unknown()).optional(),\r\n schemaVersion: z.number().optional(),\r\n styles: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\n/**\r\n * Figma file response\r\n */\r\nexport const figmaFileSchema = z\r\n .object({\r\n name: z.string(),\r\n lastModified: z.string(),\r\n thumbnailUrl: z.string().optional(),\r\n version: z.string(),\r\n role: z.string().optional(),\r\n editorType: z.string().optional(),\r\n linkAccess: z.string().optional(),\r\n document: z.record(z.string(), z.unknown()),\r\n components: z.record(z.string(), z.unknown()).optional(),\r\n componentSets: z.record(z.string(), z.unknown()).optional(),\r\n schemaVersion: z.number().optional(),\r\n styles: z.record(z.string(), figmaStyleSchema).optional(),\r\n mainFileKey: z.string().optional(),\r\n branches: z.array(z.unknown()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Figma variables API response\r\n */\r\nexport const figmaVariablesResponseSchema = z.object({\r\n meta: z.object({\r\n variables: z.record(z.string(), figmaVariableSchema),\r\n variableCollections: z.record(z.string(), figmaCollectionSchema),\r\n }),\r\n});\r\n\r\n/**\r\n * Figma published variables response\r\n */\r\nexport const figmaPublishedVariablesResponseSchema = z.union([\r\n figmaVariablesResponseSchema,\r\n z.object({\r\n variables: z.record(z.string(), figmaVariableSchema),\r\n variableCollections: z.record(z.string(), figmaCollectionSchema),\r\n }),\r\n]);\r\n\r\n/**\r\n * Figma export format (as produced by @dsai-io/figma-tokens)\r\n * This is the format after exportTokens() processes the Figma API response\r\n */\r\nexport const figmaExportSchema = z.record(\r\n z.string(),\r\n z.union([\r\n z\r\n .object({\r\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\r\n })\r\n .passthrough(),\r\n z.record(z.string(), z.unknown()),\r\n ])\r\n);\r\n\r\n/**\r\n * Figma export with metadata\r\n */\r\nexport const figmaExportWithMetadataSchema = z\r\n .object({\r\n $schema: z.string().optional(),\r\n $description: z.string().optional(),\r\n $version: z.string().optional(),\r\n $source: z.string().optional(),\r\n $figmaFileKey: z.string().optional(),\r\n $exportedAt: z.string().optional(),\r\n })\r\n .catchall(\r\n z.union([\r\n z\r\n .object({\r\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\r\n })\r\n .passthrough(),\r\n z.record(z.string(), z.unknown()),\r\n ])\r\n );\r\n\r\nexport type FigmaColor = z.infer<typeof figmaColorSchema>;\r\nexport type FigmaAlias = z.infer<typeof figmaAliasSchema>;\r\nexport type FigmaVariableValue = z.infer<typeof figmaVariableValueSchema>;\r\nexport type FigmaMode = z.infer<typeof figmaModeSchema>;\r\nexport type FigmaCollection = z.infer<typeof figmaCollectionSchema>;\r\nexport type FigmaVariable = z.infer<typeof figmaVariableSchema>;\r\nexport type FigmaStyle = z.infer<typeof figmaStyleSchema>;\r\nexport type FigmaNode = z.infer<typeof figmaNodeSchema>;\r\nexport type FigmaFile = z.infer<typeof figmaFileSchema>;\r\nexport type FigmaVariablesResponse = z.infer<typeof figmaVariablesResponseSchema>;\r\nexport type FigmaExport = z.infer<typeof figmaExportSchema>;\r\nexport type FigmaExportWithMetadata = z.infer<typeof figmaExportWithMetadataSchema>;\r\n","/**\r\n * @fileoverview Zod schemas for Style Dictionary token format\r\n * @see https://amzn.github.io/style-dictionary/\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Style Dictionary token attributes\r\n */\r\nexport const styleDictionaryAttributesSchema = z\r\n .object({\r\n category: z.string().optional(),\r\n type: z.string().optional(),\r\n item: z.string().optional(),\r\n subitem: z.string().optional(),\r\n state: z.string().optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary token (legacy format - uses \"value\" not \"$value\")\r\n */\r\nexport const styleDictionaryTokenSchema = z\r\n .object({\r\n value: z.unknown(),\r\n type: z.string().optional(),\r\n comment: z.string().optional(),\r\n themeable: z.boolean().optional(),\r\n attributes: styleDictionaryAttributesSchema.optional(),\r\n name: z.string().optional(),\r\n path: z.array(z.string()).optional(),\r\n original: z\r\n .object({\r\n value: z.unknown(),\r\n })\r\n .passthrough()\r\n .optional(),\r\n filePath: z.string().optional(),\r\n isSource: z.boolean().optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary token or group (recursive)\r\n */\r\nexport const styleDictionaryTokenOrGroupSchema: z.ZodType<StyleDictionaryTokenOrGroup> = z.lazy(\r\n () =>\r\n z.union([styleDictionaryTokenSchema, z.record(z.string(), styleDictionaryTokenOrGroupSchema)])\r\n);\r\n\r\nexport type StyleDictionaryTokenOrGroup =\r\n | z.infer<typeof styleDictionaryTokenSchema>\r\n | { [key: string]: StyleDictionaryTokenOrGroup };\r\n\r\n/**\r\n * Style Dictionary tokens collection\r\n */\r\nexport const styleDictionaryTokensSchema = z.record(z.string(), styleDictionaryTokenOrGroupSchema);\r\n\r\nexport type StyleDictionaryTokens = z.infer<typeof styleDictionaryTokensSchema>;\r\n\r\n/**\r\n * Style Dictionary config source\r\n */\r\nexport const styleDictionarySourceSchema = z.union([z.string(), z.array(z.string())]);\r\n\r\n/**\r\n * Style Dictionary platform config\r\n */\r\nexport const styleDictionaryPlatformSchema = z\r\n .object({\r\n transformGroup: z.string().optional(),\r\n transforms: z.array(z.string()).optional(),\r\n buildPath: z.string().optional(),\r\n files: z\r\n .array(\r\n z\r\n .object({\r\n destination: z.string(),\r\n format: z.string(),\r\n filter: z.function().optional(),\r\n options: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .passthrough()\r\n )\r\n .optional(),\r\n actions: z.array(z.string()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary config\r\n */\r\nexport const styleDictionaryConfigSchema = z\r\n .object({\r\n source: styleDictionarySourceSchema.optional(),\r\n include: styleDictionarySourceSchema.optional(),\r\n platforms: z.record(z.string(), styleDictionaryPlatformSchema).optional(),\r\n hooks: z\r\n .object({\r\n parsers: z.record(z.string(), z.function()).optional(),\r\n preprocessors: z.record(z.string(), z.function()).optional(),\r\n transformGroups: z.record(z.string(), z.array(z.string())).optional(),\r\n transforms: z.record(z.string(), z.function()).optional(),\r\n formats: z.record(z.string(), z.function()).optional(),\r\n filters: z.record(z.string(), z.function()).optional(),\r\n fileHeaders: z.record(z.string(), z.function()).optional(),\r\n actions: z.record(z.string(), z.function()).optional(),\r\n })\r\n .optional(),\r\n log: z\r\n .object({\r\n warnings: z.enum(['warn', 'error', 'disabled']).optional(),\r\n verbosity: z.enum(['default', 'silent', 'verbose']).optional(),\r\n errors: z\r\n .object({\r\n brokenReferences: z.enum(['throw', 'console']).optional(),\r\n })\r\n .optional(),\r\n })\r\n .optional(),\r\n })\r\n .passthrough();\r\n\r\nexport type StyleDictionaryConfig = z.infer<typeof styleDictionaryConfigSchema>;\r\n\r\n/**\r\n * Style Dictionary input file format\r\n */\r\nexport const styleDictionaryInputSchema = styleDictionaryTokensSchema;\r\n\r\nexport type StyleDictionaryInput = z.infer<typeof styleDictionaryInputSchema>;\r\n","/**\r\n * @fileoverview Token schema validation\r\n * Exports Zod schemas and validation functions for token formats\r\n */\r\n\r\nexport * from './dtcg-token.schema.js';\r\nexport * from './figma-export.schema.js';\r\nexport * from './style-dictionary.schema.js';\r\n\r\nimport { z, type ZodError, type ZodIssue } from 'zod';\r\n\r\nimport {\r\n dtcgFileSchema,\r\n dtcgTokenCollectionSchema,\r\n type DTCGFile,\r\n type DTCGTokenCollection,\r\n} from './dtcg-token.schema.js';\r\nimport {\r\n figmaExportSchema,\r\n figmaExportWithMetadataSchema,\r\n figmaVariablesResponseSchema,\r\n type FigmaExport,\r\n type FigmaExportWithMetadata,\r\n type FigmaVariablesResponse,\r\n} from './figma-export.schema.js';\r\nimport {\r\n styleDictionaryInputSchema,\r\n styleDictionaryTokensSchema,\r\n type StyleDictionaryInput,\r\n type StyleDictionaryTokens,\r\n} from './style-dictionary.schema.js';\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n /** Path to the invalid token (e.g., \"colors.primary.$value\") */\r\n path: string;\r\n /** Error message */\r\n message: string;\r\n /** The invalid value */\r\n value?: unknown;\r\n /** Error code from Zod */\r\n code?: string;\r\n}\r\n\r\n/**\r\n * Validation result\r\n */\r\nexport interface ValidationResult<T = unknown> {\r\n /** Whether validation passed */\r\n valid: boolean;\r\n /** Validated and typed data (only if valid) */\r\n data?: T;\r\n /** Validation errors (only if invalid) */\r\n errors?: ValidationError[];\r\n /** Original Zod error (for debugging) */\r\n zodError?: ZodError;\r\n}\r\n\r\n/**\r\n * Validation options\r\n */\r\nexport interface ValidationOptions {\r\n /** Strict mode - treat warnings as errors */\r\n strict?: boolean;\r\n /** Abort after first error */\r\n abortEarly?: boolean;\r\n}\r\n\r\n/**\r\n * Format Zod errors into readable validation errors\r\n */\r\nfunction formatZodErrors(zodError: ZodError): ValidationError[] {\r\n return zodError.issues.map((err: ZodIssue) => ({\r\n path: err.path.join('.'),\r\n message: err.message,\r\n value: undefined,\r\n code: err.code,\r\n }));\r\n}\r\n\r\n/**\r\n * Validate DTCG token collection\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateDTCGTokens({\r\n * colors: {\r\n * primary: {\r\n * $value: '#0066ff',\r\n * $type: 'color',\r\n * },\r\n * },\r\n * });\r\n *\r\n * if (result.valid) {\r\n * console.log('Valid tokens:', result.data);\r\n * } else {\r\n * console.error('Validation errors:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateDTCGTokens(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<DTCGTokenCollection> {\r\n try {\r\n const validated = dtcgTokenCollectionSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate DTCG file format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateDTCGFile(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<DTCGFile> {\r\n try {\r\n const validated = dtcgFileSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma export format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateFigmaExport(exportedData);\r\n * if (!result.valid) {\r\n * console.error('Invalid Figma export:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateFigmaExport(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaExport> {\r\n try {\r\n const validated = figmaExportSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma export with metadata\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateFigmaExportWithMetadata(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaExportWithMetadata> {\r\n try {\r\n const validated = figmaExportWithMetadataSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma Variables API response\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateFigmaVariablesResponse(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaVariablesResponse> {\r\n try {\r\n const validated = figmaVariablesResponseSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Style Dictionary input format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateStyleDictionaryInput(tokens);\r\n * if (!result.valid) {\r\n * throw new Error(`Invalid tokens: ${result.errors.map(e => e.message).join(', ')}`);\r\n * }\r\n * ```\r\n */\r\nexport function validateStyleDictionaryInput(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<StyleDictionaryInput> {\r\n try {\r\n const validated = styleDictionaryInputSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Style Dictionary tokens\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateStyleDictionaryTokens(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<StyleDictionaryTokens> {\r\n try {\r\n const validated = styleDictionaryTokensSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","/**\r\n * Figma Export Validation module\r\n *\r\n * Validates Figma token exports before transformation to ensure\r\n * they meet the expected structure and format requirements.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\r\nimport { basename, extname, join } from 'node:path';\r\n\r\nimport { isDTCGToken, isLegacyToken, isToken, isValidTokenType } from './types.js';\r\n\r\nimport type { FigmaCollection, FigmaExport, ValidationIssue, ValidationResult } from './types.js';\r\nimport type { ResolvedConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Expected structure for a Figma collection\r\n */\r\ninterface ExpectedCollection {\r\n /** File name for this collection */\r\n input: string;\r\n /** Whether the collection has mode variants (Light/Dark) */\r\n modeAware: boolean;\r\n /** Expected mode names */\r\n modes?: string[];\r\n}\r\n\r\n/**\r\n * Expected collections configuration\r\n */\r\ninterface ExpectedCollections {\r\n [key: string]: ExpectedCollection;\r\n}\r\n\r\n/**\r\n * Figma validation options\r\n */\r\nexport interface ValidateFigmaOptions {\r\n /** Path to the figma-exports directory */\r\n exportsDir?: string;\r\n /** Expected collection definitions */\r\n collections?: ExpectedCollections;\r\n /** Strict mode - treat warnings as errors */\r\n strict?: boolean;\r\n /** Skip missing files */\r\n skipMissing?: boolean;\r\n /** Configuration object */\r\n config?: ResolvedConfig;\r\n}\r\n\r\n/**\r\n * Figma validation result\r\n */\r\nexport interface ValidateFigmaResult extends ValidationResult {\r\n /** Per-file validation results */\r\n files: Map<string, ValidationResult>;\r\n /** Detected modes across all files */\r\n detectedModes: Set<string>;\r\n /** Missing expected files */\r\n missingFiles: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default expected collections configuration\r\n */\r\nconst DEFAULT_COLLECTIONS: ExpectedCollections = {\r\n foundation: {\r\n input: 'foundation.json',\r\n modeAware: true,\r\n modes: ['Light', 'Dark'],\r\n },\r\n typography: {\r\n input: 'typography.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n spacing: {\r\n input: 'spacing.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n radius: {\r\n input: 'radius.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n layout: {\r\n input: 'layout.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n shadows: {\r\n input: 'shadows.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validation Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single token from Figma export\r\n */\r\nfunction validateFigmaToken(\r\n path: string,\r\n token: unknown,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n if (!isToken(token)) {\r\n // Not a token object, might be a nested group\r\n return;\r\n }\r\n\r\n // Check for required $value\r\n if (isDTCGToken(token)) {\r\n if (token.$value === undefined || token.$value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has $value property but value is undefined or null',\r\n severity: 'error',\r\n });\r\n }\r\n\r\n // Validate token type if present\r\n if (token.$type !== undefined) {\r\n if (!isValidTokenType(token.$type)) {\r\n warnings.push({\r\n path,\r\n message: `Unknown token type: ${token.$type}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n } else if (isLegacyToken(token)) {\r\n if (token.value === undefined || token.value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has value property but value is undefined or null',\r\n severity: 'error',\r\n });\r\n }\r\n\r\n // Suggest migrating to DTCG format\r\n warnings.push({\r\n path,\r\n message: 'Token uses legacy format (value instead of $value), consider migrating to DTCG',\r\n severity: 'warning',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Recursively validate a token tree\r\n */\r\nfunction validateTokenTree(\r\n obj: unknown,\r\n basePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n if (obj === null || typeof obj !== 'object') {\r\n return;\r\n }\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n const path = basePath ? `${basePath}.${key}` : key;\r\n\r\n // Check if this is a token\r\n if (isToken(value)) {\r\n validateFigmaToken(path, value, errors, warnings);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Recursively validate nested objects\r\n validateTokenTree(value, path, errors, warnings);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate a Figma collection structure\r\n */\r\nfunction validateCollectionStructure(\r\n data: FigmaExport,\r\n collectionName: string,\r\n expectedCollection: ExpectedCollection,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): Set<string> {\r\n const detectedModes = new Set<string>();\r\n\r\n // Find the collection in the data\r\n const collection = Object.entries(data).find(\r\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\r\n )?.[1] as FigmaCollection | undefined;\r\n\r\n if (!collection) {\r\n errors.push({\r\n path: collectionName,\r\n message: `Expected collection \"${collectionName}\" not found in export`,\r\n severity: 'error',\r\n });\r\n return detectedModes;\r\n }\r\n\r\n // Validate modes structure\r\n if (collection.modes) {\r\n const modes = Object.keys(collection.modes);\r\n\r\n for (const mode of modes) {\r\n detectedModes.add(mode);\r\n }\r\n\r\n // Check if expected modes are present\r\n if (expectedCollection.modeAware && expectedCollection.modes) {\r\n for (const expectedMode of expectedCollection.modes) {\r\n if (!modes.includes(expectedMode)) {\r\n warnings.push({\r\n path: `${collectionName}.modes`,\r\n message: `Expected mode \"${expectedMode}\" not found, available modes: ${modes.join(', ')}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Validate tokens in each mode\r\n for (const [modeName, modeData] of Object.entries(collection.modes)) {\r\n if (modeData && typeof modeData === 'object') {\r\n validateTokenTree(modeData, `${collectionName}.modes.${modeName}`, errors, warnings);\r\n }\r\n }\r\n } else {\r\n // No modes structure, validate at collection level\r\n validateTokenTree(collection, collectionName, errors, warnings);\r\n }\r\n\r\n return detectedModes;\r\n}\r\n\r\n// ============================================================================\r\n// Main Validation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single Figma export file\r\n */\r\nexport function validateFigmaFile(\r\n filePath: string,\r\n expectedCollection?: ExpectedCollection\r\n): ValidationResult & { detectedModes: Set<string> } {\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n const detectedModes = new Set<string>();\r\n let tokenCount = 0;\r\n\r\n // Check file exists\r\n if (!existsSync(filePath)) {\r\n errors.push({\r\n path: filePath,\r\n message: 'File not found',\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 0 };\r\n }\r\n\r\n // Parse JSON\r\n let data: FigmaExport;\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n data = JSON.parse(content) as FigmaExport;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n errors.push({\r\n path: filePath,\r\n message: `Failed to parse JSON: ${message}`,\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\r\n }\r\n\r\n // Validate basic structure\r\n if (data === null || typeof data !== 'object' || Array.isArray(data)) {\r\n errors.push({\r\n path: filePath,\r\n message: 'Figma export must be a JSON object',\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\r\n }\r\n\r\n // Get collection name from filename\r\n const fileName = basename(filePath, extname(filePath));\r\n const collectionName = fileName.charAt(0).toUpperCase() + fileName.slice(1);\r\n\r\n // Count tokens helper\r\n const countTokens = (obj: unknown): number => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return 0;\r\n }\r\n if (isToken(obj)) {\r\n return 1;\r\n }\r\n let count = 0;\r\n for (const value of Object.values(obj)) {\r\n count += countTokens(value);\r\n }\r\n return count;\r\n };\r\n\r\n // Validate collection structure if expected collection provided\r\n if (expectedCollection) {\r\n const modes = validateCollectionStructure(\r\n data,\r\n collectionName,\r\n expectedCollection,\r\n errors,\r\n warnings\r\n );\r\n for (const mode of modes) {\r\n detectedModes.add(mode);\r\n }\r\n } else {\r\n // General validation without expected structure\r\n for (const [key, value] of Object.entries(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as FigmaCollection;\r\n if (collection.modes) {\r\n for (const mode of Object.keys(collection.modes)) {\r\n detectedModes.add(mode);\r\n }\r\n }\r\n validateTokenTree(value, key, errors, warnings);\r\n }\r\n }\r\n }\r\n\r\n tokenCount = countTokens(data);\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n detectedModes,\r\n tokenCount,\r\n fileCount: 1,\r\n };\r\n}\r\n\r\n/**\r\n * Validate all Figma exports in a directory\r\n */\r\nexport function validateFigmaExports(options: ValidateFigmaOptions = {}): ValidateFigmaResult {\r\n const {\r\n exportsDir,\r\n collections = DEFAULT_COLLECTIONS,\r\n strict = false,\r\n skipMissing = false,\r\n } = options;\r\n\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n const files = new Map<string, ValidationResult>();\r\n const detectedModes = new Set<string>();\r\n const missingFiles: string[] = [];\r\n let totalTokenCount = 0;\r\n let totalFileCount = 0;\r\n\r\n // Resolve exports directory\r\n const targetDir = exportsDir ?? options.config?.tokens.sourceDir;\r\n\r\n if (!targetDir) {\r\n errors.push({\r\n path: 'config',\r\n message: 'Figma exports directory not specified',\r\n severity: 'error',\r\n });\r\n return {\r\n valid: false,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: 0,\r\n fileCount: 0,\r\n };\r\n }\r\n\r\n // Check directory exists\r\n if (!existsSync(targetDir)) {\r\n errors.push({\r\n path: targetDir,\r\n message: 'Figma exports directory not found',\r\n severity: 'error',\r\n });\r\n return {\r\n valid: false,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: 0,\r\n fileCount: 0,\r\n };\r\n }\r\n\r\n // Validate each expected collection\r\n for (const [_name, expectedCollection] of Object.entries(collections)) {\r\n const filePath = join(targetDir, expectedCollection.input);\r\n\r\n if (!existsSync(filePath)) {\r\n missingFiles.push(expectedCollection.input);\r\n if (!skipMissing) {\r\n errors.push({\r\n path: filePath,\r\n message: `Expected Figma export \"${expectedCollection.input}\" not found`,\r\n severity: 'error',\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n const result = validateFigmaFile(filePath, expectedCollection);\r\n files.set(expectedCollection.input, {\r\n valid: result.valid,\r\n errors: result.errors,\r\n warnings: result.warnings,\r\n tokenCount: result.tokenCount,\r\n fileCount: result.fileCount,\r\n });\r\n\r\n // Aggregate results\r\n errors.push(...result.errors);\r\n warnings.push(...result.warnings);\r\n totalTokenCount += result.tokenCount;\r\n totalFileCount += result.fileCount;\r\n for (const mode of result.detectedModes) {\r\n detectedModes.add(mode);\r\n }\r\n }\r\n\r\n // Check for unexpected files in the exports directory\r\n try {\r\n const existingFiles = readdirSync(targetDir).filter(\r\n (f) => f.endsWith('.json') && statSync(join(targetDir, f)).isFile()\r\n );\r\n const expectedFiles = new Set(Object.values(collections).map((c) => c.input));\r\n\r\n for (const file of existingFiles) {\r\n if (!expectedFiles.has(file)) {\r\n warnings.push({\r\n path: join(targetDir, file),\r\n message: `Unexpected file in exports directory: ${file}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n } catch {\r\n // Ignore read errors\r\n }\r\n\r\n // In strict mode, treat warnings as errors\r\n const effectiveErrors = strict ? [...errors, ...warnings] : errors;\r\n\r\n return {\r\n valid: effectiveErrors.length === 0,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: totalTokenCount,\r\n fileCount: totalFileCount,\r\n };\r\n}\r\n\r\n/**\r\n * Detect modes from Figma export data\r\n */\r\nexport function detectModes(data: FigmaExport, collectionName?: string): string[] {\r\n if (!data || typeof data !== 'object') {\r\n return ['Base'];\r\n }\r\n\r\n // If collection name is specified, look for that collection\r\n if (collectionName) {\r\n const collection = Object.entries(data).find(\r\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\r\n )?.[1] as FigmaCollection | undefined;\r\n\r\n if (collection?.modes) {\r\n return Object.keys(collection.modes);\r\n }\r\n return ['Base'];\r\n }\r\n\r\n // Otherwise, look for modes in any collection\r\n for (const [, value] of Object.entries(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as FigmaCollection;\r\n if (collection.modes) {\r\n return Object.keys(collection.modes);\r\n }\r\n }\r\n }\r\n\r\n return ['Base'];\r\n}\r\n\r\n// ============================================================================\r\n// CLI Support\r\n// ============================================================================\r\n\r\n/**\r\n * CLI entry point for Figma validation\r\n */\r\nexport function validateFigmaCLI(\r\n exportsDir: string,\r\n options: Omit<ValidateFigmaOptions, 'exportsDir'> = {}\r\n): boolean {\r\n console.info(`\\n🔍 Validating Figma exports in: ${exportsDir}\\n`);\r\n\r\n const result = validateFigmaExports({ ...options, exportsDir });\r\n\r\n // Report results per file\r\n for (const [file, fileResult] of result.files) {\r\n if (fileResult.errors.length === 0 && fileResult.warnings.length === 0) {\r\n console.info(`✅ ${file}`);\r\n } else {\r\n console.info(`\\n📄 ${file}`);\r\n for (const error of fileResult.errors) {\r\n console.error(` ❌ ${error.path}: ${error.message}`);\r\n }\r\n for (const warning of fileResult.warnings) {\r\n console.warn(` ⚠️ ${warning.path}: ${warning.message}`);\r\n }\r\n }\r\n }\r\n\r\n // Report missing files\r\n if (result.missingFiles.length > 0) {\r\n console.warn(`\\n⚠️ Missing files: ${result.missingFiles.join(', ')}`);\r\n }\r\n\r\n // Report detected modes\r\n if (result.detectedModes.size > 0) {\r\n console.info(`\\n📊 Detected modes: ${[...result.detectedModes].join(', ')}`);\r\n }\r\n\r\n // Summary\r\n console.info(`\\n${'─'.repeat(50)}`);\r\n if (result.valid) {\r\n console.info('✅ All Figma exports are valid');\r\n } else {\r\n console.error(\r\n `❌ Validation failed: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`\r\n );\r\n }\r\n\r\n return result.valid;\r\n}\r\n","/**\r\n * Token Transformation module\r\n *\r\n * Transforms Figma token exports to Style Dictionary format with DTCG compliance.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { basename, dirname, extname, join } from 'node:path';\r\n\r\nimport { validateFigmaExport } from './schemas/index.js';\r\n\r\nimport type {\r\n DTCGToken,\r\n FigmaExport,\r\n TokenType,\r\n TransformOptions,\r\n TransformResult,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Extractor function type\r\n */\r\ntype ExtractorFn = (data: FigmaExport, mode?: string) => Record<string, unknown>;\r\n\r\n/**\r\n * Collection output configuration\r\n */\r\ninterface CollectionOutput {\r\n /** Output file path relative to output directory */\r\n file: string;\r\n /** Extractor function for this output */\r\n extractor: ExtractorFn;\r\n}\r\n\r\n/**\r\n * Collection configuration\r\n */\r\ninterface CollectionConfig {\r\n /** Input filename */\r\n input: string;\r\n /** Whether collection has mode variants (Light/Dark) */\r\n modeAware: boolean;\r\n /** Output configurations */\r\n outputs: CollectionOutput[];\r\n}\r\n\r\n/**\r\n * Collections configuration map\r\n */\r\ninterface CollectionsConfig {\r\n [key: string]: CollectionConfig;\r\n}\r\n\r\n/**\r\n * Transform options specific to token values\r\n */\r\ninterface TokenTransformOptions {\r\n /** Font stack to prepend font name to */\r\n fontStack?: string;\r\n /** Token path for context-aware transformations */\r\n tokenPath?: string;\r\n /** Token scopes from Figma */\r\n scopes?: string[];\r\n /** Whether value represents a circle (50%) */\r\n isCircle?: boolean;\r\n /** Whether value represents a pill (9999px) */\r\n isPill?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\n/** Keys that could cause prototype pollution */\r\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\r\n\r\n/** Check if a key is safe from prototype pollution */\r\nfunction isSafeKey(key: string): boolean {\r\n return !UNSAFE_KEYS.has(key);\r\n}\r\n\r\n/**\r\n * Safe nested property access for objects with index signatures\r\n */\r\nfunction getNestedValue(obj: unknown, ...keys: string[]): unknown {\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n let current: unknown = obj;\r\n for (const key of keys) {\r\n if (current === null || current === undefined || typeof current !== 'object') {\r\n return undefined;\r\n }\r\n if (!isSafeKey(key)) {\r\n return undefined;\r\n }\r\n // Only access own properties to prevent prototype pollution\r\n if (!hasOwn.call(current, key)) {\r\n return undefined;\r\n }\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n return current;\r\n}\r\n\r\n// ============================================================================\r\n// Value Transformation\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a token should remain unitless\r\n */\r\nfunction shouldKeepUnitless(_type: string, scopes: string[] = [], tokenPath = ''): boolean {\r\n // Font weights must be unitless (300, 400, 700, etc.)\r\n if (scopes.includes('FONT_WEIGHT')) {\r\n return true;\r\n }\r\n\r\n // Line heights should be unitless for proper inheritance (1, 1.5, 2, etc.)\r\n if (scopes.includes('LINE_HEIGHT')) {\r\n return true;\r\n }\r\n\r\n // Opacity values must be unitless decimals (0, 0.5, 1, etc.)\r\n if (scopes.includes('OPACITY')) {\r\n return true;\r\n }\r\n\r\n // Grid configuration values should be unitless (12 columns, 6 row-columns, etc.)\r\n const pathLower = tokenPath.toLowerCase();\r\n if (pathLower.includes('columns') || pathLower.includes('row-columns')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if px units should be added to a number value\r\n */\r\nfunction shouldAddUnit(type: string, scopes: string[] = [], tokenPath = ''): boolean {\r\n // Don't add units to font-weights, line-heights, or grid configuration\r\n if (shouldKeepUnitless(type, scopes, tokenPath)) {\r\n return false;\r\n }\r\n\r\n return type === 'number';\r\n}\r\n\r\n/**\r\n * Transform value based on type\r\n */\r\nexport function transformValue(\r\n value: unknown,\r\n type: string | undefined,\r\n options: TokenTransformOptions = {}\r\n): unknown {\r\n // Handle font family special case - prepend font name to font stack\r\n if (type === 'string' && options.fontStack && typeof value === 'string') {\r\n const fontName = value;\r\n const stack = options.fontStack;\r\n\r\n // Check if font name is already in the stack (avoid duplicates)\r\n if (stack.toLowerCase().includes(fontName.toLowerCase())) {\r\n return stack;\r\n }\r\n\r\n // Prepend font name to stack\r\n return `${fontName}, ${stack}`;\r\n }\r\n\r\n // Handle opacity: convert percentage (0-100) to decimal (0-1)\r\n if (typeof value === 'number' && options.scopes?.includes('OPACITY')) {\r\n // If value is > 1, it's a percentage that needs conversion\r\n if (value > 1) {\r\n return value / 100;\r\n }\r\n // Value is already a decimal (0-1)\r\n return value;\r\n }\r\n\r\n // Handle line-height and font-weight: keep as unitless number (CSS best practice)\r\n if (\r\n typeof value === 'number' &&\r\n shouldKeepUnitless(type ?? '', options.scopes, options.tokenPath)\r\n ) {\r\n return value;\r\n }\r\n\r\n // Handle numbers that should be dimensions\r\n if (typeof value === 'number' && shouldAddUnit(type ?? '', options.scopes, options.tokenPath)) {\r\n // Special case for circle radius (percentage)\r\n if (options.isCircle) {\r\n return '50%';\r\n }\r\n // Special case for pill radius\r\n if (options.isPill) {\r\n return '9999px';\r\n }\r\n return `${value}px`;\r\n }\r\n\r\n // Return value as-is for colors, strings, etc.\r\n return value;\r\n}\r\n\r\n/**\r\n * Transform type from Figma to DTCG standard\r\n * @param figmaType - The original Figma type\r\n * @param scopes - Token scopes to determine type-specific handling\r\n */\r\nexport function transformType(\r\n figmaType: string | undefined,\r\n scopes: string[] = []\r\n): TokenType | undefined {\r\n if (!figmaType) {\r\n return undefined;\r\n }\r\n\r\n // Keep 'number' type for unitless values (opacity, font-weight, line-height)\r\n if (figmaType === 'number') {\r\n const unitlessScopes = ['OPACITY', 'FONT_WEIGHT', 'LINE_HEIGHT'];\r\n if (scopes.some((scope) => unitlessScopes.includes(scope))) {\r\n return 'number' as TokenType;\r\n }\r\n // Default: convert number to dimension\r\n return 'dimension';\r\n }\r\n\r\n const typeMap = new Map<string, TokenType>([\r\n ['string', 'fontFamily'],\r\n ['color', 'color'],\r\n ]);\r\n\r\n return typeMap.get(figmaType) ?? (figmaType as TokenType);\r\n}\r\n\r\n/**\r\n * Transform a single token from Figma format to DTCG-compliant format\r\n */\r\nexport function transformToken(\r\n figmaToken: unknown,\r\n options: TokenTransformOptions = {}\r\n): DTCGToken | null {\r\n if (!figmaToken || typeof figmaToken !== 'object') {\r\n return null;\r\n }\r\n\r\n const tokenObj = figmaToken as Record<string, unknown>;\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n // Skip if this is not a leaf token (no $value property)\r\n if (!hasOwn.call(tokenObj, '$value')) {\r\n return null;\r\n }\r\n\r\n // Extract scopes for type-specific handling\r\n const scopes = (tokenObj['$scopes'] as string[] | undefined) ?? [];\r\n\r\n // Pass scopes to transformValue for type-specific handling\r\n const transformOptions: TokenTransformOptions = {\r\n ...options,\r\n scopes,\r\n };\r\n\r\n const rawType = tokenObj['$type'] as string | undefined;\r\n const transformedType = transformType(rawType, scopes);\r\n\r\n // DTCG Format: Keep $ prefix for all properties\r\n const token: DTCGToken = {\r\n $value: transformValue(tokenObj['$value'], rawType, transformOptions),\r\n $type: transformedType ?? 'string',\r\n };\r\n\r\n // Add description if present (DTCG property)\r\n if (tokenObj['$description'] && typeof tokenObj['$description'] === 'string') {\r\n token.$description = tokenObj['$description'];\r\n }\r\n\r\n // Preserve extensions (DTCG property) - keeps all metadata\r\n if (tokenObj['$extensions'] && typeof tokenObj['$extensions'] === 'object') {\r\n token.$extensions = tokenObj['$extensions'] as Record<string, unknown>;\r\n }\r\n\r\n return token;\r\n}\r\n\r\n/**\r\n * Recursively transform nested token objects\r\n */\r\nexport function transformTokenTree(\r\n obj: unknown,\r\n parentKey = '',\r\n options: Record<string, TokenTransformOptions> = {}\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n const optionsMap = new Map(Object.entries(options));\r\n\r\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\r\n return result;\r\n }\r\n\r\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\r\n // Build the full path for this token\r\n const currentPath = parentKey ? `${parentKey}.${key}` : key;\r\n\r\n // Try to transform as a token\r\n const keyOptions = optionsMap.get(key);\r\n const tokenOptions: TokenTransformOptions = {\r\n ...(keyOptions ?? {}),\r\n tokenPath: currentPath,\r\n };\r\n const transformed = transformToken(value, tokenOptions);\r\n\r\n if (transformed) {\r\n Object.defineProperty(result, key, {\r\n value: transformed,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Recursively process nested objects\r\n const nested = transformTokenTree(\r\n value,\r\n currentPath,\r\n (keyOptions as Record<string, TokenTransformOptions>) ?? {}\r\n );\r\n if (Object.keys(nested).length > 0) {\r\n Object.defineProperty(result, key, {\r\n value: nested,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Extractors\r\n// ============================================================================\r\n\r\n/**\r\n * Extract brand colors from foundation collection\r\n */\r\nfunction extractBrandColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const brandData = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'brand');\r\n\r\n if (!brandData) {\r\n console.warn(`No brand colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n color: transformTokenTree(brandData),\r\n };\r\n}\r\n\r\n/**\r\n * Extract semantic/component colors from foundation collection\r\n */\r\nfunction extractSemanticColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const semantic = getNestedValue(data, 'Foundation', 'modes', mode, 'semantic');\r\n\r\n if (!semantic) {\r\n console.warn(`No semantic colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n semantic: transformTokenTree(semantic),\r\n };\r\n}\r\n\r\n/**\r\n * Extract neutral colors (black, white, grays)\r\n */\r\nfunction extractNeutralColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const neutral = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'neutral');\r\n\r\n if (!neutral) {\r\n console.warn(`No neutral colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n neutral: transformTokenTree(neutral),\r\n };\r\n}\r\n\r\n/**\r\n * Extract opacity scale\r\n */\r\nfunction extractOpacityColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const opacity = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'opacity');\r\n\r\n if (!opacity) {\r\n console.warn(`No opacity tokens found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n opacity: transformTokenTree(opacity),\r\n };\r\n}\r\n\r\n/**\r\n * Extract typography tokens\r\n */\r\nfunction extractTypography(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Typography', 'modes', 'Base') as\r\n | Record<string, unknown>\r\n | undefined;\r\n\r\n if (!base) {\r\n console.warn('No typography tokens found');\r\n return {};\r\n }\r\n\r\n // Special handling for font families - use font stacks from extensions\r\n const optionsMap = new Map<string, TokenTransformOptions>();\r\n const fontFamily = Reflect.get(base, 'fontFamily') as\r\n | Record<string, Record<string, unknown>>\r\n | undefined;\r\n if (fontFamily) {\r\n for (const key of Object.keys(fontFamily)) {\r\n const fontToken = Reflect.get(fontFamily, key) as Record<string, unknown> | undefined;\r\n const extensions = fontToken?.['$extensions'] as\r\n | Record<string, Record<string, string>>\r\n | undefined;\r\n const fontStack = extensions?.['platform']?.['fontStack'];\r\n if (fontStack) {\r\n optionsMap.set(key, { fontStack });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n typography: transformTokenTree(base, '', {\r\n fontFamily: Object.fromEntries(optionsMap),\r\n } as Record<string, TokenTransformOptions>),\r\n };\r\n}\r\n\r\n/**\r\n * Extract spacing tokens\r\n */\r\nfunction extractSpacing(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Spacing', 'modes', 'Base', 'spacing');\r\n\r\n if (!base) {\r\n console.warn('No spacing tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n spacing: transformTokenTree(base),\r\n };\r\n}\r\n\r\n/**\r\n * Extract border radius tokens\r\n */\r\nfunction extractRadius(data: FigmaExport): Record<string, unknown> {\r\n // Support both 'border-radius' (Bootstrap naming) and 'radius' (legacy Figma naming)\r\n const base =\r\n getNestedValue(data, 'Radius', 'modes', 'Base', 'border-radius') ||\r\n getNestedValue(data, 'Radius', 'modes', 'Base', 'radius');\r\n\r\n if (!base) {\r\n console.warn('No radius tokens found');\r\n return {};\r\n }\r\n\r\n // Special handling for circle and pill\r\n const options: Record<string, TokenTransformOptions> = {\r\n circle: { isCircle: true },\r\n pill: { isPill: true },\r\n };\r\n\r\n return {\r\n border: {\r\n radius: transformTokenTree(base, '', options),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract border widths from border.json file\r\n * Structure: Border.modes.Base.[0-5] → border.width.[0-5]\r\n */\r\nfunction extractBorderWidthsFromBorder(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Border', 'modes', 'Base');\r\n\r\n if (!base) {\r\n console.warn('No border width tokens found in border.json');\r\n return {};\r\n }\r\n\r\n // Transform numeric keys to proper width tokens\r\n // The tokens are numbers (0-5) representing pixel values\r\n const transformedWidths = new Map<string, DTCGToken>();\r\n for (const [key, value] of Object.entries(base as Record<string, unknown>)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const token = value as Record<string, unknown>;\r\n const numValue = token['$value'];\r\n\r\n // Convert to dimension type with px unit for border widths\r\n transformedWidths.set(key, {\r\n $value: typeof numValue === 'number' ? `${numValue}px` : String(numValue),\r\n $type: 'dimension',\r\n $description: `Border width ${key} (${numValue}px). Bootstrap's $border-width-${key} variable.`,\r\n $extensions: {\r\n platform: {\r\n scssVariableName: `$border-width-${key}`,\r\n },\r\n },\r\n });\r\n }\r\n }\r\n\r\n return {\r\n border: {\r\n width: Object.fromEntries(transformedWidths),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract breakpoint tokens\r\n */\r\nfunction extractBreakpoints(data: FigmaExport): Record<string, unknown> {\r\n const breakpoints = getNestedValue(data, 'Layout', 'modes', 'Base', 'breakpoints');\r\n\r\n if (!breakpoints) {\r\n console.warn('No breakpoint tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n layout: {\r\n breakpoints: transformTokenTree(breakpoints),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract container tokens\r\n */\r\nfunction extractContainers(data: FigmaExport): Record<string, unknown> {\r\n const container = getNestedValue(data, 'Layout', 'modes', 'Base', 'container');\r\n\r\n if (!container) {\r\n console.warn('No container tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n layout: {\r\n container: transformTokenTree(container),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract grid tokens\r\n */\r\nfunction extractGrid(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Layout', 'modes', 'Base') as\r\n | Record<string, unknown>\r\n | undefined;\r\n const grid = base?.['grid'];\r\n const gutters = base?.['gutters'];\r\n\r\n if (!grid) {\r\n console.warn('No grid tokens found');\r\n return {};\r\n }\r\n\r\n const result: { layout: { grid: Record<string, unknown>; gutters?: Record<string, unknown> } } = {\r\n layout: {\r\n grid: transformTokenTree(grid),\r\n },\r\n };\r\n\r\n if (gutters) {\r\n result.layout.gutters = transformTokenTree(gutters);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Extract shadow tokens (use composite values)\r\n */\r\nfunction extractShadows(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Shadows', 'modes', 'Base', 'shadows') as\r\n | Record<string, Record<string, unknown>>\r\n | undefined;\r\n\r\n if (!base) {\r\n console.warn('No shadow tokens found');\r\n return {};\r\n }\r\n\r\n const shadowMap = new Map<string, DTCGToken>();\r\n\r\n for (const [key, value] of Object.entries(base)) {\r\n const composite = value?.['composite'] as Record<string, unknown> | undefined;\r\n if (composite) {\r\n const token: DTCGToken = {\r\n $value: composite['$value'],\r\n $type: 'shadow',\r\n };\r\n\r\n if (composite['$description'] && typeof composite['$description'] === 'string') {\r\n token.$description = composite['$description'];\r\n }\r\n\r\n if (composite['$extensions'] && typeof composite['$extensions'] === 'object') {\r\n token.$extensions = composite['$extensions'] as Record<string, unknown>;\r\n }\r\n\r\n shadowMap.set(key, token);\r\n }\r\n }\r\n\r\n return { shadow: Object.fromEntries(shadowMap) };\r\n}\r\n\r\n// ============================================================================\r\n// Default Collections Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Default collections configuration matching the original script\r\n */\r\nconst DEFAULT_COLLECTIONS: CollectionsConfig = {\r\n foundation: {\r\n input: 'foundation.json',\r\n modeAware: true,\r\n outputs: [\r\n { file: 'collections/color/primitive.json', extractor: extractBrandColors },\r\n { file: 'collections/color/neutral.json', extractor: extractNeutralColors },\r\n { file: 'collections/color/opacity.json', extractor: extractOpacityColors },\r\n { file: 'collections/color/component.json', extractor: extractSemanticColors },\r\n // Note: These paths don't exist in current Figma exports:\r\n // - colors.theme (extractThemeColors) - use semantic tokens instead\r\n // - colors.background (extractBackgroundColors) - backgrounds are in semantic\r\n // - borders.color (extractBorderColors) - border colors are in semantic.border-color\r\n ],\r\n },\r\n typography: {\r\n input: 'typography.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/typography/base.json', extractor: extractTypography }],\r\n },\r\n spacing: {\r\n input: 'spacing.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/spacing/base.json', extractor: extractSpacing }],\r\n },\r\n radius: {\r\n input: 'radius.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/border/radius.json', extractor: extractRadius }],\r\n },\r\n border: {\r\n input: 'border.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/border/width.json', extractor: extractBorderWidthsFromBorder }],\r\n },\r\n layout: {\r\n input: 'layout.json',\r\n modeAware: false,\r\n outputs: [\r\n { file: 'collections/layout/breakpoints.json', extractor: extractBreakpoints },\r\n { file: 'collections/layout/containers.json', extractor: extractContainers },\r\n { file: 'collections/layout/grid.json', extractor: extractGrid },\r\n ],\r\n },\r\n shadows: {\r\n input: 'shadows.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/shadow/base.json', extractor: extractShadows }],\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Ensure directory exists\r\n */\r\nfunction ensureDir(filePath: string): void {\r\n const dir = dirname(filePath);\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Detect modes from Figma export data\r\n */\r\nexport function detectModes(data: FigmaExport, collectionPath?: string): string[] {\r\n if (!data || typeof data !== 'object') {\r\n return ['Base'];\r\n }\r\n\r\n // If collection path is specified, look for that collection\r\n if (collectionPath) {\r\n const collection = getNestedValue(data, collectionPath) as Record<string, unknown> | undefined;\r\n const modes = collection?.['modes'] as Record<string, unknown> | undefined;\r\n if (modes) {\r\n return Object.keys(modes);\r\n }\r\n return ['Base'];\r\n }\r\n\r\n // Otherwise, look for modes in any collection\r\n for (const value of Object.values(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as Record<string, unknown>;\r\n const modes = collection['modes'] as Record<string, unknown> | undefined;\r\n if (modes) {\r\n return Object.keys(modes);\r\n }\r\n }\r\n }\r\n\r\n return ['Base'];\r\n}\r\n\r\n/**\r\n * Get input source based on configuration with automatic fallback\r\n */\r\nfunction getInputSource(\r\n collectionConfig: CollectionConfig,\r\n exportsDir: string,\r\n buildSource: string\r\n): string {\r\n const themeFile = join(exportsDir, 'theme.json');\r\n const collectionFile = join(exportsDir, collectionConfig.input);\r\n\r\n if (buildSource === 'theme') {\r\n // Prefer theme.json, fallback to collection file\r\n if (existsSync(themeFile)) {\r\n return themeFile;\r\n }\r\n if (existsSync(collectionFile)) {\r\n console.warn(` ⚠️ theme.json not found, using ${collectionConfig.input}`);\r\n return collectionFile;\r\n }\r\n return themeFile;\r\n }\r\n\r\n // Prefer collection file, fallback to theme.json\r\n if (existsSync(collectionFile)) {\r\n return collectionFile;\r\n }\r\n if (existsSync(themeFile)) {\r\n console.warn(` ⚠️ ${collectionConfig.input} not found, using theme.json`);\r\n return themeFile;\r\n }\r\n return collectionFile;\r\n}\r\n\r\n// ============================================================================\r\n// Main Transformation\r\n// ============================================================================\r\n\r\n/**\r\n * Transform Figma tokens to Style Dictionary format\r\n */\r\nexport function transformTokens(options: TransformOptions): TransformResult {\r\n const {\r\n sourceDir,\r\n collectionsDir,\r\n ignoreModes = [],\r\n defaultMode = 'Light',\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n const startTime = Date.now();\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const filesWritten: string[] = [];\r\n const allModesDetected: Set<string> = new Set();\r\n let tokensProcessed = 0;\r\n\r\n if (verbose) {\r\n console.info('🎨 Transforming Figma tokens to Style Dictionary format...\\n');\r\n console.info('📋 Configuration:');\r\n console.info(` Source directory: ${sourceDir}`);\r\n console.info(` Output directory: ${collectionsDir}`);\r\n console.info(` Default mode: ${defaultMode}`);\r\n if (ignoreModes.length > 0) {\r\n console.info(` Ignored modes: ${ignoreModes.join(', ')}`);\r\n }\r\n if (dryRun) {\r\n console.info(' DRY RUN - no files will be written');\r\n }\r\n console.info('');\r\n }\r\n\r\n // Detect modes from theme.json\r\n const detectedModesMap = new Map<string, string[]>();\r\n const themeFile = join(sourceDir, 'theme.json');\r\n if (existsSync(themeFile)) {\r\n try {\r\n const content = readFileSync(themeFile, 'utf-8');\r\n const themeData = JSON.parse(content) as FigmaExport;\r\n\r\n // Detect modes for each collection\r\n for (const [name, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\r\n const typedConfig = collectionConfig as CollectionConfig;\r\n if (typedConfig.modeAware) {\r\n const collectionPath = name.charAt(0).toUpperCase() + name.slice(1);\r\n const modes = detectModes(themeData, collectionPath);\r\n if (modes.length > 0) {\r\n detectedModesMap.set(collectionPath, modes);\r\n for (const mode of modes) {\r\n allModesDetected.add(mode);\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n warnings.push(\r\n `Failed to read theme.json for mode detection: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n\r\n // Process each collection\r\n for (const [collectionName, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\r\n const typedConfig = collectionConfig as CollectionConfig;\r\n if (verbose) {\r\n console.info(`Processing ${collectionName} collection...`);\r\n }\r\n\r\n // Get input path based on configuration\r\n const inputPath = getInputSource(typedConfig, sourceDir, 'theme');\r\n\r\n // Check if input file exists\r\n if (!existsSync(inputPath)) {\r\n warnings.push(`Input file not found: ${inputPath}`);\r\n continue;\r\n }\r\n\r\n // Read input file\r\n let data: FigmaExport;\r\n try {\r\n const content = readFileSync(inputPath, 'utf-8');\r\n data = JSON.parse(content) as FigmaExport;\r\n\r\n // Validate schema if strict mode is enabled\r\n if (options.strict) {\r\n const validation = validateFigmaExport(data);\r\n if (!validation.valid) {\r\n const errorMessages = validation.errors?.map((e) => `${e.path}: ${e.message}`) || [];\r\n errors.push(`Schema validation failed for ${inputPath}:\\n${errorMessages.join('\\n')}`);\r\n continue;\r\n }\r\n if (verbose) {\r\n console.info(` ✓ Schema validation passed`);\r\n }\r\n }\r\n } catch (error) {\r\n errors.push(\r\n `Failed to read ${inputPath}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n continue;\r\n }\r\n\r\n // Determine which modes to process for this collection\r\n let modesToProcess = [defaultMode];\r\n if (typedConfig.modeAware) {\r\n const collectionPath = collectionName.charAt(0).toUpperCase() + collectionName.slice(1);\r\n const detectedForCollection = detectedModesMap.get(collectionPath);\r\n if (detectedForCollection) {\r\n modesToProcess = detectedForCollection.filter((m) => !ignoreModes.includes(m));\r\n } else {\r\n const modes = detectModes(data, collectionPath);\r\n if (modes.length > 1 || !modes.includes('Base')) {\r\n modesToProcess = modes.filter((m) => !ignoreModes.includes(m));\r\n }\r\n }\r\n }\r\n\r\n // Process each output\r\n for (const output of typedConfig.outputs) {\r\n for (const mode of modesToProcess) {\r\n // Generate the output file path\r\n let outputFile = output.file;\r\n if (typedConfig.modeAware && modesToProcess.length > 1) {\r\n const ext = extname(output.file);\r\n const base = basename(output.file, ext);\r\n const dir = dirname(output.file);\r\n\r\n if (mode !== defaultMode) {\r\n outputFile = join(dir, `${base}-${mode.toLowerCase()}${ext}`);\r\n }\r\n }\r\n\r\n const outputPath = join(collectionsDir, outputFile);\r\n\r\n try {\r\n // Extract and transform tokens\r\n const tokens = typedConfig.modeAware\r\n ? output.extractor(data, mode)\r\n : output.extractor(data);\r\n\r\n const tokenCount = Object.keys(tokens).length;\r\n if (tokenCount === 0) {\r\n warnings.push(`No tokens extracted for ${outputFile} (${mode} mode)`);\r\n continue;\r\n }\r\n\r\n tokensProcessed += tokenCount;\r\n\r\n if (!dryRun) {\r\n // Ensure output directory exists\r\n ensureDir(outputPath);\r\n\r\n // Write output file\r\n writeFileSync(outputPath, `${JSON.stringify(tokens, null, 2)}\\n`, 'utf-8');\r\n }\r\n\r\n filesWritten.push(outputFile);\r\n\r\n if (verbose) {\r\n const dryRunLabel = dryRun ? ' (dry run)' : '';\r\n console.info(\r\n ` ✅ Created ${outputFile}${modesToProcess.length > 1 ? ` (${mode})` : ''}${dryRunLabel}`\r\n );\r\n }\r\n } catch (error) {\r\n errors.push(\r\n `Error processing ${outputFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n if (verbose) {\r\n console.info('\\n✨ Transformation complete!');\r\n console.info(`\\n📁 Output directory: ${collectionsDir}`);\r\n console.info(`⏱️ Duration: ${duration}ms`);\r\n }\r\n\r\n return {\r\n success: errors.length === 0,\r\n filesWritten,\r\n tokensProcessed,\r\n modesDetected: Array.from(allModesDetected),\r\n errors,\r\n warnings,\r\n duration,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token transformation\r\n */\r\nexport function transformTokensCLI(\r\n sourceDir: string,\r\n collectionsDir: string,\r\n options: Partial<Omit<TransformOptions, 'sourceDir' | 'collectionsDir'>> = {}\r\n): boolean {\r\n const result = transformTokens({\r\n sourceDir,\r\n collectionsDir,\r\n verbose: true,\r\n ...options,\r\n });\r\n\r\n // Report errors\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n\r\n // Report warnings\r\n for (const warning of result.warnings) {\r\n console.warn(`⚠️ ${warning}`);\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @file Token Sync Module\r\n * @description Synchronizes generated tokens from Style Dictionary output to TypeScript source\r\n *\r\n * This module handles syncing the generated tokens from dist/js/tokens.js\r\n * to src/tokens-flat.ts so that tsup can bundle them correctly.\r\n *\r\n * This ensures that when font families or other tokens change in Figma,\r\n * the changes automatically propagate to the TypeScript source.\r\n *\r\n * @module @dsai-io/tools/tokens/sync\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { SyncOptions, SyncResult } from './types';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Default source file relative path from tokens package */\r\nconst DEFAULT_SOURCE_RELATIVE = 'dist/js/tokens.js';\r\n\r\n/** Default target file relative path from tokens package */\r\nconst DEFAULT_TARGET_RELATIVE = 'src/tokens-flat.ts';\r\n\r\n/** TypeScript header template for generated file */\r\nconst TS_HEADER = `/**\r\n * Do not edit directly, this file was auto-generated.\r\n * Generated from Style Dictionary output (dist/js/tokens.js)\r\n *\r\n * To update: run \\`pnpm tokens:build\\` which will:\r\n * 1. Transform Figma tokens\r\n * 2. Build with Style Dictionary\r\n * 3. Sync this file automatically\r\n */\r\n\r\n`;\r\n\r\n/** Font families to verify in output */\r\nconst EXPECTED_FONTS = ['Inter', 'Roboto Mono'] as const;\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Verify that expected font families are present in the content\r\n */\r\nfunction verifyFontFamilies(content: string): { found: string[]; missing: string[] } {\r\n const found: string[] = [];\r\n const missing: string[] = [];\r\n\r\n for (const font of EXPECTED_FONTS) {\r\n // Check for font in various formats: \"'Inter,\" or \"Inter,\"\r\n const pattern = `'${font},`;\r\n if (content.includes(pattern) || content.includes(`\"${font},`)) {\r\n found.push(font);\r\n } else {\r\n missing.push(font);\r\n }\r\n }\r\n\r\n return { found, missing };\r\n}\r\n\r\n/**\r\n * Count token exports in content\r\n */\r\nfunction countTokenExports(content: string): number {\r\n // Count export const declarations\r\n const exportPattern = /export\\s+const\\s+\\w+/g;\r\n const matches = content.match(exportPattern);\r\n return matches ? matches.length : 0;\r\n}\r\n\r\n/**\r\n * Compute default file paths from tokens directory\r\n */\r\nexport function getDefaultSyncPaths(tokensDir: string): { sourceFile: string; targetFile: string } {\r\n return {\r\n sourceFile: join(tokensDir, DEFAULT_SOURCE_RELATIVE),\r\n targetFile: join(tokensDir, DEFAULT_TARGET_RELATIVE),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Sync tokens from Style Dictionary output to TypeScript source\r\n *\r\n * @example\r\n * ```typescript\r\n * // Sync with explicit paths\r\n * const result = syncTokens({\r\n * sourceFile: './packages/@dsai-io/tokens/dist/js/tokens.js',\r\n * targetFile: './packages/@dsai-io/tokens/src/tokens-flat.ts',\r\n * });\r\n *\r\n * // Sync with paths computed from tokens directory\r\n * const paths = getDefaultSyncPaths('./packages/@dsai-io/tokens');\r\n * const result = syncTokens(paths);\r\n * ```\r\n */\r\nexport function syncTokens(options: SyncOptions): SyncResult {\r\n const { sourceFile, targetFile, dryRun = false, verbose = false } = options;\r\n\r\n const errors: string[] = [];\r\n\r\n if (verbose) {\r\n console.info('🔄 Syncing tokens from Style Dictionary output...');\r\n console.info(` Source: ${sourceFile}`);\r\n console.info(` Target: ${targetFile}`);\r\n if (dryRun) {\r\n console.info(' DRY RUN - no files will be written');\r\n }\r\n }\r\n\r\n // Check if source file exists\r\n if (!existsSync(sourceFile)) {\r\n const error = `Source file not found: ${sourceFile}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount: 0,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n\r\n // Read source content\r\n let sourceContent: string;\r\n try {\r\n sourceContent = readFileSync(sourceFile, 'utf-8');\r\n } catch (err) {\r\n const error = `Failed to read source file: ${err instanceof Error ? err.message : 'Unknown error'}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount: 0,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n\r\n // Generate TypeScript content\r\n const tsContent = `${TS_HEADER}${sourceContent}`;\r\n\r\n // Verify font families\r\n const fontFamilies = verifyFontFamilies(sourceContent);\r\n if (fontFamilies.missing.length > 0) {\r\n for (const font of fontFamilies.missing) {\r\n errors.push(`Font family may be missing: ${font}`);\r\n }\r\n }\r\n\r\n // Count tokens\r\n const tokensCount = countTokenExports(sourceContent);\r\n\r\n // Check if target already exists and has same content\r\n let changed = true;\r\n if (existsSync(targetFile)) {\r\n try {\r\n const existingContent = readFileSync(targetFile, 'utf-8');\r\n if (existingContent === tsContent) {\r\n changed = false;\r\n if (verbose) {\r\n console.info('✅ Target file is already up to date');\r\n }\r\n }\r\n } catch {\r\n // Ignore read errors, will overwrite\r\n }\r\n }\r\n\r\n // Write target file if changed\r\n if (changed && !dryRun) {\r\n try {\r\n // Ensure target directory exists\r\n const targetDir = dirname(targetFile);\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n writeFileSync(targetFile, tsContent, 'utf-8');\r\n } catch (err) {\r\n const error = `Failed to write target file: ${err instanceof Error ? err.message : 'Unknown error'}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n }\r\n\r\n if (verbose) {\r\n if (changed) {\r\n console.info('✅ Successfully synced tokens');\r\n }\r\n console.info(` Tokens exported: ${tokensCount}`);\r\n if (fontFamilies.found.length > 0) {\r\n console.info(` Font families found: ${fontFamilies.found.join(', ')}`);\r\n }\r\n if (fontFamilies.missing.length > 0) {\r\n console.warn(` ⚠️ Missing fonts: ${fontFamilies.missing.join(', ')}`);\r\n }\r\n }\r\n\r\n return {\r\n success: errors.length === 0 || errors.every((e) => e.includes('Font family')),\r\n tokensCount,\r\n changed,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token sync\r\n * @param tokensDir - The tokens package directory\r\n * @param customPaths - Optional custom paths for source and target files\r\n */\r\nexport function syncTokensCLI(\r\n tokensDir: string,\r\n customPaths?: { syncSource?: string; syncTarget?: string }\r\n): boolean {\r\n // Use custom paths if provided, otherwise use defaults\r\n const sourceFile = customPaths?.syncSource\r\n ? join(tokensDir, customPaths.syncSource)\r\n : join(tokensDir, DEFAULT_SOURCE_RELATIVE);\r\n const targetFile = customPaths?.syncTarget\r\n ? join(tokensDir, customPaths.syncTarget)\r\n : join(tokensDir, DEFAULT_TARGET_RELATIVE);\r\n\r\n const result = syncTokens({\r\n sourceFile,\r\n targetFile,\r\n verbose: true,\r\n });\r\n\r\n // Report errors (non-critical ones like missing fonts)\r\n if (result.errors) {\r\n for (const error of result.errors) {\r\n if (error.includes('Font family')) {\r\n console.warn(`⚠️ ${error}`);\r\n } else {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @fileoverview Token cache management for incremental builds\r\n * Provides hash-based change detection and cache storage\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { createHash } from 'node:crypto';\r\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\n\r\n/**\r\n * Cache entry for a single token file\r\n */\r\nexport interface CacheEntry {\r\n /** SHA-256 hash of file content */\r\n hash: string;\r\n /** Last modification time */\r\n mtime: Date;\r\n /** Generated output files */\r\n outputs: string[];\r\n}\r\n\r\n/**\r\n * Token cache structure\r\n */\r\nexport interface TokenCache {\r\n /** Cache format version */\r\n version: string;\r\n /** Cache creation timestamp */\r\n timestamp: Date;\r\n /** Cached file entries */\r\n files: Record<string, CacheEntry>;\r\n}\r\n\r\n/**\r\n * Cache configuration\r\n */\r\nexport interface CacheConfig {\r\n /** Cache directory path */\r\n cacheDir?: string;\r\n /** Enable/disable caching */\r\n enabled?: boolean;\r\n /** Cache file name */\r\n cacheFile?: string;\r\n}\r\n\r\n/**\r\n * Cache storage service for token builds\r\n */\r\nexport class CacheService {\r\n private readonly cacheDir: string;\r\n private readonly cacheFile: string;\r\n private readonly enabled: boolean;\r\n private cache: TokenCache | null = null;\r\n\r\n constructor(config: CacheConfig = {}) {\r\n this.cacheDir = config.cacheDir ?? '.dsai-cache';\r\n this.cacheFile = config.cacheFile ?? 'tokens.json';\r\n this.enabled = config.enabled ?? true;\r\n }\r\n\r\n /**\r\n * Get full path to cache file\r\n */\r\n private getCachePath(): string {\r\n return join(this.cacheDir, this.cacheFile);\r\n }\r\n\r\n /**\r\n * Ensure cache directory exists\r\n */\r\n private ensureCacheDir(): void {\r\n if (!existsSync(this.cacheDir)) {\r\n mkdirSync(this.cacheDir, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Calculate SHA-256 hash of file content\r\n */\r\n static hashFile(filePath: string): string {\r\n const content = readFileSync(filePath, 'utf-8');\r\n return createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Calculate hash of string content\r\n */\r\n static hashContent(content: string): string {\r\n return createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Load cache from disk\r\n */\r\n loadCache(): TokenCache {\r\n if (!this.enabled) {\r\n return this.createEmptyCache();\r\n }\r\n\r\n if (this.cache) {\r\n return this.cache;\r\n }\r\n\r\n const cachePath = this.getCachePath();\r\n\r\n if (!existsSync(cachePath)) {\r\n this.cache = this.createEmptyCache();\r\n return this.cache;\r\n }\r\n\r\n try {\r\n const content = readFileSync(cachePath, 'utf-8');\r\n const parsed = JSON.parse(content) as TokenCache;\r\n\r\n // Convert date strings back to Date objects\r\n this.cache = {\r\n ...parsed,\r\n timestamp: new Date(parsed.timestamp),\r\n files: Object.fromEntries(\r\n Object.entries(parsed.files).map(([path, entry]) => [\r\n path,\r\n { ...entry, mtime: new Date(entry.mtime) },\r\n ])\r\n ),\r\n };\r\n\r\n return this.cache;\r\n } catch {\r\n // Invalid cache, start fresh\r\n this.cache = this.createEmptyCache();\r\n return this.cache;\r\n }\r\n }\r\n\r\n /**\r\n * Save cache to disk\r\n */\r\n saveCache(cache: TokenCache): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n this.ensureCacheDir();\r\n const cachePath = this.getCachePath();\r\n\r\n try {\r\n const content = JSON.stringify(cache, null, 2);\r\n writeFileSync(cachePath, content, 'utf-8');\r\n this.cache = cache;\r\n } catch (error) {\r\n console.warn(\r\n `Failed to save cache: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Create empty cache structure\r\n */\r\n private createEmptyCache(): TokenCache {\r\n return {\r\n version: '1.0.0',\r\n timestamp: new Date(),\r\n files: {},\r\n };\r\n }\r\n\r\n /**\r\n * Check if a file has changed since last cache\r\n */\r\n hasFileChanged(filePath: string, baseDir: string): boolean {\r\n if (!this.enabled) {\r\n return true; // Always rebuild if caching disabled\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n // File not in cache = changed\r\n const entry = Reflect.get(cache.files, relativePath) as CacheEntry | undefined;\r\n if (!entry) {\r\n return true;\r\n }\r\n\r\n // Check if file still exists\r\n if (!existsSync(filePath)) {\r\n return true;\r\n }\r\n\r\n const currentHash = CacheService.hashFile(filePath);\r\n\r\n // Hash mismatch = changed\r\n if (entry.hash !== currentHash) {\r\n return true;\r\n }\r\n\r\n // Check mtime as fast path (but hash is source of truth)\r\n const stats = statSync(filePath);\r\n const currentMtime = stats.mtime;\r\n\r\n return currentMtime.getTime() !== new Date(entry.mtime).getTime();\r\n }\r\n\r\n /**\r\n * Get list of changed files in a directory\r\n */\r\n getChangedFiles(directory: string, pattern = '**/*.json'): string[] {\r\n if (!this.enabled) {\r\n // Return all files if caching disabled\r\n return this.getAllFiles(directory, pattern);\r\n }\r\n\r\n const allFiles = this.getAllFiles(directory, pattern);\r\n const changedFiles: string[] = [];\r\n\r\n for (const file of allFiles) {\r\n if (this.hasFileChanged(file, directory)) {\r\n changedFiles.push(file);\r\n }\r\n }\r\n\r\n return changedFiles;\r\n }\r\n\r\n /**\r\n * Get all files matching pattern\r\n */\r\n private getAllFiles(directory: string, pattern: string): string[] {\r\n const files: string[] = [];\r\n\r\n const scan = (dir: string): void => {\r\n if (!existsSync(dir)) {\r\n return;\r\n }\r\n\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n scan(fullPath);\r\n } else if (entry.isFile()) {\r\n // Get relative path for pattern matching\r\n const relativePath = relative(directory, fullPath);\r\n if (this.matchesPattern(relativePath, pattern)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n };\r\n\r\n scan(directory);\r\n return files;\r\n }\r\n\r\n /**\r\n * Simple pattern matching for file globs\r\n * Supports: *.json, **\\/*.json, *.tokens.json\r\n */\r\n private matchesPattern(filename: string, pattern: string): boolean {\r\n // Simple cases\r\n if (pattern === '*' || pattern === '**/*') {\r\n return true;\r\n }\r\n\r\n if (pattern === '*.*') {\r\n return filename.includes('.');\r\n }\r\n\r\n // Handle **.ext patterns\r\n if (pattern.startsWith('**/*.')) {\r\n const ext = pattern.substring(4); // Remove **/*\r\n return filename.endsWith(ext);\r\n }\r\n\r\n // Handle *.ext patterns\r\n if (pattern.startsWith('*.')) {\r\n const ext = pattern.substring(1); // Remove *\r\n return filename.endsWith(ext);\r\n }\r\n\r\n // Convert glob pattern to regex for complex patterns\r\n /* eslint-disable security/detect-non-literal-regexp */\r\n const regexPattern = pattern\r\n .replace(/\\*\\*/g, '.*')\r\n .replace(/\\*/g, '[^/]*')\r\n .replace(/\\./g, '\\\\.');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(filename);\r\n /* eslint-enable security/detect-non-literal-regexp */\r\n }\r\n\r\n /**\r\n * Update cache entry for a file\r\n */\r\n updateCacheEntry(filePath: string, baseDir: string, outputs: string[] = []): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n if (!existsSync(filePath)) {\r\n return;\r\n }\r\n\r\n const hash = CacheService.hashFile(filePath);\r\n const stats = statSync(filePath);\r\n\r\n Object.defineProperty(cache.files, relativePath, {\r\n value: {\r\n hash,\r\n mtime: stats.mtime,\r\n outputs,\r\n },\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Update multiple cache entries at once\r\n */\r\n updateCacheEntries(\r\n entries: Array<{ filePath: string; outputs?: string[] }>,\r\n baseDir: string\r\n ): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n\r\n for (const entry of entries) {\r\n const relativePath = relative(baseDir, entry.filePath);\r\n\r\n if (!existsSync(entry.filePath)) {\r\n continue;\r\n }\r\n\r\n const hash = CacheService.hashFile(entry.filePath);\r\n const stats = statSync(entry.filePath);\r\n\r\n Object.defineProperty(cache.files, relativePath, {\r\n value: {\r\n hash,\r\n mtime: stats.mtime,\r\n outputs: entry.outputs ?? [],\r\n },\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Clear cache entry for a file\r\n */\r\n clearCacheEntry(filePath: string, baseDir: string): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n // Safe deletion using Map-like operation\r\n const { [relativePath]: _removed, ...remainingFiles } = cache.files;\r\n cache.files = remainingFiles;\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Clear entire cache\r\n */\r\n clearCache(): void {\r\n this.cache = this.createEmptyCache();\r\n\r\n if (this.enabled) {\r\n const cachePath = this.getCachePath();\r\n if (existsSync(cachePath)) {\r\n try {\r\n writeFileSync(cachePath, JSON.stringify(this.cache, null, 2), 'utf-8');\r\n } catch {\r\n // Ignore write errors during clear\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n getCacheStats(): {\r\n enabled: boolean;\r\n fileCount: number;\r\n cacheSize: number;\r\n oldestEntry: Date | null;\r\n newestEntry: Date | null;\r\n } {\r\n const cache = this.loadCache();\r\n const entries = Object.values(cache.files);\r\n\r\n let oldestEntry: Date | null = null;\r\n let newestEntry: Date | null = null;\r\n\r\n for (const entry of entries) {\r\n const mtime = new Date(entry.mtime);\r\n if (!oldestEntry || mtime < oldestEntry) {\r\n oldestEntry = mtime;\r\n }\r\n if (!newestEntry || mtime > newestEntry) {\r\n newestEntry = mtime;\r\n }\r\n }\r\n\r\n let cacheSize = 0;\r\n const cachePath = this.getCachePath();\r\n if (existsSync(cachePath)) {\r\n cacheSize = statSync(cachePath).size;\r\n }\r\n\r\n return {\r\n enabled: this.enabled,\r\n fileCount: entries.length,\r\n cacheSize,\r\n oldestEntry,\r\n newestEntry,\r\n };\r\n }\r\n\r\n /**\r\n * Check if cache is enabled\r\n */\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n /**\r\n * Get cache directory path\r\n */\r\n getCacheDir(): string {\r\n return this.cacheDir;\r\n }\r\n}\r\n","/**\r\n * Incremental Build System\r\n *\r\n * Provides intelligent change detection and incremental processing for token builds.\r\n * Only transforms and processes tokens that have changed since the last build.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { basename, join, relative } from 'node:path';\r\n\r\nimport type { CacheService } from './cache.js';\r\nimport type { TransformOptions } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for incremental builds\r\n */\r\nexport interface IncrementalOptions {\r\n /** Whether incremental mode is enabled */\r\n enabled: boolean;\r\n /** Force full rebuild (ignores cache) */\r\n force?: boolean;\r\n /** Cache service instance */\r\n cacheService?: CacheService;\r\n /** Verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of incremental analysis\r\n */\r\nexport interface IncrementalAnalysis {\r\n /** Whether a full build is required */\r\n needsFullBuild: boolean;\r\n /** Files that have changed since last build */\r\n changedFiles: string[];\r\n /** Files that can be skipped */\r\n unchangedFiles: string[];\r\n /** Reason for full build (if needed) */\r\n fullBuildReason?: string;\r\n /** Total files analyzed */\r\n totalFiles: number;\r\n}\r\n\r\n/**\r\n * Collection dependency information\r\n */\r\ninterface CollectionDependency {\r\n /** Collection name */\r\n name: string;\r\n /** Input file path */\r\n inputFile: string;\r\n /** Output file paths */\r\n outputFiles: string[];\r\n /** Collections that depend on this one */\r\n dependents: string[];\r\n /** Collections this one depends on */\r\n dependencies: string[];\r\n}\r\n\r\n/**\r\n * Dependency graph for collections\r\n */\r\ninterface DependencyGraph {\r\n /** Map of collection name to dependency info */\r\n collections: Map<string, CollectionDependency>;\r\n /** Collections in topological order */\r\n buildOrder: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Incremental Analysis\r\n// ============================================================================\r\n\r\n/**\r\n * Analyze files to determine what needs to be rebuilt\r\n */\r\nexport async function analyzeChanges(\r\n sourceDir: string,\r\n options: IncrementalOptions\r\n): Promise<IncrementalAnalysis> {\r\n const { enabled, force, cacheService, verbose } = options;\r\n\r\n // If not enabled or force build, do full build\r\n if (!enabled || force) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: force ? 'Force rebuild requested' : 'Incremental mode disabled',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // If no cache service, do full build\r\n if (!cacheService) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No cache service available',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Load cache\r\n const cache = await cacheService.loadCache();\r\n\r\n // If no cache exists, do full build\r\n if (!cache || Object.keys(cache.files).length === 0) {\r\n if (verbose) {\r\n console.info(' ℹ️ No cache found, performing full build');\r\n }\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No cache available',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Get all source files\r\n const sourceFiles = await getSourceFiles(sourceDir);\r\n\r\n if (sourceFiles.length === 0) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No source files found',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Check which files have changed\r\n const changedFiles: string[] = [];\r\n const unchangedFiles: string[] = [];\r\n\r\n for (const file of sourceFiles) {\r\n const hasChanged = cacheService.hasFileChanged(file, sourceDir);\r\n\r\n if (hasChanged) {\r\n changedFiles.push(file);\r\n } else {\r\n unchangedFiles.push(file);\r\n }\r\n }\r\n\r\n const totalFiles = sourceFiles.length;\r\n const changePercentage = (changedFiles.length / totalFiles) * 100;\r\n\r\n if (verbose && changedFiles.length > 0) {\r\n console.info(\r\n ` 📊 Analysis: ${changedFiles.length}/${totalFiles} files changed (${changePercentage.toFixed(1)}%)`\r\n );\r\n }\r\n\r\n // If more than 50% of files changed, do full build\r\n // This is more efficient than selective processing\r\n if (changePercentage > 50) {\r\n if (verbose) {\r\n console.info(' ℹ️ >50% files changed, performing full build for efficiency');\r\n }\r\n return {\r\n needsFullBuild: true,\r\n changedFiles,\r\n unchangedFiles,\r\n fullBuildReason: 'Too many files changed (>50%)',\r\n totalFiles,\r\n };\r\n }\r\n\r\n // If no files changed, skip build entirely\r\n if (changedFiles.length === 0) {\r\n if (verbose) {\r\n console.info(' ✅ No changes detected, skipping build');\r\n }\r\n return {\r\n needsFullBuild: false,\r\n changedFiles: [],\r\n unchangedFiles,\r\n fullBuildReason: undefined,\r\n totalFiles,\r\n };\r\n }\r\n\r\n // Incremental build is possible\r\n return {\r\n needsFullBuild: false,\r\n changedFiles,\r\n unchangedFiles,\r\n totalFiles,\r\n };\r\n}\r\n\r\n/**\r\n * Get all source files in directory\r\n */\r\nasync function getSourceFiles(sourceDir: string): Promise<string[]> {\r\n if (!existsSync(sourceDir)) {\r\n return [];\r\n }\r\n\r\n const fs = await import('node:fs/promises');\r\n const files: string[] = [];\r\n\r\n try {\r\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isFile() && entry.name.endsWith('.json')) {\r\n files.push(join(sourceDir, entry.name));\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\r\n `Error reading source directory: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Dependency Graph\r\n// ============================================================================\r\n\r\n/**\r\n * Build dependency graph for collections\r\n *\r\n * Currently returns empty graph as collections are independent.\r\n * This can be extended to support collection dependencies in the future.\r\n */\r\nexport function buildDependencyGraph(\r\n collections: Array<{ name: string; inputFile: string; outputFiles: string[] }>\r\n): DependencyGraph {\r\n const graph: DependencyGraph = {\r\n collections: new Map(),\r\n buildOrder: [],\r\n };\r\n\r\n // Add all collections\r\n for (const collection of collections) {\r\n graph.collections.set(collection.name, {\r\n name: collection.name,\r\n inputFile: collection.inputFile,\r\n outputFiles: collection.outputFiles,\r\n dependents: [],\r\n dependencies: [],\r\n });\r\n graph.buildOrder.push(collection.name);\r\n }\r\n\r\n // TODO: Add dependency detection logic\r\n // For now, collections are processed independently in the order they're defined\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Get collections that need to be rebuilt based on changed files\r\n */\r\nexport function getAffectedCollections(\r\n changedFiles: string[],\r\n collections: Array<{ name: string; inputFile: string }>,\r\n dependencyGraph: DependencyGraph\r\n): string[] {\r\n const affected = new Set<string>();\r\n\r\n // Find directly affected collections\r\n for (const file of changedFiles) {\r\n const fileName = basename(file);\r\n\r\n for (const collection of collections) {\r\n const collectionFile = basename(collection.inputFile);\r\n\r\n if (collectionFile === fileName) {\r\n affected.add(collection.name);\r\n\r\n // Add dependent collections\r\n const deps = dependencyGraph.collections.get(collection.name);\r\n if (deps) {\r\n for (const dependent of deps.dependents) {\r\n affected.add(dependent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Array.from(affected);\r\n}\r\n\r\n// ============================================================================\r\n// Incremental Transform\r\n// ============================================================================\r\n\r\n/**\r\n * Filter transform options to only process changed collections\r\n * Returns both the options and list of affected collections\r\n */\r\nexport function filterTransformForIncremental(\r\n options: TransformOptions,\r\n analysis: IncrementalAnalysis,\r\n collections: Array<{ name: string; inputFile: string }>\r\n): { options: TransformOptions; affectedCollections: string[] } {\r\n // If full build needed, return original options\r\n if (analysis.needsFullBuild) {\r\n return { options, affectedCollections: [] };\r\n }\r\n\r\n // If no changes, return options that will skip processing\r\n if (analysis.changedFiles.length === 0) {\r\n return {\r\n options: {\r\n ...options,\r\n sourceDir: '',\r\n },\r\n affectedCollections: [],\r\n };\r\n }\r\n\r\n // Build dependency graph\r\n const graph = buildDependencyGraph(\r\n collections.map((c) => ({\r\n name: c.name,\r\n inputFile: c.inputFile,\r\n outputFiles: [], // Will be populated after transform\r\n }))\r\n );\r\n\r\n // Get affected collections\r\n const affectedCollections = getAffectedCollections(analysis.changedFiles, collections, graph);\r\n\r\n if (options.verbose) {\r\n console.info(\r\n ` 🎯 Incremental: processing ${affectedCollections.length}/${collections.length} collections`\r\n );\r\n for (const name of affectedCollections) {\r\n console.info(` - ${name}`);\r\n }\r\n }\r\n\r\n // Return original options and affected collections list\r\n return { options, affectedCollections };\r\n}\r\n\r\n/**\r\n * Check if a collection should be processed in incremental mode\r\n */\r\nexport function shouldProcessCollection(\r\n collectionName: string,\r\n affectedCollections?: string[]\r\n): boolean {\r\n // If no incremental filter, process all\r\n if (!affectedCollections || affectedCollections.length === 0) {\r\n return true;\r\n }\r\n\r\n // Check if in affected list\r\n return affectedCollections.includes(collectionName);\r\n}\r\n\r\n// ============================================================================\r\n// Cache Updates\r\n// ============================================================================\r\n\r\n/**\r\n * Update cache after successful incremental build\r\n */\r\nexport async function updateCacheAfterBuild(\r\n cacheService: CacheService | undefined,\r\n sourceFiles: string[],\r\n outputFiles: string[],\r\n sourceDir: string,\r\n collectionsDir: string,\r\n verbose: boolean\r\n): Promise<void> {\r\n if (!cacheService) {\r\n return;\r\n }\r\n\r\n const updates: Array<{ filePath: string; relativePath: string; outputs: string[] }> = [];\r\n\r\n // Update source file cache entries\r\n for (const sourceFile of sourceFiles) {\r\n const relativePath = relative(sourceDir, sourceFile);\r\n\r\n // Find corresponding output files\r\n const sourceBaseName = basename(sourceFile, '.json');\r\n const relatedOutputs = outputFiles.filter((f) => {\r\n const outputBaseName = basename(f, '.json');\r\n return outputBaseName.includes(sourceBaseName);\r\n });\r\n\r\n updates.push({\r\n filePath: sourceFile,\r\n relativePath,\r\n outputs: relatedOutputs.map((f) => relative(collectionsDir, f)),\r\n });\r\n }\r\n\r\n // Batch update cache\r\n await cacheService.updateCacheEntries(\r\n updates.map((u) => ({\r\n filePath: u.filePath,\r\n outputs: u.outputs,\r\n })),\r\n sourceDir\r\n );\r\n\r\n if (verbose) {\r\n console.info(` 💾 Cache updated: ${updates.length} entries`);\r\n }\r\n}\r\n\r\n/**\r\n * Generate incremental build report\r\n */\r\nexport function generateIncrementalReport(\r\n analysis: IncrementalAnalysis,\r\n startTime: number,\r\n collectionsProcessed: number,\r\n totalCollections: number\r\n): string {\r\n const duration = Date.now() - startTime;\r\n const lines: string[] = [];\r\n\r\n lines.push('\\n📊 Incremental Build Report');\r\n lines.push('─'.repeat(50));\r\n\r\n if (analysis.needsFullBuild) {\r\n lines.push(`Reason: ${analysis.fullBuildReason}`);\r\n lines.push(`Duration: ${duration}ms`);\r\n } else if (analysis.changedFiles.length === 0) {\r\n lines.push('Result: No changes detected');\r\n lines.push(`Duration: ${duration}ms`);\r\n lines.push(`Time saved: ~${duration}ms (100%)`);\r\n } else {\r\n const savedCollections = totalCollections - collectionsProcessed;\r\n const savedPercentage = ((savedCollections / totalCollections) * 100).toFixed(1);\r\n\r\n lines.push(`Files analyzed: ${analysis.totalFiles}`);\r\n lines.push(`Files changed: ${analysis.changedFiles.length}`);\r\n lines.push(`Files unchanged: ${analysis.unchangedFiles.length}`);\r\n lines.push(`Collections processed: ${collectionsProcessed}/${totalCollections}`);\r\n lines.push(`Collections skipped: ${savedCollections} (${savedPercentage}%)`);\r\n lines.push(`Duration: ${duration}ms`);\r\n }\r\n\r\n lines.push('─'.repeat(50));\r\n\r\n return lines.join('\\n');\r\n}\r\n","/**\r\n * Mode Extractor Module\r\n *\r\n * Extracts specific modes from nested Figma token structures.\r\n * Handles the conversion from Figma's nested mode structure to flat token files.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/mode-extractor\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Mode extraction options\r\n */\r\nexport interface ModeExtractionOptions {\r\n /** Mode name to extract (e.g., 'Light', 'Dark') */\r\n modeName: string;\r\n /** Path to the modes in the token structure (e.g., ['Foundation', 'modes']) */\r\n modesPath?: string[];\r\n /** Whether to preserve non-mode tokens */\r\n preserveNonModeTokens?: boolean;\r\n}\r\n\r\n/**\r\n * Mode extraction result\r\n */\r\nexport interface ModeExtractionResult {\r\n /** Extracted tokens for the specified mode */\r\n tokens: Record<string, unknown>;\r\n /** Mode name that was extracted */\r\n modeName: string;\r\n /** Whether any tokens were found */\r\n hasTokens: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Deep clone an object\r\n */\r\nfunction deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Get nested value from object using path array\r\n * Uses hasOwn.call() to prevent prototype pollution attacks\r\n */\r\nfunction getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n let current: unknown = obj;\r\n\r\n for (const key of path) {\r\n if (\r\n current &&\r\n typeof current === 'object' &&\r\n !Array.isArray(current) &&\r\n hasOwn.call(current, key)\r\n ) {\r\n current = (current as Record<string, unknown>)[key];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n return current;\r\n}\r\n\r\n// ============================================================================\r\n// Main Extraction Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Extract a specific mode from token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param options - Extraction options\r\n * @returns Extracted tokens for the specified mode\r\n *\r\n * @example\r\n * ```typescript\r\n * const tokens = {\r\n * Foundation: {\r\n * modes: {\r\n * Light: { colors: { primary: { $value: '#0000ff' } } },\r\n * Dark: { colors: { primary: { $value: '#ffffff' } } }\r\n * }\r\n * }\r\n * };\r\n *\r\n * const result = extractMode(tokens, {\r\n * modeName: 'Light',\r\n * modesPath: ['Foundation', 'modes']\r\n * });\r\n * // result.tokens = { colors: { primary: { $value: '#0000ff' } } }\r\n * ```\r\n */\r\nexport function extractMode(\r\n tokens: Record<string, unknown>,\r\n options: ModeExtractionOptions\r\n): ModeExtractionResult {\r\n const { modeName, modesPath = ['Foundation', 'modes'], preserveNonModeTokens = true } = options;\r\n\r\n // Clone to avoid mutations\r\n const clonedTokens = deepClone(tokens);\r\n\r\n // Get the modes object\r\n const modesObj = getNestedValue(clonedTokens, modesPath);\r\n\r\n if (!modesObj || typeof modesObj !== 'object') {\r\n return {\r\n tokens: preserveNonModeTokens ? clonedTokens : {},\r\n modeName,\r\n hasTokens: Object.keys(clonedTokens).length > 0,\r\n };\r\n }\r\n\r\n // Get the specific mode\r\n const modeTokens = (modesObj as Record<string, unknown>)[modeName];\r\n\r\n if (!modeTokens || typeof modeTokens !== 'object') {\r\n return {\r\n tokens: preserveNonModeTokens ? clonedTokens : {},\r\n modeName,\r\n hasTokens: false,\r\n };\r\n }\r\n\r\n // Build result: preserve structure but replace mode content\r\n const result = preserveNonModeTokens ? deepClone(clonedTokens) : {};\r\n\r\n // Navigate to the modes parent and replace with mode-specific tokens\r\n let current: Record<string, unknown> = result;\r\n for (let i = 0; i < modesPath.length - 1; i++) {\r\n const key = modesPath[i];\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n if (!(key in current)) {\r\n current[key] = {};\r\n }\r\n const next = current[key];\r\n if (next && typeof next === 'object') {\r\n current = next as Record<string, unknown>;\r\n }\r\n }\r\n\r\n // Replace the modes object with the specific mode content\r\n const lastKey = modesPath[modesPath.length - 1];\r\n if (lastKey) {\r\n current[lastKey] = modeTokens;\r\n }\r\n\r\n return {\r\n tokens: result,\r\n modeName,\r\n hasTokens: true,\r\n };\r\n}\r\n\r\n/**\r\n * Extract multiple modes from token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param modeNames - Array of mode names to extract\r\n * @param modesPath - Path to modes in structure\r\n * @returns Map of mode name to extracted tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = extractModes(tokens, ['Light', 'Dark']);\r\n * // results.get('Light') = light mode tokens\r\n * // results.get('Dark') = dark mode tokens\r\n * ```\r\n */\r\nexport function extractModes(\r\n tokens: Record<string, unknown>,\r\n modeNames: string[],\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): Map<string, ModeExtractionResult> {\r\n const results = new Map<string, ModeExtractionResult>();\r\n\r\n for (const modeName of modeNames) {\r\n const result = extractMode(tokens, { modeName, modesPath });\r\n results.set(modeName, result);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Auto-detect available modes in token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param modesPath - Path to modes in structure\r\n * @returns Array of detected mode names\r\n *\r\n * @example\r\n * ```typescript\r\n * const modes = detectModes(tokens);\r\n * // modes = ['Light', 'Dark']\r\n * ```\r\n */\r\nexport function detectModes(\r\n tokens: Record<string, unknown>,\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): string[] {\r\n const modesObj = getNestedValue(tokens, modesPath);\r\n\r\n if (!modesObj || typeof modesObj !== 'object') {\r\n return [];\r\n }\r\n\r\n const modes: string[] = [];\r\n for (const [key, value] of Object.entries(modesObj as Record<string, unknown>)) {\r\n if (value && typeof value === 'object') {\r\n modes.push(key);\r\n }\r\n }\r\n\r\n return modes;\r\n}\r\n\r\n/**\r\n * Flatten mode structure by hoisting mode tokens to top level\r\n *\r\n * Useful when you want to completely flatten the structure instead of preserving nesting\r\n *\r\n * @param tokens - Source token object\r\n * @param modeName - Mode to extract\r\n * @param modesPath - Path to modes\r\n * @returns Flattened token structure\r\n *\r\n * @example\r\n * ```typescript\r\n * const flattened = flattenModeStructure(tokens, 'Light');\r\n * // { colors: { primary: { $value: '#0000ff' } } }\r\n * ```\r\n */\r\nexport function flattenModeStructure(\r\n tokens: Record<string, unknown>,\r\n modeName: string,\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): Record<string, unknown> {\r\n const result = extractMode(tokens, {\r\n modeName,\r\n modesPath,\r\n preserveNonModeTokens: false,\r\n });\r\n\r\n // Get just the mode content\r\n const modesObj = getNestedValue(result.tokens, modesPath);\r\n\r\n if (modesObj && typeof modesObj === 'object') {\r\n return modesObj as Record<string, unknown>;\r\n }\r\n\r\n return result.tokens;\r\n}\r\n","/**\r\n * Mode Preprocessor Module\r\n *\r\n * Preprocesses token files by extracting mode-specific tokens into separate files.\r\n * This allows theme builders to work with mode-specific token sets.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/mode-preprocessor\r\n */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { join, parse } from 'node:path';\r\n\r\nimport { detectModes, extractMode } from './mode-extractor.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocessor configuration\r\n */\r\nexport interface PreprocessorConfig {\r\n /** Source directory containing original token files */\r\n sourceDir: string;\r\n /** Output directory for preprocessed files */\r\n outputDir: string;\r\n /** Files to preprocess (glob patterns or file paths) */\r\n files: string[];\r\n /** Mode names to extract (auto-detected if not provided) */\r\n modes?: string[];\r\n /** Path to modes in token structure */\r\n modesPath?: string[];\r\n /** Whether to preserve original files */\r\n preserveOriginals?: boolean;\r\n /** Whether to clean output directory before processing */\r\n clean?: boolean;\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Preprocessing result for a single file\r\n */\r\nexport interface FilePreprocessingResult {\r\n /** Original file path */\r\n sourceFile: string;\r\n /** Detected or configured modes */\r\n modes: string[];\r\n /** Generated output files by mode */\r\n outputFiles: Map<string, string>;\r\n /** Whether preprocessing succeeded */\r\n success: boolean;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Overall preprocessing result\r\n */\r\nexport interface PreprocessingResult {\r\n /** Results for each processed file */\r\n files: FilePreprocessingResult[];\r\n /** Total files processed */\r\n totalFiles: number;\r\n /** Number of successful preprocessings */\r\n successCount: number;\r\n /** Number of failed preprocessings */\r\n failureCount: number;\r\n /** Output directory used */\r\n outputDir: string;\r\n /** Cleanup function to remove preprocessed files */\r\n cleanup: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Generate output filename for a mode\r\n */\r\nfunction generateModeFilename(\r\n originalFilename: string,\r\n modeName: string,\r\n isDefault: boolean\r\n): string {\r\n const parsed = parse(originalFilename);\r\n\r\n // Default mode keeps original name, others get suffix\r\n if (isDefault) {\r\n return originalFilename;\r\n }\r\n\r\n const suffix = modeName.toLowerCase();\r\n return `${parsed.name}-${suffix}${parsed.ext}`;\r\n}\r\n\r\n/**\r\n * Read and parse JSON file\r\n */\r\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\r\n try {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const content = readFileSync(filePath, 'utf-8');\r\n return JSON.parse(content) as Record<string, unknown>;\r\n } catch (error) {\r\n console.error(`Failed to read ${filePath}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Write JSON file with formatting\r\n */\r\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): boolean {\r\n try {\r\n const content = JSON.stringify(data, null, 2);\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n writeFileSync(filePath, content, 'utf-8');\r\n return true;\r\n } catch (error) {\r\n console.error(`Failed to write ${filePath}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Main Preprocessing Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocess a single token file\r\n *\r\n * @param filePath - Path to the token file\r\n * @param config - Preprocessor configuration\r\n * @returns Preprocessing result\r\n */\r\nexport function preprocessFile(\r\n filePath: string,\r\n config: PreprocessorConfig\r\n): FilePreprocessingResult {\r\n const { outputDir, modes: configuredModes, modesPath, verbose } = config;\r\n\r\n const result: FilePreprocessingResult = {\r\n sourceFile: filePath,\r\n modes: [],\r\n outputFiles: new Map(),\r\n success: false,\r\n };\r\n\r\n // Read source file\r\n const tokens = readJsonFile(filePath);\r\n if (!tokens) {\r\n result.error = 'Failed to read source file';\r\n return result;\r\n }\r\n\r\n // Detect or use configured modes\r\n const modes = configuredModes ?? detectModes(tokens, modesPath);\r\n result.modes = modes;\r\n\r\n if (modes.length === 0) {\r\n if (verbose) {\r\n console.warn(` ⚠️ No modes detected in ${filePath}`);\r\n }\r\n result.error = 'No modes detected';\r\n return result;\r\n }\r\n\r\n // Extract each mode to a separate file\r\n const filename = parse(filePath).base;\r\n let successCount = 0;\r\n\r\n for (let i = 0; i < modes.length; i++) {\r\n const modeName = modes[i];\r\n if (!modeName) {\r\n continue;\r\n }\r\n\r\n const isDefault = i === 0; // First mode is default\r\n\r\n // Extract mode\r\n const extracted = extractMode(tokens, {\r\n modeName,\r\n modesPath,\r\n preserveNonModeTokens: true,\r\n });\r\n\r\n if (!extracted.hasTokens) {\r\n if (verbose) {\r\n console.warn(` ⚠️ No tokens found for mode \"${modeName}\" in ${filename}`);\r\n }\r\n continue;\r\n }\r\n\r\n // Generate output filename\r\n const outputFilename = generateModeFilename(filename, modeName, isDefault);\r\n const outputPath = join(outputDir, outputFilename);\r\n\r\n // Write preprocessed file\r\n if (writeJsonFile(outputPath, extracted.tokens)) {\r\n result.outputFiles.set(modeName, outputPath);\r\n successCount++;\r\n\r\n if (verbose) {\r\n console.warn(` ✅ Extracted \"${modeName}\" → ${outputFilename}`);\r\n }\r\n } else if (verbose) {\r\n console.error(` ❌ Failed to write \"${modeName}\" → ${outputFilename}`);\r\n }\r\n }\r\n\r\n result.success = successCount > 0;\r\n return result;\r\n}\r\n\r\n/**\r\n * Preprocess all token files\r\n *\r\n * @param config - Preprocessor configuration\r\n * @returns Overall preprocessing result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = preprocessTokenFiles({\r\n * sourceDir: './src/figma-exports',\r\n * outputDir: './src/.preprocessed',\r\n * files: ['foundation.json', 'semantic.json'],\r\n * modes: ['Light', 'Dark'],\r\n * clean: true,\r\n * });\r\n *\r\n * // Build tokens using preprocessed files...\r\n *\r\n * // Cleanup when done\r\n * result.cleanup();\r\n * ```\r\n */\r\nexport function preprocessTokenFiles(config: PreprocessorConfig): PreprocessingResult {\r\n const { sourceDir, outputDir, files, clean = true, verbose = false } = config;\r\n\r\n if (verbose) {\r\n console.warn(`\\n🔧 Preprocessing token files...`);\r\n console.warn(` Source: ${sourceDir}`);\r\n console.warn(` Output: ${outputDir}`);\r\n }\r\n\r\n // Clean output directory if requested\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (clean && existsSync(outputDir)) {\r\n rmSync(outputDir, { recursive: true, force: true });\r\n if (verbose) {\r\n console.warn(` 🧹 Cleaned output directory`);\r\n }\r\n }\r\n\r\n // Create output directory\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(outputDir)) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Process each file\r\n const results: FilePreprocessingResult[] = [];\r\n let successCount = 0;\r\n let failureCount = 0;\r\n\r\n for (const file of files) {\r\n const filePath = join(sourceDir, file);\r\n\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(filePath)) {\r\n if (verbose) {\r\n console.warn(` ⚠️ File not found: ${file}`);\r\n }\r\n results.push({\r\n sourceFile: filePath,\r\n modes: [],\r\n outputFiles: new Map(),\r\n success: false,\r\n error: 'File not found',\r\n });\r\n failureCount++;\r\n continue;\r\n }\r\n\r\n if (verbose) {\r\n console.warn(`\\n 📄 Processing ${file}...`);\r\n }\r\n\r\n const result = preprocessFile(filePath, config);\r\n results.push(result);\r\n\r\n if (result.success) {\r\n successCount++;\r\n } else {\r\n failureCount++;\r\n }\r\n }\r\n\r\n // Summary\r\n if (verbose) {\r\n console.warn(`\\n📊 Preprocessing Summary:`);\r\n console.warn(` Total: ${files.length}`);\r\n console.warn(` Success: ${successCount}`);\r\n console.warn(` Failed: ${failureCount}`);\r\n }\r\n\r\n // Create cleanup function\r\n const cleanup = (): void => {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (existsSync(outputDir)) {\r\n rmSync(outputDir, { recursive: true, force: true });\r\n if (verbose) {\r\n console.warn(`\\n🧹 Cleaned up preprocessed files from ${outputDir}`);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n files: results,\r\n totalFiles: files.length,\r\n successCount,\r\n failureCount,\r\n outputDir,\r\n cleanup,\r\n };\r\n}\r\n\r\n/**\r\n * Get list of preprocessed files for a specific mode\r\n *\r\n * @param result - Preprocessing result\r\n * @param modeName - Mode to get files for\r\n * @returns Array of file paths for the mode\r\n */\r\nexport function getPreprocessedFilesForMode(\r\n result: PreprocessingResult,\r\n modeName: string\r\n): string[] {\r\n const files: string[] = [];\r\n\r\n for (const fileResult of result.files) {\r\n const outputPath = fileResult.outputFiles.get(modeName);\r\n if (fileResult.success && outputPath) {\r\n files.push(outputPath);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n","/**\r\n * @file CSS Post-processing Module\r\n * @description Post-processes CSS files after SASS compilation\r\n *\r\n * This module applies DSAi-specific transformations to compiled CSS:\r\n * - Replaces `data-bs-theme` with `data-dsai-theme` for custom theme attribute\r\n * - Applies configurable text replacements\r\n *\r\n * @module @dsai-io/tools/tokens/postprocess\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PostprocessOptions, PostprocessResult, ReplacementRule } from './types';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Default CSS distribution directory relative to tokens package */\r\nconst DEFAULT_CSS_DIR = 'dist/css';\r\n\r\n/** Default files to process */\r\nconst DEFAULT_FILES = ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'];\r\n\r\n/** Default transformations to apply */\r\nconst DEFAULT_TRANSFORMATIONS: ReplacementRule[] = [\r\n {\r\n description: 'Theme attribute',\r\n from: /data-bs-theme/g,\r\n to: 'data-dsai-theme',\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// Core Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Apply all replacements to content\r\n */\r\nfunction applyReplacements(\r\n content: string,\r\n replacements: ReplacementRule[],\r\n verbose: boolean\r\n): { result: string; count: number } {\r\n let result = content;\r\n let totalCount = 0;\r\n\r\n for (const rule of replacements) {\r\n // Count matches first\r\n let matchCount = 0;\r\n\r\n if (typeof rule.from === 'string') {\r\n // For string patterns, count occurrences manually\r\n let pos = 0;\r\n const searchStr = rule.from;\r\n while (pos < result.length) {\r\n const idx = result.indexOf(searchStr, pos);\r\n if (idx === -1) {\r\n break;\r\n }\r\n matchCount++;\r\n pos = idx + 1;\r\n }\r\n // Replace all occurrences using split/join (safe, no regex)\r\n if (matchCount > 0) {\r\n result = result.split(rule.from).join(rule.to);\r\n }\r\n } else {\r\n // For regex patterns, use as-is\r\n const matches = result.match(rule.from);\r\n matchCount = matches ? matches.length : 0;\r\n if (matchCount > 0) {\r\n result = result.replace(rule.from, rule.to);\r\n }\r\n }\r\n\r\n if (matchCount > 0) {\r\n totalCount += matchCount;\r\n if (verbose) {\r\n const desc =\r\n rule.description ?? (typeof rule.from === 'string' ? rule.from : String(rule.from));\r\n console.info(` ✓ ${desc}: ${matchCount} replacement(s)`);\r\n }\r\n }\r\n }\r\n\r\n return { result, count: totalCount };\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Post-process a single CSS file\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = postprocessCss({\r\n * inputFile: './dist/css/theme.css',\r\n * replacements: [\r\n * { from: /data-bs-theme/g, to: 'data-dsai-theme', description: 'Theme attribute' }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function postprocessCss(options: PostprocessOptions): PostprocessResult {\r\n const {\r\n inputFile,\r\n outputFile = inputFile,\r\n replacements = DEFAULT_TRANSFORMATIONS,\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n // Check if input file exists\r\n if (!existsSync(inputFile)) {\r\n return {\r\n success: false,\r\n replacementsMade: 0,\r\n outputFile,\r\n errors: [`File not found: ${inputFile}`],\r\n };\r\n }\r\n\r\n // Read input content\r\n let content: string;\r\n try {\r\n content = readFileSync(inputFile, 'utf-8');\r\n } catch (err) {\r\n return {\r\n success: false,\r\n replacementsMade: 0,\r\n outputFile,\r\n errors: [`Failed to read file: ${err instanceof Error ? err.message : 'Unknown error'}`],\r\n };\r\n }\r\n\r\n // Apply replacements\r\n const { result, count } = applyReplacements(content, replacements, verbose);\r\n\r\n // Write output if changed and not dry run\r\n if (count > 0 && !dryRun) {\r\n try {\r\n writeFileSync(outputFile, result, 'utf-8');\r\n } catch (err) {\r\n return {\r\n success: false,\r\n replacementsMade: count,\r\n outputFile,\r\n errors: [`Failed to write file: ${err instanceof Error ? err.message : 'Unknown error'}`],\r\n };\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n replacementsMade: count,\r\n outputFile,\r\n };\r\n}\r\n\r\n/**\r\n * Post-process multiple CSS files in a directory\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = postprocessCssFiles({\r\n * cssDir: './packages/@dsai-io/tokens/dist/css',\r\n * files: ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'],\r\n * });\r\n * ```\r\n */\r\nexport function postprocessCssFiles(options: {\r\n cssDir: string;\r\n files?: string[];\r\n replacements?: ReplacementRule[];\r\n dryRun?: boolean;\r\n verbose?: boolean;\r\n}): { success: boolean; filesModified: number; totalReplacements: number; errors: string[] } {\r\n const {\r\n cssDir,\r\n files = DEFAULT_FILES,\r\n replacements = DEFAULT_TRANSFORMATIONS,\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n let filesModified = 0;\r\n let totalReplacements = 0;\r\n const errors: string[] = [];\r\n\r\n if (verbose) {\r\n console.info('🔧 Post-processing CSS files...\\n');\r\n }\r\n\r\n for (const fileName of files) {\r\n const filePath = join(cssDir, fileName);\r\n\r\n if (verbose) {\r\n console.info(`📄 ${fileName}`);\r\n }\r\n\r\n const result = postprocessCss({\r\n inputFile: filePath,\r\n replacements,\r\n dryRun,\r\n verbose,\r\n });\r\n\r\n if (result.success) {\r\n if (result.replacementsMade > 0) {\r\n filesModified++;\r\n totalReplacements += result.replacementsMade;\r\n } else if (verbose) {\r\n console.info(' (no changes needed)');\r\n }\r\n } else if (result.errors) {\r\n errors.push(...result.errors);\r\n if (verbose) {\r\n for (const err of result.errors) {\r\n console.warn(` ⚠️ ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.info(`\\n✅ Post-processing complete. ${filesModified} file(s) modified.`);\r\n if (totalReplacements > 0) {\r\n console.info(` Total replacements: ${totalReplacements}`);\r\n }\r\n }\r\n\r\n return {\r\n success: errors.length === 0,\r\n filesModified,\r\n totalReplacements,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for CSS post-processing\r\n */\r\nexport function postprocessCLI(tokensDir: string): boolean {\r\n const cssDir = join(tokensDir, DEFAULT_CSS_DIR);\r\n\r\n const result = postprocessCssFiles({\r\n cssDir,\r\n verbose: true,\r\n });\r\n\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Get the default CSS distribution directory path\r\n */\r\nexport function getDefaultCssDir(tokensDir: string): string {\r\n return join(tokensDir, DEFAULT_CSS_DIR);\r\n}\r\n\r\n/**\r\n * Get the default files to process\r\n */\r\nexport function getDefaultFiles(): string[] {\r\n return [...DEFAULT_FILES];\r\n}\r\n\r\n/**\r\n * Get the default transformation rules\r\n */\r\nexport function getDefaultTransformations(): ReplacementRule[] {\r\n return [...DEFAULT_TRANSFORMATIONS];\r\n}\r\n","/**\r\n * @fileoverview Token snapshot service for backup and rollback\r\n * Creates snapshots of token collections before transformations\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { createHash } from 'node:crypto';\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { basename, dirname, join } from 'node:path';\r\n\r\n/**\r\n * Token snapshot metadata\r\n */\r\nexport interface TokenSnapshot {\r\n /** Unique snapshot ID */\r\n id: string;\r\n /** Timestamp when snapshot was created */\r\n timestamp: Date;\r\n /** Directory that was snapshotted */\r\n collectionsDir: string;\r\n /** Files included in snapshot */\r\n files: TokenSnapshotFile[];\r\n /** Optional description */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * File in a token snapshot\r\n */\r\nexport interface TokenSnapshotFile {\r\n /** Relative path from collections directory */\r\n path: string;\r\n /** File content */\r\n content: string;\r\n /** SHA-256 checksum */\r\n checksum: string;\r\n}\r\n\r\n/**\r\n * Snapshot configuration\r\n */\r\nexport interface SnapshotConfig {\r\n /** Directory to store snapshots */\r\n snapshotDir?: string;\r\n /** Maximum number of snapshots to keep */\r\n maxSnapshots?: number;\r\n /** File patterns to include (glob) */\r\n include?: string[];\r\n /** File patterns to exclude */\r\n exclude?: string[];\r\n}\r\n\r\n/**\r\n * Snapshot result\r\n */\r\nexport interface SnapshotResult {\r\n /** Whether snapshot was successful */\r\n success: boolean;\r\n /** Snapshot metadata */\r\n snapshot?: TokenSnapshot;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Rollback result\r\n */\r\nexport interface RollbackResult {\r\n /** Whether rollback was successful */\r\n success: boolean;\r\n /** Number of files restored */\r\n filesRestored: number;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Token snapshot service\r\n */\r\nexport class SnapshotService {\r\n private readonly snapshotDir: string;\r\n private readonly maxSnapshots: number;\r\n private readonly include: string[];\r\n private readonly exclude: string[];\r\n\r\n constructor(config: SnapshotConfig = {}) {\r\n this.snapshotDir = config.snapshotDir ?? '.snapshots';\r\n this.maxSnapshots = config.maxSnapshots ?? 10;\r\n this.include = config.include ?? ['**/*.json'];\r\n this.exclude = config.exclude ?? ['**/node_modules/**', '**/.git/**'];\r\n }\r\n\r\n /**\r\n * Create a snapshot of the collections directory\r\n */\r\n createSnapshot(collectionsDir: string, description?: string): SnapshotResult {\r\n try {\r\n // Verify directory exists\r\n if (!existsSync(collectionsDir)) {\r\n return {\r\n success: false,\r\n error: `Collections directory not found: ${collectionsDir}`,\r\n };\r\n }\r\n\r\n // Create snapshot metadata\r\n const snapshot: TokenSnapshot = {\r\n id: this.generateSnapshotId(),\r\n timestamp: new Date(),\r\n collectionsDir,\r\n files: [],\r\n description,\r\n };\r\n\r\n // Scan directory for files\r\n const files = this.scanDirectory(collectionsDir);\r\n if (files.length === 0) {\r\n return {\r\n success: false,\r\n error: 'No files found to snapshot',\r\n };\r\n }\r\n\r\n // Create snapshot files\r\n for (const filePath of files) {\r\n const fullPath = join(collectionsDir, filePath);\r\n const content = readFileSync(fullPath, 'utf-8');\r\n const checksum = this.calculateChecksum(content);\r\n\r\n snapshot.files.push({\r\n path: filePath,\r\n content,\r\n checksum,\r\n });\r\n }\r\n\r\n // Ensure snapshot directory exists\r\n if (!existsSync(this.snapshotDir)) {\r\n mkdirSync(this.snapshotDir, { recursive: true });\r\n }\r\n\r\n // Write snapshot to disk\r\n const snapshotPath = join(this.snapshotDir, `${snapshot.id}.json`);\r\n writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\r\n\r\n // Clean up old snapshots\r\n this.cleanupOldSnapshots();\r\n\r\n return {\r\n success: true,\r\n snapshot,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Rollback to a specific snapshot\r\n */\r\n rollback(snapshotId: string): RollbackResult {\r\n try {\r\n // Load snapshot\r\n const snapshot = this.loadSnapshot(snapshotId);\r\n if (!snapshot) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: `Snapshot not found: ${snapshotId}`,\r\n };\r\n }\r\n\r\n // Validate snapshot\r\n const validationError = this.validateSnapshot(snapshot);\r\n if (validationError) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: validationError,\r\n };\r\n }\r\n\r\n // Ensure target directory exists\r\n if (!existsSync(snapshot.collectionsDir)) {\r\n mkdirSync(snapshot.collectionsDir, { recursive: true });\r\n }\r\n\r\n // Restore files\r\n let filesRestored = 0;\r\n for (const file of snapshot.files) {\r\n const targetPath = join(snapshot.collectionsDir, file.path);\r\n\r\n // Ensure directory exists\r\n const targetDir = dirname(targetPath);\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Write file\r\n writeFileSync(targetPath, file.content, 'utf-8');\r\n filesRestored++;\r\n }\r\n\r\n return {\r\n success: true,\r\n filesRestored,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get list of available snapshots\r\n */\r\n listSnapshots(): TokenSnapshot[] {\r\n if (!existsSync(this.snapshotDir)) {\r\n return [];\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\r\n\r\n const snapshots: TokenSnapshot[] = [];\r\n for (const file of files) {\r\n const snapshot = this.loadSnapshot(basename(file, '.json'));\r\n if (snapshot) {\r\n // Don't include file contents in list\r\n snapshots.push({\r\n ...snapshot,\r\n files: snapshot.files.map((f) => ({\r\n ...f,\r\n content: '',\r\n })),\r\n });\r\n }\r\n }\r\n\r\n // Sort by timestamp (newest first)\r\n return snapshots.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n }\r\n\r\n /**\r\n * Get the most recent snapshot\r\n */\r\n getLatestSnapshot(): TokenSnapshot | null {\r\n const snapshots = this.listSnapshots();\r\n if (snapshots.length > 0 && snapshots[0]) {\r\n return snapshots[0];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Delete a snapshot\r\n */\r\n deleteSnapshot(snapshotId: string): boolean {\r\n try {\r\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\r\n if (existsSync(snapshotPath)) {\r\n rmSync(snapshotPath);\r\n return true;\r\n }\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Delete all snapshots\r\n */\r\n clearSnapshots(): number {\r\n if (!existsSync(this.snapshotDir)) {\r\n return 0;\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\r\n let deleted = 0;\r\n\r\n for (const file of files) {\r\n try {\r\n rmSync(join(this.snapshotDir, file));\r\n deleted++;\r\n } catch {\r\n // Continue on error\r\n }\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n // Private methods\r\n\r\n /**\r\n * Generate unique snapshot ID\r\n */\r\n private generateSnapshotId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return `snapshot-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate SHA-256 checksum\r\n */\r\n private calculateChecksum(content: string): string {\r\n return createHash('sha256').update(content, 'utf-8').digest('hex');\r\n }\r\n\r\n /**\r\n * Scan directory for files matching include/exclude patterns\r\n */\r\n private scanDirectory(dir: string, baseDir = dir): string[] {\r\n const files: string[] = [];\r\n\r\n try {\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relativePath = fullPath.substring(baseDir.length + 1);\r\n\r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n if (!this.shouldExclude(relativePath)) {\r\n files.push(...this.scanDirectory(fullPath, baseDir));\r\n }\r\n } else if (entry.isFile()) {\r\n // Include files matching patterns\r\n if (this.shouldInclude(relativePath)) {\r\n files.push(relativePath);\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore errors\r\n }\r\n\r\n return files;\r\n }\r\n\r\n /**\r\n * Check if path should be included\r\n */\r\n private shouldInclude(path: string): boolean {\r\n // Simple pattern matching (supports *.ext and **/*.ext)\r\n return this.include.some((pattern) => {\r\n if (pattern === '**/*') {\r\n return true;\r\n }\r\n if (pattern.startsWith('**/')) {\r\n // **/*.json matches any path ending with .json\r\n const suffix = pattern.substring(3); // Remove **/\r\n if (suffix.startsWith('*.')) {\r\n // Pattern like **/*.json - check extension\r\n const ext = suffix.substring(1); // .json\r\n return path.endsWith(ext);\r\n }\r\n return path.endsWith(suffix);\r\n }\r\n if (pattern.startsWith('*.')) {\r\n return path.endsWith(pattern.substring(1));\r\n }\r\n return path === pattern;\r\n });\r\n }\r\n\r\n /**\r\n * Check if path should be excluded\r\n */\r\n private shouldExclude(path: string): boolean {\r\n return this.exclude.some((pattern) => {\r\n if (pattern.startsWith('**/')) {\r\n return path.includes(pattern.substring(3).replace('/**', ''));\r\n }\r\n return path.includes(pattern);\r\n });\r\n }\r\n\r\n /**\r\n * Load snapshot from disk\r\n */\r\n private loadSnapshot(snapshotId: string): TokenSnapshot | null {\r\n try {\r\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\r\n if (!existsSync(snapshotPath)) {\r\n return null;\r\n }\r\n\r\n const content = readFileSync(snapshotPath, 'utf-8');\r\n const snapshot = JSON.parse(content) as TokenSnapshot;\r\n\r\n // Convert timestamp string to Date\r\n snapshot.timestamp = new Date(snapshot.timestamp);\r\n\r\n return snapshot;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Validate snapshot integrity\r\n */\r\n private validateSnapshot(snapshot: TokenSnapshot): string | null {\r\n if (!snapshot.files || snapshot.files.length === 0) {\r\n return 'Snapshot has no files';\r\n }\r\n\r\n for (const file of snapshot.files) {\r\n const actualChecksum = this.calculateChecksum(file.content);\r\n if (actualChecksum !== file.checksum) {\r\n return `Checksum mismatch for file: ${file.path}`;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Clean up old snapshots keeping only maxSnapshots most recent\r\n */\r\n private cleanupOldSnapshots(): void {\r\n if (!existsSync(this.snapshotDir)) {\r\n return;\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir)\r\n .filter((f) => f.endsWith('.json'))\r\n .map((f) => ({\r\n name: f,\r\n path: join(this.snapshotDir, f),\r\n mtime: this.getFileModificationTime(join(this.snapshotDir, f)),\r\n }))\r\n .sort((a, b) => b.mtime - a.mtime);\r\n\r\n // Delete old snapshots\r\n for (let i = this.maxSnapshots; i < files.length; i++) {\r\n const file = files.at(i);\r\n if (file?.path) {\r\n try {\r\n rmSync(file.path);\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get file modification time\r\n */\r\n private getFileModificationTime(path: string): number {\r\n try {\r\n const snapshot = this.loadSnapshot(basename(path, '.json'));\r\n return snapshot ? snapshot.timestamp.getTime() : 0;\r\n } catch {\r\n return 0;\r\n }\r\n }\r\n}\r\n","/**\r\n * @file Theme Builder Module\r\n * @description Builds token outputs for a single theme using Style Dictionary\r\n *\r\n * This module orchestrates the build process for individual themes, generating\r\n * the appropriate Style Dictionary configuration based on the theme definition.\r\n *\r\n * Key responsibilities:\r\n * - Generate Style Dictionary config for a theme\r\n * - Use correct CSS format based on theme type (default vs non-default)\r\n * - Support all output formats (CSS, SCSS, JS, TS, JSON)\r\n * - Generate output file paths from theme definition\r\n *\r\n * @example\r\n * ```typescript\r\n * import { buildTheme, generateThemeBuildConfig } from '@dsai-io/tools';\r\n *\r\n * const result = await buildTheme({\r\n * themeName: 'dark',\r\n * themeDefinition: {\r\n * isDefault: false,\r\n * suffix: '-dark',\r\n * selector: '[data-dsai-theme=\"dark\"]',\r\n * outputFiles: { css: 'tokens-dark.css' },\r\n * },\r\n * files: ['collections/color-dark.json', 'collections/semantic-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * });\r\n * ```\r\n *\r\n * @module @dsai-io/tools/tokens/theme-builder\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\n\r\nimport type { OutputFormat, ResolvedThemeDefinition, ThemeDefinition } from '../config/types.js';\r\nimport type { StyleDictionaryInstance } from './style-dictionary/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal configuration required for theme building\r\n *\r\n * This interface only includes the properties actually used by the theme builder,\r\n * allowing callers to pass either a full ResolvedTokensConfig or a minimal object.\r\n */\r\nexport interface ThemeBuildConfig {\r\n /** Output formats to generate */\r\n formats: OutputFormat[];\r\n\r\n /** Theme definitions (used by buildAllThemes to lookup theme metadata) */\r\n themes?: {\r\n definitions?: Record<string, ThemeDefinition | ResolvedThemeDefinition>;\r\n };\r\n}\r\n\r\n/**\r\n * Options for building a single theme\r\n */\r\nexport interface ThemeBuildOptions {\r\n /** Name of the theme (e.g., 'light', 'dark', 'pro') */\r\n themeName: string;\r\n\r\n /** Resolved theme definition with all required fields */\r\n themeDefinition: ResolvedThemeDefinition;\r\n\r\n /** Array of token file paths for this theme */\r\n files: string[];\r\n\r\n /** Output directory for generated files */\r\n outputDir: string;\r\n\r\n /** Build configuration (formats and optionally theme definitions) */\r\n config: ThemeBuildConfig;\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n\r\n /** Skip cache lookup (force rebuild) */\r\n skipCache?: boolean;\r\n}\r\n\r\n/**\r\n * Result of building a single theme\r\n */\r\nexport interface ThemeBuildResult {\r\n /** Whether the build succeeded */\r\n success: boolean;\r\n\r\n /** Theme name that was built */\r\n themeName: string;\r\n\r\n /** Generated output files by format */\r\n outputs: Partial<Record<OutputFormat, string[]>>;\r\n\r\n /** Error message if build failed */\r\n error?: string;\r\n\r\n /** Duration in milliseconds */\r\n duration: number;\r\n\r\n /** Whether result was from cache */\r\n fromCache: boolean;\r\n}\r\n\r\n/**\r\n * Style Dictionary configuration for a theme\r\n */\r\nexport interface ThemeStyleDictionaryConfig {\r\n /** Source token files */\r\n source: string[];\r\n\r\n /** Platform configurations */\r\n platforms: Record<string, StyleDictionaryPlatformConfig>;\r\n\r\n /** Whether tokens use DTCG format ($value, $type, etc.) */\r\n usesDtcg?: boolean;\r\n\r\n /** Logging configuration */\r\n log?: {\r\n warnings?: 'warn' | 'error' | 'disabled';\r\n verbosity?: 'default' | 'silent' | 'verbose';\r\n errors?: {\r\n brokenReferences?: 'throw' | 'console';\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Style Dictionary platform configuration\r\n */\r\nexport interface StyleDictionaryPlatformConfig {\r\n /** Transform group to use */\r\n transformGroup?: string;\r\n\r\n /** Build path for outputs */\r\n buildPath: string;\r\n\r\n /** Output file configurations */\r\n files: StyleDictionaryFileConfig[];\r\n\r\n /** Custom options for formats */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style Dictionary file configuration\r\n */\r\nexport interface StyleDictionaryFileConfig {\r\n /** Output file path (relative to buildPath) */\r\n destination: string;\r\n\r\n /** Format to use for output */\r\n format: string;\r\n\r\n /** Filter for tokens to include */\r\n filter?: Record<string, unknown>;\r\n\r\n /** Format-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Format config type for mapping\r\n */\r\ninterface FormatConfig {\r\n default: string;\r\n themed: string;\r\n}\r\n\r\n/**\r\n * Mapping of OutputFormat to Style Dictionary format names\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n */\r\nconst FORMAT_MAPPING = new Map<OutputFormat, FormatConfig>([\r\n ['css', { default: 'css/variables-with-comments', themed: 'css/variables-dark-mode' }],\r\n ['scss', { default: 'scss/variables', themed: 'scss/variables' }],\r\n ['js', { default: 'javascript/esm-safe', themed: 'javascript/esm-safe' }],\r\n ['ts', { default: 'typescript/declarations', themed: 'typescript/declarations' }],\r\n ['json', { default: 'json/nested', themed: 'json/nested' }],\r\n ['android', { default: 'android/resources', themed: 'android/resources' }],\r\n ['ios', { default: 'ios/macros', themed: 'ios/macros' }],\r\n]);\r\n\r\n/**\r\n * Default Style Dictionary transform groups by platform\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n * Note: Style Dictionary built-in groups are: web, js, scss, css, less, html, android, compose, ios, ios-swift, assets, flutter, react-native\r\n *\r\n * We use 'js-custom' for JS/TS to ensure valid JavaScript identifiers with our custom name/js-identifier transform\r\n */\r\nconst TRANSFORM_GROUPS = new Map<OutputFormat, string>([\r\n ['css', 'css'],\r\n ['scss', 'scss'],\r\n ['js', 'js-custom'], // Use custom transform group for valid JS identifiers\r\n ['ts', 'js-custom'], // TypeScript uses same transforms as JS\r\n ['json', 'web'], // JSON uses web transforms (no \"json\" transformGroup exists)\r\n ['android', 'android'],\r\n ['ios', 'ios'],\r\n]);\r\n\r\n// ============================================================================\r\n// Configuration Generators\r\n// ============================================================================\r\n\r\n/**\r\n * Generate Style Dictionary configuration for a single theme\r\n *\r\n * @param options - Theme build options\r\n * @returns Style Dictionary configuration object\r\n *\r\n * @example\r\n * ```typescript\r\n * const sdConfig = generateThemeBuildConfig({\r\n * themeName: 'dark',\r\n * themeDefinition: { isDefault: false, selector: '[data-dsai-theme=\"dark\"]' },\r\n * files: ['collections/color-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * });\r\n * // Returns Style Dictionary config with dark mode format\r\n * ```\r\n */\r\nexport function generateThemeBuildConfig(options: ThemeBuildOptions): ThemeStyleDictionaryConfig {\r\n const { themeDefinition, files, outputDir, config } = options;\r\n const isDefault = themeDefinition.isDefault;\r\n\r\n // Build platforms based on enabled formats using Map for safe access\r\n const platformsMap = new Map<string, StyleDictionaryPlatformConfig>();\r\n const enabledFormats = config.formats;\r\n\r\n for (const format of enabledFormats) {\r\n const platformConfig = generatePlatformConfig(format, themeDefinition, outputDir, isDefault);\r\n if (platformConfig) {\r\n platformsMap.set(format, platformConfig);\r\n }\r\n }\r\n\r\n // Convert Map to object for Style Dictionary compatibility\r\n const platforms: Record<string, StyleDictionaryPlatformConfig> = Object.fromEntries(platformsMap);\r\n\r\n return {\r\n source: files,\r\n platforms,\r\n // Enable DTCG format support (tokens with $value, $type, etc.)\r\n usesDtcg: true,\r\n // Configure logging to not throw on broken references (they'll be logged but build continues)\r\n log: {\r\n warnings: 'warn' as const,\r\n verbosity: 'default' as const,\r\n errors: {\r\n brokenReferences: 'console' as const,\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Generate platform configuration for a specific output format\r\n *\r\n * @param format - Output format (css, scss, js, etc.)\r\n * @param themeDefinition - Theme definition\r\n * @param outputDir - Output directory\r\n * @param isDefault - Whether this is the default theme\r\n * @returns Style Dictionary platform configuration\r\n */\r\nfunction generatePlatformConfig(\r\n format: OutputFormat,\r\n themeDefinition: ResolvedThemeDefinition,\r\n outputDir: string,\r\n isDefault: boolean\r\n): StyleDictionaryPlatformConfig | null {\r\n const formatConfig = FORMAT_MAPPING.get(format);\r\n if (!formatConfig) {\r\n console.warn(`Unknown format: ${format}`);\r\n return null;\r\n }\r\n\r\n const sdFormat = isDefault ? formatConfig.default : formatConfig.themed;\r\n\r\n // Use Map for safe access to outputFiles\r\n const outputFilesMap = new Map(Object.entries(themeDefinition.outputFiles));\r\n const outputFile = outputFilesMap.get(format) ?? `tokens.${format}`;\r\n\r\n // Determine subdirectory based on format\r\n const subDir = getFormatSubdirectory(format);\r\n const buildPath = subDir ? join(outputDir, subDir) + '/' : outputDir + '/';\r\n\r\n const fileConfig: StyleDictionaryFileConfig = {\r\n destination: outputFile,\r\n format: sdFormat,\r\n };\r\n\r\n // Add selector option for themed CSS\r\n if (format === 'css' && !isDefault) {\r\n fileConfig.options = {\r\n selector: themeDefinition.selector,\r\n };\r\n }\r\n\r\n // Add media query if defined\r\n if (themeDefinition.mediaQuery && format === 'css' && !isDefault) {\r\n const existingOptions = fileConfig.options ?? {};\r\n fileConfig.options = {\r\n ...existingOptions,\r\n mediaQuery: themeDefinition.mediaQuery,\r\n };\r\n }\r\n\r\n const transformGroup = TRANSFORM_GROUPS.get(format) ?? format;\r\n\r\n return {\r\n transformGroup,\r\n buildPath,\r\n files: [fileConfig],\r\n };\r\n}\r\n\r\n/**\r\n * Get subdirectory for a format (e.g., 'css' -> 'css', 'js' -> 'js')\r\n *\r\n * @param format - Output format\r\n * @returns Subdirectory name\r\n */\r\nfunction getFormatSubdirectory(format: OutputFormat): string {\r\n switch (format) {\r\n case 'css':\r\n return 'css';\r\n case 'scss':\r\n return 'scss';\r\n case 'js':\r\n return 'js';\r\n case 'ts':\r\n return 'ts';\r\n case 'json':\r\n return 'json';\r\n case 'android':\r\n return 'android';\r\n case 'ios':\r\n return 'ios';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Build Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Build token outputs for a single theme\r\n *\r\n * This function generates Style Dictionary configuration from the theme\r\n * definition and runs the build process. For default themes, it uses\r\n * `css/variables-with-comments` format with `:root` selector. For\r\n * non-default themes, it uses `css/variables-dark-mode` with the\r\n * theme-specific selector.\r\n *\r\n * @param options - Theme build options\r\n * @returns Build result with success status and output files\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await buildTheme({\r\n * themeName: 'dark',\r\n * themeDefinition: resolvedThemeDef,\r\n * files: ['collections/color-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * verbose: true,\r\n * });\r\n *\r\n * if (result.success) {\r\n * console.log('Built files:', result.outputs);\r\n * }\r\n * ```\r\n */\r\nexport async function buildTheme(options: ThemeBuildOptions): Promise<ThemeBuildResult> {\r\n const startTime = Date.now();\r\n const { themeName, files, verbose } = options;\r\n\r\n // Validate inputs\r\n if (files.length === 0) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No token files found for theme \"${themeName}\"`,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n\r\n // Validate files exist (resolve to absolute paths for checking)\r\n const missingFiles: string[] = [];\r\n for (const file of files) {\r\n const resolvedPath = resolve(file);\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(resolvedPath)) {\r\n missingFiles.push(file);\r\n }\r\n }\r\n if (missingFiles.length > 0) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `Missing token files for theme \"${themeName}\": ${missingFiles.join(', ')}`,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n\r\n if (verbose) {\r\n console.warn(`🎨 Building theme: ${themeName}`);\r\n console.warn(` Files: ${files.length}`);\r\n console.warn(` Default: ${options.themeDefinition.isDefault}`);\r\n console.warn(` Selector: ${options.themeDefinition.selector}`);\r\n }\r\n\r\n try {\r\n // Generate Style Dictionary configuration\r\n const sdConfig = generateThemeBuildConfig(options);\r\n\r\n if (verbose) {\r\n console.warn(` Platforms: ${Object.keys(sdConfig.platforms).join(', ')}`);\r\n console.warn(` Enabled formats: ${options.config.formats.join(', ')}`);\r\n // Debug: show platform build paths\r\n for (const [platform, platformCfg] of Object.entries(sdConfig.platforms)) {\r\n console.warn(\r\n ` ${platform}: ${platformCfg.buildPath} -> ${platformCfg.files[0]?.destination}`\r\n );\r\n }\r\n }\r\n\r\n // Run Style Dictionary build\r\n const outputs = await runStyleDictionaryBuild(sdConfig, options);\r\n\r\n return {\r\n success: true,\r\n themeName,\r\n outputs,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: error instanceof Error ? error.message : 'Unknown build error',\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Run Style Dictionary build with generated configuration\r\n *\r\n * @param sdConfig - Style Dictionary configuration\r\n * @param options - Build options for context\r\n * @returns Map of format to output file paths\r\n */\r\nasync function runStyleDictionaryBuild(\r\n sdConfig: ThemeStyleDictionaryConfig,\r\n options: ThemeBuildOptions\r\n): Promise<Partial<Record<OutputFormat, string[]>>> {\r\n // Dynamic import to avoid circular dependencies\r\n const StyleDictionaryModule = await import('style-dictionary');\r\n const StyleDictionary = StyleDictionaryModule.default;\r\n\r\n // Register custom formats using type assertion for compatibility\r\n const { registerFormats: registerCustomFormats } = await import(\r\n './style-dictionary/formats/index.js'\r\n );\r\n registerCustomFormats(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Register custom transforms\r\n const { registerTransforms: registerCustomTransforms } = await import(\r\n './style-dictionary/transforms/index.js'\r\n );\r\n registerCustomTransforms(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Register custom transform groups (including js-custom with name/js-identifier)\r\n const { registerTransformGroups } = await import('./style-dictionary/groups/index.js');\r\n registerTransformGroups(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Debug: log platforms being built\r\n if (options.verbose) {\r\n console.warn(` 🔧 Style Dictionary platforms:`);\r\n for (const [platform, config] of Object.entries(sdConfig.platforms)) {\r\n console.warn(\r\n ` ${platform}: transformGroup=\"${config.transformGroup}\", format=\"${config.files[0]?.format}\"`\r\n );\r\n }\r\n }\r\n\r\n // Create and build Style Dictionary instance\r\n // Note: The built-in 'js' transform group includes 'name/pascal' which\r\n // generates valid JS identifiers like 'Spacing0', 'NeutralGray100', etc.\r\n const sd = new StyleDictionary(sdConfig);\r\n\r\n // Build all platforms and capture any errors\r\n try {\r\n await sd.buildAllPlatforms();\r\n } catch (error) {\r\n console.error(`❌ Style Dictionary build failed:`, error);\r\n throw error;\r\n }\r\n\r\n // Collect output files using Map for safe access\r\n const outputsMap = new Map<OutputFormat, string[]>();\r\n\r\n for (const [platformName, platformConfig] of Object.entries(sdConfig.platforms)) {\r\n const format = platformName as OutputFormat;\r\n const outputFiles = platformConfig.files.map((f) =>\r\n join(platformConfig.buildPath, f.destination)\r\n );\r\n outputsMap.set(format, outputFiles);\r\n }\r\n\r\n const outputs: Partial<Record<OutputFormat, string[]>> = Object.fromEntries(outputsMap);\r\n\r\n if (options.verbose) {\r\n const totalFiles = Object.values(outputs).flat().length;\r\n console.warn(` ✅ Generated ${totalFiles} output files`);\r\n // Debug: check if files actually exist\r\n for (const [format, files] of Object.entries(outputs)) {\r\n for (const file of files) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const exists = existsSync(file);\r\n if (!exists) {\r\n console.warn(` ⚠️ Missing: ${format} -> ${file}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return outputs;\r\n}\r\n\r\n// ============================================================================\r\n// Batch Build Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Options for building multiple themes\r\n */\r\nexport interface MultiThemeBuildOptions {\r\n /** Build configuration with formats and theme definitions */\r\n config: ThemeBuildConfig;\r\n\r\n /** Map of theme name to file paths */\r\n themeFiles: Map<string, string[]>;\r\n\r\n /** Output directory for all themes */\r\n outputDir: string;\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n\r\n /** Only build these specific themes (if not set, build all) */\r\n themes?: string[];\r\n\r\n /** Skip cache lookup */\r\n skipCache?: boolean;\r\n}\r\n\r\n/**\r\n * Result of building multiple themes\r\n */\r\nexport interface MultiThemeBuildResult {\r\n /** Overall success (true if all themes succeeded) */\r\n success: boolean;\r\n\r\n /** Individual theme results */\r\n results: ThemeBuildResult[];\r\n\r\n /** Total duration in milliseconds */\r\n duration: number;\r\n\r\n /** Number of themes built successfully */\r\n successCount: number;\r\n\r\n /** Number of themes that failed */\r\n failCount: number;\r\n}\r\n\r\n/**\r\n * Build multiple themes in sequence\r\n *\r\n * This function iterates through all configured themes and builds each one\r\n * using the appropriate Style Dictionary configuration. It collects results\r\n * and returns a summary of the build process.\r\n *\r\n * @param options - Multi-theme build options\r\n * @returns Aggregated build results\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await buildAllThemes({\r\n * config: resolvedConfig,\r\n * themeFiles: new Map([\r\n * ['light', ['collections/color.json']],\r\n * ['dark', ['collections/color-dark.json']],\r\n * ]),\r\n * outputDir: 'dist',\r\n * verbose: true,\r\n * });\r\n *\r\n * console.log(`Built ${result.successCount}/${result.results.length} themes`);\r\n * ```\r\n */\r\nexport async function buildAllThemes(\r\n options: MultiThemeBuildOptions\r\n): Promise<MultiThemeBuildResult> {\r\n const startTime = Date.now();\r\n const { config, themeFiles, outputDir, verbose, themes } = options;\r\n\r\n // Get theme definitions\r\n const definitions = config.themes?.definitions ?? {};\r\n const definitionsMap = new Map(Object.entries(definitions));\r\n\r\n // Determine which themes to build\r\n const themesToBuild = themes ?? Array.from(themeFiles.keys());\r\n const results: ThemeBuildResult[] = [];\r\n\r\n if (verbose) {\r\n console.warn(`\\n🎨 Building ${themesToBuild.length} themes...`);\r\n }\r\n\r\n // Find the default theme's files (needed for non-default themes to resolve references)\r\n const defaultThemeName = Array.from(definitionsMap.entries()).find(\r\n ([_, def]) => def.isDefault\r\n )?.[0];\r\n const defaultThemeFiles = defaultThemeName ? (themeFiles.get(defaultThemeName) ?? []) : [];\r\n\r\n // Build each theme\r\n for (const themeName of themesToBuild) {\r\n const rawThemeDefinition = definitionsMap.get(themeName);\r\n const themeSpecificFiles = themeFiles.get(themeName);\r\n\r\n if (!rawThemeDefinition) {\r\n results.push({\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No theme definition found for \"${themeName}\"`,\r\n duration: 0,\r\n fromCache: false,\r\n });\r\n continue;\r\n }\r\n\r\n if (!themeSpecificFiles || themeSpecificFiles.length === 0) {\r\n results.push({\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No files found for theme \"${themeName}\"`,\r\n duration: 0,\r\n fromCache: false,\r\n });\r\n continue;\r\n }\r\n\r\n // For non-default themes, include default theme files first, then theme-specific files\r\n // This allows references to be resolved and theme-specific values to override defaults\r\n const isDefault = rawThemeDefinition.isDefault ?? false;\r\n let files: string[];\r\n if (isDefault) {\r\n files = themeSpecificFiles;\r\n } else {\r\n // Include default files first, then theme-specific files (which override)\r\n files = [...defaultThemeFiles, ...themeSpecificFiles];\r\n }\r\n\r\n // Resolve the theme definition to ensure all required fields are present\r\n const baseOutputFiles = rawThemeDefinition.outputFiles ?? {};\r\n const themeDefinition: ResolvedThemeDefinition = {\r\n isDefault,\r\n suffix: rawThemeDefinition.suffix ?? (isDefault ? null : `-${themeName}`),\r\n selector:\r\n rawThemeDefinition.selector ?? (isDefault ? ':root' : `[data-dsai-theme=\"${themeName}\"]`),\r\n mediaQuery: rawThemeDefinition.mediaQuery,\r\n dataAttribute: rawThemeDefinition.dataAttribute ?? `data-dsai-theme=\"${themeName}\"`,\r\n outputFiles: {\r\n css: baseOutputFiles.css ?? (isDefault ? 'tokens.css' : `tokens-${themeName}.css`),\r\n scss:\r\n baseOutputFiles.scss ?? (isDefault ? '_variables.scss' : `_variables-${themeName}.scss`),\r\n js: baseOutputFiles.js ?? (isDefault ? 'tokens.js' : `tokens-${themeName}.js`),\r\n ts: baseOutputFiles.ts ?? (isDefault ? 'tokens.d.ts' : `tokens-${themeName}.d.ts`),\r\n json: baseOutputFiles.json ?? (isDefault ? 'tokens.json' : `tokens-${themeName}.json`),\r\n android: baseOutputFiles.android ?? (isDefault ? 'tokens.xml' : `tokens-${themeName}.xml`),\r\n ios: baseOutputFiles.ios ?? (isDefault ? 'tokens.h' : `tokens-${themeName}.h`),\r\n },\r\n };\r\n\r\n const result = await buildTheme({\r\n themeName,\r\n themeDefinition,\r\n files,\r\n outputDir,\r\n config,\r\n verbose,\r\n skipCache: options.skipCache,\r\n });\r\n\r\n results.push(result);\r\n }\r\n\r\n // Calculate totals\r\n const successCount = results.filter((r) => r.success).length;\r\n const failCount = results.filter((r) => !r.success).length;\r\n\r\n if (verbose) {\r\n console.warn(`\\n📊 Theme Build Summary`);\r\n console.warn(` Total: ${results.length}`);\r\n console.warn(` Success: ${successCount}`);\r\n console.warn(` Failed: ${failCount}`);\r\n console.warn(` Duration: ${Date.now() - startTime}ms`);\r\n\r\n // Log failed themes\r\n const failed = results.filter((r) => !r.success);\r\n if (failed.length > 0) {\r\n console.warn(`\\n❌ Failed themes:`);\r\n for (const f of failed) {\r\n console.warn(` - ${f.themeName}: ${f.error}`);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: failCount === 0,\r\n results,\r\n duration: Date.now() - startTime,\r\n successCount,\r\n failCount,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Get the appropriate CSS format for a theme\r\n *\r\n * @param isDefault - Whether this is the default theme\r\n * @returns Style Dictionary format name\r\n */\r\nexport function getCssFormat(isDefault: boolean): string {\r\n return isDefault ? 'css/variables-with-comments' : 'css/variables-dark-mode';\r\n}\r\n\r\n/**\r\n * Get the CSS selector for a theme\r\n *\r\n * @param themeDefinition - Resolved theme definition\r\n * @returns CSS selector string\r\n */\r\nexport function getThemeSelector(themeDefinition: ResolvedThemeDefinition): string {\r\n return themeDefinition.isDefault ? ':root' : themeDefinition.selector;\r\n}\r\n\r\n/**\r\n * Validate theme definitions for conflicts\r\n *\r\n * Checks for:\r\n * - Multiple default themes\r\n * - Duplicate selectors\r\n * - Duplicate suffixes\r\n *\r\n * @param definitions - Map of theme name to definition\r\n * @returns Array of validation error messages\r\n */\r\nexport function validateThemeDefinitions(\r\n definitions: Map<string, ResolvedThemeDefinition>\r\n): string[] {\r\n const errors: string[] = [];\r\n const selectors = new Map<string, string>();\r\n const suffixes = new Map<string, string>();\r\n let defaultCount = 0;\r\n let defaultTheme = '';\r\n\r\n for (const [name, def] of definitions) {\r\n // Check for multiple defaults\r\n if (def.isDefault) {\r\n defaultCount++;\r\n if (defaultCount > 1) {\r\n errors.push(`Multiple default themes defined: \"${defaultTheme}\" and \"${name}\"`);\r\n }\r\n defaultTheme = name;\r\n }\r\n\r\n // Check for duplicate selectors\r\n const existingSelector = selectors.get(def.selector);\r\n if (existingSelector) {\r\n errors.push(\r\n `Duplicate selector \"${def.selector}\" used by themes \"${existingSelector}\" and \"${name}\"`\r\n );\r\n } else {\r\n selectors.set(def.selector, name);\r\n }\r\n\r\n // Check for duplicate suffixes\r\n const suffix = def.suffix ?? '';\r\n const existingSuffix = suffixes.get(suffix);\r\n if (existingSuffix && suffix !== '') {\r\n errors.push(`Duplicate suffix \"${suffix}\" used by themes \"${existingSuffix}\" and \"${name}\"`);\r\n } else if (suffix !== '') {\r\n suffixes.set(suffix, name);\r\n }\r\n }\r\n\r\n // Ensure at least one default\r\n if (defaultCount === 0 && definitions.size > 0) {\r\n errors.push('No default theme defined. One theme must have isDefault: true');\r\n }\r\n\r\n return errors;\r\n}\r\n","/**\r\n * Theme Discovery Module\r\n *\r\n * Discovers and categorizes token files by theme based on file suffix patterns.\r\n * Supports both auto-detection from file names and explicit theme definitions.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/theme-discovery\r\n */\r\n\r\nimport path from 'node:path';\r\n\r\nimport fg from 'fast-glob';\r\n\r\nimport type { ResolvedThemeDefinition, ResolvedThemesConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Result of theme file discovery\r\n */\r\nexport interface ThemeFilesResult {\r\n /** Theme name */\r\n theme: string;\r\n /** Theme definition */\r\n definition: ResolvedThemeDefinition;\r\n /** Files belonging to this theme */\r\n files: string[];\r\n}\r\n\r\n/**\r\n * Discovery result with all themes\r\n */\r\nexport interface DiscoveryResult {\r\n /** Files organized by theme - Map of theme name to file paths */\r\n themes: Map<string, string[]>;\r\n /** Theme definitions organized by theme name */\r\n definitions: Map<string, ResolvedThemeDefinition>;\r\n /** Files that couldn't be matched to any theme (when autoDetect is false) */\r\n orphanFiles: string[];\r\n /** Themes with no files found */\r\n emptyThemes: string[];\r\n /** Total files discovered */\r\n totalFiles: number;\r\n}\r\n\r\n/**\r\n * Options for theme discovery\r\n */\r\nexport interface DiscoveryOptions {\r\n /** Base directory for file patterns */\r\n sourceDir: string;\r\n /** Glob pattern for finding token files */\r\n pattern?: string;\r\n /** Whether to include verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Extract theme suffixes from definitions\r\n */\r\nfunction getThemeSuffixes(\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): Map<string, string> {\r\n const suffixToTheme = new Map<string, string>();\r\n\r\n for (const [themeName, definition] of Object.entries(definitions)) {\r\n if (definition.suffix) {\r\n suffixToTheme.set(definition.suffix, themeName);\r\n }\r\n }\r\n\r\n return suffixToTheme;\r\n}\r\n\r\n/**\r\n * Get the default theme name from definitions\r\n */\r\nfunction getDefaultThemeName(\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): string | undefined {\r\n for (const [themeName, definition] of Object.entries(definitions)) {\r\n if (definition.isDefault) {\r\n return themeName;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if a file matches a theme suffix\r\n * Returns the theme name if matched, undefined otherwise\r\n */\r\nfunction matchFileSuffix(filename: string, suffixToTheme: Map<string, string>): string | undefined {\r\n // Remove .json extension\r\n const baseName = filename.replace(/\\.json$/i, '');\r\n\r\n // Check each suffix\r\n for (const [suffix, themeName] of suffixToTheme.entries()) {\r\n if (baseName.endsWith(suffix)) {\r\n return themeName;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Generate ignore patterns for non-default theme files\r\n */\r\nfunction generateIgnorePatterns(\r\n sourceDir: string,\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): string[] {\r\n const patterns: string[] = [];\r\n\r\n for (const definition of Object.values(definitions)) {\r\n if (definition.suffix) {\r\n patterns.push(`${sourceDir}/**/*${definition.suffix}.json`);\r\n }\r\n }\r\n\r\n return patterns;\r\n}\r\n\r\n// ============================================================================\r\n// Main Discovery Function\r\n// ============================================================================\r\n\r\n/**\r\n * Discover token files organized by theme\r\n *\r\n * This function scans the source directory for JSON token files and\r\n * categorizes them by theme based on their file suffix patterns.\r\n *\r\n * @param themesConfig - Resolved themes configuration\r\n * @param options - Discovery options including source directory\r\n * @returns Discovery result with files organized by theme\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = discoverThemeFiles(themesConfig, {\r\n * sourceDir: 'src/collections',\r\n * pattern: '**\\/*.json',\r\n * });\r\n *\r\n * // result.themes = [\r\n * // { theme: 'light', files: ['foundation.json', 'semantic.json'] },\r\n * // { theme: 'dark', files: ['foundation-dark.json', 'semantic-dark.json'] },\r\n * // ]\r\n * ```\r\n */\r\nexport function discoverThemeFiles(\r\n themesConfig: ResolvedThemesConfig,\r\n options: DiscoveryOptions\r\n): DiscoveryResult {\r\n const { sourceDir, pattern = '**/*.json', verbose = false } = options;\r\n const { definitions } = themesConfig;\r\n\r\n // Build suffix mapping\r\n const suffixToTheme = getThemeSuffixes(definitions);\r\n const defaultThemeName = getDefaultThemeName(definitions);\r\n\r\n // Initialize result containers\r\n const themeFilesMap = new Map<string, string[]>();\r\n const orphanFiles: string[] = [];\r\n const emptyThemes: string[] = [];\r\n\r\n // Initialize theme file arrays\r\n for (const themeName of Object.keys(definitions)) {\r\n themeFilesMap.set(themeName, []);\r\n }\r\n\r\n // Discover all JSON files\r\n const allFiles = fg.sync(pattern, {\r\n cwd: sourceDir,\r\n absolute: false,\r\n });\r\n\r\n if (verbose) {\r\n console.warn(` 📂 Found ${allFiles.length} token files in ${sourceDir}`);\r\n }\r\n\r\n // Categorize each file\r\n for (const file of allFiles) {\r\n const filename = path.basename(file);\r\n const matchedTheme = matchFileSuffix(filename, suffixToTheme);\r\n\r\n if (matchedTheme) {\r\n // File matches a non-default theme\r\n const files = themeFilesMap.get(matchedTheme);\r\n if (files) {\r\n files.push(file);\r\n } else if (!themesConfig.autoDetect) {\r\n // Theme not defined and autoDetect is off\r\n orphanFiles.push(file);\r\n }\r\n } else if (defaultThemeName) {\r\n // File has no theme suffix - belongs to default theme\r\n themeFilesMap.get(defaultThemeName)?.push(file);\r\n } else {\r\n // No default theme defined\r\n orphanFiles.push(file);\r\n }\r\n }\r\n\r\n // Build result Maps\r\n const themesMap = new Map<string, string[]>();\r\n const definitionsMap = new Map<string, ResolvedThemeDefinition>();\r\n const themeResults: ThemeFilesResult[] = [];\r\n\r\n for (const [themeName, files] of themeFilesMap.entries()) {\r\n // Safe access using Map lookup since we control the keys\r\n const definition = definitions[themeName as keyof typeof definitions] as\r\n | ResolvedThemeDefinition\r\n | undefined;\r\n\r\n if (!definition) {\r\n continue;\r\n }\r\n\r\n const fullPaths = files.map((f) => path.join(sourceDir, f));\r\n\r\n if (files.length === 0) {\r\n emptyThemes.push(themeName);\r\n }\r\n\r\n // Add to Maps\r\n themesMap.set(themeName, fullPaths);\r\n definitionsMap.set(themeName, definition);\r\n\r\n // Also keep array format for sorting/iteration\r\n themeResults.push({\r\n theme: themeName,\r\n definition,\r\n files: fullPaths,\r\n });\r\n }\r\n\r\n // Sort themes: default first, then alphabetically\r\n themeResults.sort((a, b) => {\r\n if (a.definition.isDefault) {\r\n return -1;\r\n }\r\n if (b.definition.isDefault) {\r\n return 1;\r\n }\r\n return a.theme.localeCompare(b.theme);\r\n });\r\n\r\n const totalFiles = themeResults.reduce((sum, t) => sum + t.files.length, 0);\r\n\r\n if (verbose) {\r\n for (const { theme, files, definition } of themeResults) {\r\n const suffix = definition.suffix ?? '(no suffix)';\r\n console.warn(` 🎨 ${theme} [${suffix}]: ${files.length} files`);\r\n }\r\n if (orphanFiles.length > 0) {\r\n console.warn(` ⚠️ ${orphanFiles.length} orphan files (no matching theme)`);\r\n }\r\n if (emptyThemes.length > 0) {\r\n console.warn(` ⚠️ Empty themes: ${emptyThemes.join(', ')}`);\r\n }\r\n }\r\n\r\n return {\r\n themes: themesMap,\r\n definitions: definitionsMap,\r\n orphanFiles,\r\n emptyThemes,\r\n totalFiles,\r\n };\r\n}\r\n\r\n/**\r\n * Get files for a specific theme\r\n *\r\n * For the default theme, this returns all files EXCEPT those\r\n * matching other theme suffixes.\r\n *\r\n * For non-default themes, this returns only files with the\r\n * matching suffix.\r\n *\r\n * @param themeName - Name of the theme to get files for\r\n * @param themesConfig - Resolved themes configuration\r\n * @param options - Discovery options\r\n * @returns Array of file paths for the theme\r\n */\r\nexport function getThemeFiles(\r\n themeName: string,\r\n themesConfig: ResolvedThemesConfig,\r\n options: DiscoveryOptions\r\n): string[] {\r\n const { sourceDir, pattern = '**/*.json' } = options;\r\n\r\n // Use Map for safe access\r\n const definitionsMap = new Map(Object.entries(themesConfig.definitions));\r\n const definition = definitionsMap.get(themeName);\r\n\r\n if (!definition) {\r\n throw new Error(`Unknown theme: ${themeName}`);\r\n }\r\n\r\n if (definition.isDefault) {\r\n // Default theme: all files EXCEPT those with theme suffixes\r\n const ignorePatterns = generateIgnorePatterns(sourceDir, themesConfig.definitions);\r\n\r\n return fg.sync(path.join(sourceDir, pattern), {\r\n ignore: ignorePatterns,\r\n absolute: true,\r\n });\r\n }\r\n\r\n // Non-default theme: files with specific suffix\r\n if (!definition.suffix) {\r\n return [];\r\n }\r\n\r\n const suffixPattern = pattern.replace(/\\.json$/i, `${definition.suffix}.json`);\r\n\r\n return fg.sync(path.join(sourceDir, suffixPattern), {\r\n absolute: true,\r\n });\r\n}\r\n\r\n/**\r\n * Auto-detect themes from file suffixes\r\n *\r\n * Scans files in the source directory and extracts unique\r\n * theme suffixes to build a dynamic theme list.\r\n *\r\n * @param sourceDir - Directory to scan\r\n * @param pattern - Glob pattern for files\r\n * @param selectorPattern - Pattern for generating selectors\r\n * @returns Map of theme names to their suffixes\r\n */\r\nexport function autoDetectThemes(\r\n sourceDir: string,\r\n pattern: string = '**/*.json',\r\n selectorPattern: string = '[data-dsai-theme=\"{mode}\"]'\r\n): Map<string, { suffix: string | null; selector: string }> {\r\n const themes = new Map<string, { suffix: string | null; selector: string }>();\r\n\r\n // Get all files\r\n const files = fg.sync(pattern, { cwd: sourceDir });\r\n\r\n // Extract unique suffixes\r\n const suffixRegex = /-([a-z0-9]+)\\.json$/i;\r\n const foundSuffixes = new Set<string>();\r\n\r\n for (const file of files) {\r\n const match = suffixRegex.exec(file);\r\n if (match?.[1]) {\r\n foundSuffixes.add(match[1].toLowerCase());\r\n }\r\n }\r\n\r\n // Add default theme (light)\r\n themes.set('light', {\r\n suffix: null,\r\n selector: ':root',\r\n });\r\n\r\n // Add detected themes\r\n for (const suffix of foundSuffixes) {\r\n themes.set(suffix, {\r\n suffix: `-${suffix}`,\r\n selector: selectorPattern.replace('{mode}', suffix),\r\n });\r\n }\r\n\r\n return themes;\r\n}\r\n","/**\r\n * @file Token Build Module\r\n * @description Orchestrates the complete token build pipeline\r\n *\r\n * Runs all token build steps in sequence with clear logging:\r\n * 1. Validate tokens\r\n * 2. Transform Figma tokens\r\n * 3. Build Style Dictionary outputs (CSS, JS, TS, SCSS, JSON)\r\n * 4. Sync tokens-flat.ts\r\n * 5. Compile Bootstrap theme SCSS → CSS\r\n * 6. Post-process theme CSS (data-bs-theme → data-dsai-theme)\r\n * 7. Compile DSAi utilities SCSS → CSS\r\n * 8. Bundle with tsup (ESM + CJS)\r\n *\r\n * The pipeline is configurable via dsai.config.mjs tokens.pipeline section.\r\n * Packages can specify which steps to run and customize paths.\r\n *\r\n * @module @dsai-io/tools/tokens/build\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { execSync } from 'node:child_process';\r\nimport { existsSync, readdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { CacheService } from './cache.js';\r\nimport {\r\n analyzeChanges,\r\n generateIncrementalReport,\r\n updateCacheAfterBuild,\r\n type IncrementalOptions,\r\n} from './incremental.js';\r\nimport { preprocessTokenFiles, type FilePreprocessingResult } from './mode-preprocessor.js';\r\nimport { postprocessCssFiles } from './postprocess.js';\r\nimport { SnapshotService } from './snapshot.js';\r\nimport { syncTokensCLI } from './sync.js';\r\nimport { buildAllThemes } from './theme-builder.js';\r\nimport { discoverThemeFiles } from './theme-discovery.js';\r\nimport { transformTokens } from './transform.js';\r\nimport { validateTokens } from './validate.js';\r\n\r\nimport type { BuildOptions, BuildResult, BuildStep } from './types';\r\nimport type {\r\n BuildPipelinePaths,\r\n BuildPipelineStep,\r\n OutputFormat,\r\n TokensBuildPipeline,\r\n} from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Global cleanup function for preprocessed files */\r\nlet preprocessCleanup: (() => void) | null = null;\r\n\r\n/** Default SASS deprecation silencing flags */\r\nconst SASS_FLAGS = [\r\n '--quiet-deps',\r\n '--silence-deprecation=import',\r\n '--silence-deprecation=global-builtin',\r\n '--silence-deprecation=color-functions',\r\n].join(' ');\r\n\r\n/** Minimal SASS flags (no color functions deprecation) */\r\nconst SASS_FLAGS_MINIMAL = ['--quiet-deps', '--silence-deprecation=import'].join(' ');\r\n\r\n/** Default build pipeline steps (full @dsai-io/tokens build) */\r\nconst DEFAULT_PIPELINE_STEPS: BuildPipelineStep[] = [\r\n 'validate',\r\n 'snapshot', // Create backup before transform\r\n 'preprocess', // Extract modes from nested Figma structure\r\n 'transform',\r\n 'style-dictionary',\r\n 'sync',\r\n 'sass-theme',\r\n 'sass-theme-minified',\r\n 'postprocess',\r\n 'sass-utilities',\r\n 'sass-utilities-minified',\r\n 'bundle',\r\n];\r\n\r\n/** Default pipeline paths */\r\nconst DEFAULT_PIPELINE_PATHS: Required<BuildPipelinePaths> = {\r\n syncSource: 'dist/js/tokens.js',\r\n syncTarget: 'src/tokens-flat.ts',\r\n sassThemeInput: 'src/scss/dsai-theme-bs.scss',\r\n sassThemeOutput: 'dist/css/dsai-theme-bs.css',\r\n sassThemeMinifiedOutput: 'dist/css/dsai-theme-bs.min.css',\r\n sassUtilitiesInput: 'src/scss/dsai-utilities.scss',\r\n sassUtilitiesOutput: 'dist/css/dsai.css',\r\n sassUtilitiesMinifiedOutput: 'dist/css/dsai.min.css',\r\n};\r\n\r\n// ============================================================================\r\n// Build Step Runner\r\n// ============================================================================\r\n\r\n/**\r\n * Run a single build step\r\n */\r\nasync function runStep(\r\n step: BuildStep,\r\n index: number,\r\n total: number,\r\n verbose: boolean\r\n): Promise<boolean> {\r\n const stepNum = `[${index + 1}/${total}]`;\r\n\r\n if (step.skip) {\r\n if (verbose) {\r\n console.info(`${stepNum} ⏭️ ${step.name} (skipped)`);\r\n }\r\n return true;\r\n }\r\n\r\n if (verbose) {\r\n console.info(`\\n${stepNum} 🔧 ${step.name}`);\r\n }\r\n\r\n // If step has a function, run it\r\n if (step.fn) {\r\n try {\r\n // Run function and await if it returns a promise\r\n const result = await step.fn();\r\n // Check if function returned false (failure)\r\n if (result === false) {\r\n console.error(` ❌ Failed: Step returned false`);\r\n return false;\r\n }\r\n if (verbose) {\r\n console.info(' ✅ Done');\r\n }\r\n return true;\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n console.error(` ❌ Failed: ${errorMsg}`);\r\n return false;\r\n }\r\n }\r\n\r\n // Otherwise run command\r\n if (step.command) {\r\n if (verbose) {\r\n const shortCmd = step.command.split(' ').slice(0, 4).join(' ');\r\n console.info(` $ ${shortCmd}...`);\r\n }\r\n\r\n try {\r\n execSync(step.command, {\r\n cwd: step.cwd ?? process.cwd(),\r\n stdio: verbose ? 'inherit' : 'pipe',\r\n env: { ...process.env, FORCE_COLOR: '1' },\r\n });\r\n if (verbose) {\r\n console.info(' ✅ Done');\r\n }\r\n return true;\r\n } catch (error) {\r\n console.error(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n return false;\r\n }\r\n }\r\n\r\n console.warn(` ⚠️ Step ${step.name} has no command or function`);\r\n return true;\r\n}\r\n\r\n// ============================================================================\r\n// Build Steps Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Get merged pipeline paths with defaults\r\n */\r\nfunction getPipelinePaths(customPaths?: BuildPipelinePaths): Required<BuildPipelinePaths> {\r\n return {\r\n ...DEFAULT_PIPELINE_PATHS,\r\n ...customPaths,\r\n };\r\n}\r\n\r\n/**\r\n * Map of step names to human-readable names\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n */\r\nconst STEP_DISPLAY_NAMES = new Map<BuildPipelineStep, string>([\r\n ['validate', 'Validate Tokens'],\r\n ['snapshot', 'Create Snapshot Backup'],\r\n ['preprocess', 'Preprocess Mode Files'],\r\n ['transform', 'Transform Figma Tokens'],\r\n ['style-dictionary', 'Build Style Dictionary'],\r\n ['multi-theme', 'Build Multi-Theme Tokens'],\r\n ['sync', 'Sync tokens-flat.ts'],\r\n ['sass-theme', 'Compile Bootstrap Theme (unminified)'],\r\n ['sass-theme-minified', 'Compile Bootstrap Theme (minified)'],\r\n ['postprocess', 'Post-process Theme CSS'],\r\n ['sass-utilities', 'Compile DSAi Utilities (unminified)'],\r\n ['sass-utilities-minified', 'Compile DSAi Utilities (minified)'],\r\n ['bundle', 'Bundle with tsup'],\r\n]);\r\n\r\n/**\r\n * Create a single build step from step name\r\n */\r\nfunction createStepFromName(\r\n stepName: BuildPipelineStep,\r\n tokensPackageDir: string,\r\n figmaExportsDir: string,\r\n tokensDir: string,\r\n paths: Required<BuildPipelinePaths>,\r\n sdConfigFile: string,\r\n strict: boolean,\r\n snapshotService?: SnapshotService,\r\n themesConfig?: BuildOptions['themesConfig'],\r\n outputDir?: string,\r\n formats: OutputFormat[] = ['css', 'scss', 'json'],\r\n cssOutputDir?: string,\r\n postprocessConfig?: BuildOptions['postprocessConfig']\r\n): BuildStep {\r\n const displayName = STEP_DISPLAY_NAMES.get(stepName) ?? `Unknown: ${stepName}`;\r\n\r\n switch (stepName) {\r\n case 'validate':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n // Create minimal config for validation\r\n const config = {\r\n tokens: {\r\n collectionsDir: tokensDir,\r\n sourceDir: figmaExportsDir,\r\n },\r\n } as Parameters<typeof validateTokens>[0];\r\n\r\n const result = await validateTokens(config, {\r\n verbose: true,\r\n strict,\r\n });\r\n\r\n if (!result.valid) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error.message}`);\r\n }\r\n }\r\n return result.valid;\r\n },\r\n };\r\n\r\n case 'snapshot':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n if (!snapshotService) {\r\n console.warn(' ⚠️ Snapshot service not available, skipping');\r\n return true;\r\n }\r\n try {\r\n // tokensDir is collectionsDir from config (e.g., ./src)\r\n // actual collections are in tokensDir/collections\r\n const collectionsPath = join(tokensDir, 'collections');\r\n console.info(` 📂 Snapshot path: ${collectionsPath}`);\r\n const result = snapshotService.createSnapshot(\r\n collectionsPath,\r\n `Pre-transform backup - ${new Date().toISOString()}`\r\n );\r\n\r\n if (!result.success || !result.snapshot) {\r\n console.error(` ❌ Snapshot failed: ${result.error || 'Unknown error'}`);\r\n return false;\r\n }\r\n\r\n console.info(` 📸 Snapshot created: ${result.snapshot.id}`);\r\n console.info(` Files: ${result.snapshot.files.length}`);\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Snapshot failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'preprocess':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n try {\r\n const outputDir = join(figmaExportsDir, '.preprocessed');\r\n console.info(` 📂 Source: ${figmaExportsDir}`);\r\n console.info(` 📂 Output: ${outputDir}`);\r\n\r\n // Get all JSON files from the source directory\r\n const jsonFiles = readdirSync(figmaExportsDir).filter((f) => f.endsWith('.json'));\r\n\r\n if (jsonFiles.length === 0) {\r\n console.warn(` ⚠️ No JSON files found in ${figmaExportsDir}`);\r\n return true; // Not a failure, just skip\r\n }\r\n\r\n const result = preprocessTokenFiles({\r\n sourceDir: figmaExportsDir,\r\n outputDir,\r\n files: jsonFiles,\r\n modesPath: ['Foundation', 'modes'],\r\n verbose: true,\r\n });\r\n\r\n // Only fail if actual processing errors occurred (not \"no modes detected\")\r\n const failedFiles = result.files.filter(\r\n (f) => !f.success && f.error !== 'No modes detected'\r\n );\r\n if (failedFiles.length > 0) {\r\n console.error(` ❌ Preprocessing failed for ${failedFiles.length} file(s)`);\r\n for (const failed of failedFiles) {\r\n console.error(` - ${failed.sourceFile}: ${failed.error ?? 'Unknown error'}`);\r\n }\r\n return false;\r\n }\r\n\r\n const successFiles = result.files.filter((f) => f.success);\r\n const skippedFiles = result.files.filter((f) => f.error === 'No modes detected');\r\n\r\n console.info(` ✅ Preprocessed ${successFiles.length} file(s)`);\r\n if (skippedFiles.length > 0) {\r\n console.info(` ⏭️ Skipped ${skippedFiles.length} file(s) (no modes)`);\r\n }\r\n\r\n const totalModes = result.files.reduce(\r\n (sum: number, file: FilePreprocessingResult) => sum + file.modes.length,\r\n 0\r\n );\r\n console.info(` 📊 Total modes extracted: ${totalModes}`);\r\n\r\n // Store cleanup function for later\r\n preprocessCleanup = result.cleanup;\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Preprocessing failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'transform':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n // Check if preprocessed directory exists and use it instead\r\n const preprocessedDir = join(figmaExportsDir, '.preprocessed');\r\n const sourceDir = existsSync(preprocessedDir) ? preprocessedDir : figmaExportsDir;\r\n\r\n if (sourceDir === preprocessedDir) {\r\n console.info(` 📂 Using preprocessed directory: ${preprocessedDir}`);\r\n }\r\n\r\n const result = transformTokens({\r\n sourceDir,\r\n collectionsDir: tokensDir,\r\n verbose: true,\r\n strict,\r\n });\r\n if (!result.success) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n return result.success;\r\n },\r\n };\r\n\r\n case 'style-dictionary':\r\n return {\r\n name: displayName,\r\n command: `style-dictionary build --config ${sdConfigFile}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'multi-theme':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n // Check if themes config is provided and enabled\r\n if (!themesConfig?.enabled || !themesConfig?.definitions) {\r\n console.warn(' ⚠️ Multi-theme build requires themes config with enabled: true');\r\n console.warn(' ℹ️ Falling back to single-theme build via style-dictionary');\r\n return true; // Skip but don't fail\r\n }\r\n\r\n try {\r\n // Build minimal resolved config for theme builder\r\n const definitions = new Map(Object.entries(themesConfig.definitions));\r\n\r\n // Discover theme files\r\n const discoveryResult = discoverThemeFiles(\r\n {\r\n enabled: true,\r\n default: 'light',\r\n autoDetect: true,\r\n ignoreModes: [],\r\n selectorPattern: {\r\n default: ':root',\r\n others: '[data-dsai-theme=\"{mode}\"]',\r\n },\r\n definitions: Object.fromEntries(\r\n Array.from(definitions.entries()).map(([name, def]) => [\r\n name,\r\n {\r\n isDefault: def.isDefault ?? name === 'light',\r\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\r\n selector: def.selector,\r\n mediaQuery: def.mediaQuery,\r\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\r\n outputFiles: {\r\n css:\r\n def.outputFiles?.['css'] ??\r\n (def.isDefault ? 'tokens.css' : `tokens-${name}.css`),\r\n scss:\r\n def.outputFiles?.['scss'] ??\r\n (def.isDefault ? '_variables.scss' : `_variables-${name}.scss`),\r\n js:\r\n def.outputFiles?.['js'] ??\r\n (def.isDefault ? 'tokens.js' : `tokens-${name}.js`),\r\n ts:\r\n def.outputFiles?.['ts'] ??\r\n (def.isDefault ? 'tokens.d.ts' : `tokens-${name}.d.ts`),\r\n json:\r\n def.outputFiles?.['json'] ??\r\n (def.isDefault ? 'tokens.json' : `tokens-${name}.json`),\r\n android:\r\n def.outputFiles?.['android'] ??\r\n (def.isDefault ? 'tokens.xml' : `tokens-${name}.xml`),\r\n ios:\r\n def.outputFiles?.['ios'] ??\r\n (def.isDefault ? 'tokens.h' : `tokens-${name}.h`),\r\n },\r\n },\r\n ])\r\n ),\r\n },\r\n { sourceDir: join(tokensDir, 'collections'), verbose: true }\r\n );\r\n\r\n if (discoveryResult.emptyThemes.length > 0) {\r\n console.warn(\r\n ` ⚠️ Empty themes (no files): ${discoveryResult.emptyThemes.join(', ')}`\r\n );\r\n }\r\n\r\n console.info(\r\n ` 📂 Found ${discoveryResult.totalFiles} files across ${discoveryResult.themes.size} themes`\r\n );\r\n\r\n // Build all themes\r\n const themeFiles = discoveryResult.themes;\r\n\r\n // Convert definitions to the format buildAllThemes expects\r\n const themeDefinitions = Object.fromEntries(\r\n Array.from(definitions.entries()).map(([name, def]) => [\r\n name,\r\n {\r\n isDefault: def.isDefault ?? name === 'light',\r\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\r\n selector: def.selector,\r\n mediaQuery: def.mediaQuery,\r\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\r\n outputFiles: def.outputFiles,\r\n },\r\n ])\r\n );\r\n\r\n const result = await buildAllThemes({\r\n config: {\r\n formats: formats,\r\n themes: {\r\n definitions: themeDefinitions,\r\n },\r\n },\r\n themeFiles,\r\n outputDir: outputDir ?? `${tokensPackageDir}/dist`,\r\n verbose: true,\r\n });\r\n\r\n if (!result.success) {\r\n console.error(` ❌ Multi-theme build failed: ${result.failCount} theme(s) failed`);\r\n for (const themeResult of result.results.filter((r) => !r.success)) {\r\n console.error(` - ${themeResult.themeName}: ${themeResult.error}`);\r\n }\r\n return false;\r\n }\r\n\r\n console.info(` ✅ Built ${result.successCount} themes in ${result.duration}ms`);\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Multi-theme build error: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'sync':\r\n return {\r\n name: displayName,\r\n fn: () =>\r\n syncTokensCLI(tokensPackageDir, {\r\n syncSource: paths.syncSource,\r\n syncTarget: paths.syncTarget,\r\n }),\r\n };\r\n\r\n case 'sass-theme':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeOutput}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'sass-theme-minified':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeMinifiedOutput} --style=compressed`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'postprocess':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n // Use cssOutputDir or postprocessConfig.cssDir if provided (now absolute paths from CLI)\r\n // Fall back to tokensPackageDir + 'dist/css' if neither is set\r\n const cssDir =\r\n cssOutputDir ?? postprocessConfig?.cssDir ?? join(tokensPackageDir, 'dist/css');\r\n\r\n const result = postprocessCssFiles({\r\n cssDir,\r\n files: postprocessConfig?.files,\r\n replacements: postprocessConfig?.replacements,\r\n verbose: true,\r\n });\r\n return result.success;\r\n },\r\n };\r\n\r\n case 'sass-utilities':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesOutput}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'sass-utilities-minified':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesMinifiedOutput} --style=compressed`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'bundle':\r\n return {\r\n name: displayName,\r\n command: 'tsup',\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n default:\r\n return {\r\n name: `Unknown step: ${stepName}`,\r\n fn: () => {\r\n console.warn(`⚠️ Unknown pipeline step: ${stepName}`);\r\n return true;\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create build steps based on options and pipeline configuration\r\n */\r\nfunction createBuildSteps(\r\n tokensDir: string,\r\n _toolsDir: string,\r\n options: BuildOptions,\r\n pipeline?: TokensBuildPipeline\r\n): BuildStep[] {\r\n const { skipValidate, skipTransform, onlyTheme, strict = false } = options;\r\n\r\n // Get the tokens package root directory\r\n // tokensDir is typically the collections dir (e.g., packages/@dsai-io/tokens/collections)\r\n // We need the package root for running commands\r\n const tokensPackageDir = tokensDir.endsWith('/collections')\r\n ? dirname(tokensDir)\r\n : dirname(tokensDir);\r\n\r\n // Path to figma-exports source directory\r\n // Use sourceDir from options if provided, otherwise use sibling directory\r\n const figmaExportsDir = options.sourceDir ?? `${tokensPackageDir}/figma-exports`;\r\n\r\n // Initialize snapshot service for backup/rollback\r\n const snapshotService = new SnapshotService({\r\n snapshotDir: `${tokensPackageDir}/.snapshots`,\r\n maxSnapshots: 10,\r\n include: ['**/*.json'],\r\n });\r\n\r\n // Get pipeline configuration\r\n const pipelineSteps = pipeline?.steps ?? DEFAULT_PIPELINE_STEPS;\r\n const paths = getPipelinePaths(pipeline?.paths);\r\n const sdConfigFile = pipeline?.styleDictionaryConfig ?? 'sd.config.mjs';\r\n\r\n // Get formats from options (default: css, scss, json - no js/ts by default to avoid numeric identifier issues)\r\n const formats = (options.formats ?? ['css', 'scss', 'json']) as OutputFormat[];\r\n\r\n // Build steps based on pipeline configuration\r\n const steps: BuildStep[] = [];\r\n\r\n for (const stepName of pipelineSteps) {\r\n const step = createStepFromName(\r\n stepName,\r\n tokensPackageDir,\r\n figmaExportsDir,\r\n tokensDir,\r\n paths,\r\n sdConfigFile,\r\n strict,\r\n snapshotService,\r\n options.themesConfig,\r\n options.outputDir,\r\n formats,\r\n options.cssOutputDir,\r\n options.postprocessConfig\r\n );\r\n\r\n // Apply skip flags based on legacy options\r\n if (stepName === 'validate' && skipValidate) {\r\n step.skip = true;\r\n }\r\n if (stepName === 'transform' && (skipTransform || onlyTheme)) {\r\n step.skip = true;\r\n }\r\n if (onlyTheme && !['sass-theme', 'sass-theme-minified', 'postprocess'].includes(stepName)) {\r\n // Only run theme-related steps when onlyTheme is true\r\n if (!['validate'].includes(stepName)) {\r\n step.skip = true;\r\n }\r\n }\r\n\r\n steps.push(step);\r\n }\r\n\r\n return steps;\r\n}\r\n\r\n// ============================================================================\r\n// Main Build Function\r\n// ============================================================================\r\n\r\n/**\r\n * Run the complete token build pipeline\r\n *\r\n * @example\r\n * ```typescript\r\n * // Full build\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * });\r\n *\r\n * // Skip validation\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * skipValidate: true,\r\n * });\r\n *\r\n * // Only build theme CSS\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * onlyTheme: true,\r\n * });\r\n * ```\r\n */\r\nexport async function buildTokens(\r\n tokensDir: string,\r\n toolsDir: string,\r\n options: BuildOptions = {}\r\n): Promise<BuildResult> {\r\n const {\r\n skipValidate,\r\n onlyTheme,\r\n verbose = true,\r\n quiet = false,\r\n incremental = false,\r\n force = false,\r\n cacheDir,\r\n } = options;\r\n\r\n // Use config values from options (already passed from CLI)\r\n // No need to reload config here - CLI already loaded it\r\n const cssOutputDir = options.cssOutputDir;\r\n const postprocessConfig = options.postprocessConfig;\r\n\r\n // Pass config to options so createBuildSteps can access it\r\n const optionsWithConfig: BuildOptions = {\r\n ...options,\r\n cssOutputDir,\r\n postprocessConfig,\r\n };\r\n\r\n const startTime = Date.now();\r\n const stepsCompleted: string[] = [];\r\n const stepsFailed: string[] = [];\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Verify directories exist\r\n try {\r\n if (!existsSync(tokensDir)) {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Tokens directory not found: ${tokensDir}`],\r\n warnings,\r\n };\r\n }\r\n } catch {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Failed to check tokens directory: ${tokensDir}`],\r\n warnings,\r\n };\r\n }\r\n\r\n try {\r\n if (!existsSync(toolsDir)) {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Tools directory not found: ${toolsDir}`],\r\n warnings,\r\n };\r\n }\r\n } catch {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Failed to check tools directory: ${toolsDir}`],\r\n warnings,\r\n };\r\n }\r\n\r\n // Print header\r\n if (verbose && !quiet) {\r\n console.info('╔════════════════════════════════════════════════════════════╗');\r\n console.info('║ DSAi Tokens - Complete Build ║');\r\n console.info('╚════════════════════════════════════════════════════════════╝');\r\n\r\n if (skipValidate) {\r\n console.info('⚠️ Skipping validation (--skip-validate)');\r\n }\r\n if (onlyTheme) {\r\n console.info('⚠️ Building only theme CSS (--only-theme)');\r\n }\r\n if (incremental) {\r\n console.info('🔄 Incremental build enabled');\r\n if (force) {\r\n console.info('⚡ Force rebuild - ignoring cache');\r\n }\r\n }\r\n }\r\n\r\n // Initialize cache service for incremental builds\r\n let cacheService: CacheService | undefined;\r\n let incrementalAnalysis: Awaited<ReturnType<typeof analyzeChanges>> | undefined;\r\n\r\n if (incremental) {\r\n cacheService = new CacheService({\r\n cacheDir: cacheDir || `${tokensDir}/.dsai-cache`,\r\n enabled: true,\r\n });\r\n\r\n // Analyze what needs to be rebuilt\r\n const figmaExportsDir = `${tokensDir}/figma-exports`;\r\n const incrementalOptions: IncrementalOptions = {\r\n enabled: true,\r\n force,\r\n cacheService,\r\n verbose: verbose && !quiet,\r\n };\r\n\r\n incrementalAnalysis = await analyzeChanges(figmaExportsDir, incrementalOptions);\r\n\r\n // If no changes detected, skip build\r\n if (!incrementalAnalysis.needsFullBuild && incrementalAnalysis.changedFiles.length === 0) {\r\n const duration = Date.now() - startTime;\r\n\r\n if (verbose && !quiet) {\r\n console.info(generateIncrementalReport(incrementalAnalysis, startTime, 0, 0));\r\n }\r\n\r\n return {\r\n success: true,\r\n stepsCompleted: ['Cache Check'],\r\n stepsFailed: [],\r\n duration,\r\n errors: [],\r\n warnings: ['No changes detected - build skipped'],\r\n };\r\n }\r\n }\r\n\r\n // Create and run build steps\r\n const steps = createBuildSteps(\r\n tokensDir,\r\n toolsDir,\r\n optionsWithConfig,\r\n optionsWithConfig.pipeline\r\n );\r\n\r\n for (const step of steps) {\r\n const stepIndex = steps.indexOf(step);\r\n const success = await runStep(step, stepIndex, steps.length, verbose && !quiet);\r\n\r\n if (success) {\r\n if (!step.skip) {\r\n stepsCompleted.push(step.name);\r\n }\r\n } else {\r\n stepsFailed.push(step.name);\r\n errors.push(`Build failed at step: ${step.name}`);\r\n\r\n // Stop on first failure\r\n const failDuration = Date.now() - startTime;\r\n\r\n if (verbose && !quiet) {\r\n console.error(`\\n💥 Build failed at step: ${step.name}`);\r\n }\r\n\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed,\r\n duration: failDuration,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n const durationSec = (duration / 1000).toFixed(2);\r\n\r\n // Update cache after successful build\r\n if (incremental && cacheService && incrementalAnalysis) {\r\n const figmaExportsDir = `${tokensDir}/figma-exports`;\r\n const collectionsDir = `${tokensDir}/collections`;\r\n\r\n await updateCacheAfterBuild(\r\n cacheService,\r\n incrementalAnalysis.changedFiles,\r\n [], // Output files - would need to track from transform step\r\n figmaExportsDir,\r\n collectionsDir,\r\n verbose && !quiet\r\n );\r\n\r\n // Show incremental build report\r\n if (verbose && !quiet) {\r\n console.info(\r\n generateIncrementalReport(\r\n incrementalAnalysis,\r\n startTime,\r\n stepsCompleted.length,\r\n steps.length\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Cleanup preprocessed files if they exist\r\n if (preprocessCleanup) {\r\n try {\r\n preprocessCleanup();\r\n if (verbose && !quiet) {\r\n console.info('🧹 Cleaned up preprocessed files');\r\n }\r\n } catch (error) {\r\n if (verbose && !quiet) {\r\n console.warn(\r\n `⚠️ Failed to cleanup preprocessed files: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n } finally {\r\n preprocessCleanup = null;\r\n }\r\n }\r\n\r\n // Print footer\r\n if (verbose && !quiet) {\r\n console.info('\\n╔════════════════════════════════════════════════════════════╗');\r\n console.info('║ ✅ Build Complete ║');\r\n console.info(\r\n `║ 📊 ${stepsCompleted.length} steps passed in ${durationSec}s ║`\r\n );\r\n console.info('╚════════════════════════════════════════════════════════════╝');\r\n }\r\n\r\n return {\r\n success: true,\r\n stepsCompleted,\r\n stepsFailed,\r\n duration,\r\n errors,\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token build\r\n */\r\nexport async function buildTokensCLI(\r\n tokensDir: string,\r\n toolsDir: string,\r\n args: string[] = []\r\n): Promise<boolean> {\r\n const skipValidate = args.includes('--skip-validate');\r\n const skipTransform = args.includes('--skip-transform');\r\n const onlyTheme = args.includes('--only-theme');\r\n const quiet = args.includes('--quiet') || args.includes('-q');\r\n const strict = args.includes('--strict');\r\n const incremental = args.includes('--incremental') || args.includes('--cache');\r\n const force = args.includes('--force');\r\n\r\n // Extract --cache-dir argument\r\n const cacheDirIndex = args.findIndex((arg) => arg.startsWith('--cache-dir='));\r\n const cacheDirArg = cacheDirIndex >= 0 ? args.at(cacheDirIndex) : undefined;\r\n const cacheDir = cacheDirArg?.split('=')[1];\r\n\r\n const result = await buildTokens(tokensDir, toolsDir, {\r\n skipValidate,\r\n skipTransform,\r\n onlyTheme,\r\n verbose: !quiet,\r\n quiet,\r\n strict,\r\n incremental,\r\n force,\r\n cacheDir,\r\n });\r\n\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Parse CLI arguments and run build\r\n * Used as the main entry point when called directly\r\n */\r\nexport async function runBuildCLI(tokensDir: string, toolsDir: string): Promise<void> {\r\n const args = process.argv.slice(2);\r\n const success = await buildTokensCLI(tokensDir, toolsDir, args);\r\n process.exit(success ? 0 : 1);\r\n}\r\n","/**\r\n * @file Token Clean Module\r\n * @description Provides functionality to clean token output directories before builds.\r\n *\r\n * This module supports:\r\n * - Cleaning individual output directories (dist/css, dist/js, etc.)\r\n * - Cleaning all build outputs\r\n * - Dry-run mode to preview what would be deleted\r\n * - Safe deletion with directory validation\r\n *\r\n * @module @dsai-io/tools/tokens/clean\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\r\nimport { basename, join, resolve } from 'node:path';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Clean operation options\r\n */\r\nexport interface CleanOptions {\r\n /**\r\n * Base directory for cleaning (typically the package root)\r\n * @default process.cwd()\r\n */\r\n baseDir?: string;\r\n\r\n /**\r\n * Directories to clean relative to baseDir\r\n * @default ['dist']\r\n */\r\n directories?: string[];\r\n\r\n /**\r\n * Show what would be deleted without actually deleting\r\n * @default false\r\n */\r\n dryRun?: boolean;\r\n\r\n /**\r\n * Enable verbose logging\r\n * @default false\r\n */\r\n verbose?: boolean;\r\n\r\n /**\r\n * File patterns to preserve (glob patterns)\r\n * Files matching these patterns will not be deleted\r\n * @example ['.gitkeep', 'README.md']\r\n */\r\n preserve?: string[];\r\n}\r\n\r\n/**\r\n * Information about a cleaned directory\r\n */\r\nexport interface CleanedDirectory {\r\n /** Path to the cleaned directory */\r\n path: string;\r\n\r\n /** Number of files removed */\r\n filesRemoved: number;\r\n\r\n /** Number of directories removed */\r\n directoriesRemoved: number;\r\n\r\n /** Whether the directory existed before cleaning */\r\n existed: boolean;\r\n}\r\n\r\n/**\r\n * Result of a clean operation\r\n */\r\nexport interface CleanResult {\r\n /** Whether the clean operation completed successfully */\r\n success: boolean;\r\n\r\n /** List of cleaned directories with details */\r\n cleaned: CleanedDirectory[];\r\n\r\n /** Total number of files removed */\r\n totalFilesRemoved: number;\r\n\r\n /** Total number of directories removed */\r\n totalDirectoriesRemoved: number;\r\n\r\n /** Any errors encountered */\r\n errors: string[];\r\n\r\n /** Any warnings (non-blocking issues) */\r\n warnings: string[];\r\n\r\n /** Whether this was a dry run */\r\n dryRun: boolean;\r\n\r\n /** Duration of the operation in milliseconds */\r\n duration: number;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default directories to clean for token builds\r\n */\r\nexport const DEFAULT_CLEAN_DIRECTORIES = ['dist'] as const;\r\n\r\n/**\r\n * Files to always preserve\r\n */\r\nconst ALWAYS_PRESERVE = ['.gitkeep', '.gitignore'] as const;\r\n\r\n/**\r\n * Directories that should never be cleaned (safety check)\r\n */\r\nconst PROTECTED_DIRECTORIES = [\r\n 'src',\r\n 'node_modules',\r\n '.git',\r\n '.github',\r\n 'test',\r\n 'tests',\r\n '__tests__',\r\n 'docs',\r\n 'config',\r\n] as const;\r\n\r\n// ============================================================================\r\n// Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate that a directory is safe to clean\r\n *\r\n * @param dirPath - Absolute path to the directory\r\n * @param baseDir - Base directory for relative validation\r\n * @returns Validation result with error message if invalid\r\n */\r\nfunction validateCleanTarget(dirPath: string, baseDir: string): { valid: boolean; error?: string } {\r\n // Ensure path is within baseDir (prevent directory traversal)\r\n const resolvedDir = resolve(dirPath);\r\n const resolvedBase = resolve(baseDir);\r\n\r\n if (!resolvedDir.startsWith(resolvedBase)) {\r\n return {\r\n valid: false,\r\n error: `Directory \"${dirPath}\" is outside base directory \"${baseDir}\"`,\r\n };\r\n }\r\n\r\n // Check for protected directories\r\n const dirName = basename(resolvedDir);\r\n if (PROTECTED_DIRECTORIES.includes(dirName as (typeof PROTECTED_DIRECTORIES)[number])) {\r\n return {\r\n valid: false,\r\n error: `Directory \"${dirName}\" is protected and cannot be cleaned`,\r\n };\r\n }\r\n\r\n // Don't allow cleaning the base directory itself\r\n if (resolvedDir === resolvedBase) {\r\n return {\r\n valid: false,\r\n error: 'Cannot clean the base directory itself',\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Match a string against a glob pattern using dynamic programming\r\n * Safely handles * (any chars) and ? (single char) without regex\r\n *\r\n * @param str - String to match\r\n * @param pattern - Glob pattern\r\n * @returns Whether the string matches the pattern\r\n */\r\nfunction matchGlobDP(str: string, pattern: string): boolean {\r\n const m = str.length;\r\n const n = pattern.length;\r\n\r\n // Use a Map for type-safe access instead of 2D array\r\n const dp = new Map<string, boolean>();\r\n const key = (i: number, j: number): string => `${i},${j}`;\r\n const get = (i: number, j: number): boolean => dp.get(key(i, j)) ?? false;\r\n const set = (i: number, j: number, val: boolean): void => {\r\n dp.set(key(i, j), val);\r\n };\r\n\r\n // Initialize all to false (Map returns undefined -> false via get helper)\r\n // Empty pattern matches empty string\r\n set(0, 0, true);\r\n\r\n // Handle patterns starting with *\r\n for (let j = 1; j <= n; j++) {\r\n if (pattern[j - 1] === '*') {\r\n set(0, j, get(0, j - 1));\r\n }\r\n }\r\n\r\n // Fill the DP table\r\n for (let i = 1; i <= m; i++) {\r\n for (let j = 1; j <= n; j++) {\r\n const pChar = pattern[j - 1];\r\n\r\n if (pChar === '*') {\r\n // * can match zero chars (dp[i][j-1]) or one+ chars (dp[i-1][j])\r\n set(i, j, get(i, j - 1) || get(i - 1, j));\r\n } else if (pChar === '?' || pChar === str[i - 1]) {\r\n // ? matches any single char, or exact character match\r\n set(i, j, get(i - 1, j - 1));\r\n }\r\n // else remains false (not set in Map)\r\n }\r\n }\r\n\r\n return get(m, n);\r\n}\r\n\r\n/**\r\n * Match a filename against a glob pattern safely\r\n * Uses optimized string methods for simple patterns, DP algorithm for complex ones\r\n *\r\n * @param fileName - Name of the file to match\r\n * @param pattern - Glob pattern (supports * and ? wildcards)\r\n * @returns Whether the filename matches the pattern\r\n */\r\nfunction matchGlobPattern(fileName: string, pattern: string): boolean {\r\n // For patterns without wildcards, use exact match\r\n if (!pattern.includes('*') && !pattern.includes('?')) {\r\n return fileName === pattern;\r\n }\r\n\r\n // For simple extension patterns like \"*.json\", use endsWith for safety\r\n if (pattern.startsWith('*.') && !pattern.slice(2).includes('*') && !pattern.includes('?')) {\r\n const extension = pattern.slice(1); // \".json\"\r\n return fileName.endsWith(extension);\r\n }\r\n\r\n // For simple prefix patterns like \"file*\", use startsWith for safety\r\n if (pattern.endsWith('*') && !pattern.slice(0, -1).includes('*') && !pattern.includes('?')) {\r\n const prefix = pattern.slice(0, -1);\r\n return fileName.startsWith(prefix);\r\n }\r\n\r\n // For complex patterns, use safe DP-based glob matching (no regex)\r\n return matchGlobDP(fileName, pattern);\r\n}\r\n\r\n/**\r\n * Check if a file should be preserved\r\n *\r\n * @param fileName - Name of the file\r\n * @param preservePatterns - Additional patterns to preserve\r\n * @returns Whether the file should be preserved\r\n */\r\nfunction shouldPreserve(fileName: string, preservePatterns: string[]): boolean {\r\n const allPatterns = [...ALWAYS_PRESERVE, ...preservePatterns];\r\n return allPatterns.some((pattern) => matchGlobPattern(fileName, pattern));\r\n}\r\n\r\n// ============================================================================\r\n// Directory Cleaning\r\n// ============================================================================\r\n\r\n/**\r\n * Count files and directories in a path recursively\r\n *\r\n * @param dirPath - Path to count\r\n * @returns Object with file and directory counts\r\n */\r\nfunction countContents(dirPath: string): { files: number; dirs: number } {\r\n if (!existsSync(dirPath)) {\r\n return { files: 0, dirs: 0 };\r\n }\r\n\r\n let files = 0;\r\n let dirs = 0;\r\n\r\n const entries = readdirSync(dirPath, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n dirs++;\r\n const subCounts = countContents(join(dirPath, entry.name));\r\n files += subCounts.files;\r\n dirs += subCounts.dirs;\r\n } else {\r\n files++;\r\n }\r\n }\r\n\r\n return { files, dirs };\r\n}\r\n\r\n/**\r\n * Clean a single directory\r\n *\r\n * @param dirPath - Absolute path to the directory to clean\r\n * @param options - Clean options\r\n * @returns Cleaned directory info\r\n */\r\nfunction cleanDirectory(\r\n dirPath: string,\r\n options: Required<Pick<CleanOptions, 'dryRun' | 'verbose' | 'preserve'>>\r\n): CleanedDirectory {\r\n const existed = existsSync(dirPath);\r\n\r\n if (!existed) {\r\n if (options.verbose) {\r\n console.info(` ℹ️ Directory does not exist: ${dirPath}`);\r\n }\r\n return {\r\n path: dirPath,\r\n filesRemoved: 0,\r\n directoriesRemoved: 0,\r\n existed: false,\r\n };\r\n }\r\n\r\n // Count contents before deletion\r\n const counts = countContents(dirPath);\r\n\r\n if (options.dryRun) {\r\n if (options.verbose) {\r\n console.info(\r\n ` 🔍 Would remove: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`\r\n );\r\n }\r\n return {\r\n path: dirPath,\r\n filesRemoved: counts.files,\r\n directoriesRemoved: counts.dirs,\r\n existed: true,\r\n };\r\n }\r\n\r\n // Check for files to preserve\r\n const entries = readdirSync(dirPath, { withFileTypes: true });\r\n const toPreserve = entries.filter((e) => shouldPreserve(e.name, options.preserve));\r\n\r\n if (toPreserve.length > 0) {\r\n // Delete contents except preserved files\r\n for (const entry of entries) {\r\n if (shouldPreserve(entry.name, options.preserve)) {\r\n if (options.verbose) {\r\n console.info(` 📌 Preserving: ${entry.name}`);\r\n }\r\n continue;\r\n }\r\n\r\n const entryPath = join(dirPath, entry.name);\r\n rmSync(entryPath, { recursive: true, force: true });\r\n }\r\n } else {\r\n // Delete entire directory\r\n rmSync(dirPath, { recursive: true, force: true });\r\n }\r\n\r\n if (options.verbose) {\r\n console.info(` ✅ Cleaned: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`);\r\n }\r\n\r\n return {\r\n path: dirPath,\r\n filesRemoved: counts.files,\r\n directoriesRemoved: counts.dirs,\r\n existed: true,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n\r\n/**\r\n * Clean token output directories\r\n *\r\n * Removes build artifacts from output directories to ensure a fresh build.\r\n * Supports dry-run mode, preserve patterns, and safety validation.\r\n *\r\n * @param options - Clean operation options\r\n * @returns Clean operation result\r\n *\r\n * @example\r\n * // Clean default dist directory\r\n * const result = cleanTokenOutputs();\r\n *\r\n * @example\r\n * // Clean specific directories with dry-run\r\n * const result = cleanTokenOutputs({\r\n * directories: ['dist/css', 'dist/js'],\r\n * dryRun: true,\r\n * verbose: true,\r\n * });\r\n *\r\n * @example\r\n * // Clean with preserved files\r\n * const result = cleanTokenOutputs({\r\n * preserve: ['README.md', '*.d.ts'],\r\n * });\r\n */\r\nexport function cleanTokenOutputs(options: CleanOptions = {}): CleanResult {\r\n const startTime = Date.now();\r\n\r\n // Normalize options with defaults\r\n const normalizedOptions = {\r\n baseDir: options.baseDir ?? process.cwd(),\r\n directories: options.directories ?? [...DEFAULT_CLEAN_DIRECTORIES],\r\n dryRun: options.dryRun ?? false,\r\n verbose: options.verbose ?? false,\r\n preserve: options.preserve ?? [],\r\n };\r\n\r\n const result: CleanResult = {\r\n success: true,\r\n cleaned: [],\r\n totalFilesRemoved: 0,\r\n totalDirectoriesRemoved: 0,\r\n errors: [],\r\n warnings: [],\r\n dryRun: normalizedOptions.dryRun,\r\n duration: 0,\r\n };\r\n\r\n if (normalizedOptions.verbose) {\r\n const modeStr = normalizedOptions.dryRun ? '(dry-run)' : '';\r\n console.info(`\\n🧹 Cleaning token outputs ${modeStr}`);\r\n console.info(` Base: ${normalizedOptions.baseDir}`);\r\n }\r\n\r\n // Validate and clean each directory\r\n for (const dir of normalizedOptions.directories) {\r\n const absolutePath = resolve(normalizedOptions.baseDir, dir);\r\n\r\n // Validate target\r\n const validation = validateCleanTarget(absolutePath, normalizedOptions.baseDir);\r\n if (!validation.valid && validation.error) {\r\n result.errors.push(validation.error);\r\n result.success = false;\r\n continue;\r\n }\r\n\r\n // Clean directory\r\n try {\r\n const cleaned = cleanDirectory(absolutePath, {\r\n dryRun: normalizedOptions.dryRun,\r\n verbose: normalizedOptions.verbose,\r\n preserve: normalizedOptions.preserve,\r\n });\r\n\r\n result.cleaned.push(cleaned);\r\n result.totalFilesRemoved += cleaned.filesRemoved;\r\n result.totalDirectoriesRemoved += cleaned.directoriesRemoved;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n result.errors.push(`Failed to clean \"${dir}\": ${errorMessage}`);\r\n result.success = false;\r\n }\r\n }\r\n\r\n result.duration = Date.now() - startTime;\r\n\r\n if (normalizedOptions.verbose) {\r\n console.info('');\r\n if (result.success) {\r\n const actionStr = normalizedOptions.dryRun ? 'Would remove' : 'Removed';\r\n console.info(\r\n `✅ ${actionStr} ${result.totalFilesRemoved} files, ` +\r\n `${result.totalDirectoriesRemoved} directories in ${result.duration}ms`\r\n );\r\n } else {\r\n console.error('❌ Clean failed with errors:');\r\n for (const error of result.errors) {\r\n console.error(` - ${error}`);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * CLI wrapper for cleanTokenOutputs\r\n *\r\n * Provides formatted output suitable for CLI usage.\r\n *\r\n * @param baseDir - Base directory for the clean operation\r\n * @param options - Clean options\r\n * @returns Whether the clean was successful\r\n */\r\nexport function cleanTokensCLI(\r\n baseDir: string,\r\n options: Omit<CleanOptions, 'baseDir'> = {}\r\n): boolean {\r\n const result = cleanTokenOutputs({\r\n ...options,\r\n baseDir,\r\n verbose: options.verbose ?? true,\r\n });\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @file Token Collections Merge Module\r\n * @description Merge multiple Figma Tokens Studio collection files into one unified collection\r\n *\r\n * Features:\r\n * - Intelligently merges nested token structures\r\n * - Preserves all metadata ($codeSyntax, $scopes, $type, etc.)\r\n * - Maintains token references and aliases\r\n * - Handles mode-based tokens (Light Mode, Dark Mode)\r\n * - Deep merges sections without overwriting\r\n * - Normalizes reference format to lowercase {colors.path}\r\n * - Adds $libraryName and $collectionName to aliased tokens\r\n * - Sorts properties alphabetically for consistency\r\n * - Removes duplicate sections (like \"hue\" that duplicates \"brand\")\r\n *\r\n * @module @dsai-io/tools/tokens/merge\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\n\r\nimport type { MergeOptions, MergeResult } from './types';\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\ntype TokenValue = string | number | boolean | null | TokenObject | TokenValue[];\r\n\r\ninterface TokenObject {\r\n [key: string]: TokenValue;\r\n}\r\n\r\ntype CollectionData = TokenObject[];\r\n\r\n// ============================================================================\r\n// Token Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an object is a token (has $type or $value)\r\n */\r\nfunction isToken(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n const record = obj as Record<string, unknown>;\r\n return '$type' in record || '$value' in record;\r\n}\r\n\r\n/**\r\n * Check if an object has child tokens\r\n */\r\nfunction hasChildTokens(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n const record = obj as Record<string, unknown>;\r\n for (const key of Object.keys(record)) {\r\n if (!key.startsWith('$') && typeof record[key] === 'object') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Deep Merge\r\n// ============================================================================\r\n\r\n/**\r\n * Deep merge two objects, preserving all properties\r\n * Special handling: If target has child tokens and source is a token,\r\n * or vice versa, prioritize the structure with children\r\n */\r\nfunction deepMerge(\r\n target: TokenObject | undefined,\r\n source: TokenObject,\r\n verbose = false\r\n): TokenObject {\r\n const result: TokenObject = target ? { ...target } : {};\r\n\r\n // Check for conflict: one is a token, the other has child tokens\r\n const targetIsToken = isToken(target);\r\n const sourceIsToken = isToken(source);\r\n const targetHasChildren = hasChildTokens(target);\r\n const sourceHasChildren = hasChildTokens(source);\r\n\r\n if (targetHasChildren && sourceIsToken) {\r\n if (verbose) {\r\n console.info(' ⚠️ Skipping single token in favor of children structure');\r\n }\r\n return result;\r\n }\r\n\r\n if (sourceHasChildren && targetIsToken) {\r\n if (verbose) {\r\n console.info(' ⚠️ Replacing single token with children structure');\r\n }\r\n return { ...source };\r\n }\r\n\r\n for (const key of Object.keys(source)) {\r\n const sourceValue = source[key];\r\n const targetValue = result[key];\r\n\r\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\r\n // Recursively merge nested objects\r\n result[key] = deepMerge(\r\n targetValue as TokenObject | undefined,\r\n sourceValue as TokenObject,\r\n verbose\r\n );\r\n } else if (Array.isArray(sourceValue)) {\r\n // Concatenate arrays\r\n const existingArray = Array.isArray(targetValue) ? targetValue : [];\r\n result[key] = [...existingArray, ...sourceValue];\r\n } else if (sourceValue !== undefined) {\r\n // Overwrite primitive values (source takes precedence)\r\n result[key] = sourceValue;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Token Counting\r\n// ============================================================================\r\n\r\n/**\r\n * Count tokens recursively in a nested structure\r\n */\r\nfunction countTokens(obj: unknown): number {\r\n if (!obj || typeof obj !== 'object') {\r\n return 0;\r\n }\r\n\r\n let count = 0;\r\n const record = obj as Record<string, unknown>;\r\n\r\n for (const key of Object.keys(record)) {\r\n const value = record[key];\r\n\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n const valueRecord = value as Record<string, unknown>;\r\n // Check if this is a token\r\n if ('$type' in valueRecord || '$value' in valueRecord) {\r\n count++;\r\n } else {\r\n // Recursively count nested tokens\r\n count += countTokens(value);\r\n }\r\n }\r\n }\r\n\r\n return count;\r\n}\r\n\r\n// ============================================================================\r\n// Reference Normalization\r\n// ============================================================================\r\n\r\n/**\r\n * Update token references to match new collection name\r\n * Normalizes to lowercase format: {colors.path} instead of {Colors.path}\r\n */\r\nfunction updateReferences(\r\n obj: TokenObject,\r\n oldName: string,\r\n newName: string,\r\n collectionName: string\r\n): void {\r\n const normalizedOld = oldName.toLowerCase().replace(/\\s+/g, '');\r\n const normalizedNew = newName.toLowerCase().replace(/\\s+/g, '');\r\n\r\n // Build patterns to match (case-insensitive)\r\n const patternsLower = [`{${oldName.toLowerCase()}.`, `{${normalizedOld}.`];\r\n\r\n for (const key of Object.keys(obj)) {\r\n const value = obj[key];\r\n\r\n if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) {\r\n // This is a token reference - normalize to lowercase\r\n let newValue = value;\r\n const valueLower = value.toLowerCase();\r\n\r\n for (const pattern of patternsLower) {\r\n if (valueLower.startsWith(pattern)) {\r\n // Replace the prefix with the normalized version\r\n const suffix = value.slice(pattern.length);\r\n newValue = `{${normalizedNew}.${suffix}`;\r\n break;\r\n }\r\n }\r\n obj[key] = newValue;\r\n\r\n // Add metadata for aliased tokens\r\n if ((obj[key] as string).startsWith('{')) {\r\n if (!('$libraryName' in obj)) {\r\n obj['$libraryName'] = '';\r\n }\r\n if (!('$collectionName' in obj)) {\r\n obj['$collectionName'] = collectionName;\r\n }\r\n }\r\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n updateReferences(value as TokenObject, oldName, newName, collectionName);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Property Sorting\r\n// ============================================================================\r\n\r\n/**\r\n * Sort object properties alphabetically, with $ properties first\r\n */\r\nfunction sortProperties(obj: unknown): unknown {\r\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\r\n return obj;\r\n }\r\n\r\n const record = obj as Record<string, unknown>;\r\n const sorted: Record<string, unknown> = {};\r\n const keys = Object.keys(record).sort((a, b) => {\r\n // $ properties first, then alphabetically\r\n const aIsMeta = a.startsWith('$');\r\n const bIsMeta = b.startsWith('$');\r\n if (aIsMeta && !bIsMeta) {\r\n return -1;\r\n }\r\n if (!aIsMeta && bIsMeta) {\r\n return 1;\r\n }\r\n return a.localeCompare(b);\r\n });\r\n\r\n for (const key of keys) {\r\n sorted[key] = sortProperties(record[key]);\r\n }\r\n\r\n return sorted;\r\n}\r\n\r\n// ============================================================================\r\n// Duplicate Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a section is a duplicate/alias section\r\n * (e.g., \"hue\" that just references \"brand\")\r\n */\r\nfunction isDuplicateSection(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n\r\n let hasOnlyReferences = true;\r\n let referenceCount = 0;\r\n\r\n function checkReferences(item: Record<string, unknown>): void {\r\n for (const key of Object.keys(item)) {\r\n if (key.startsWith('$')) {\r\n continue;\r\n }\r\n\r\n const value = item[key];\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n const valueRecord = value as Record<string, unknown>;\r\n if ('$value' in valueRecord) {\r\n referenceCount++;\r\n if (\r\n typeof valueRecord['$value'] === 'string' &&\r\n (valueRecord['$value'] as string).startsWith('{')\r\n ) {\r\n continue;\r\n } else {\r\n hasOnlyReferences = false;\r\n return;\r\n }\r\n }\r\n checkReferences(valueRecord);\r\n }\r\n }\r\n }\r\n\r\n checkReferences(obj as Record<string, unknown>);\r\n return hasOnlyReferences && referenceCount > 10;\r\n}\r\n\r\n/**\r\n * Get collection name from file structure\r\n */\r\nfunction getCollectionName(data: CollectionData): string | null {\r\n if (Array.isArray(data) && data[0]) {\r\n const keys = Object.keys(data[0]);\r\n return keys[0] ?? null;\r\n }\r\n return null;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Load and parse JSON file\r\n */\r\nfunction loadJSON(filePath: string, verbose: boolean): CollectionData | null {\r\n try {\r\n const fullPath = resolve(filePath);\r\n if (verbose) {\r\n console.info(`📖 Reading: ${fullPath}`);\r\n }\r\n const content = readFileSync(fullPath, 'utf-8');\r\n return JSON.parse(content) as CollectionData;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Save JSON to file with pretty formatting\r\n */\r\nfunction saveJSON(filePath: string, data: unknown, verbose: boolean): boolean {\r\n try {\r\n const fullPath = resolve(filePath);\r\n const content = JSON.stringify(data, null, 2);\r\n writeFileSync(fullPath, content, 'utf-8');\r\n if (verbose) {\r\n console.info(`✅ Saved: ${fullPath}`);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple collection files into one\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = mergeCollections({\r\n * sourceFiles: ['colors-scales.json', 'colors.json'],\r\n * outputFile: 'merged-colors.json',\r\n * });\r\n * ```\r\n */\r\nexport function mergeCollections(options: MergeOptions): MergeResult {\r\n const { sourceFiles, outputFile, strategy = 'last', dryRun = false, verbose = false } = options;\r\n\r\n const errors: string[] = [];\r\n const conflicts: string[] = [];\r\n\r\n if (sourceFiles.length < 2) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: ['At least two source files are required'],\r\n };\r\n }\r\n\r\n // Validate files exist\r\n for (const file of sourceFiles) {\r\n if (!existsSync(file)) {\r\n errors.push(`Source file not found: ${file}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors,\r\n };\r\n }\r\n\r\n if (verbose) {\r\n console.info('🔄 Starting merge process...\\n');\r\n }\r\n\r\n // Load all source files\r\n const collections: { name: string | null; data: TokenObject; tokenCount: number }[] = [];\r\n\r\n for (const file of sourceFiles) {\r\n const data = loadJSON(file, verbose);\r\n if (!data || !Array.isArray(data) || !data[0]) {\r\n errors.push(`Invalid collection structure in: ${file}`);\r\n continue;\r\n }\r\n\r\n const name = getCollectionName(data);\r\n const collectionData = name\r\n ? (data[0][name] as TokenObject)\r\n : (data[0] as unknown as TokenObject);\r\n const tokenCount = countTokens(collectionData);\r\n\r\n if (verbose) {\r\n console.info(`📦 Collection: \"${name ?? 'unknown'}\" (${tokenCount} tokens)`);\r\n }\r\n\r\n collections.push({ name, data: collectionData, tokenCount });\r\n }\r\n\r\n if (collections.length < 2) {\r\n return {\r\n success: false,\r\n collectionsCount: collections.length,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: errors.length > 0 ? errors : ['Not enough valid collections to merge'],\r\n };\r\n }\r\n\r\n // Determine unified collection name\r\n const collectionNames = collections.map((c) => c.name).filter((n): n is string => n !== null);\r\n const defaultName = collectionNames[0] ?? 'Tokens';\r\n const unifiedName = collectionNames.includes('Colors')\r\n ? 'Colors'\r\n : collectionNames.reduce((a, b) => (a.length <= b.length ? a : b), defaultName);\r\n\r\n if (verbose) {\r\n console.info(`\\n🎯 Unified collection name: \"${unifiedName}\"`);\r\n console.info('\\n🔀 Merging structures...');\r\n }\r\n\r\n // Merge collections based on strategy\r\n const firstCollection = collections[0];\r\n if (!firstCollection) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: ['No collections to merge'],\r\n };\r\n }\r\n\r\n let merged: TokenObject = firstCollection.data;\r\n for (let i = 1; i < collections.length; i++) {\r\n const source = collections[i];\r\n if (!source) {\r\n continue;\r\n }\r\n if (strategy === 'first') {\r\n // First wins - merge source into target but target takes precedence\r\n merged = deepMerge(source.data, merged, verbose);\r\n } else {\r\n // Last wins (default) - source overwrites target\r\n merged = deepMerge(merged, source.data, verbose);\r\n }\r\n }\r\n\r\n // Remove duplicate sections\r\n if (verbose) {\r\n console.info('🗑️ Checking for duplicate sections...');\r\n }\r\n const modes = merged['modes'] as TokenObject | undefined;\r\n if (modes) {\r\n for (const modeName of Object.keys(modes)) {\r\n const mode = modes[modeName] as TokenObject | undefined;\r\n const colors = mode?.['colors'] as TokenObject | undefined;\r\n\r\n if (colors) {\r\n for (const sectionName of Object.keys(colors)) {\r\n if (isDuplicateSection(colors[sectionName])) {\r\n if (verbose) {\r\n console.info(` ⚠️ Removing duplicate section: ${sectionName}`);\r\n }\r\n delete colors[sectionName];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Normalize references\r\n if (verbose) {\r\n const normalized = unifiedName.toLowerCase().replace(/\\s+/g, '');\r\n console.info(`🔗 Normalizing references to lowercase \"{${normalized}.\" format...`);\r\n }\r\n for (const coll of collections) {\r\n if (coll.name) {\r\n updateReferences(merged, coll.name, unifiedName, unifiedName);\r\n }\r\n }\r\n\r\n // Sort properties\r\n if (verbose) {\r\n console.info('📋 Sorting properties alphabetically...');\r\n }\r\n const sorted = sortProperties(merged) as TokenObject;\r\n\r\n // Count final tokens\r\n const tokensCount = countTokens(sorted);\r\n\r\n if (verbose) {\r\n console.info(`✨ Merged collection: ${tokensCount} tokens\\n`);\r\n }\r\n\r\n // Create output structure\r\n const output = [{ [unifiedName]: sorted }];\r\n\r\n // Save if not dry run\r\n if (!dryRun) {\r\n if (!saveJSON(outputFile, output, verbose)) {\r\n errors.push(`Failed to write output file: ${outputFile}`);\r\n return {\r\n success: false,\r\n collectionsCount: collections.length,\r\n tokensCount,\r\n outputFile,\r\n errors,\r\n conflicts: conflicts.length > 0 ? conflicts : undefined,\r\n };\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.info('\\n✅ Merge complete!');\r\n console.info('📊 Summary:');\r\n for (const coll of collections) {\r\n console.info(` Source: ${coll.tokenCount} tokens`);\r\n }\r\n console.info(` Merged: ${tokensCount} tokens`);\r\n }\r\n\r\n return {\r\n success: true,\r\n collectionsCount: collections.length,\r\n tokensCount,\r\n outputFile,\r\n conflicts: conflicts.length > 0 ? conflicts : undefined,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for merging collections\r\n */\r\nexport function mergeCollectionsCLI(source1: string, source2: string, output: string): boolean {\r\n const result = mergeCollections({\r\n sourceFiles: [source1, source2],\r\n outputFile: output,\r\n verbose: true,\r\n });\r\n\r\n if (result.errors) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * Scanner for finding stylesheet files in directories\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-regexp */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { StyleScannerOptions, StyleScannerResult, StyleScannedFile } from './types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default ignore patterns\r\n */\r\nconst DEFAULT_IGNORE_PATTERNS = [\r\n '**/node_modules/**',\r\n '**/.git/**',\r\n '**/_index.scss',\r\n '**/*.test.scss',\r\n '**/*.spec.scss',\r\n '**/test/**',\r\n '**/tests/**',\r\n];\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Convert a glob pattern to a regular expression\r\n */\r\nfunction globToRegex(pattern: string): RegExp {\r\n const regex = pattern\r\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars (except * and ?)\r\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>') // Temporarily replace **\r\n .replace(/\\*/g, '[^/]*') // * matches anything except /\r\n .replace(/\\?/g, '.') // ? matches single char\r\n .replace(/<<<GLOBSTAR>>>/g, '.*'); // ** matches anything including /\r\n return new RegExp(`^${regex}$`);\r\n}\r\n\r\n/**\r\n * Check if a path matches any of the ignore patterns\r\n */\r\nfunction matchesIgnorePattern(relativePath: string, patterns: string[]): boolean {\r\n for (const pattern of patterns) {\r\n const regex = globToRegex(pattern);\r\n if (regex.test(relativePath)) {\r\n return true;\r\n }\r\n // Also check just the filename\r\n const fileName = path.basename(relativePath);\r\n if (regex.test(fileName)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Recursively scan a directory for files\r\n */\r\nasync function scanDirectory(\r\n dir: string,\r\n rootDir: string,\r\n extension: string,\r\n ignorePatterns: string[],\r\n maxDepth: number,\r\n currentDepth: number,\r\n followSymlinks: boolean\r\n): Promise<StyleScannedFile[]> {\r\n const files: StyleScannedFile[] = [];\r\n\r\n if (currentDepth > maxDepth) {\r\n return files;\r\n }\r\n\r\n try {\r\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const entryPath = path.join(dir, entry.name);\r\n const relativePath = path.relative(rootDir, entryPath);\r\n\r\n // Check ignore patterns\r\n if (matchesIgnorePattern(relativePath, ignorePatterns)) {\r\n continue;\r\n }\r\n\r\n if (entry.isDirectory() || (followSymlinks && entry.isSymbolicLink())) {\r\n // Recurse into directory\r\n const subFiles = await scanDirectory(\r\n entryPath,\r\n rootDir,\r\n extension,\r\n ignorePatterns,\r\n maxDepth,\r\n currentDepth + 1,\r\n followSymlinks\r\n );\r\n files.push(...subFiles);\r\n } else if (entry.isFile() && entry.name.endsWith(`.${extension}`)) {\r\n // Add file\r\n const stat = await fs.promises.stat(entryPath);\r\n files.push({\r\n absolutePath: entryPath,\r\n relativePath,\r\n name: path.basename(entry.name, `.${extension}`),\r\n extension: extension as 'scss' | 'css',\r\n size: stat.size,\r\n mtime: stat.mtime,\r\n depth: currentDepth,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n // Directory read error - skip silently\r\n console.warn(`Warning: Could not read directory ${dir}: ${(error as Error).message}`);\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Scan directories for stylesheet files\r\n *\r\n * @param options Scanner options\r\n * @returns Scanner result with found files\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await scanDirectories({\r\n * directories: ['src/styles/overrides', 'src/styles/custom'],\r\n * extension: 'scss',\r\n * });\r\n *\r\n * console.log(`Found ${result.totalFiles} files`);\r\n * ```\r\n */\r\nexport async function scanDirectories(options: StyleScannerOptions): Promise<StyleScannerResult> {\r\n const {\r\n directories,\r\n extension,\r\n ignorePatterns = DEFAULT_IGNORE_PATTERNS,\r\n followSymlinks = false,\r\n maxDepth = 10,\r\n } = options;\r\n\r\n const files: StyleScannedFile[] = [];\r\n const scannedDirs: string[] = [];\r\n const missingDirs: string[] = [];\r\n\r\n for (const dir of directories) {\r\n const absoluteDir = path.resolve(dir);\r\n\r\n // Check if directory exists\r\n try {\r\n const stat = await fs.promises.stat(absoluteDir);\r\n if (!stat.isDirectory()) {\r\n missingDirs.push(absoluteDir);\r\n continue;\r\n }\r\n } catch {\r\n missingDirs.push(absoluteDir);\r\n continue;\r\n }\r\n\r\n scannedDirs.push(absoluteDir);\r\n\r\n // Scan directory recursively\r\n const foundFiles = await scanDirectory(\r\n absoluteDir,\r\n absoluteDir,\r\n extension,\r\n ignorePatterns,\r\n maxDepth,\r\n 0,\r\n followSymlinks\r\n );\r\n\r\n files.push(...foundFiles);\r\n }\r\n\r\n // Calculate totals\r\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\r\n\r\n return {\r\n files,\r\n directories: scannedDirs,\r\n missingDirectories: missingDirs,\r\n totalFiles: files.length,\r\n totalSize,\r\n };\r\n}\r\n\r\n/**\r\n * Sort scanned files according to specified order\r\n *\r\n * @param files Files to sort\r\n * @param order Sort order\r\n * @returns Sorted files\r\n */\r\nexport function sortFiles(\r\n files: StyleScannedFile[],\r\n order: 'alphabetical' | 'directory-first' = 'alphabetical'\r\n): StyleScannedFile[] {\r\n const sorted = [...files];\r\n\r\n if (order === 'alphabetical') {\r\n sorted.sort((a, b) => a.name.localeCompare(b.name));\r\n } else if (order === 'directory-first') {\r\n sorted.sort((a, b) => {\r\n // First by directory\r\n const dirA = path.dirname(a.relativePath);\r\n const dirB = path.dirname(b.relativePath);\r\n if (dirA !== dirB) {\r\n return dirA.localeCompare(dirB);\r\n }\r\n // Then by name\r\n return a.name.localeCompare(b.name);\r\n });\r\n }\r\n\r\n return sorted;\r\n}\r\n\r\n/**\r\n * Filter files matching patterns\r\n *\r\n * @param files Files to filter\r\n * @param patterns Glob patterns to match\r\n * @param include If true, keep matching files; if false, exclude matching\r\n * @returns Filtered files\r\n */\r\nexport function filterFiles(\r\n files: StyleScannedFile[],\r\n patterns: string[],\r\n include = false\r\n): StyleScannedFile[] {\r\n return files.filter((file) => {\r\n const matches = matchesIgnorePattern(file.relativePath, patterns);\r\n return include ? matches : !matches;\r\n });\r\n}\r\n\r\n/**\r\n * Get default ignore patterns\r\n */\r\nexport function getDefaultIgnorePatterns(): string[] {\r\n return [...DEFAULT_IGNORE_PATTERNS];\r\n}\r\n","/**\r\n * Merge stylesheet content\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { MergeConfig, MergeContent, StyleMergeResult } from './types.js';\r\n\r\n// ============================================================================\r\n// Content Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Generate header comment for merged file\r\n */\r\nfunction generateHeaderComment(_format: 'scss' | 'css'): string {\r\n const timestamp = new Date().toISOString();\r\n const comment = `/**\r\n * DSAi Design Tokens - Merged Bundle\r\n * Generated: ${timestamp}\r\n *\r\n * This file was automatically generated and includes:\r\n * - Generated design tokens\r\n * - Merged additional stylesheets\r\n *\r\n * DO NOT EDIT DIRECTLY - changes will be overwritten on rebuild\r\n */`;\r\n\r\n return comment;\r\n}\r\n\r\n/**\r\n * Generate source comment for section\r\n */\r\nfunction generateSourceComment(source: string, _format: 'scss' | 'css'): string {\r\n return `/* ========== Source: ${source} ========== */`;\r\n}\r\n\r\n// ============================================================================\r\n// Issue Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Detect potential issues in merged content\r\n */\r\nfunction detectMergeIssues(content: string, format: 'scss' | 'css'): string[] {\r\n const warnings: string[] = [];\r\n\r\n // Check for duplicate :root selectors\r\n const rootMatches = content.match(/:root\\s*\\{/g);\r\n const rootCount = rootMatches ? rootMatches.length : 0;\r\n if (rootCount > 1) {\r\n warnings.push(\r\n `Found ${rootCount} :root selectors. Consider consolidating for better performance.`\r\n );\r\n }\r\n\r\n // Check for duplicate CSS custom properties (simplified check)\r\n const customProps = content.match(/--[\\w-]+:/g) ?? [];\r\n const uniqueProps = new Set(customProps);\r\n if (customProps.length > uniqueProps.size) {\r\n warnings.push(\r\n `Found duplicate CSS custom properties. Later definitions will override earlier ones.`\r\n );\r\n }\r\n\r\n // SCSS-specific checks\r\n if (format === 'scss') {\r\n // Check for @import after content\r\n const importAfterContent = /@import\\s+['\"][^'\"]+['\"];?\\s*$/gm;\r\n if (importAfterContent.test(content)) {\r\n warnings.push(`Found @import statements that may not be at the top of the file.`);\r\n }\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Merge stylesheet content in specified order\r\n *\r\n * @param tokenContent Generated token content\r\n * @param userContent User stylesheet content\r\n * @param config Merge configuration\r\n * @returns Merged result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await mergeContent(\r\n * { content: ':root { --color-primary: blue; }', format: 'css' },\r\n * [{ source: 'overrides.css', content: ':root { --color-bg: white; }' }],\r\n * { mergeOrder: 'after' }\r\n * );\r\n * ```\r\n */\r\nexport async function mergeContent(\r\n tokenContent: { content: string; format: 'scss' | 'css' },\r\n userContent: MergeContent[],\r\n config: Partial<MergeConfig> = {}\r\n): Promise<StyleMergeResult> {\r\n const { mergeOrder = 'after' } = config;\r\n\r\n const parts: string[] = [];\r\n const sources: string[] = ['<generated-tokens>'];\r\n const warnings: string[] = [];\r\n\r\n // Add header comment\r\n parts.push(generateHeaderComment(tokenContent.format));\r\n\r\n // Build content based on merge order\r\n if (mergeOrder === 'before') {\r\n // User styles first\r\n for (const content of userContent) {\r\n parts.push(generateSourceComment(content.source, tokenContent.format));\r\n parts.push(content.content);\r\n sources.push(content.source);\r\n }\r\n // Then token styles\r\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\r\n parts.push(tokenContent.content);\r\n } else {\r\n // Token styles first\r\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\r\n parts.push(tokenContent.content);\r\n // Then user styles\r\n for (const content of userContent) {\r\n parts.push(generateSourceComment(content.source, tokenContent.format));\r\n parts.push(content.content);\r\n sources.push(content.source);\r\n }\r\n }\r\n\r\n // Check for potential issues\r\n const mergedContent = parts.join('\\n\\n');\r\n warnings.push(...detectMergeIssues(mergedContent, tokenContent.format));\r\n\r\n return {\r\n content: mergedContent,\r\n sources,\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * Load content from files\r\n *\r\n * @param files File paths to load\r\n * @param type Content type (token or user)\r\n * @param format File format\r\n * @returns Loaded content\r\n */\r\nexport async function loadContent(\r\n files: string[],\r\n type: 'token' | 'user',\r\n format: 'scss' | 'css'\r\n): Promise<MergeContent[]> {\r\n const content: MergeContent[] = [];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const fileContent = await fs.promises.readFile(filePath, 'utf-8');\r\n content.push({\r\n source: filePath,\r\n content: fileContent,\r\n type,\r\n format,\r\n });\r\n } catch (error) {\r\n console.warn(`Failed to load file: ${filePath}`, error);\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\n/**\r\n * Process SCSS imports header\r\n *\r\n * @param importHeader Import header configuration\r\n * @param configDir Config directory for resolving relative paths\r\n * @returns Processed import statements\r\n */\r\nexport function processScssImportHeader(\r\n importHeader: string | string[] | undefined,\r\n configDir: string\r\n): string {\r\n if (!importHeader) {\r\n return '';\r\n }\r\n\r\n const imports = Array.isArray(importHeader) ? importHeader : [importHeader];\r\n const statements: string[] = [];\r\n\r\n for (const importPath of imports) {\r\n // Determine if it's a path or module import\r\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\r\n // Relative or absolute path\r\n const resolvedPath = path.resolve(configDir, importPath);\r\n statements.push(`@import '${resolvedPath}';`);\r\n } else {\r\n // Module import (e.g., 'normalize.css')\r\n statements.push(`@import '${importPath}';`);\r\n }\r\n }\r\n\r\n return `${statements.join('\\n')}\\n\\n`;\r\n}\r\n\r\n/**\r\n * Add SCSS import header to content\r\n *\r\n * @param content SCSS content\r\n * @param importHeader Import header to add\r\n * @param configDir Config directory for resolving paths\r\n * @returns Content with import header\r\n */\r\nexport function addScssImportHeader(\r\n content: string,\r\n importHeader: string | string[] | undefined,\r\n configDir: string\r\n): string {\r\n const header = processScssImportHeader(importHeader, configDir);\r\n if (!header) {\r\n return content;\r\n }\r\n\r\n return header + content;\r\n}\r\n","/**\r\n * Bundle generator for combined stylesheets\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-unsafe-regex */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport { loadContent, mergeContent } from './merger.js';\r\nimport { sortFiles } from './scanner.js';\r\n\r\nimport type { BundleConfig, BundleResult, StyleScannedFile, StyleMergeResult } from './types.js';\r\n\r\n// ============================================================================\r\n// Content Processing\r\n// ============================================================================\r\n\r\n/**\r\n * Remove source comments from content\r\n */\r\nfunction removeSourceComments(content: string): string {\r\n return content.replace(/\\/\\* ========== Source: .+ ========== \\*\\/\\n?/g, '');\r\n}\r\n\r\n/**\r\n * Simple CSS minification\r\n * Note: For production, consider using a proper minifier like cssnano\r\n */\r\nfunction minifyContent(content: string): string {\r\n return (\r\n content\r\n // Remove comments (but keep /*! ... */ license comments)\r\n .replace(/\\/\\*(?!!)[^*]*\\*+([^/*][^*]*\\*+)*\\//g, '')\r\n // Remove whitespace\r\n .replace(/\\s+/g, ' ')\r\n // Remove space around special characters\r\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\r\n // Remove trailing semicolons before closing braces\r\n .replace(/;}/g, '}')\r\n // Remove empty rules\r\n .replace(/[^{}]+\\{\\s*\\}/g, '')\r\n .trim()\r\n );\r\n}\r\n\r\n/**\r\n * Detect output extension based on content\r\n */\r\nfunction detectExtension(mergeResult: StyleMergeResult): string {\r\n const hasScssFeatures = mergeResult.content.match(/@mixin|@include|\\$[a-zA-Z]/);\r\n return hasScssFeatures ? '.scss' : '.css';\r\n}\r\n\r\n/**\r\n * Generate a basic sourcemap\r\n */\r\nfunction generateSourcemap(sources: string[], name: string, extension: string): string {\r\n const sourceMapV3 = {\r\n version: 3,\r\n file: `${name}${extension}`,\r\n sources,\r\n names: [],\r\n mappings: '',\r\n };\r\n\r\n return JSON.stringify(sourceMapV3, null, 2);\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a stylesheet bundle\r\n *\r\n * @param mergeResult Result from merge operation\r\n * @param config Bundle configuration\r\n * @returns Bundle result\r\n *\r\n * @example\r\n * ```typescript\r\n * const bundle = await createBundle(mergeResult, {\r\n * name: 'tokens-bundle',\r\n * outputDir: 'dist',\r\n * includeSourceComments: true,\r\n * sourcemaps: true,\r\n * minify: false,\r\n * });\r\n * ```\r\n */\r\nexport async function createBundle(\r\n mergeResult: StyleMergeResult,\r\n config: BundleConfig\r\n): Promise<BundleResult> {\r\n const { name, outputDir, includeSourceComments, sourcemaps, minify } = config;\r\n\r\n let content = mergeResult.content;\r\n\r\n // Optionally remove source comments\r\n if (!includeSourceComments) {\r\n content = removeSourceComments(content);\r\n }\r\n\r\n // Minify if requested\r\n let minifiedSize: number | undefined;\r\n if (minify) {\r\n const minified = minifyContent(content);\r\n minifiedSize = Buffer.byteLength(minified, 'utf-8');\r\n content = minified;\r\n }\r\n\r\n // Determine output path\r\n const extension = detectExtension(mergeResult);\r\n const outputPath = path.join(outputDir, `${name}${extension}`);\r\n\r\n // Ensure output directory exists\r\n await fs.promises.mkdir(outputDir, { recursive: true });\r\n\r\n // Write bundle\r\n await fs.promises.writeFile(outputPath, content, 'utf-8');\r\n\r\n // Write sourcemap if requested\r\n let sourcemap: string | undefined;\r\n if (sourcemaps) {\r\n sourcemap = generateSourcemap(mergeResult.sources, name, extension);\r\n const mapPath = `${outputPath}.map`;\r\n await fs.promises.writeFile(mapPath, sourcemap, 'utf-8');\r\n\r\n // Add sourcemap reference to content\r\n const mapRef = `\\n/*# sourceMappingURL=${name}${extension}.map */`;\r\n content += mapRef;\r\n await fs.promises.writeFile(outputPath, content, 'utf-8');\r\n }\r\n\r\n return {\r\n content,\r\n sourcemap,\r\n outputPath,\r\n files: mergeResult.sources,\r\n size: Buffer.byteLength(content, 'utf-8'),\r\n minifiedSize,\r\n };\r\n}\r\n\r\n/**\r\n * Create both CSS and SCSS bundles\r\n *\r\n * @param tokenCss Generated CSS tokens\r\n * @param tokenScss Generated SCSS tokens\r\n * @param cssFiles User CSS files (StyleScannedFile objects)\r\n * @param scssFiles User SCSS files (StyleScannedFile objects)\r\n * @param config Bundle configuration\r\n * @returns Map of bundle type to result\r\n */\r\nexport async function createBundles(\r\n tokenCss: string,\r\n tokenScss: string,\r\n cssFiles: StyleScannedFile[],\r\n scssFiles: StyleScannedFile[],\r\n config: Omit<BundleConfig, 'name'> & { baseName?: string }\r\n): Promise<{ css?: BundleResult; scss?: BundleResult }> {\r\n const { baseName = 'tokens-bundle', ...bundleConfig } = config;\r\n const results: { css?: BundleResult; scss?: BundleResult } = {};\r\n\r\n // Create CSS bundle if we have CSS content\r\n const sortedCss = sortFiles(cssFiles);\r\n if (tokenCss || sortedCss.length > 0) {\r\n const userContent = await loadContent(\r\n sortedCss.map((f) => f.absolutePath),\r\n 'user',\r\n 'css'\r\n );\r\n const mergeResult = await mergeContent({ content: tokenCss, format: 'css' }, userContent);\r\n\r\n results.css = await createBundle(mergeResult, {\r\n ...bundleConfig,\r\n name: baseName,\r\n });\r\n }\r\n\r\n // Create SCSS bundle if we have SCSS content\r\n const sortedScss = sortFiles(scssFiles);\r\n if (tokenScss || sortedScss.length > 0) {\r\n const userContent = await loadContent(\r\n sortedScss.map((f) => f.absolutePath),\r\n 'user',\r\n 'scss'\r\n );\r\n const mergeResult = await mergeContent({ content: tokenScss, format: 'scss' }, userContent);\r\n\r\n results.scss = await createBundle(mergeResult, {\r\n ...bundleConfig,\r\n name: `_${baseName}`,\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Create a bundle from scanned files (no token content)\r\n *\r\n * @param files Scanned files to bundle\r\n * @param format Output format\r\n * @param config Bundle configuration\r\n * @returns Bundle result\r\n */\r\nexport async function createBundleFromFiles(\r\n files: StyleScannedFile[],\r\n format: 'css' | 'scss',\r\n config: BundleConfig\r\n): Promise<BundleResult> {\r\n const sorted = sortFiles(files);\r\n const userContent = await loadContent(\r\n sorted.map((f) => f.absolutePath),\r\n 'user',\r\n format\r\n );\r\n\r\n // Create merge result with empty token content\r\n const mergeResult = await mergeContent({ content: '', format }, userContent);\r\n\r\n return createBundle(mergeResult, config);\r\n}\r\n","/**\r\n * Output path resolver with placeholder support\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { OutputFormat } from '../../config/types.js';\r\nimport type { OutputConfig, PlaceholderValues } from '../merge/types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default file names per format\r\n */\r\nexport const DEFAULT_FILE_NAMES: Record<OutputFormat, string> = {\r\n css: 'tokens.css',\r\n scss: '_tokens.scss',\r\n js: 'tokens.js',\r\n ts: 'tokens.ts',\r\n json: 'tokens.json',\r\n android: 'tokens.xml',\r\n ios: 'Tokens.swift',\r\n};\r\n\r\n// ============================================================================\r\n// Placeholder Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Replace placeholders in a string\r\n *\r\n * @param template Template string with placeholders\r\n * @param values Values to replace\r\n * @returns String with placeholders replaced\r\n */\r\nexport function replacePlaceholders(template: string, values: PlaceholderValues): string {\r\n const now = new Date();\r\n\r\n const allValues: Record<string, string> = {\r\n theme: values.theme ?? 'default',\r\n name: values.name ?? 'tokens',\r\n format: values.format ?? '',\r\n date: values.date ?? now.toISOString().split('T')[0] ?? '',\r\n timestamp: values.timestamp ?? now.toISOString(),\r\n };\r\n\r\n let result = template;\r\n for (const [key, value] of Object.entries(allValues)) {\r\n result = result.replaceAll(`{${key}}`, value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Path Resolution\r\n// ============================================================================\r\n\r\n/**\r\n * Resolve output path for a specific format\r\n *\r\n * @param format Output format\r\n * @param config Output configuration\r\n * @param values Placeholder values\r\n * @returns Resolved output path\r\n *\r\n * @example\r\n * ```typescript\r\n * const outputPath = resolveOutputPath('css', {\r\n * baseDir: 'dist',\r\n * formatDirs: { css: 'dist/css' },\r\n * fileNames: { css: 'design-tokens-{theme}.css' },\r\n * }, { theme: 'light' });\r\n *\r\n * // Returns: 'dist/css/design-tokens-light.css'\r\n * ```\r\n */\r\nexport function resolveOutputPath(\r\n format: OutputFormat,\r\n config: OutputConfig,\r\n values: PlaceholderValues = {}\r\n): string {\r\n // Determine directory\r\n const dir = config.formatDirs[format] ?? config.baseDir;\r\n\r\n // Determine file name\r\n let fileName = config.fileNames[format] ?? DEFAULT_FILE_NAMES[format];\r\n\r\n // Replace placeholders\r\n fileName = replacePlaceholders(fileName, values);\r\n\r\n return path.join(dir, fileName);\r\n}\r\n\r\n/**\r\n * Resolve all output paths for all formats\r\n *\r\n * @param formats Formats to generate\r\n * @param config Output configuration\r\n * @param values Placeholder values\r\n * @returns Map of format to output path\r\n */\r\nexport function resolveAllOutputPaths(\r\n formats: OutputFormat[],\r\n config: OutputConfig,\r\n values: PlaceholderValues = {}\r\n): Record<OutputFormat, string> {\r\n const result: Partial<Record<OutputFormat, string>> = {};\r\n\r\n for (const format of formats) {\r\n result[format] = resolveOutputPath(format, config, values);\r\n }\r\n\r\n return result as Record<OutputFormat, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate output paths don't conflict\r\n *\r\n * @param paths Output paths to validate\r\n * @returns Validation result with any conflicts found\r\n */\r\nexport function validateOutputPaths(paths: Record<string, string>): {\r\n valid: boolean;\r\n conflicts: [string, string][];\r\n} {\r\n const conflicts: [string, string][] = [];\r\n const pathToFormat: Record<string, string> = {};\r\n\r\n for (const [format, outputPath] of Object.entries(paths)) {\r\n const normalized = path.normalize(outputPath);\r\n const existingFormat = pathToFormat[normalized];\r\n\r\n if (existingFormat !== undefined) {\r\n conflicts.push([existingFormat, format]);\r\n } else {\r\n pathToFormat[normalized] = format;\r\n }\r\n }\r\n\r\n return {\r\n valid: conflicts.length === 0,\r\n conflicts,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Directory Management\r\n// ============================================================================\r\n\r\n/**\r\n * Ensure all output directories exist\r\n *\r\n * @param paths Output paths\r\n * @returns Created directories\r\n */\r\nexport async function ensureOutputDirs(paths: Record<string, string>): Promise<string[]> {\r\n const directories = new Set<string>();\r\n for (const outputPath of Object.values(paths)) {\r\n directories.add(path.dirname(outputPath));\r\n }\r\n\r\n const created: string[] = [];\r\n for (const dir of directories) {\r\n await fs.promises.mkdir(dir, { recursive: true });\r\n created.push(dir);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Create output configuration from token config\r\n *\r\n * @param tokenConfig Token configuration\r\n * @returns Output configuration\r\n */\r\nexport function createOutputConfig(tokenConfig: {\r\n outputDir?: string;\r\n outputDirs?: Partial<Record<OutputFormat, string>>;\r\n outputFileNames?: Partial<Record<OutputFormat, string>>;\r\n}): OutputConfig {\r\n return {\r\n baseDir: tokenConfig.outputDir ?? 'dist',\r\n formatDirs: tokenConfig.outputDirs ?? {},\r\n fileNames: tokenConfig.outputFileNames ?? {},\r\n createDirs: true,\r\n };\r\n}\r\n","/**\r\n * Style Dictionary Type Definitions\r\n *\r\n * Types for Style Dictionary integration including tokens, transforms,\r\n * formats, preprocessors, and configuration.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/types\r\n */\r\n\r\n// ============================================================================\r\n// Token Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary token (runtime representation)\r\n */\r\nexport interface SDToken {\r\n /** Token name (after name transforms) */\r\n name: string;\r\n\r\n /** Resolved value (after value transforms) */\r\n value: unknown;\r\n\r\n /** Original value (may contain references) */\r\n original: {\r\n value: unknown;\r\n $value?: unknown;\r\n };\r\n\r\n /** Token path segments */\r\n path: string[];\r\n\r\n /** DTCG $value property */\r\n $value?: unknown;\r\n\r\n /** Token type */\r\n type?: string;\r\n\r\n /** DTCG $type property */\r\n $type?: string;\r\n\r\n /** Token description */\r\n description?: string;\r\n\r\n /** DTCG $description property */\r\n $description?: string;\r\n\r\n /** Comment for documentation */\r\n comment?: string;\r\n\r\n /** DTCG $extensions */\r\n $extensions?: Record<string, unknown>;\r\n\r\n /** DTCG $scopes (from Figma Variables) */\r\n $scopes?: string[];\r\n\r\n /** CTI (Category/Type/Item) attributes */\r\n attributes?: {\r\n category?: string;\r\n type?: string;\r\n item?: string;\r\n subitem?: string;\r\n state?: string;\r\n };\r\n\r\n /** File path where token was defined */\r\n filePath?: string;\r\n\r\n /** Whether token is a reference to another token */\r\n isSource?: boolean;\r\n}\r\n\r\n/**\r\n * Style Dictionary dictionary containing all tokens\r\n */\r\nexport interface SDDictionary {\r\n /** Flat array of all tokens */\r\n allTokens: SDToken[];\r\n\r\n /** Nested token structure */\r\n tokens: Record<string, unknown>;\r\n\r\n /** Unfiltered tokens (before platform filtering) */\r\n unfilteredTokens: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Transform Types\r\n// ============================================================================\r\n\r\n/**\r\n * Transform type - what aspect of the token is being transformed\r\n */\r\nexport type TransformType = 'name' | 'value' | 'attribute';\r\n\r\n/**\r\n * Options passed to transform functions\r\n */\r\nexport interface SDTransformOptions {\r\n /** Base font size for rem conversion (default: 16) */\r\n basePxFontSize?: number;\r\n\r\n /** CSS variable prefix */\r\n prefix?: string;\r\n\r\n /** Additional options */\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Transform definition for Style Dictionary\r\n */\r\nexport interface TransformDefinition {\r\n /** Unique transform name (e.g., 'fontWeight/unitless') */\r\n name: string;\r\n\r\n /** Transform type */\r\n type: TransformType;\r\n\r\n /**\r\n * Filter function - return true to apply transform\r\n * If omitted, transform applies to all tokens\r\n */\r\n filter?: (token: SDToken) => boolean;\r\n\r\n /**\r\n * Transform function\r\n * @param token - The token being transformed\r\n * @param options - Transform options from platform config\r\n * @returns Transformed value\r\n */\r\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\r\n}\r\n\r\n/**\r\n * Transform group definition\r\n */\r\nexport interface TransformGroupDefinition {\r\n /** Unique group name (e.g., 'custom/css') */\r\n name: string;\r\n\r\n /** Ordered list of transform names to apply */\r\n transforms: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Format Types\r\n// ============================================================================\r\n\r\n/**\r\n * Platform configuration passed to formats\r\n */\r\nexport interface SDPlatform {\r\n /** Transform group to use */\r\n transformGroup?: string;\r\n\r\n /** Individual transforms (alternative to transformGroup) */\r\n transforms?: string[];\r\n\r\n /** Output path prefix */\r\n buildPath?: string;\r\n\r\n /** Files to generate */\r\n files?: SDFile[];\r\n\r\n /** Platform-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * File configuration for platform output\r\n */\r\nexport interface SDFile {\r\n /** Output file name */\r\n destination: string;\r\n\r\n /** Format to use for generating content */\r\n format: string;\r\n\r\n /**\r\n * Filter tokens to include in this file\r\n * Can be a string (filter name) or function\r\n */\r\n filter?: string | ((token: SDToken) => boolean);\r\n\r\n /** File-specific options passed to format */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Arguments passed to format functions\r\n */\r\nexport interface SDFormatArgs {\r\n /** Dictionary containing all tokens */\r\n dictionary: SDDictionary;\r\n\r\n /** Options from file config */\r\n options: Record<string, unknown>;\r\n\r\n /** Platform configuration */\r\n platform: SDPlatform;\r\n\r\n /** File configuration */\r\n file: SDFile;\r\n}\r\n\r\n/**\r\n * Format definition for Style Dictionary\r\n */\r\nexport interface FormatDefinition {\r\n /** Unique format name (e.g., 'css/variables-with-comments') */\r\n name: string;\r\n\r\n /**\r\n * Format function - generates file content\r\n * @param args - Format arguments\r\n * @returns File content as string\r\n */\r\n format: (args: SDFormatArgs) => string;\r\n}\r\n\r\n// ============================================================================\r\n// Preprocessor Types\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocessor definition for Style Dictionary\r\n */\r\nexport interface PreprocessorDefinition {\r\n /** Unique preprocessor name */\r\n name: string;\r\n\r\n /**\r\n * Preprocessor function - modifies token dictionary before processing\r\n * @param dictionary - Raw token dictionary\r\n * @returns Modified dictionary\r\n */\r\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary log configuration\r\n */\r\nexport interface SDLogConfig {\r\n /** Logging verbosity */\r\n verbosity?: 'default' | 'silent' | 'verbose';\r\n\r\n /** How to handle warnings */\r\n warnings?: 'warn' | 'error' | 'disabled';\r\n\r\n /** How to handle errors */\r\n errors?: 'error' | 'throw';\r\n}\r\n\r\n/**\r\n * Expand configuration for composite tokens\r\n */\r\nexport interface SDExpandConfig {\r\n /** Optional type mapping for composite token properties */\r\n typesMap?: Record<string, string | string[] | Record<string, string | string[]>>;\r\n /** Include specific token types */\r\n include?: string[] | ((token: SDToken, config: SDConfig) => boolean);\r\n /** Exclude specific token types */\r\n exclude?: string[] | ((token: SDToken, config: SDConfig) => boolean);\r\n}\r\n\r\n/**\r\n * Full Style Dictionary configuration\r\n */\r\nexport interface SDConfig {\r\n /** Logging configuration */\r\n log?: SDLogConfig;\r\n\r\n /** Preprocessors to run on source tokens */\r\n preprocessors?: string[];\r\n\r\n /** Configures whether and how composite tokens will be expanded */\r\n expand?: boolean | SDExpandConfig | ((token: SDToken, config: SDConfig) => boolean);\r\n\r\n /** Source token file patterns */\r\n source?: string[];\r\n\r\n /** Additional files to include */\r\n include?: string[];\r\n\r\n /** Platform configurations */\r\n platforms?: Record<string, SDPlatform>;\r\n}\r\n\r\n/**\r\n * Options for creating Style Dictionary configuration\r\n */\r\nexport interface CreateSDConfigOptions {\r\n /** Token source files (glob patterns) */\r\n source?: string[];\r\n\r\n /** CSS variable prefix (default: '--dsai-') */\r\n prefix?: string;\r\n\r\n /** Output directory base path */\r\n buildPath?: string;\r\n\r\n /** Base font size for rem conversion (default: 16) */\r\n baseFontSize?: number;\r\n\r\n /** Whether to output references in generated files */\r\n outputReferences?: boolean;\r\n\r\n /** Additional transforms to register */\r\n customTransforms?: TransformDefinition[];\r\n\r\n /** Additional formats to register */\r\n customFormats?: FormatDefinition[];\r\n\r\n /** Additional preprocessors to register */\r\n customPreprocessors?: PreprocessorDefinition[];\r\n\r\n /** Platforms to include (default: all) */\r\n platforms?: SDPlatformType[];\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Available platform types\r\n */\r\nexport type SDPlatformType = 'css' | 'js' | 'ts' | 'scss' | 'scss-dist' | 'json';\r\n\r\n// ============================================================================\r\n// Registration Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary instance type (for registration functions)\r\n * This is a minimal interface - actual SD has more methods\r\n */\r\nexport interface StyleDictionaryInstance {\r\n registerTransform: (transform: {\r\n name: string;\r\n type: TransformType;\r\n filter?: (token: SDToken) => boolean;\r\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\r\n }) => void;\r\n\r\n registerTransformGroup: (group: { name: string; transforms: string[] }) => void;\r\n\r\n registerFormat: (format: { name: string; format: (args: SDFormatArgs) => string }) => void;\r\n\r\n registerPreprocessor: (preprocessor: {\r\n name: string;\r\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\r\n }) => void;\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a value is an SD token\r\n */\r\nexport function isSDToken(obj: unknown): obj is SDToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const token = obj as Record<string, unknown>;\r\n\r\n // Must have name and path\r\n if (typeof token['name'] !== 'string') {\r\n return false;\r\n }\r\n\r\n if (!Array.isArray(token['path'])) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if token has a DTCG $value\r\n */\r\nexport function hasDTCGValue(token: SDToken): boolean {\r\n return token.$value !== undefined;\r\n}\r\n\r\n/**\r\n * Get token value (DTCG or legacy format)\r\n */\r\nexport function getSDTokenValue(token: SDToken): unknown {\r\n return token.$value ?? token.value;\r\n}\r\n\r\n/**\r\n * Get token type (DTCG or legacy format)\r\n */\r\nexport function getSDTokenType(token: SDToken): string | undefined {\r\n return token.$type ?? token.type;\r\n}\r\n","/**\r\n * Style Dictionary Configuration Generator\r\n *\r\n * Creates Style Dictionary configuration from DSAi config.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/config\r\n */\r\n\r\nimport { registerFormats } from './formats/index.js';\r\nimport { registerTransformGroups } from './groups/index.js';\r\nimport { registerPreprocessors } from './preprocessors/index.js';\r\nimport { registerTransforms } from './transforms/index.js';\r\n\r\nimport type {\r\n CreateSDConfigOptions,\r\n SDConfig,\r\n SDPlatformType,\r\n StyleDictionaryInstance,\r\n} from './types.js';\r\nimport type { ResolvedConfig } from '../../config/types.js';\r\n\r\n/**\r\n * Default source patterns for token files\r\n */\r\nconst DEFAULT_SOURCE_PATTERNS = [\r\n 'collections/color/*.json',\r\n 'collections/typography/*.json',\r\n 'collections/spacing/*.json',\r\n 'collections/border/*.json',\r\n 'collections/shadow/*.json',\r\n 'collections/layout/*.json',\r\n];\r\n\r\n/**\r\n * Default platforms to generate\r\n */\r\nconst DEFAULT_PLATFORMS: SDPlatformType[] = ['css', 'js', 'ts', 'scss', 'scss-dist', 'json'];\r\n\r\n/**\r\n * Create Style Dictionary configuration from DSAi config\r\n *\r\n * Generates a complete Style Dictionary configuration based on\r\n * the resolved DSAi configuration, with sensible defaults.\r\n *\r\n * @param dsaiConfig - Resolved DSAi configuration\r\n * @param options - Additional options to override defaults\r\n * @returns Style Dictionary configuration object\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import { createStyleDictionaryConfig, registerAll } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * const { config } = await loadConfig();\r\n * const sdConfig = createStyleDictionaryConfig(config);\r\n *\r\n * registerAll(StyleDictionary);\r\n *\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\nexport function createStyleDictionaryConfig(\r\n dsaiConfig: ResolvedConfig,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): SDConfig {\r\n const {\r\n source = DEFAULT_SOURCE_PATTERNS,\r\n prefix = dsaiConfig.tokens.prefix,\r\n buildPath = dsaiConfig.tokens.outputDir,\r\n baseFontSize = dsaiConfig.tokens.baseFontSize ?? 16,\r\n outputReferences = dsaiConfig.tokens.outputReferences ?? true,\r\n platforms = DEFAULT_PLATFORMS,\r\n verbose = dsaiConfig.global.debug ?? false,\r\n } = options;\r\n\r\n const config: SDConfig = {\r\n log: {\r\n verbosity: verbose ? 'verbose' : 'default',\r\n warnings: 'warn',\r\n errors: 'error',\r\n },\r\n preprocessors: ['fix-references'],\r\n expand: {\r\n typesMap: {\r\n sizing: 'dimension',\r\n spacing: 'dimension',\r\n borderRadius: 'dimension',\r\n borderWidth: 'dimension',\r\n },\r\n },\r\n source,\r\n platforms: {},\r\n };\r\n\r\n // Ensure buildPath ends with /\r\n const normalizedBuildPath = buildPath.endsWith('/') ? buildPath : `${buildPath}/`;\r\n\r\n const platformConfigs = config.platforms ?? {};\r\n\r\n // CSS Platform\r\n if (platforms.includes('css')) {\r\n platformConfigs['css'] = {\r\n transformGroup: 'custom/css',\r\n buildPath: `${normalizedBuildPath}css/`,\r\n files: [\r\n {\r\n destination: 'variables.css',\r\n format: 'css/variables-with-comments',\r\n options: {\r\n prefix,\r\n // For CSS, we need resolved values, not references\r\n // CSS custom properties cannot reference other tokens using {token.path} syntax\r\n // They need actual values or var(--other-token) syntax\r\n outputReferences: false,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // JavaScript Platform\r\n if (platforms.includes('js')) {\r\n platformConfigs['js'] = {\r\n transformGroup: 'js-custom',\r\n buildPath: `${normalizedBuildPath}js/`,\r\n files: [\r\n {\r\n destination: 'tokens.js',\r\n format: 'javascript/es6',\r\n options: { outputReferences },\r\n },\r\n {\r\n destination: 'tokens.cjs',\r\n format: 'javascript/module',\r\n options: { outputReferences },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // TypeScript Platform\r\n if (platforms.includes('ts')) {\r\n platformConfigs['ts'] = {\r\n transformGroup: 'js-custom',\r\n buildPath: `${normalizedBuildPath}ts/`,\r\n files: [\r\n {\r\n destination: 'tokens.ts',\r\n format: 'javascript/es6',\r\n options: { outputReferences },\r\n },\r\n {\r\n destination: 'tokens.d.ts',\r\n format: 'typescript/declarations',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // SCSS Platform (source - for Bootstrap & DSAi builds)\r\n if (platforms.includes('scss')) {\r\n platformConfigs['scss'] = {\r\n transformGroup: 'custom/scss',\r\n buildPath: 'src/scss/',\r\n files: [\r\n {\r\n destination: '_variables.scss',\r\n format: 'scss/variables',\r\n options: {\r\n outputReferences,\r\n basePxFontSize: baseFontSize,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // SCSS Platform (dist - for npm package consumers)\r\n if (platforms.includes('scss-dist')) {\r\n platformConfigs['scss-dist'] = {\r\n transformGroup: 'custom/scss',\r\n buildPath: `${normalizedBuildPath}scss/`,\r\n files: [\r\n {\r\n destination: '_variables.scss',\r\n format: 'scss/variables',\r\n options: {\r\n outputReferences,\r\n basePxFontSize: baseFontSize,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // JSON Platform (for documentation)\r\n if (platforms.includes('json')) {\r\n platformConfigs['json'] = {\r\n transformGroup: 'js',\r\n buildPath: `${normalizedBuildPath}json/`,\r\n files: [\r\n { destination: 'tokens.json', format: 'json/flat' },\r\n { destination: 'tokens-nested.json', format: 'json/nested' },\r\n ],\r\n };\r\n }\r\n\r\n config.platforms = platformConfigs;\r\n return config;\r\n}\r\n\r\n/**\r\n * Register all custom transforms, formats, preprocessors, and groups\r\n *\r\n * Must be called before creating a Style Dictionary instance with\r\n * a config generated by createStyleDictionaryConfig.\r\n *\r\n * @param sd - Style Dictionary instance (the imported module)\r\n * @param options - Custom extensions to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerAll } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerAll(StyleDictionary, {\r\n * customTransforms: [myCustomTransform],\r\n * customFormats: [myCustomFormat],\r\n * });\r\n * ```\r\n */\r\nexport function registerAll(\r\n sd: StyleDictionaryInstance,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): void {\r\n const { customTransforms = [], customFormats = [], customPreprocessors = [] } = options;\r\n\r\n // Order matters: transforms first, then groups (which reference transforms)\r\n registerTransforms(sd, customTransforms);\r\n registerTransformGroups(sd);\r\n registerFormats(sd, customFormats);\r\n registerPreprocessors(sd, customPreprocessors);\r\n}\r\n\r\n/**\r\n * Create and register a complete Style Dictionary setup\r\n *\r\n * Convenience function that combines registerAll and createStyleDictionaryConfig.\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param dsaiConfig - Resolved DSAi configuration\r\n * @param options - Additional options\r\n * @returns Style Dictionary configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import { setupStyleDictionary } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * const { config } = await loadConfig();\r\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\r\n *\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\nexport function setupStyleDictionary(\r\n sd: StyleDictionaryInstance,\r\n dsaiConfig: ResolvedConfig,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): SDConfig {\r\n registerAll(sd, options);\r\n return createStyleDictionaryConfig(dsaiConfig, options);\r\n}\r\n","/**\r\n * Fix References Preprocessor\r\n *\r\n * Fixes token reference paths that may be mismatched between\r\n * Figma exports and the actual token structure.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors/fix-references\r\n */\r\n\r\nimport type { PreprocessorDefinition } from '../types.js';\r\n\r\n/**\r\n * Default reference path mappings\r\n * Maps incorrect reference paths to correct paths\r\n */\r\nconst DEFAULT_PATH_MAPPINGS: Array<[string, string]> = [\r\n ['{colors.brand.', '{color.'],\r\n ['{colors.neutral.', '{neutral.'],\r\n ['{borders.width.', '{border.width.'],\r\n];\r\n\r\n/**\r\n * Fix a single value's reference path\r\n */\r\nfunction fixValue(value: unknown, mappings: Array<[string, string]>): unknown {\r\n if (typeof value !== 'string' || !value.startsWith('{')) {\r\n return value;\r\n }\r\n\r\n let result = value;\r\n for (const mapping of mappings) {\r\n result = result.split(mapping[0]).join(mapping[1]);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Process tokens recursively to fix reference paths\r\n */\r\nfunction processTokens(obj: Record<string, unknown>, mappings: Array<[string, string]>): void {\r\n for (const key of Object.keys(obj)) {\r\n // eslint-disable-next-line security/detect-object-injection\r\n const value = obj[key];\r\n\r\n if (value && typeof value === 'object') {\r\n const typedValue = value as Record<string, unknown>;\r\n\r\n // DTCG format - fix $value\r\n if ('$value' in typedValue) {\r\n typedValue['$value'] = fixValue(typedValue['$value'], mappings);\r\n }\r\n // Legacy format - fix value\r\n else if ('value' in typedValue) {\r\n typedValue['value'] = fixValue(typedValue['value'], mappings);\r\n }\r\n // Recurse into nested objects\r\n else {\r\n processTokens(typedValue, mappings);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * fix-references preprocessor\r\n *\r\n * Fixes token reference paths that may be mismatched.\r\n * Our tokens use \"color.blue.500\" but Figma exports may reference\r\n * \"{colors.brand.blue.500}\" - this preprocessor fixes the mismatch.\r\n *\r\n * @example\r\n * Before: { $value: \"{colors.brand.primary}\" }\r\n * After: { $value: \"{color.primary}\" }\r\n */\r\nexport const fixReferences: PreprocessorDefinition = {\r\n name: 'fix-references',\r\n preprocessor: (dictionary) => {\r\n processTokens(dictionary, DEFAULT_PATH_MAPPINGS);\r\n return dictionary;\r\n },\r\n};\r\n\r\n/**\r\n * Create a custom fix-references preprocessor with custom mappings\r\n *\r\n * @param mappings - Array of [from, to] path mapping pairs\r\n * @returns Custom preprocessor definition\r\n *\r\n * @example\r\n * ```typescript\r\n * const customFixReferences = createFixReferencesPreprocessor([\r\n * ['{colors.brand.', '{color.'],\r\n * ['{acme.', '{brand.'],\r\n * ]);\r\n * ```\r\n */\r\nexport function createFixReferencesPreprocessor(\r\n mappings: Array<[string, string]>\r\n): PreprocessorDefinition {\r\n return {\r\n name: 'fix-references-custom',\r\n preprocessor: (dictionary) => {\r\n processTokens(dictionary, mappings);\r\n return dictionary;\r\n },\r\n };\r\n}\r\n","/**\r\n * Style Dictionary Preprocessors\r\n *\r\n * Exports all built-in preprocessors and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors\r\n */\r\n\r\nimport { fixReferences } from './fix-references.js';\r\n\r\nimport type { PreprocessorDefinition, StyleDictionaryInstance } from '../types.js';\r\n\r\n/**\r\n * All built-in preprocessors\r\n */\r\nexport const builtInPreprocessors: PreprocessorDefinition[] = [fixReferences];\r\n\r\n/**\r\n * Register all preprocessors with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customPreprocessors - Additional custom preprocessors to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerPreprocessors } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerPreprocessors(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerPreprocessors(\r\n sd: StyleDictionaryInstance,\r\n customPreprocessors: PreprocessorDefinition[] = []\r\n): void {\r\n const allPreprocessors = [...builtInPreprocessors, ...customPreprocessors];\r\n\r\n for (const preprocessor of allPreprocessors) {\r\n sd.registerPreprocessor({\r\n name: preprocessor.name,\r\n preprocessor: preprocessor.preprocessor,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual preprocessors\r\nexport { fixReferences, createFixReferencesPreprocessor } from './fix-references.js';\r\n","/**\r\n * Style Dictionary Integration Module\r\n *\r\n * Provides reusable transforms, formats, preprocessors, and configuration\r\n * generation for Style Dictionary token builds.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import {\r\n * setupStyleDictionary,\r\n * registerAll,\r\n * createStyleDictionaryConfig,\r\n * } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * // Option 1: All-in-one setup\r\n * const { config } = await loadConfig();\r\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n *\r\n * // Option 2: Manual registration\r\n * registerAll(StyleDictionary);\r\n * const sdConfig = createStyleDictionaryConfig(config);\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n // Token types\r\n SDToken,\r\n SDDictionary,\r\n // Transform types\r\n TransformType,\r\n SDTransformOptions,\r\n TransformDefinition,\r\n TransformGroupDefinition,\r\n // Format types\r\n SDPlatform,\r\n SDFile,\r\n SDFormatArgs,\r\n FormatDefinition,\r\n // Preprocessor types\r\n PreprocessorDefinition,\r\n // Config types\r\n SDLogConfig,\r\n SDConfig,\r\n CreateSDConfigOptions,\r\n SDPlatformType,\r\n // Registration types\r\n StyleDictionaryInstance,\r\n} from './types.js';\r\n\r\n// Type guards\r\nexport { isSDToken, hasDTCGValue, getSDTokenValue, getSDTokenType } from './types.js';\r\n\r\n// ============================================================================\r\n// Config Generation\r\n// ============================================================================\r\n\r\nexport { createStyleDictionaryConfig, registerAll, setupStyleDictionary } from './config.js';\r\n\r\n// ============================================================================\r\n// Transforms\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInTransforms,\r\n // Registration\r\n registerTransforms,\r\n // Individual transforms\r\n fontWeightUnitless,\r\n lineHeightUnitless,\r\n dimensionRem,\r\n nameKebab,\r\n} from './transforms/index.js';\r\n\r\n// ============================================================================\r\n// Formats\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInFormats,\r\n // Registration\r\n registerFormats,\r\n // Individual formats\r\n cssVariablesWithComments,\r\n typescriptDeclarations,\r\n} from './formats/index.js';\r\n\r\n// ============================================================================\r\n// Preprocessors\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInPreprocessors,\r\n // Registration\r\n registerPreprocessors,\r\n // Individual preprocessors\r\n fixReferences,\r\n createFixReferencesPreprocessor,\r\n} from './preprocessors/index.js';\r\n\r\n// ============================================================================\r\n// Transform Groups\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n transformGroups,\r\n // Registration\r\n registerTransformGroups,\r\n // Individual groups\r\n cssTransformGroup,\r\n jsTransformGroup,\r\n scssTransformGroup,\r\n} from './groups/index.js';\r\n","/**\r\n * Framework Mappers\r\n *\r\n * Maps Figma/DTCG token names to framework-specific variable names.\r\n * Supports Bootstrap, shadcn/ui, Tailwind, MUI, and custom mappings.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nexport {\r\n bootstrapMapper,\r\n BOOTSTRAP_MAPPINGS,\r\n BOOTSTRAP_PATTERNS,\r\n mapToBootstrapName,\r\n} from './bootstrap.js';\r\nexport { shadcnMapper, SHADCN_MAPPINGS, mapToShadcnName } from './shadcn.js';\r\nexport {\r\n createFrameworkMapper,\r\n getFrameworkMapper,\r\n applyNameMapping,\r\n type FrameworkMapper,\r\n type FrameworkMapperWithConfig,\r\n} from './mapper.js';\r\nexport type {\r\n FrameworkTarget,\r\n FrameworkMappingConfig,\r\n FrameworkMappingPattern,\r\n} from '../../config/types.js';\r\n","/**\r\n * Token Changelog Generator\r\n *\r\n * Generates human-readable changelogs from token diffs in Markdown format.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { writeFile, readFile } from 'node:fs/promises';\r\n\r\nimport type { TokenDiff, TokenChange } from './diff.js';\r\nimport type { TokenCollection } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for changelog generation\r\n */\r\nexport interface ChangelogOptions {\r\n /** Version number (e.g., '1.2.0') */\r\n version?: string;\r\n /** Release date (defaults to today) */\r\n date?: Date;\r\n /** Custom header for the changelog entry */\r\n header?: string;\r\n /** Whether to include descriptions */\r\n includeDescriptions?: boolean;\r\n /** Whether to include value changes (before/after) */\r\n includeValues?: boolean;\r\n /** Maximum value length to display (truncates longer values) */\r\n maxValueLength?: number;\r\n /** Whether to group by change type */\r\n groupByType?: boolean;\r\n}\r\n\r\n/**\r\n * Result of changelog generation\r\n */\r\nexport interface ChangelogResult {\r\n /** Generated Markdown content */\r\n content: string;\r\n /** Number of entries in the changelog */\r\n entryCount: number;\r\n /** Whether there are breaking changes */\r\n hasBreaking: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Format a date as YYYY-MM-DD\r\n */\r\nfunction formatDate(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(date.getUTCDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n/**\r\n * Format a value for display (truncate if too long)\r\n */\r\nfunction formatValue(value: unknown, maxLength = 100): string {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n\r\n if (str.length <= maxLength) {\r\n return str;\r\n }\r\n\r\n return `${str.slice(0, maxLength)}...`;\r\n}\r\n\r\n/**\r\n * Escape Markdown special characters\r\n */\r\nfunction escapeMarkdown(text: string): string {\r\n return text.replace(/[*_`[\\]]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Generate Markdown for a single token change\r\n */\r\nfunction formatChange(change: TokenChange, options: ChangelogOptions): string {\r\n const lines: string[] = [];\r\n\r\n // Token path with breaking indicator\r\n const breaking = change.breaking ? ' ⚠️ **BREAKING**' : '';\r\n lines.push(`- \\`${escapeMarkdown(change.path)}\\`${breaking}`);\r\n\r\n // Description\r\n if (options.includeDescriptions && change.description) {\r\n lines.push(` - ${change.description}`);\r\n }\r\n\r\n // Value change details\r\n if (options.includeValues && change.valueChange) {\r\n const { oldValue, newValue, oldType, newType } = change.valueChange;\r\n\r\n if (change.type === 'type-changed') {\r\n lines.push(` - Type: \\`${oldType}\\` → \\`${newType}\\``);\r\n }\r\n\r\n const oldFormatted = formatValue(oldValue, options.maxValueLength);\r\n const newFormatted = formatValue(newValue, options.maxValueLength);\r\n\r\n if (change.type === 'modified' || change.type === 'type-changed') {\r\n lines.push(` - Before: \\`${escapeMarkdown(oldFormatted)}\\``);\r\n lines.push(` - After: \\`${escapeMarkdown(newFormatted)}\\``);\r\n }\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Generate a section for a specific change type\r\n */\r\nfunction formatSection(title: string, changes: TokenChange[], options: ChangelogOptions): string {\r\n if (changes.length === 0) {\r\n return '';\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push(`### ${title}`);\r\n lines.push('');\r\n\r\n for (const change of changes) {\r\n lines.push(formatChange(change, options));\r\n }\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Generate a changelog entry from a token diff\r\n *\r\n * @param diff - Token diff to generate changelog from\r\n * @param options - Changelog options\r\n * @returns Generated changelog content\r\n */\r\nexport function generateChangelog(\r\n diff: TokenDiff,\r\n options: ChangelogOptions = {}\r\n): ChangelogResult {\r\n const {\r\n version = 'Unreleased',\r\n date = new Date(),\r\n header,\r\n includeDescriptions = true,\r\n includeValues = true,\r\n maxValueLength = 100,\r\n groupByType = true,\r\n } = options;\r\n\r\n const lines: string[] = [];\r\n\r\n // Header\r\n if (header) {\r\n lines.push(header);\r\n } else {\r\n const dateStr = formatDate(date);\r\n lines.push(`## [${version}] - ${dateStr}`);\r\n }\r\n\r\n lines.push('');\r\n\r\n // Summary\r\n if (diff.totalChanges === 0) {\r\n lines.push('No changes.');\r\n lines.push('');\r\n return {\r\n content: lines.join('\\n'),\r\n entryCount: 0,\r\n hasBreaking: false,\r\n };\r\n }\r\n\r\n if (diff.hasBreaking) {\r\n lines.push('⚠️ **This release contains breaking changes**');\r\n lines.push('');\r\n }\r\n\r\n lines.push(`**Total changes:** ${diff.totalChanges}`);\r\n lines.push('');\r\n\r\n // Group changes by type\r\n if (groupByType) {\r\n // Breaking changes first\r\n if (diff.removed.length > 0 || diff.typeChanged.length > 0) {\r\n lines.push(\r\n formatSection('Breaking Changes', [...diff.removed, ...diff.typeChanged], {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Added tokens\r\n if (diff.added.length > 0) {\r\n lines.push(\r\n formatSection('Added', diff.added, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues: false, // No before/after for additions\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Modified tokens\r\n if (diff.modified.length > 0) {\r\n lines.push(\r\n formatSection('Changed', diff.modified, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Deprecated tokens\r\n if (diff.deprecated.length > 0) {\r\n lines.push(\r\n formatSection('Deprecated', diff.deprecated, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues: false,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n } else {\r\n // Flat list of all changes\r\n const allChanges = [\r\n ...diff.removed,\r\n ...diff.typeChanged,\r\n ...diff.added,\r\n ...diff.modified,\r\n ...diff.deprecated,\r\n ];\r\n\r\n for (const change of allChanges) {\r\n lines.push(\r\n formatChange(change, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n lines.push('');\r\n }\r\n\r\n return {\r\n content: lines.join('\\n'),\r\n entryCount: diff.totalChanges,\r\n hasBreaking: diff.hasBreaking,\r\n };\r\n}\r\n\r\n/**\r\n * Write changelog to file (append mode)\r\n *\r\n * @param content - Changelog content to write\r\n * @param filePath - Path to changelog file\r\n * @returns Whether the write was successful\r\n */\r\nexport async function writeChangelog(content: string, filePath: string): Promise<boolean> {\r\n try {\r\n let finalContent = content;\r\n\r\n // If file exists, prepend new content\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (existsSync(filePath)) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const existingContent = await readFile(filePath, 'utf-8');\r\n\r\n // Check if there's a header (# Changelog)\r\n const hasHeader = existingContent.trim().startsWith('#');\r\n\r\n if (hasHeader) {\r\n // Insert after first line\r\n const lines = existingContent.split('\\n');\r\n const header = lines[0];\r\n const rest = lines.slice(1).join('\\n');\r\n finalContent = `${header}\\n\\n${content}${rest}`;\r\n } else {\r\n // Prepend\r\n finalContent = `${content}\\n${existingContent}`;\r\n }\r\n } else {\r\n // Create new file with header\r\n finalContent = `# Changelog\\n\\nAll notable changes to design tokens will be documented in this file.\\n\\n${content}`;\r\n }\r\n\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n await writeFile(filePath, finalContent, 'utf-8');\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to write changelog:', error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Generate and write changelog in one step\r\n *\r\n * @param diff - Token diff to generate changelog from\r\n * @param filePath - Path to changelog file\r\n * @param options - Changelog options\r\n * @returns Result of changelog generation\r\n */\r\nexport async function generateAndWriteChangelog(\r\n diff: TokenDiff,\r\n filePath: string,\r\n options: ChangelogOptions = {}\r\n): Promise<ChangelogResult & { written: boolean }> {\r\n const result = generateChangelog(diff, options);\r\n const written = await writeChangelog(result.content, filePath);\r\n\r\n return {\r\n ...result,\r\n written,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for generating changelog from two token files\r\n *\r\n * @param oldTokensPath - Path to old/previous tokens file\r\n * @param newTokensPath - Path to new/current tokens file\r\n * @param outputPath - Path to changelog file (default: 'TOKENS-CHANGELOG.md')\r\n * @param version - Version number for the changelog entry\r\n * @returns Whether the operation was successful\r\n */\r\nexport async function generateChangelogCLI(\r\n oldTokensPath: string,\r\n newTokensPath: string,\r\n outputPath = 'TOKENS-CHANGELOG.md',\r\n version?: string\r\n): Promise<boolean> {\r\n /* eslint-disable no-console */\r\n try {\r\n console.log('📝 Generating token changelog...\\n');\r\n\r\n // Import required modules dynamically\r\n const { readFile: fsReadFile } = await import('node:fs/promises');\r\n const { diffTokens: diffFn } = await import('./diff.js');\r\n\r\n // Load token files\r\n console.log(`📖 Reading old tokens: ${oldTokensPath}`);\r\n const oldContent = await fsReadFile(oldTokensPath, 'utf-8');\r\n const oldTokens = JSON.parse(oldContent) as TokenCollection;\r\n\r\n console.log(`📖 Reading new tokens: ${newTokensPath}`);\r\n const newContent = await fsReadFile(newTokensPath, 'utf-8');\r\n const newTokens = JSON.parse(newContent) as TokenCollection;\r\n\r\n // Compute diff\r\n console.log('🔍 Computing differences...');\r\n const diff = diffFn(oldTokens, newTokens);\r\n\r\n if (diff.totalChanges === 0) {\r\n console.log('✨ No changes detected.');\r\n return true;\r\n }\r\n\r\n console.log(`\\n📊 Summary:`);\r\n console.log(` • Total changes: ${diff.totalChanges}`);\r\n if (diff.added.length > 0) {\r\n console.log(` • Added: ${diff.added.length}`);\r\n }\r\n if (diff.removed.length > 0) {\r\n console.log(` • Removed: ${diff.removed.length} ⚠️`);\r\n }\r\n if (diff.modified.length > 0) {\r\n console.log(` • Modified: ${diff.modified.length}`);\r\n }\r\n if (diff.typeChanged.length > 0) {\r\n console.log(` • Type changed: ${diff.typeChanged.length} ⚠️`);\r\n }\r\n if (diff.deprecated.length > 0) {\r\n console.log(` • Deprecated: ${diff.deprecated.length}`);\r\n }\r\n\r\n if (diff.hasBreaking) {\r\n console.log('\\n⚠️ Warning: This release contains breaking changes!');\r\n }\r\n\r\n // Generate and write changelog\r\n console.log(`\\n📄 Writing changelog to: ${outputPath}`);\r\n const result = await generateAndWriteChangelog(diff, outputPath, {\r\n version,\r\n includeDescriptions: true,\r\n includeValues: true,\r\n });\r\n\r\n if (result.written) {\r\n console.log('✅ Changelog generated successfully!');\r\n return true;\r\n } else {\r\n console.error('❌ Failed to write changelog file');\r\n return false;\r\n }\r\n } catch (error) {\r\n console.error('❌ Error generating changelog:', error);\r\n return false;\r\n }\r\n /* eslint-enable no-console */\r\n}\r\n","/**\r\n * @file Token Tooling Module\r\n * @description Provides utilities for token validation, transformation,\r\n * and build orchestration using Style Dictionary.\r\n *\r\n * @module @dsai-io/tools/tokens\r\n */\r\n\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n // Core token types\r\n DTCGToken,\r\n LegacyToken,\r\n Token,\r\n TokenType,\r\n TokenCollection,\r\n // Figma types\r\n FigmaCollection,\r\n FigmaExport,\r\n // Validation types\r\n ValidationSeverity,\r\n ValidationIssue,\r\n ValidateOptions,\r\n // Build types\r\n BuildOptions,\r\n BuildResult,\r\n BuildStep,\r\n // Sync types\r\n SyncOptions,\r\n SyncResult,\r\n // Postprocess types\r\n PostprocessOptions,\r\n PostprocessResult,\r\n ReplacementRule,\r\n // Merge types\r\n MergeOptions,\r\n MergeResult,\r\n} from './types.js';\r\n\r\n// Re-export with prefixed names to avoid conflicts with config module\r\nexport type {\r\n ValidationResult as TokenValidationResult,\r\n TransformOptions as TokenTransformOptions,\r\n TransformResult as TokenTransformResult,\r\n} from './types.js';\r\n\r\n// Mode extraction and preprocessing types\r\nexport type {\r\n ModeExtractionOptions,\r\n ModeExtractionResult,\r\n} from './mode-extractor.js';\r\n\r\nexport type {\r\n PreprocessorConfig,\r\n FilePreprocessingResult,\r\n PreprocessingResult,\r\n} from './mode-preprocessor.js';\r\n\r\n// ============================================================================\r\n// Type Guards and Utility Functions\r\n// ============================================================================\r\n\r\nexport {\r\n // Type guards\r\n isDTCGToken,\r\n isLegacyToken,\r\n isToken,\r\n isValidTokenType,\r\n isTokenReference,\r\n // Token utilities\r\n getTokenValue,\r\n getTokenType,\r\n getTokenDescription,\r\n toDTCGToken,\r\n parseTokenReference,\r\n // Constants\r\n VALID_TOKEN_TYPES,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Validation Module\r\n// ============================================================================\r\n\r\nexport { validateTokens, validateTokensCLI } from './validate.js';\r\n\r\n// ============================================================================\r\n// Schema Validation Module\r\n// ============================================================================\r\n\r\nexport {\r\n // DTCG schemas\r\n dtcgFileSchema,\r\n dtcgTokenCollectionSchema,\r\n dtcgTokenSchema,\r\n // Figma schemas\r\n figmaExportSchema,\r\n figmaExportWithMetadataSchema,\r\n figmaVariablesResponseSchema,\r\n // Style Dictionary schemas\r\n styleDictionaryInputSchema,\r\n styleDictionaryTokenSchema,\r\n // Validation functions\r\n validateDTCGFile,\r\n validateDTCGTokens,\r\n validateFigmaExport,\r\n validateFigmaExportWithMetadata,\r\n validateFigmaVariablesResponse,\r\n validateStyleDictionaryInput,\r\n validateStyleDictionaryTokens,\r\n} from './schemas/index.js';\r\n\r\nexport type {\r\n // Schema types\r\n DTCGFile,\r\n DTCGTokenCollection,\r\n FigmaExportWithMetadata,\r\n FigmaVariablesResponse,\r\n // Validation types\r\n ValidationError as SchemaValidationError,\r\n ValidationOptions as SchemaValidationOptions,\r\n ValidationResult as SchemaValidationResult,\r\n} from './schemas/index.js';\r\n\r\n// ============================================================================\r\n// Figma Validation Module\r\n// ============================================================================\r\n\r\nexport {\r\n validateFigmaExports,\r\n validateFigmaFile,\r\n validateFigmaCLI,\r\n detectModes as detectFigmaModes,\r\n} from './validate-figma.js';\r\n\r\n// ============================================================================\r\n// Transform Module\r\n// ============================================================================\r\n\r\nexport {\r\n transformTokens,\r\n transformTokensCLI,\r\n transformToken,\r\n transformTokenTree,\r\n transformType,\r\n transformValue,\r\n detectModes as detectTransformModes,\r\n} from './transform.js';\r\n\r\n// ============================================================================\r\n// Sync Module\r\n// ============================================================================\r\n\r\nexport { syncTokens, syncTokensCLI, getDefaultSyncPaths } from './sync.js';\r\n\r\n// ============================================================================\r\n// Build Module\r\n// ============================================================================\r\n\r\nexport { buildTokens, buildTokensCLI, runBuildCLI } from './build.js';\r\n\r\n// ============================================================================\r\n// Theme Discovery Module\r\n// ============================================================================\r\n\r\nexport {\r\n discoverThemeFiles,\r\n getThemeFiles,\r\n autoDetectThemes,\r\n} from './theme-discovery.js';\r\n\r\nexport type {\r\n ThemeFilesResult,\r\n DiscoveryResult,\r\n DiscoveryOptions,\r\n} from './theme-discovery.js';\r\n\r\n// ============================================================================\r\n// Mode Extraction and Preprocessing Module\r\n// ============================================================================\r\n\r\nexport {\r\n extractMode,\r\n extractModes,\r\n detectModes,\r\n flattenModeStructure,\r\n} from './mode-extractor.js';\r\n\r\nexport {\r\n preprocessFile,\r\n preprocessTokenFiles,\r\n getPreprocessedFilesForMode,\r\n} from './mode-preprocessor.js';\r\n\r\n// ============================================================================\r\n// Theme Builder Module\r\n// ============================================================================\r\n\r\nexport {\r\n buildTheme,\r\n buildAllThemes,\r\n generateThemeBuildConfig,\r\n getCssFormat,\r\n getThemeSelector,\r\n validateThemeDefinitions,\r\n} from './theme-builder.js';\r\n\r\nexport type {\r\n ThemeBuildConfig,\r\n ThemeBuildOptions,\r\n ThemeBuildResult,\r\n MultiThemeBuildOptions,\r\n MultiThemeBuildResult,\r\n ThemeStyleDictionaryConfig,\r\n StyleDictionaryPlatformConfig,\r\n StyleDictionaryFileConfig,\r\n} from './theme-builder.js';\r\n\r\n// ============================================================================\r\n// Clean Module\r\n// ============================================================================\r\n\r\nexport {\r\n cleanTokenOutputs,\r\n cleanTokensCLI,\r\n DEFAULT_CLEAN_DIRECTORIES,\r\n} from './clean.js';\r\n\r\nexport type {\r\n CleanOptions,\r\n CleanResult,\r\n CleanedDirectory,\r\n} from './clean.js';\r\n\r\n// ============================================================================\r\n// Postprocess Module\r\n// ============================================================================\r\n\r\nexport {\r\n postprocessCss,\r\n postprocessCssFiles,\r\n postprocessCLI,\r\n getDefaultCssDir,\r\n getDefaultFiles,\r\n getDefaultTransformations,\r\n} from './postprocess.js';\r\n\r\n// ============================================================================\r\n// Merge Module (Token Collections)\r\n// ============================================================================\r\n\r\nexport { mergeCollections, mergeCollectionsCLI } from './merge.js';\r\n\r\n// ============================================================================\r\n// Style Merge Module (CSS/SCSS Bundling)\r\n// ============================================================================\r\n\r\nexport * from './merge/index.js';\r\n\r\n// ============================================================================\r\n// Output Path Resolution\r\n// ============================================================================\r\n\r\nexport * from './output/index.js';\r\n\r\n// ============================================================================\r\n// Style Dictionary Integration\r\n// ============================================================================\r\n\r\n// Re-export all Style Dictionary types and utilities\r\nexport * from './style-dictionary/index.js';\r\n\r\n// ============================================================================\r\n// Framework Mappers\r\n// ============================================================================\r\n\r\n// Re-export framework mapping utilities\r\nexport * from './framework-mappers/index.js';\r\n\r\n// ============================================================================\r\n// Changelog Generation\r\n// ============================================================================\r\n\r\nexport {\r\n generateChangelog,\r\n writeChangelog,\r\n generateAndWriteChangelog,\r\n generateChangelogCLI,\r\n} from './changelog.js';\r\n\r\nexport type {\r\n ChangelogOptions,\r\n ChangelogResult,\r\n} from './changelog.js';\r\n\r\nexport {\r\n diffTokens,\r\n summarizeDiff,\r\n filterDiff,\r\n getBreakingChanges,\r\n} from './diff.js';\r\n\r\nexport type {\r\n TokenChangeType,\r\n TokenValueChange,\r\n TokenChange,\r\n TokenDiff,\r\n} from './diff.js';\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/tokens/style-dictionary/formats/css-dark-mode.ts","../../src/tokens/style-dictionary/formats/css-variables.ts","../../src/tokens/style-dictionary/formats/javascript.ts","../../src/tokens/framework-mappers/bootstrap.ts","../../src/tokens/framework-mappers/shadcn.ts","../../src/tokens/framework-mappers/mapper.ts","../../src/tokens/style-dictionary/formats/scss-framework.ts","../../src/tokens/style-dictionary/formats/typescript.ts","../../src/tokens/style-dictionary/formats/index.ts","../../src/tokens/style-dictionary/transforms/dimension.ts","../../src/tokens/style-dictionary/transforms/font-weight.ts","../../src/tokens/style-dictionary/transforms/line-height.ts","../../src/tokens/style-dictionary/transforms/name-js-identifier.ts","../../src/tokens/style-dictionary/transforms/name.ts","../../src/tokens/style-dictionary/transforms/index.ts","../../src/tokens/style-dictionary/groups/css.ts","../../src/tokens/style-dictionary/groups/js.ts","../../src/tokens/style-dictionary/groups/scss.ts","../../src/tokens/style-dictionary/groups/index.ts","../../src/tokens/style-dictionary/preprocessors/fix-references.ts","../../src/tokens/style-dictionary/preprocessors/index.ts","../../src/tokens/diff.ts","../../src/tokens/types.ts","../../src/tokens/validate.ts","../../src/tokens/schemas/dtcg-token.schema.ts","../../src/tokens/schemas/figma-export.schema.ts","../../src/tokens/schemas/style-dictionary.schema.ts","../../src/tokens/schemas/index.ts","../../src/tokens/validate-figma.ts","../../src/tokens/transform.ts","../../src/tokens/sync.ts","../../src/tokens/cache.ts","../../src/tokens/incremental.ts","../../src/tokens/mode-extractor.ts","../../src/tokens/mode-preprocessor.ts","../../src/tokens/postprocess.ts","../../src/tokens/snapshot.ts","../../src/tokens/theme-builder.ts","../../src/tokens/theme-discovery.ts","../../src/tokens/build.ts","../../src/tokens/clean.ts","../../src/tokens/merge.ts","../../src/tokens/merge/scanner.ts","../../src/tokens/merge/merger.ts","../../src/tokens/merge/bundler.ts","../../src/tokens/output/resolver.ts","../../src/tokens/style-dictionary/types.ts","../../src/tokens/style-dictionary/config.ts","../../src/tokens/style-dictionary/index.ts","../../src/tokens/framework-mappers/index.ts","../../src/tokens/changelog.ts","../../src/tokens/index.ts"],"names":["cssVariablesWithComments","path","BOOTSTRAP_MAPPINGS","BOOTSTRAP_PATTERNS","bootstrapMapper","SHADCN_MAPPINGS","shadcnMapper","mapper","toPascalCaseSegment","toJsIdentifier","typescriptDeclarations","builtInFormats","dimensionRem","fontWeightUnitless","DEFAULT_BASE_FONT_SIZE","lineHeightUnitless","nameKebab","builtInTransforms","cssTransformGroup","jsTransformGroup","scssTransformGroup","transformGroups","fixReferences","builtInPreprocessors","isToken","getTokenValue","getTokenType","getTokenDescription","readFileSync","existsSync","readdirSync","join","statSync","relative","z","basename","extname","countTokens","DEFAULT_COLLECTIONS","dirname","mkdirSync","detectModes","writeFileSync","createHash","fs","getNestedValue","parse","rmSync","resolve","registerTransformGroups","registerPreprocessors","fg","execSync","outputDir","duration","path2","fs2","path3","path4","fs3","path5","fs4","readFile","writeFile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IA4Ba,oBAAA;AA5Bb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sDAAA,GAAA;AA4BO,IAAM,oBAAA,GAAyC;AAAA,MACpD,IAAA,EAAM,yBAAA;AAAA,MACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAA4B;AACzD,QAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,QAAQ,CAAA,IAAgB,IAAA;AAChD,QAAA,MAAM,QAAA,GAAY,OAAA,CAAQ,UAAU,CAAA,IAAgB,wBAAA;AAEpD,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACpD,UAAA,MAAM,QAAkB,EAAC;AAGzB,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,UACvC;AAGA,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAChD,UAAA,IAAI,WAAA,IAAe,WAAA,KAAgB,KAAA,CAAM,OAAA,EAAS;AAChD,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,WAAW,CAAA,GAAA,CAAK,CAAA;AAAA,UACrC;AAGA,UAAA,MAAM,aAAa,KAAA,CAAM,MAAA,KAAW,MAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACrE,UAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,GAAa,IAAA,CAAK,UAAU,UAAU,CAAA;AAGrF,UAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhD,UAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACxB,CAAC,CAAA;AAED,QAAA,OAAO,GAAG,QAAQ,CAAA;AAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,MAC/C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjCaA;AA3Bb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sDAAA,GAAA;AA2BO,IAAMA,gCAAA,GAA6C;AAAA,MACxD,IAAA,EAAM,6BAAA;AAAA,MACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAA4B;AACzD,QAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,QAAQ,CAAA,IAAgB,IAAA;AAEhD,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACpD,UAAA,MAAM,QAAkB,EAAC;AAGzB,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,UACvC;AAGA,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAChD,UAAA,IAAI,WAAA,IAAe,WAAA,KAAgB,KAAA,CAAM,OAAA,EAAS;AAChD,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,WAAW,CAAA,GAAA,CAAK,CAAA;AAAA,UACrC;AAGA,UAAA,MAAM,aAAa,KAAA,CAAM,MAAA,KAAW,MAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACrE,UAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,GAAa,IAAA,CAAK,UAAU,UAAU,CAAA;AAGrF,UAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhD,UAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACxB,CAAC,CAAA;AAED,QAAA,OAAO,CAAA;AAAA,EAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3CA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAG7C,EAAA,MAAM,MAAA,GAAS,OAAA,CACZ,KAAA,CAAM,eAAe,CAAA,CACrB,OAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CACxE,IAAA,CAAK,EAAE,CAAA;AAGV,EAAA,OAAO,kBAAA,GAAqB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAC7C;AAKA,SAAS,eAAeC,KAAAA,EAAwB;AAC9C,EAAA,OAAOA,KAAAA,CAAK,GAAA,CAAI,mBAAmB,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9C;AAlCA,IAyCa,aAAA;AAzCb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mDAAA,GAAA;AAyCO,IAAM,aAAA,GAAkC;AAAA,MAC7C,IAAA,EAAM,qBAAA;AAAA,MACN,QAAQ,CAAC,EAAE,UAAA,EAAY,IAAA,EAAM,SAAQ,KAAM;AACzC,QAAA,MAAM,SAAS,UAAA,CAAW,SAAA;AAE1B,QAAA,MAAM,QAAA,GAAW,OAAA,GAAU,UAAU,CAAA,IAAK,KAAA;AAE1C,QAAA,IAAI,MAAA,GAAS,CAAA;AAAA,GAAA,EAAW,KAAK,WAAW;AAAA;AAAA;AAAA;;AAAA,CAAA;AAExC,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AAGtC,UAAA,MAAM,UAAA,GAAa,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,KAAA;AACnD,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAGvC,UAAA,MAAM,UAAU,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,YAAA,IAAgB,MAAM,WAAA,IAAe,EAAA;AAE5E,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAA,IAAU,MAAM,OAAO;AAAA,CAAA;AAAA,UACzB;AACA,UAAA,MAAA,IAAU,CAAA,aAAA,EAAgB,IAAI,CAAA,GAAA,EAAM,KAAK,CAAA;AAAA,CAAA;AAAA,QAC3C;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC8MO,SAAS,mBAAmB,SAAA,EAA2B;AAE5D,EAAA,MAAM,cAAc,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQC,0BAAkB,CAAC,CAAA;AAC9D,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,SAAA;AAAA,EACvC;AAGA,EAAA,KAAA,MAAW,WAAWC,0BAAA,EAAoB;AAExC,IAAA,IAAI,QAAQ,OAAA,YAAmB,MAAA,IAAU,QAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACxE,MAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAC/D;AAAA,EACF;AAGA,EAAA,OAAO,SAAA;AACT;AAnQaD,qCAkLAC,mCAAA,CAAA,CAoBAC;AAvOb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAiCO,IAAMF,0BAAA,GAA6C;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxD,sBAAA,EAAwB,gBAAA;AAAA,MACxB,oBAAA,EAAsB,cAAA;AAAA,MACtB,sBAAA,EAAwB,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMxB,6BAAA,EAA+B,qBAAA;AAAA,MAC/B,oCAAA,EAAsC,qBAAA;AAAA,MACtC,8BAAA,EAAgC,mBAAA;AAAA,MAChC,gCAAA,EAAkC,oBAAA;AAAA,MAClC,+BAAA,EAAiC,oBAAA;AAAA,MACjC,kCAAA,EAAoC,sBAAA;AAAA,MACpC,6BAAA,EAA+B,kBAAA;AAAA,MAC/B,mCAAA,EAAqC,kBAAA;AAAA,MACrC,8BAAA,EAAgC,oBAAA;AAAA;AAAA;AAAA;AAAA,MAKhC,6BAAA,EAA+B,kBAAA;AAAA,MAC/B,kCAAA,EAAoC,uBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMpC,uBAAA,EAAyB,cAAA;AAAA,MACzB,uBAAA,EAAyB,cAAA;AAAA,MACzB,uBAAA,EAAyB,cAAA;AAAA,MACzB,uBAAA,EAAyB,cAAA;AAAA,MACzB,uBAAA,EAAyB,cAAA;AAAA,MACzB,uBAAA,EAAyB,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA;AAAA,MAEzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA;AAAA;AAAA;AAAA,MAKzB,2BAAA,EAA6B,gBAAA;AAAA,MAC7B,2BAAA,EAA6B,gBAAA;AAAA,MAC7B,8BAAA,EAAgC,sBAAA;AAAA,MAChC,6BAAA,EAA+B,kBAAA;AAAA,MAC/B,gCAAA,EAAkC,qBAAA;AAAA,MAClC,2BAAA,EAA6B,gBAAA;AAAA,MAC7B,mCAAA,EAAqC,qBAAA;AAAA,MACrC,mCAAA,EAAqC,wBAAA;AAAA,MACrC,mCAAA,EAAqC,wBAAA;AAAA;AAAA;AAAA;AAAA,MAKrC,mCAAA,EAAqC,wBAAA;AAAA,MACrC,oCAAA,EAAsC,wBAAA;AAAA,MACtC,iCAAA,EAAmC,sBAAA;AAAA,MACnC,kCAAA,EAAoC,uBAAA;AAAA,MACpC,gCAAA,EAAkC,qBAAA;AAAA,MAClC,iCAAA,EAAmC,sBAAA;AAAA,MACnC,kCAAA,EAAoC,uBAAA;AAAA;AAAA;AAAA;AAAA,MAKpC,2BAAA,EAA6B,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM7B,gBAAA,EAAkB,YAAA;AAAA,MAClB,WAAA,EAAa,eAAA;AAAA,MACb,WAAA,EAAa,eAAA;AAAA,MACb,cAAA,EAAgB,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMhB,gBAAA,EAAkB,gBAAA;AAAA,MAClB,gBAAA,EAAkB,gBAAA;AAAA,MAClB,gBAAA,EAAkB,gBAAA;AAAA,MAClB,gBAAA,EAAkB,gBAAA;AAAA,MAClB,gBAAA,EAAkB,gBAAA;AAAA,MAClB,gBAAA,EAAkB,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMlB,iBAAA,EAAmB,iBAAA;AAAA,MACnB,uBAAA,EAAyB,eAAA;AAAA,MACzB,kBAAA,EAAoB,kBAAA;AAAA,MACpB,kBAAA,EAAoB,kBAAA;AAAA,MACpB,kBAAA,EAAoB,kBAAA;AAAA,MACpB,mBAAA,EAAqB,mBAAA;AAAA,MACrB,oBAAA,EAAsB,oBAAA;AAAA,MACtB,sBAAA,EAAwB,sBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMxB,eAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAmB,WAAA;AAAA,MACnB,eAAA,EAAiB,SAAA;AAAA,MACjB,cAAA,EAAgB,QAAA;AAAA,MAChB,eAAA,EAAiB,SAAA;AAAA,MACjB,YAAA,EAAc,MAAA;AAAA,MACd,aAAA,EAAe,OAAA;AAAA,MACf,YAAA,EAAc,MAAA;AAAA;AAAA;AAAA;AAAA,MAKd,qBAAA,EAAuB,cAAA;AAAA,MACvB,0BAAA,EAA4B,mBAAA;AAAA,MAC5B,yBAAA,EAA2B,kBAAA;AAAA;AAAA;AAAA;AAAA,MAK3B,4BAAA,EAA8B,qBAAA;AAAA,MAC9B,+BAAA,EAAiC,wBAAA;AAAA,MACjC,+BAAA,EAAiC,wBAAA;AAAA,MACjC,+BAAA,EAAiC,wBAAA;AAAA,MACjC,+BAAA,EAAiC,wBAAA;AAAA,MACjC,gCAAA,EAAkC,yBAAA;AAAA;AAAA;AAAA;AAAA,MAKlC,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,uBAAA,EAAyB,eAAA;AAAA,MACzB,wBAAA,EAA0B,gBAAA;AAAA;AAAA;AAAA;AAAA,MAK1B,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB;AAAA,KACtB;AASO,IAAMC,0BAAA,GAAgD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAe7D;AAKO,IAAMC,uBAAA,GAA0C;AAAA,MACrD,SAAA,EAAW,WAAA;AAAA,MACX,QAAA,EAAUF,0BAAA;AAAA,MACV,QAAA,EAAUC,0BAAA;AAAA,MACV,cAAA,EAAgB,GAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,KAmBV;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrJO,SAAS,gBAAgB,SAAA,EAA2B;AAEzD,EAAA,MAAM,cAAc,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQE,uBAAe,CAAC,CAAA;AAC3D,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,SAAA;AAAA,EACvC;AAGA,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,IAAI,QAAQ,OAAA,YAAmB,MAAA,IAAU,QAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACxE,MAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAC/D;AAAA,EACF;AAGA,EAAA,OAAO,SAAA;AACT;AAtGaA,sCA2CA,eAAA,CAAA,CAiBAC;AAhFb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAoBO,IAAMD,uBAAA,GAA0C;AAAA;AAAA,MAErD,kBAAA,EAAoB,SAAA;AAAA,MACpB,oBAAA,EAAsB,WAAA;AAAA,MACtB,kBAAA,EAAoB,SAAA;AAAA,MACpB,iBAAA,EAAmB,aAAA;AAAA,MACnB,kBAAA,EAAoB,SAAA;AAAA,MACpB,eAAA,EAAiB,MAAA;AAAA,MACjB,kBAAA,EAAoB,YAAA;AAAA,MACpB,qBAAA,EAAuB,YAAA;AAAA,MACvB,eAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAmB,WAAA;AAAA;AAAA,MAGnB,eAAA,EAAiB,YAAA;AAAA,MACjB,eAAA,EAAiB,YAAA;AAAA,MACjB,gBAAA,EAAkB,OAAA;AAAA,MAClB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,MAGlB,gBAAA,EAAkB,MAAA;AAAA,MAClB,gBAAA,EAAkB,iBAAA;AAAA;AAAA,MAGlB,uBAAA,EAAyB,QAAA;AAAA,MACzB,gBAAA,EAAkB,OAAA;AAAA;AAAA,MAGlB,gBAAA,EAAkB,MAAA;AAAA;AAAA,MAGlB,eAAA,EAAiB,QAAA;AAAA,MACjB,kBAAA,EAAoB,WAAA;AAAA,MACpB,kBAAA,EAAoB,WAAA;AAAA;AAAA,MAGpB,6BAAA,EAA+B,WAAA;AAAA,MAC/B,kCAAA,EAAoC;AAAA,KACtC;AAKO,IAAM,eAAA,GAA6C;AAAA;AAAA,MAExD;AAAA,QACE,OAAA,EAAS,kBAAA;AAAA,QACT,WAAA,EAAa,QAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,OAAA,EAAS,kBAAA;AAAA,QACT,WAAA,EAAa,mBAAA;AAAA,QACb,WAAA,EAAa;AAAA;AACf,KACF;AAKO,IAAMC,oBAAA,GAAuC;AAAA,MAClD,SAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAUD,uBAAA;AAAA,MACV,QAAA,EAAU,eAAA;AAAA,MACV,cAAA,EAAgB,IAAA;AAAA,MAChB,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAaV;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACYO,SAAS,mBAAmB,SAAA,EAAuD;AAExF,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AACnC,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,WAAA;AACH,QAAA,OAAO,iBAAA,CAAkB,SAAA;AAAA,MAC3B,KAAK,QAAA;AACH,QAAA,OAAO,iBAAA,CAAkB,MAAA;AAAA,MAC3B,KAAK,UAAA;AACH,QAAA,OAAO,iBAAA,CAAkB,QAAA;AAAA,MAC3B,KAAK,KAAA;AACH,QAAA,OAAO,iBAAA,CAAkB,GAAA;AAAA,MAC3B,KAAK,QAAA;AACH,QAAA,OAAO,iBAAA,CAAkB,MAAA;AAAA;AAC7B,EACF;AACA,EAAA,OAAO,iBAAA,CAAkB,MAAA;AAC3B;AAUO,SAAS,qBAAA,CACd,aAAA,EACA,cAAA,EACA,cAAA,EAC2B;AAC3B,EAAA,MAAM,IAAA,GAAO,mBAAmB,aAAa,CAAA;AAG7C,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,GAAG,KAAK,MAAA,CAAO,QAAA;AAAA,IACf,GAAG;AAAA,GACL;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAI,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,EAAC,EAAI,GAAI,cAAA,IAAkB,EAAG,CAAA;AAGlF,EAAA,MAAM,GAAA,GAAuB,CAAC,SAAA,KAAsB;AAElD,IAAA,MAAM,cAAc,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAC,CAAA;AAC1D,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,MAAA,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,SAAA;AAAA,IACvC;AAGA,IAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,MAAA,IAAI,QAAQ,OAAA,YAAmB,MAAA,IAAU,QAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACxE,QAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,MAC/D;AAAA,IACF;AAGA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,QAAA,EAAU,cAAA;AAAA,MACV,QAAA,EAAU;AAAA;AACZ,GACF;AACF;AAUO,SAAS,gBAAA,CACd,SAAA,EACA,SAAA,GAA6B,WAAA,EAC7B,cAAA,EACQ;AACR,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAME,OAAAA,GAAS,qBAAA,CAAsB,SAAA,EAAW,cAAc,CAAA;AAC9D,IAAA,OAAOA,OAAAA,CAAO,IAAI,SAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAmB,SAAS,CAAA;AAC3C,EAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B;AA1MA,IA2CM,iBAAA,EAqDA,gBAAA;AAhGN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAQA,IAAA,cAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAkCA,IAAM,iBAAA,GAAwE;AAAA,MAC5E,SAAA,EAAW;AAAA,QACT,GAAA,EAAK,kBAAA;AAAA,QACL,MAAA,EAAQH;AAAA,OACV;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,GAAA,EAAK,eAAA;AAAA,QACL,MAAA,EAAQE;AAAA,OACV;AAAA,MACA,QAAA,EAAU;AAAA;AAAA;AAAA,QAGR,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW,UAAA;AAAA,UACX,UAAU,EAAC;AAAA,UACX,UAAU,EAAC;AAAA,UACX,cAAA,EAAgB,EAAA;AAAA,UAChB,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,GAAA,EAAK;AAAA;AAAA;AAAA,QAGH,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW,KAAA;AAAA,UACX,UAAU,EAAC;AAAA,UACX,UAAU,EAAC;AAAA,UACX,cAAA,EAAgB,EAAA;AAAA,UAChB,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,MAAA,EAAQ;AAAA;AAAA,QAEN,GAAA,EAAK,CAAC,IAAA,KAAS,IAAA;AAAA,QACf,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW,QAAA;AAAA,UACX,UAAU,EAAC;AAAA,UACX,UAAU,EAAC;AAAA,UACX,cAAA,EAAgB,GAAA;AAAA,UAChB,MAAA,EAAQ;AAAA;AACV;AACF,KACF;AASA,IAAM,gBAAA,uBAAuB,GAAA,CAAqB;AAAA,MAChD,WAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtGD,IAsFa,wBA+DA,sBAAA,EAwBA,mBAAA;AA7Kb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uDAAA,GAAA;AAUA,IAAA,WAAA,EAAA;AA4EO,IAAM,sBAAA,GAA2C;AAAA,MACtD,IAAA,EAAM,0BAAA;AAAA,MACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAA4B;AACzD,QAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,WAAW,CAAA,IAAyB,WAAA;AAC/D,QAAA,MAAM,cAAA,GAAkB,OAAA,CAAQ,gBAAgB,CAAA,IAAgC,EAAC;AACjF,QAAA,MAAM,cAAA,GAAkB,OAAA,CAAQ,gBAAgB,CAAA,IAAgB,EAAA;AAChE,QAAA,MAAM,aAAA,GAAiB,OAAA,CAAQ,eAAe,CAAA,IAAiB,IAAA;AAC/D,QAAA,MAAM,YAAA,GAAe,QAAQ,cAAc,CAAA;AAG3C,QAAA,MAAM,MAAA,GAAS,mBAAmB,SAAS,CAAA;AAG3C,QAAA,MAAM,QAAkB,EAAC;AAEzB,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,KAAK,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,CAAA,GAAA,EAAM,SAAS,CAAA,4BAAA,CAA8B,CAAA;AAChF,YAAA,KAAA,CAAM,KAAK,8DAA8D,CAAA;AACzE,YAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,UACf;AAAA,QACF;AAGA,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AAExC,UAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,WAAW,cAAc,CAAA;AAGzE,UAAA,MAAM,WAAA,GAAc,CAAA,CAAA,EAAI,cAAc,CAAA,EAAG,UAAU,CAAA,CAAA;AAGnD,UAAA,MAAM,aAAa,KAAA,CAAM,MAAA,KAAW,MAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACrE,UAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,GAAa,IAAA,CAAK,UAAU,UAAU,CAAA;AAGrF,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAChD,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,WAAW,CAAA,CAAE,CAAA;AAAA,UAChC;AAGA,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,QACxC;AAEA,QAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,MAC5B;AAAA,KACF;AAcO,IAAM,sBAAA,GAA2C;AAAA,MACtD,IAAA,EAAM,0BAAA;AAAA,MACN,MAAA,EAAQ,CAAC,IAAA,KAA+B;AACtC,QAAA,MAAM,oBAAA,GAAuB;AAAA,UAC3B,GAAG,IAAA,CAAK,OAAA;AAAA,UACR,SAAA,EAAW;AAAA,SACb;AACA,QAAA,OAAO,uBAAuB,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,sBAAsB,CAAA;AAAA,MACjF;AAAA,KACF;AAeO,IAAM,mBAAA,GAAwC;AAAA,MACnD,IAAA,EAAM,uBAAA;AAAA,MACN,MAAA,EAAQ,CAAC,IAAA,KAA+B;AACtC,QAAA,MAAM,iBAAA,GAAoB;AAAA,UACxB,GAAG,IAAA,CAAK,OAAA;AAAA,UACR,SAAA,EAAW;AAAA,SACb;AACA,QAAA,OAAO,uBAAuB,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,mBAAmB,CAAA;AAAA,MAC9E;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtKA,SAASE,qBAAoB,OAAA,EAAyB;AACpD,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAG7C,EAAA,MAAM,MAAA,GAAS,OAAA,CACZ,KAAA,CAAM,eAAe,CAAA,CACrB,OAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CACxE,IAAA,CAAK,EAAE,CAAA;AAGV,EAAA,OAAO,kBAAA,GAAqB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAC7C;AAKA,SAASC,gBAAeR,KAAAA,EAAwB;AAC9C,EAAA,OAAOA,KAAAA,CAAK,GAAA,CAAIO,oBAAmB,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9C;AAKA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAcA,SAAS,mBAAA,CAAoB,GAAA,EAAoB,MAAA,GAAS,CAAA,EAAW;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAElC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAY,4BAAA,CAA6B,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA,CAAA;AAExE,IAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAA,IAAU,GAAG,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,WAAW,KAAK,CAAA;AAAA,CAAA;AAAA,IACxD,CAAA,MAAO;AAEL,MAAA,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,SAAS,KAAK,mBAAA,CAAoB,UAAA,EAAY,MAAA,GAAS,CAAC,CAAC;AAAA,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,MAAA,IAAU,GAAG,MAAM,CAAA,CAAA,CAAA;AACnB,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;AA4BaE;AAjIb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mDAAA,GAAA;AAiIO,IAAMA,8BAAA,GAA2C;AAAA,MACtD,IAAA,EAAM,yBAAA;AAAA,MACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAW,KAA4B;AAEhD,QAAA,MAAM,YAA2B,EAAC;AAElC,QAAA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,cAAA;AAEhC,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,UAAA,IAAI,OAAA,GAAyB,SAAA;AAC7B,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC9C,YAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAExB,YAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,aAAA,IAAiB,QAAQ,WAAA,EAAa;AACvE,cAAA;AAAA,YACF;AACA,YAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,GAAG,KAAK,OAAO,OAAA,CAAQ,GAAG,CAAA,KAAM,QAAA,EAAU;AAClE,cAAA,OAAA,CAAQ,GAAG,IAAI,EAAC;AAAA,YAClB;AACA,YAAA,OAAA,GAAU,QAAQ,GAAG,CAAA;AAAA,UACvB;AAEA,UAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAChD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ,OAAO,CAAA,GAAI;AAAA,cACjB,QAAA,EAAU,IAAA;AAAA,cACV,KAAA,EAAO,kBAAkB,KAAK;AAAA,aAChC;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,aAAuC,EAAC;AAC9C,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAC7B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,cAAA,UAAA,CAAW,QAAQ,IAAI,EAAC;AAAA,YAC1B;AACA,YAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,UAChD;AAAA,QACF;AAGA,QAAA,IAAI,YAAA,GAAe,EAAA;AACnB,QAAA,KAAA,MAAW,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAK,EAAG;AACrD,UAAA,MAAM,cAAA,GAAiB,WAAW,QAAQ,CAAA;AAC1C,UAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAA,GAAW,CAAA,EAAG,UAAA,CAAW,QAAQ,CAAC,CAAA,SAAA,CAAA;AACxC,UAAA,YAAA,IAAgB,CAAA;AAAA,OAAA,EAAe,QAAQ,CAAA;AAAA;AAAA,CAAA;AACvC,UAAA,YAAA,IAAgB,eAAe,QAAQ,CAAA;AAAA,CAAA;AACvC,UAAA,YAAA,IAAgB,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACjE,UAAA,YAAA,IAAgB,OAAA;AAAA,QAClB;AAGA,QAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AACtE,QAAA,YAAA,IAAgB,CAAA;AAAA;AAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAChE,QAAA,YAAA,IAAgB,OAAA;AAGhB,QAAA,IAAI,WAAA,GAAc,qDAAA;AAClB,QAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,UAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,UAAA,MAAM,IAAA,GAAOD,eAAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACtC,UAAA,WAAA,IAAe,CAAA,qBAAA,EAAwB,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA;AAAA,CAAA;AAAA,QACtD;AAEA,QAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,EAYT,YAAY;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,8BAAA,EAQkB,mBAAA,CAAoB,SAAS,CAAC;;AAAA;AAAA;AAAA;;AAAA,EAM5D,WAAW;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAAA,MAQX;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5OA,IAAA,eAAA,GAAA,EAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAAE,sBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,wBAAA,EAAA,MAAAX,gCAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,sBAAA,EAAA,MAAAU;AAAA,CAAA,CAAA;AAgDO,SAAS,eAAA,CACd,EAAA,EACA,aAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM,UAAA,GAAa,CAAC,GAAGC,sBAAA,EAAgB,GAAG,aAAa,CAAA;AAEvD,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,EAAA,CAAG,cAAA,CAAe;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,EACH;AACF;AApCaA;AAxBb,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AASA,IAAA,kBAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAKA,IAAA,eAAA,EAAA;AA8CA,IAAA,kBAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAMA,IAAA,eAAA,EAAA;AAhDO,IAAMA,sBAAA,GAAqC;AAAA,MAChD,oBAAA;AAAA,MACAX,gCAAA;AAAA,MACA,aAAA;AAAA,MACAU,8BAAA;AAAA,MACA,sBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACdA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,MAAM,QAAA,CAAS,YAAY,CAAA,IAAK,KAAA,CAAM,SAAS,aAAa,CAAA;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,MAAM,QAAA,CAAS,YAAY,CAAA,IAAK,KAAA,CAAM,SAAS,aAAa,CAAA;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA;AAChE,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,aAAa,KAAA,KAAU,aAAA;AAAA,EAC1C,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,QAAA;AAC/E;AA5DA,IAaM,sBAAA,CAAA,CAsEOE;AAnFb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAaA,IAAM,sBAAA,GAAyB,EAAA;AAsExB,IAAMA,oBAAA,GAAoC;AAAA,MAC/C,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,SAAA,EAAW,CAAC,KAAA,EAAO,OAAA,KAAiC;AAClD,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AACpC,QAAA,MAAM,YAAA,GAAe,SAAS,cAAA,IAAkB,sBAAA;AAGhD,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,OAAO,CAAA,EAAG,QAAQ,YAAY,CAAA,GAAA,CAAA;AAAA,QAChC;AAGA,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACrD,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACxC,UAAA,IAAI,aAAa,CAAA,EAAG;AAClB,YAAA,OAAO,GAAA;AAAA,UACT;AACA,UAAA,OAAO,CAAA,EAAG,WAAW,YAAY,CAAA,GAAA,CAAA;AAAA,QACnC;AAGA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3EA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,SAAA,KAAc,YAAA,IAAgB,SAAA,KAAc,QAAA,EAAU;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,gBAAgB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,IAAK,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,EAC/F,CAAC,CAAA;AAED,EAAA,OAAO,iBAAA,IAAqB,KAAA;AAC9B;AAnDA,IAeM,aAAA,CAAA,CA2DOC;AA1Eb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uDAAA,GAAA;AAeA,IAAM,aAAA,GAAwC;AAAA,MAC5C,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,KAAA,EAAO,GAAA;AAAA,MACP,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,GAAA;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM,GAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,KAAA,EAAO,GAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AA2CO,IAAMA,0BAAA,GAA0C;AAAA,MACrD,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AAGpC,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,UAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,YAAA,OAAO,MAAA;AAAA,UACT;AAGA,UAAA,MAAM,aAAa,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AAC5D,UAAA,IAAI,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,UAAU,CAAA,EAAG;AAE5C,YAAA,MAAM,WAAA,GAAc,cAAc,UAAU,CAAA;AAC5C,YAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,cAAA,OAAO,WAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAGA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzFA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,gBAAgB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,IAAK,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,EAC/F,CAAC,CAAA;AAGD,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA;AAEhE,EAAA,OAAA,CAAQ,iBAAA,IAAqB,WAAW,kBAAA,IAAsB,KAAA,CAAA;AAChE;AArCA,IAcMC,uBAAAA,CAAAA,CA8COC;AA5Db,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uDAAA,GAAA;AAcA,IAAMD,uBAAAA,GAAyB,EAAA;AA8CxB,IAAMC,0BAAA,GAA0C;AAAA,MACrD,IAAA,EAAM,qBAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,YAAA;AAAA,MACR,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AAGpC,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,UAAA,IAAI,SAAS,CAAA,EAAG;AACd,YAAA,OAAO,KAAA;AAAA,UACT;AAEA,UAAA,OAAO,KAAA,GAAQD,uBAAAA;AAAA,QACjB;AAGA,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,UAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,GAAI,GAAA;AAAA,QACpC;AAGA,QAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACxC,UAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC3B,YAAA,IAAI,YAAY,CAAA,EAAG;AACjB,cAAA,OAAO,QAAA;AAAA,YACT;AACA,YAAA,OAAO,QAAA,GAAWA,uBAAAA;AAAA,UACpB;AAAA,QACF;AAGA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjFA,SAASN,qBAAoB,OAAA,EAAyB;AACpD,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAG7C,EAAA,MAAM,MAAA,GAAS,OAAA,CACZ,KAAA,CAAM,eAAe,CAAA,CACrB,OAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CACxE,IAAA,CAAK,EAAE,CAAA;AAGV,EAAA,OAAO,kBAAA,GAAqB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,MAAA;AAC7C;AA3BA,IA0Ca,gBAAA;AA1Cb,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8DAAA,GAAA;AA0CO,IAAM,gBAAA,GAAwC;AAAA,MACnD,IAAA,EAAM,oBAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,CAAC,EAAE,IAAA,EAAAP,OAAK,KAAM;AACvB,QAAA,OAAOA,KAAAA,CAAK,GAAA,CAAIO,oBAAmB,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,MAC9C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBaQ;AAzBb,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gDAAA,GAAA;AAyBO,IAAMA,iBAAA,GAAiC;AAAA,MAC5C,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,EAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,WAAA,EAAY;AAAA,MAC7D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAAC,yBAAA;AAAA,EAAA,YAAA,EAAA,MAAAL,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,0BAAA;AAAA,EAAA,kBAAA,EAAA,MAAAE,0BAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,SAAA,EAAA,MAAAC,iBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA0CO,SAAS,kBAAA,CACd,EAAA,EACA,gBAAA,GAA0C,EAAC,EACrC;AACN,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAGC,yBAAA,EAAmB,GAAG,gBAAgB,CAAA;AAEhE,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,EAAA,CAAG,iBAAA,CAAkB;AAAA,MACnB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,WAAW,SAAA,CAAU;AAAA,KACtB,CAAA;AAAA,EACH;AACF;AApCaA;AApBb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AASA,IAAA,cAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,SAAA,EAAA;AA8CA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,SAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AA3CO,IAAMA,yBAAA,GAA2C;AAAA,MACtDJ,0BAAA;AAAA,MACAE,0BAAA;AAAA,MACAH,oBAAA;AAAA,MACAI,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHaE;AAvBb,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAuBO,IAAMA,yBAAA,GAA8C;AAAA,MACzD,IAAA,EAAM,YAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,eAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACZaC;AAtBb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAsBO,IAAMA,wBAAA,GAA6C;AAAA,MACxD,IAAA,EAAM,WAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,eAAA;AAAA,QACA,oBAAA;AAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLaC;AA3Bb,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4CAAA,GAAA;AA2BO,IAAMA,0BAAA,GAA+C;AAAA,MAC1D,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,eAAA;AAAA;AAAA,QACA,YAAA;AAAA;AAAA,QACA,cAAA;AAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,qBAAA;AAAA;AAAA,QACA,eAAA;AAAA;AAAA,QACA;AAAA;AAAA;AACF,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtCA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAAF,yBAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,wBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,0BAAA;AAAA,EAAA,eAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AAsCO,SAAS,uBAAA,CACd,EAAA,EACA,YAAA,GAA2C,EAAC,EACtC;AACN,EAAA,MAAM,SAAA,GAAY,CAAC,GAAGA,uBAAA,EAAiB,GAAG,YAAY,CAAA;AAEtD,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,EAAA,CAAG,sBAAA,CAAuB;AAAA,MACxB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AAAA,EACH;AACF;AAhCaA;AAlBb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AASA,IAAA,QAAA,EAAA;AACA,IAAA,OAAA,EAAA;AACA,IAAA,SAAA,EAAA;AA0CA,IAAA,QAAA,EAAA;AACA,IAAA,OAAA,EAAA;AACA,IAAA,SAAA,EAAA;AArCO,IAAMA,uBAAA,GAA8C;AAAA,MACzDH,yBAAA;AAAA,MACAC,wBAAA;AAAA,MACAC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACGA,SAAS,QAAA,CAAS,OAAgB,QAAA,EAA4C;AAC5E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,GAAS,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAA,CAAc,KAA8B,QAAA,EAAyC;AAC5F,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAElC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AAErB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,MAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,QAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,GAAG,QAAQ,CAAA;AAAA,MAChE,CAAA,MAAA,IAES,WAAW,UAAA,EAAY;AAC9B,QAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA,CAAS,UAAA,CAAW,OAAO,GAAG,QAAQ,CAAA;AAAA,MAC9D,CAAA,MAEK;AACH,QAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAmCO,SAAS,gCACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,uBAAA;AAAA,IACN,YAAA,EAAc,CAAC,UAAA,KAAe;AAC5B,MAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,GACF;AACF;AA3GA,IAgBM,qBAAA,CAAA,CA2DOE;AA3Eb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6DAAA,GAAA;AAgBA,IAAM,qBAAA,GAAiD;AAAA,MACrD,CAAC,kBAAkB,SAAS,CAAA;AAAA,MAC5B,CAAC,oBAAoB,WAAW,CAAA;AAAA,MAChC,CAAC,mBAAmB,gBAAgB;AAAA,KACtC;AAuDO,IAAMA,qBAAA,GAAwC;AAAA,MACnD,IAAA,EAAM,gBAAA;AAAA,MACN,YAAA,EAAc,CAAC,UAAA,KAAe;AAC5B,QAAA,aAAA,CAAc,YAAY,qBAAqB,CAAA;AAC/C,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjFA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAAC,4BAAA;AAAA,EAAA,+BAAA,EAAA,MAAA,+BAAA;AAAA,EAAA,aAAA,EAAA,MAAAD,qBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgCO,SAAS,qBAAA,CACd,EAAA,EACA,mBAAA,GAAgD,EAAC,EAC3C;AACN,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAGC,4BAAA,EAAsB,GAAG,mBAAmB,CAAA;AAEzE,EAAA,KAAA,MAAW,gBAAgB,gBAAA,EAAkB;AAC3C,IAAA,EAAA,CAAG,oBAAA,CAAqB;AAAA,MACtB,MAAM,YAAA,CAAa,IAAA;AAAA,MACnB,cAAc,YAAA,CAAa;AAAA,KAC5B,CAAA;AAAA,EACH;AACF;AA5BaA;AAhBb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oDAAA,GAAA;AASA,IAAA,mBAAA,EAAA;AAsCA,IAAA,mBAAA,EAAA;AA/BO,IAAMA,4BAAA,GAAiD,CAACD,qBAAa,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChB5E,IAAA,YAAA,GAAA,EAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6EA,SAASE,SACP,GAAA,EAC6E;AAC7E,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA;AACd,EAAA,OAAO,QAAA,IAAY,SAAS,OAAA,IAAW,KAAA;AACzC;AAKA,SAASC,eAAc,KAAA,EAAyB;AAC9C,EAAA,IAAI,CAACD,QAAAA,CAAQ,KAAK,CAAA,EAAG;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AAC/B;AAKA,SAASE,cAAa,KAAA,EAAoC;AACxD,EAAA,IAAI,CAACF,QAAAA,CAAQ,KAAK,CAAA,EAAG;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA;AAC9B;AAKA,SAASG,qBAAoB,KAAA,EAAoC;AAC/D,EAAA,IAAI,CAACH,QAAAA,CAAQ,KAAK,CAAA,EAAG;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,OAAA;AAC9C;AAKA,SAAS,aAAA,CACP,UAAA,EACA,MAAA,GAAS,EAAA,EAC6E;AACtF,EAAA,MAAM,MAAA,uBAAa,GAAA,EAGjB;AAEF,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,IAAA,MAAMvB,QAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAE3C,IAAA,IAAIuB,QAAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,IAAIvB,KAAAA,EAAM;AAAA,QACf,KAAA,EAAOwB,eAAc,KAAK,CAAA;AAAA,QAC1B,IAAA,EAAMC,cAAa,KAAK,CAAA;AAAA,QACxB,WAAA,EAAaC,qBAAoB,KAAK,CAAA;AAAA,QACtC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAE/E,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,KAAA,EAA0B1B,KAAI,CAAA;AAC3D,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,WAAW,CAAA,IAAK,MAAA,EAAQ;AAC9C,QAAA,MAAA,CAAO,GAAA,CAAI,YAAY,WAAW,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,IAAI,CAACuB,QAAAA,CAAQ,KAAK,CAAA,EAAG;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAA,GAAI,KAAA;AAKV,EAAA,OAAO,CAAA,CAAE,gBAAgB,IAAA,IAAQ,CAAA,CAAE,eAAe,IAAA,IAAQ,CAAA,CAAE,aAAa,UAAA,KAAe,IAAA;AAC1F;AAKA,SAAS,OAAA,CAAQ,GAAY,CAAA,EAAqB;AAChD,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,MAAM,IAAA,EAAM;AACrD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAW,CAAA;AAErC,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC1B,MAAA,MAAM,IAAA,GAAO,CAAA;AACb,MAAA,MAAM,IAAA,GAAO,CAAA;AAEb,MAAA,MAAM,MAAA,GAAS,KAAK,GAAG,CAAA;AAEvB,MAAA,MAAM,MAAA,GAAS,KAAK,GAAG,CAAA;AACvB,MAAA,OAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;AAaO,SAAS,UAAA,CAAW,WAA4B,SAAA,EAAuC;AAC5F,EAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AAEvC,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,cAA6B,EAAC;AACpC,EAAA,MAAM,aAA4B,EAAC;AAGnC,EAAA,KAAA,MAAW,CAACvB,KAAAA,EAAM,OAAO,CAAA,IAAK,OAAA,EAAS;AACrC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAIA,KAAI,CAAA;AAEhC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAAA,KAAAA;AAAA,QACA,IAAA,EAAM,OAAA;AAAA,QACN,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,IAAI,QAAQ,IAAA,IAAQ,OAAA,CAAQ,QAAQ,OAAA,CAAQ,IAAA,KAAS,QAAQ,IAAA,EAAM;AACjE,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAAA,KAAAA;AAAA,UACA,IAAA,EAAM,cAAA;AAAA,UACN,WAAA,EAAa;AAAA,YACX,UAAU,OAAA,CAAQ,KAAA;AAAA,YAClB,UAAU,OAAA,CAAQ,KAAA;AAAA,YAClB,SAAS,OAAA,CAAQ,IAAA;AAAA,YACjB,SAAS,OAAA,CAAQ;AAAA,WACnB;AAAA,UACA,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH,WAES,CAAC,OAAA,CAAQ,QAAQ,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAAA,KAAAA;AAAA,UACA,IAAA,EAAM,UAAA;AAAA,UACN,WAAA,EAAa;AAAA,YACX,UAAU,OAAA,CAAQ,KAAA;AAAA,YAClB,UAAU,OAAA,CAAQ,KAAA;AAAA,YAClB,SAAS,OAAA,CAAQ,IAAA;AAAA,YACjB,SAAS,OAAA,CAAQ;AAAA,WACnB;AAAA,UACA,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH,CAAA,MAAA,IAES,aAAa,OAAA,CAAQ,KAAK,KAAK,CAAC,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAG;AACpE,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,IAAA,EAAAA,KAAAA;AAAA,UACA,IAAA,EAAM,YAAA;AAAA,UACN,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAACA,KAAAA,EAAM,OAAO,CAAA,IAAK,OAAA,EAAS;AACrC,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAIA,KAAI,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA,EAAAA,KAAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GACJ,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAS,QAAA,CAAS,MAAA,GAAS,WAAA,CAAY,MAAA,GAAS,UAAA,CAAW,MAAA;AACpF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAK,YAAY,MAAA,GAAS,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,cAAc,IAAA,EAAyB;AACrD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAEhD,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,KAAA,CAAM,KAAK,yCAA+B,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,EAClE;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,UAAA,CAAW,MAAiB,KAAA,EAAyC;AACnF,EAAA,MAAM,UAAyB,EAAC;AAEhC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,cAAc,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,UAAU,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,mBAAmB,IAAA,EAAgC;AACjE,EAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,KAAK,WAAW,CAAA;AAC9C;AAtXA,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACqFO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAyfO,SAAS,YAAY,GAAA,EAAgC;AAC1D,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,IAAY,GAAA;AACrB;AAKO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,IAAW,GAAA,IAAO,EAAE,QAAA,IAAY,GAAA,CAAA;AACzC;AAKO,SAAS,QAAQ,GAAA,EAA4B;AAClD,EAAA,OAAO,WAAA,CAAY,GAAG,CAAA,IAAK,aAAA,CAAc,GAAG,CAAA;AAC9C;AAKO,SAAS,iBAAiB,IAAA,EAAiC;AAChE,EAAA,OAAO,iBAAA,CAAkB,SAAS,IAAiB,CAAA;AACrD;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AACjF;AASO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACnD;AAKO,SAAS,aAAa,KAAA,EAAkC;AAC7D,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,OAAQ,KAAA,CAAsB,IAAA;AAChC;AAKO,SAAS,oBAAoB,KAAA,EAAkC;AACpE,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,YAAA;AAAA,EACf;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OAAO,MAAA,CAAO,eAAe,MAAA,CAAO,OAAA;AACtC;AAKO,SAAS,YAAY,KAAA,EAA+B;AACzD,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,QAAQ,KAAA,CAAM;AAAA,GAChB;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9C,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAA;AAAA,EACrB;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,OAAA;AACxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,oBAAoB,GAAA,EAA8B;AAChE,EAAA,IAAI,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAM,GAAG,CAAA;AACxB;AClqBA,IAAM,iBAAA,GAAoB,6CAAA;AAG1B,IAAM,WAAA,GAAc,cAAA;AAGpB,IAAM,WAAA,GAAc,cAAA;AAGpB,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,aAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKD,SAAS,aAAa,KAAA,EAAwB;AAE5C,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAOA,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKD,SAAS,iBAAiB,KAAA,EAAwB;AAEhD,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAClC,EAAA,IAAI,SAAA,KAAc,GAAA,IAAO,SAAA,KAAc,GAAA,EAAK;AAC1C,IAAA,CAAA,GAAI,CAAA;AAAA,EACN;AACA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,IAAQ,GAAA,IAAO,IAAA,IAAQ,GAAA,EAAK;AAC9B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,KAAS,GAAA,IAAO,CAAC,MAAA,EAAQ;AAClC,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AAE1C,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAA,CAAY,IAAI,IAAI,CAAA;AAC7B;AASA,SAAS,mBAAA,CACPA,KAAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,aAAa,KAAK,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAGhC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,uEAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,oBAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,8BAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,6BAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY,mCAAmC,iBAAA,CAAkB,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,GAAA;AAAA,KACxF,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,wBAAwB,IAAI,CAAA,CAAA,CAAA;AAAA,MACrC,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,CAAA,aAAA,EAAgB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,kBAAA,CAAmBA,KAAAA,EAAM,KAAA,EAAO,IAAA,EAAmB,MAAM,CAAA;AAAA,EAC3D;AACF;AAKA,SAAS,kBAAA,CACPA,KAAAA,EACA,KAAA,EACA,IAAA,EACA,MAAA,EACM;AACN,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,IAAI,CAAC,YAAA,CAAa,KAAK,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,yBAAyB,KAAK,CAAA,CAAA,CAAA;AAAA,UACvC,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,6BAA6B,KAAK,CAAA,CAAA,CAAA;AAAA,UAC3C,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,8BAA8B,KAAK,CAAA,CAAA,CAAA;AAAA,UAC5C,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAKA;AAEN;AAKA,SAAS,kBAAkB,KAAA,EAAwB;AAEjD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,KAAA,CAAM,OAAO,KAAK,OAAA,IAAW,CAAA,IAAK,WAAW,GAAA,EAAM;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAW,QAAQ,CAAA;AACvD,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AASA,SAAS,kBAAA,CACP,UAAA,EACA,QAAA,EACA,MAAA,EACA,UACA,UAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAErD,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAMA,QAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAE/C,IAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,MAAA,UAAA,CAAW,KAAA,IAAS,CAAA;AACpB,MAAA,mBAAA,CAAoBA,KAAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,MAAA,kBAAA,CAAmB,KAAA,EAA0BA,KAAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAAA,IACjF;AAAA,EACF;AACF;AAKA,SAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,QAAA,EACQ;AACR,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU2B,gBAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,EAAE,KAAA,EAAO,CAAA,EAAE;AAE9B,IAAA,kBAAA,CAAmB,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAEzD,IAAA,OAAO,UAAA,CAAW,KAAA;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yBAAyB,YAAY,CAAA,CAAA;AAAA,MAC9C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CAAc,GAAA,EAAa,KAAA,GAAkB,EAAC,EAAa;AAClE,EAAA,IAAI,CAACC,cAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUC,gBAAY,GAAG,CAAA;AAC/B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWC,UAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAChC,IAAA,MAAM,IAAA,GAAOC,aAAS,QAAQ,CAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,aAAA,CAAc,UAAU,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAyBA,eAAsB,cAAA,CACpB,MAAA,EACA,OAAA,GAA2B,EAAC,EACD;AAC3B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,EAAE,OAAA,GAAU,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,GAAS,OAAM,GAAI,OAAA;AAE3D,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,MAAA,CAAO,MAAA,CAAO,cAAA;AAE/D,EAAA,IAAI,CAACH,cAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS,sCAAA;AAAA,UACT,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,MACA,UAAU,EAAC;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,CAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,cAAc,cAAc,CAAA;AAE9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAA,CAAQ,CAAA,WAAA,EAAc,SAAA,CAAU,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,EACzD;AAGA,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAM,YAAA,GAAeI,cAAA,CAAS,cAAA,EAAgB,IAAI,CAAA;AAElD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACtD,IAAA,WAAA,IAAe,UAAA;AAAA,EACjB;AAGA,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,MAAA,KAAW,KAAK,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,MAAA,KAAW,CAAA;AAGxF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,UAAA,CAAW,CAAA,UAAA,EAAa,WAAW,CAAA,WAAA,EAAc,SAAS,CAAA,MAAA,CAAQ,CAAA;AAClE,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,uBAAA,EAA0B,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,EAAY,WAAA;AAAA,IACZ,SAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GACzB;AACF;AAQA,eAAsB,iBAAA,CACpB,MAAA,EACA,OAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA;AAEzE,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,MAAM,CAAA,OAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACnD;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AACF;AAMA,SAAS,QAAQ,OAAA,EAAuB;AACtC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAC/B;AAEA,SAAS,SAAS,OAAA,EAAuB;AACvC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAC9B;AAEA,SAAS,WAAW,OAAA,EAAuB;AACzC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC7B;AAEA,SAAS,QAAQ,OAAA,EAAuB;AACtC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAC/B;AAEA,SAAS,SAAS,OAAA,EAAuB;AACvC,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC9B;AC/gBO,IAAM,eAAA,GAAkBC,MAAE,IAAA,CAAK;AAAA,EACpC,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAOM,IAAM,gBAAA,GAAmBA,MAAE,KAAA,CAAM;AAAA,EACtCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,qBAAqB,CAAA;AAAA,EACtCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,EAC3BA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,EAC3BA,MAAE,MAAA,CAAO;AAAA,IACP,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC1B,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC1B,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAC1B,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA;AAAS,GACtC;AACH,CAAC,CAAA;AAKM,IAAM,oBAAA,GAAuBA,MAAE,KAAA,CAAM;AAAA,EAC1CA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAClCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,kBAAkB,CAAA;AAAA,EACnCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAClCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,gBAAgB,CAAA;AAAA,EACjCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAClCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAClCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAClCA,MAAE,MAAA;AACJ,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,MAAE,KAAA,CAAM;AAAA,EACzCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,eAAe,CAAA;AAAA,EAChCA,KAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,cAAc;AACjC,CAAC,CAAA;AAKM,IAAM,sBAAA,GAAyBA,MAAE,KAAA,CAAM;AAAA,EAC5CA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACvBA,MAAE,MAAA,EAAO;AAAA,EACTA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACvBA,MAAE,MAAA;AACJ,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,KAAA,EAAO,gBAAA;AAAA,EACP,OAAA,EAAS,oBAAA;AAAA,EACT,OAAA,EAAS,oBAAA;AAAA,EACT,IAAA,EAAM,oBAAA;AAAA,EACN,MAAA,EAAQ,qBAAqB,QAAA,EAAS;AAAA,EACtC,KAAA,EAAOA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACrB,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAC,CAAC,CAAA;AAAA,EACrD,QAAA,EAAU,oBAAA;AAAA,EACV,YAAYA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,EAAE,GAAA,CAAI,GAAI,GAAGA,KAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,EACnE,UAAA,EAAYA,MAAE,KAAA,CAAM,CAAC,sBAAsBA,KAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,EACtD,aAAA,EAAe,qBAAqB,QAAA,EAAS;AAAA,EAC7C,aAAA,EAAeA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,aAAa,WAAA,EAAa,YAAY,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACjF,cAAA,EAAgBA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,aAAa,UAAA,EAAY,cAAc,CAAC,CAAA,CAAE,QAAA;AAC5E,CAAC,CAAA;AAKM,IAAM,sBAAA,GAAyBA,MAAE,KAAA,CAAM;AAAA,EAC5CA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EACpFA,MAAE,MAAA,CAAO;AAAA,IACP,SAAA,EAAWA,KAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AAAA,IACvC,OAAA,EAASA,MAAE,IAAA,CAAK,CAAC,SAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA,CAAE,QAAA;AAAS,GACvD;AACH,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,KAAA,EAAO,gBAAA;AAAA,EACP,KAAA,EAAO,oBAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAC,CAAA;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,KAAA,EAAO,gBAAA;AAAA,EACP,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC;AACnC,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,KAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA;AAKtD,IAAM,oBAAA,GAAuBA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,aAAa,CAAA;AAK3D,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,MAAA,EAAQA,MAAE,OAAA,EAAQ;AAAA,EAClB,KAAA,EAAO,gBAAgB,QAAA,EAAS;AAAA,EAChC,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,WAAA,EAAaA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AACjD,CAAC,CAAA;AAOM,IAAM,oBAAA,GAAuB,oBAAoB,MAAA,CAAO;AAAA,EAC7D,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,QAAA,EAAS;AAAA,EACnC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,gBAAA,EAAkB,oBAAoB,CAAC;AAC1D,CAAC,CAAA;AAKM,IAAM,wBAAA,GAA2B,oBAAoB,MAAA,CAAO;AAAA,EACjE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,QAAA,EAAS;AAAA,EACvC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,oBAAA,EAAsB,oBAAoB,CAAC;AAC9D,CAAC,CAAA;AAKM,IAAM,yBAAA,GAA4B,oBAAoB,MAAA,CAAO;AAAA,EAClE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,YAAY,EAAE,QAAA,EAAS;AAAA,EACxC,MAAA,EAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,MAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,EAAG,oBAAoB,CAAC;AACzE,CAAC,CAAA;AAKM,IAAM,yBAAA,GAA4B,oBAAoB,MAAA,CAAO;AAAA,EAClE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,YAAY,EAAE,QAAA,EAAS;AAAA,EACxC,MAAA,EAAQA,MAAE,KAAA,CAAM;AAAA,IACdA,KAAA,CAAE,QAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA;AAAA,IAChCA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,IACvF;AAAA,GACD;AACH,CAAC,CAAA;AAKM,IAAM,uBAAA,GAA0B,oBAAoB,MAAA,CAAO;AAAA,EAChE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,QAAA,EAAS;AAAA,EACtC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,mBAAA,EAAqB,oBAAoB,CAAC;AAC7D,CAAC,CAAA;AAKM,IAAM,0BAAA,GAA6B,oBAAoB,MAAA,CAAO;AAAA,EACnE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,aAAa,EAAE,QAAA,EAAS;AAAA,EACzC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAC;AAChE,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB,oBAAoB,MAAA,CAAO;AAAA,EAC9D,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,MAAA,EAAQA,MAAE,KAAA,CAAM,CAACA,MAAE,MAAA,EAAO,EAAG,oBAAoB,CAAC;AACpD,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB,oBAAoB,MAAA,CAAO;AAAA,EAC9D,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,MAAA,EAAQA,MAAE,KAAA,CAAM,CAACA,MAAE,MAAA,EAAO,EAAG,oBAAoB,CAAC;AACpD,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB,oBAAoB,MAAA,CAAO;AAAA,EAC9D,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,MAAA,EAAQA,MAAE,KAAA,CAAM;AAAA,IACd,iBAAA;AAAA,IACAA,KAAA,CAAE,MAAM,iBAAiB,CAAA;AAAA;AAAA,IACzB;AAAA,GACD;AACH,CAAC,CAAA;AAKM,IAAM,yBAAA,GAA4B,oBAAoB,MAAA,CAAO;AAAA,EAClE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,YAAY,EAAE,QAAA,EAAS;AAAA,EACxC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,qBAAA,EAAuB,oBAAoB,CAAC;AAC/D,CAAC,CAAA;AAKM,IAAM,0BAAA,GAA6B,oBAAoB,MAAA,CAAO;AAAA,EACnE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,aAAa,EAAE,QAAA,EAAS;AAAA,EACzC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,sBAAA,EAAwB,oBAAoB,CAAC;AAChE,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwB,oBAAoB,MAAA,CAAO;AAAA,EAC9D,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAC;AAC3D,CAAC,CAAA;AAKM,IAAM,uBAAA,GAA0B,oBAAoB,MAAA,CAAO;AAAA,EAChE,KAAA,EAAOA,KAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,QAAA,EAAS;AAAA,EACtC,QAAQA,KAAA,CAAE,KAAA,CAAM,CAAC,mBAAA,EAAqB,oBAAoB,CAAC;AAC7D,CAAC,CAAA;AAKmCA,MAAE,KAAA,CAAM;AAAA,EAC1C,oBAAA;AAAA,EACA,wBAAA;AAAA,EACA,yBAAA;AAAA,EACA,yBAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,kBAA+CA,KAAA,CAAE,IAAA;AAAA,EAAK,MACjEA,KAAA,CAAE,KAAA,CAAM,CAAC,mBAAA,EAAqBA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAO,EAAG,eAAe,CAAC,CAAC;AACtE;AAOO,IAAM,4BAA4BA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAU,eAAe;AAOtE,IAAM,cAAA,GAAiBA,MAC3B,MAAA,CAAO;AAAA,EACN,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,WAAA,EAAaA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAUA,KAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AACjD,CAAC,CAAA,CACA,SAAS,eAAe;ACzSpB,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,CAAA,EAAGA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC;AAC5B,CAAC,CAAA;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,IAAA,EAAMA,KAAAA,CAAE,OAAA,CAAQ,gBAAgB,CAAA;AAAA,EAChC,EAAA,EAAIA,MAAE,MAAA;AACR,CAAC,CAAA;AAKM,IAAM,wBAAA,GAA2BA,MAAE,KAAA,CAAM;AAAA,EAC9CA,MAAE,MAAA,EAAO;AAAA,EACTA,MAAE,MAAA,EAAO;AAAA,EACTA,MAAE,OAAA,EAAQ;AAAA,EACV,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,EACjB,IAAA,EAAMA,MAAE,MAAA;AACV,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC5C,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,KAAA,EAAOA,KAAAA,CAAE,KAAA,CAAM,eAAe,CAAA;AAAA,EAC9B,aAAA,EAAeA,MAAE,MAAA,EAAO;AAAA,EACxB,MAAA,EAAQA,MAAE,OAAA,EAAQ;AAAA,EAClB,oBAAA,EAAsBA,MAAE,OAAA,EAAQ;AAAA,EAChC,WAAA,EAAaA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ;AACjC,CAAC,CAAA;AAKM,IAAM,uBAAA,GAA0BA,MAAE,IAAA,CAAK,CAAC,WAAW,OAAA,EAAS,QAAA,EAAU,OAAO,CAAC,CAAA;AAK9E,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,YAAA,EAAc,uBAAA;AAAA,EACd,cAAcA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,wBAAwB,CAAA;AAAA,EAC3D,oBAAA,EAAsBA,MAAE,MAAA,EAAO;AAAA,EAC/B,MAAA,EAAQA,MAAE,OAAA,EAAQ;AAAA,EAClB,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,EACtB,oBAAA,EAAsBA,MAAE,OAAA,EAAQ;AAAA,EAChC,MAAA,EAAQA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA;AAAA,EAC1B,UAAA,EAAYA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,QAAQ;AAC7C,CAAC,CAAA;AAKM,IAAM,oBAAA,GAAuBA,MAAE,IAAA,CAAK,CAAC,QAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAC,CAAA;AAKtE,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,EACd,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,SAAA,EAAW,oBAAA;AAAA,EACX,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACtB,CAAC,CAAA;AAKM,IAAM,uBAAA,GAA0BA,MACpC,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,MAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,OAAOA,KAAAA,CAAE,KAAA,CAAMA,MAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACrC,SAASA,KAAAA,CAAE,KAAA,CAAMA,MAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACvC,KAAA,EAAOA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC3C,CAAC,EACA,WAAA,EAAY;AAKgBA,MAAE,MAAA,CAAO;AAAA,EACtC,QAAA,EAAU,uBAAA;AAAA,EACV,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACvD,aAAA,EAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC5C,CAAC;AAK8BA,MAC5B,MAAA,CAAO;AAAA,EACN,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,EACf,YAAA,EAAcA,MAAE,MAAA,EAAO;AAAA,EACvB,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,QAAA,EAAUA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,SAAS,CAAA;AAAA,EAC1C,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACvD,aAAA,EAAeA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EAC1D,aAAA,EAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAG,gBAAgB,EAAE,QAAA,EAAS;AAAA,EACxD,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,UAAUA,KAAAA,CAAE,KAAA,CAAMA,MAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC,EACA,WAAA;AAKI,IAAM,4BAAA,GAA+BA,MAAE,MAAA,CAAO;AAAA,EACnD,IAAA,EAAMA,MAAE,MAAA,CAAO;AAAA,IACb,WAAWA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,mBAAmB,CAAA;AAAA,IACnD,qBAAqBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,qBAAqB;AAAA,GAChE;AACH,CAAC;AAKoDA,MAAE,KAAA,CAAM;AAAA,EAC3D,4BAAA;AAAA,EACAA,MAAE,MAAA,CAAO;AAAA,IACP,WAAWA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,mBAAmB,CAAA;AAAA,IACnD,qBAAqBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,qBAAqB;AAAA,GAChE;AACH,CAAC;AAMM,IAAM,oBAAoBA,KAAAA,CAAE,MAAA;AAAA,EACjCA,MAAE,MAAA,EAAO;AAAA,EACTA,MAAE,KAAA,CAAM;AAAA,IACNA,MACG,MAAA,CAAO;AAAA,MACN,OAAOA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAC,EAAE,QAAA;AAAS,KACzE,EACA,WAAA,EAAY;AAAA,IACfA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,SAAS;AAAA,GACjC;AACH;AAKO,IAAM,6BAAA,GAAgCA,MAC1C,MAAA,CAAO;AAAA,EACN,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,YAAA,EAAcA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,aAAA,EAAeA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,WAAA,EAAaA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC,CAAA,CACA,QAAA;AAAA,EACCA,MAAE,KAAA,CAAM;AAAA,IACNA,MACG,MAAA,CAAO;AAAA,MACN,OAAOA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAC,EAAE,QAAA;AAAS,KACzE,EACA,WAAA,EAAY;AAAA,IACfA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAGA,KAAAA,CAAE,SAAS;AAAA,GACjC;AACH;AC9LK,IAAM,+BAAA,GAAkCA,MAC5C,MAAA,CAAO;AAAA,EACN,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,KAAA,EAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC,EACA,WAAA,EAAY;AAKR,IAAM,0BAAA,GAA6BA,MACvC,MAAA,CAAO;AAAA,EACN,KAAA,EAAOA,MAAE,OAAA,EAAQ;AAAA,EACjB,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,OAAA,EAASA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,SAAA,EAAWA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAY,gCAAgC,QAAA,EAAS;AAAA,EACrD,IAAA,EAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAMA,KAAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAUA,MACP,MAAA,CAAO;AAAA,IACN,KAAA,EAAOA,MAAE,OAAA;AAAQ,GAClB,CAAA,CACA,WAAA,EAAY,CACZ,QAAA,EAAS;AAAA,EACZ,QAAA,EAAUA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACxB,CAAC,EACA,WAAA;AAKI,IAAM,oCAA4EA,KAAAA,CAAE,IAAA;AAAA,EACzF,MACEA,KAAAA,CAAE,KAAA,CAAM,CAAC,0BAAA,EAA4BA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,EAAO,EAAG,iCAAiC,CAAC,CAAC;AACjG,CAAA;AASO,IAAM,8BAA8BA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAU,iCAAiC,CAAA;AAO1F,IAAM,2BAAA,GAA8BA,KAAAA,CAAE,KAAA,CAAM,CAACA,KAAAA,CAAE,MAAA,EAAO,EAAGA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAC,CAAC,CAAA;AAK7E,IAAM,6BAAA,GAAgCA,MAC1C,MAAA,CAAO;AAAA,EACN,cAAA,EAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,YAAYA,KAAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACzC,SAAA,EAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,OAAOA,KAAAA,CACJ,KAAA;AAAA,IACCA,MACG,MAAA,CAAO;AAAA,MACN,WAAA,EAAaA,MAAE,MAAA,EAAO;AAAA,MACtB,MAAA,EAAQA,MAAE,MAAA,EAAO;AAAA,MACjB,MAAA,EAAQA,KAAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA,MAC9B,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAAS,KACrD,EACA,WAAA;AAAY,IAEhB,QAAA,EAAS;AAAA,EACZ,SAASA,KAAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AAC/B,CAAC,EACA,WAAA,EAAY;AAK4BA,MACxC,MAAA,CAAO;AAAA,EACN,MAAA,EAAQ,4BAA4B,QAAA,EAAS;AAAA,EAC7C,OAAA,EAAS,4BAA4B,QAAA,EAAS;AAAA,EAC9C,SAAA,EAAWA,MAAE,MAAA,CAAOA,KAAAA,CAAE,QAAO,EAAG,6BAA6B,EAAE,QAAA,EAAS;AAAA,EACxE,KAAA,EAAOA,MACJ,MAAA,CAAO;AAAA,IACN,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IACrD,aAAA,EAAeA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IAC3D,eAAA,EAAiBA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,EAAO,EAAGA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,IACpE,UAAA,EAAYA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IACxD,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IACrD,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IACrD,WAAA,EAAaA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS;AAAA,IACzD,OAAA,EAASA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,MAAA,IAAUA,KAAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA;AAAS,GACtD,EACA,QAAA,EAAS;AAAA,EACZ,GAAA,EAAKA,MACF,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,MAAE,IAAA,CAAK,CAAC,QAAQ,OAAA,EAAS,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IACzD,SAAA,EAAWA,MAAE,IAAA,CAAK,CAAC,WAAW,QAAA,EAAU,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IAC7D,MAAA,EAAQA,MACL,MAAA,CAAO;AAAA,MACN,gBAAA,EAAkBA,MAAE,IAAA,CAAK,CAAC,SAAS,SAAS,CAAC,EAAE,QAAA;AAAS,KACzD,EACA,QAAA;AAAS,GACb,EACA,QAAA;AACL,CAAC,EACA,WAAA;AAOI,IAAM,0BAAA,GAA6B;ACzD1C,SAAS,gBAAgB,QAAA,EAAuC;AAC9D,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAmB;AAAA,IAC7C,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACvB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,KAAA,EAAO,MAAA;AAAA,IACP,MAAM,GAAA,CAAI;AAAA,GACZ,CAAE,CAAA;AACJ;AA2BO,SAAS,kBAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACQ;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,KAAA,CAAM,IAAI,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AASO,SAAS,gBAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACH;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AAiBO,SAAS,mBAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACA;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AASO,SAAS,+BAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACY;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,KAAA,CAAM,IAAI,CAAA;AAC1D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AASO,SAAS,8BAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACW;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,KAAA,CAAM,IAAI,CAAA;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AAiBO,SAAS,4BAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACS;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,0BAAA,CAA2B,KAAA,CAAM,IAAI,CAAA;AACvD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;AASO,SAAS,6BAAA,CACd,IAAA,EACA,QAAA,GAA8B,EAAC,EACU;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,2BAAA,CAA4B,KAAA,CAAM,IAAI,CAAA;AACxD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,gBAAgB,KAAK,CAAA;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,EAAA;AAAA,UACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA;AAChE;AACF,KACF;AAAA,EACF;AACF;ACxSA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,KAAA,EAAO,CAAC,OAAA,EAAS,MAAM;AAAA,GACzB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA;AAElB,CAAA;AASA,SAAS,kBAAA,CACPjC,KAAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAK,CAAA,EAAG;AAEnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAa,KAAA,CAAM,WAAW,IAAA,EAAM;AACvD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAAA,KAAAA;AAAA,QACA,OAAA,EAAS,0DAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,MAAA,IAAI,CAAC,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA,EAAG;AAClC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,CAAA,oBAAA,EAAuB,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,UAC3C,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,aAAA,CAAc,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAAA,KAAAA;AAAA,QACA,OAAA,EAAS,yDAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,gFAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACF;AAKA,SAAS,iBAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAMA,QAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAG/C,IAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,MAAA,kBAAA,CAAmBA,KAAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AAEtD,MAAA,iBAAA,CAAkB,KAAA,EAAOA,KAAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AACF;AAKA,SAAS,2BAAA,CACP,IAAA,EACA,cAAA,EACA,kBAAA,EACA,QACA,QAAA,EACa;AACb,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAGtC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,IACtC,CAAC,CAAC,GAAG,CAAA,KAAM,IAAI,WAAA,EAAY,KAAM,eAAe,WAAA;AAAY,MAC1D,CAAC,CAAA;AAEL,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,wBAAwB,cAAc,CAAA,qBAAA,CAAA;AAAA,MAC/C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAE1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAGA,IAAA,IAAI,kBAAA,CAAmB,SAAA,IAAa,kBAAA,CAAmB,KAAA,EAAO;AAC5D,MAAA,KAAA,MAAW,YAAA,IAAgB,mBAAmB,KAAA,EAAO;AACnD,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG;AACjC,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,GAAG,cAAc,CAAA,MAAA,CAAA;AAAA,YACvB,SAAS,CAAA,eAAA,EAAkB,YAAY,iCAAiC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,YACxF,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,UAAU,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AACnE,MAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,QAAA,iBAAA,CAAkB,UAAU,CAAA,EAAG,cAAc,UAAU,QAAQ,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA;AAAA,MACrF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,iBAAA,CAAkB,UAAA,EAAY,cAAA,EAAgB,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,aAAA;AACT;AASO,SAAS,iBAAA,CACd,UACA,kBAAA,EACmD;AACnD,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,IAAI,CAAC4B,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,gBAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yBAAyB,OAAO,CAAA,CAAA;AAAA,MACzC,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpE,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,oCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,MAAM,QAAA,GAAWO,cAAA,CAAS,QAAA,EAAUC,aAAA,CAAQ,QAAQ,CAAC,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAG1E,EAAA,MAAMC,YAAAA,GAAc,CAAC,GAAA,KAAyB;AAC5C,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AACtC,MAAA,KAAA,IAASA,aAAY,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,KAAA,GAAQ,2BAAA;AAAA,MACZ,IAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,QAAA,MAAM,UAAA,GAAa,KAAA;AACnB,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAChD,YAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,iBAAA,CAAkB,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,UAAA,GAAaA,aAAY,IAAI,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,oBAAA,CAAqB,OAAA,GAAgC,EAAC,EAAwB;AAC5F,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,WAAA,GAAc,mBAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAChD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,EAAA,MAAM,SAAA,GAAY,UAAA,IAAc,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,SAAA;AAEvD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,uCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,IAAI,CAACR,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,kBAAkB,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrE,IAAA,MAAM,QAAA,GAAWE,UAAAA,CAAK,SAAA,EAAW,kBAAA,CAAmB,KAAK,CAAA;AAEzD,IAAA,IAAI,CAACF,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,YAAA,CAAa,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,KAAK,CAAA,WAAA,CAAA;AAAA,UAC3D,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,QAAA,EAAU,kBAAkB,CAAA;AAC7D,IAAA,KAAA,CAAM,GAAA,CAAI,mBAAmB,KAAA,EAAO;AAAA,MAClC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAGD,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAChC,IAAA,eAAA,IAAmB,MAAA,CAAO,UAAA;AAC1B,IAAA,cAAA,IAAkB,MAAA,CAAO,SAAA;AACzB,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,aAAA,EAAe;AACvC,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgBC,eAAAA,CAAY,SAAS,CAAA,CAAE,MAAA;AAAA,MAC3C,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,IAAKE,YAAAA,CAASD,UAAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA,CAAE,MAAA;AAAO,KACpE;AACA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAE5E,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAMA,UAAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAAA,UAC1B,OAAA,EAAS,yCAAyC,IAAI,CAAA,CAAA;AAAA,UACtD,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,kBAAkB,MAAA,GAAS,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAA,GAAI,MAAA;AAE5D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,gBAAgB,MAAA,KAAW,CAAA;AAAA,IAClC,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA,EAAY,eAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,WAAA,CAAY,MAAmB,cAAA,EAAmC;AAChF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,MACtC,CAAC,CAAC,GAAG,CAAA,KAAM,IAAI,WAAA,EAAY,KAAM,eAAe,WAAA;AAAY,QAC1D,CAAC,CAAA;AAEL,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,GAAG,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,MAAM,CAAA;AAChB;AASO,SAAS,gBAAA,CACd,UAAA,EACA,OAAA,GAAoD,EAAC,EAC5C;AACT,EAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,uCAAA,EAAqC,UAAU;AAAA,CAAI,CAAA;AAEhE,EAAA,MAAM,SAAS,oBAAA,CAAqB,EAAE,GAAG,OAAA,EAAS,YAAY,CAAA;AAG9D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,UAAU,CAAA,IAAK,OAAO,KAAA,EAAO;AAC7C,IAAA,IAAI,WAAW,MAAA,CAAO,MAAA,KAAW,KAAK,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACtE,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,QAAA,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,KAAA,MAAW,OAAA,IAAW,WAAW,QAAA,EAAU;AACzC,QAAA,OAAA,CAAQ,KAAK,CAAA,iBAAA,EAAU,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,6BAAA,EAAwB,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,MAAA,CAAO,aAAA,CAAc,IAAA,GAAO,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,0BAAA,EAAwB,CAAC,GAAG,MAAA,CAAO,aAAa,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E;AAGA,EAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,EAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAClC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAA,CAAQ,KAAK,oCAA+B,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,6BAAwB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,MAAM,CAAA,WAAA;AAAA,KAClF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AC7eA,IAAM,8BAAc,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAGrE,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,OAAO,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC7B;AAKA,SAAS,cAAA,CAAe,QAAiB,IAAA,EAAyB;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,cAAA;AAChC,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,OAAO,YAAY,QAAA,EAAU;AAC5E,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,OAAA;AACT;AASA,SAAS,mBAAmB,KAAA,EAAe,MAAA,GAAmB,EAAC,EAAG,YAAY,EAAA,EAAa;AAEzF,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,UAAU,WAAA,EAAY;AACxC,EAAA,IAAI,UAAU,QAAA,CAAS,SAAS,KAAK,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAc,IAAA,EAAc,MAAA,GAAmB,EAAC,EAAG,YAAY,EAAA,EAAa;AAEnF,EAAA,IAAI,kBAAA,CAAmB,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,KAAS,QAAA;AAClB;AAKO,SAAS,cAAA,CACd,KAAA,EACA,IAAA,EACA,OAAA,GAAiC,EAAC,EACzB;AAET,EAAA,IAAI,SAAS,QAAA,IAAY,OAAA,CAAQ,SAAA,IAAa,OAAO,UAAU,QAAA,EAAU;AACvE,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA;AAGtB,IAAA,IAAI,MAAM,WAAA,EAAY,CAAE,SAAS,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG;AACxD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,QAAQ,MAAA,EAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAEpE,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,IACjB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,kBAAA,CAAmB,IAAA,IAAQ,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,EAChE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,aAAA,CAAc,IAAA,IAAQ,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAE7F,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EACjB;AAGA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,aAAA,CACd,SAAA,EACA,MAAA,GAAmB,EAAC,EACG;AACvB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAW,aAAA,EAAe,aAAa,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,KAAK,CAAC,KAAA,KAAU,eAAe,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG;AAC1D,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,CAAuB;AAAA,IACzC,CAAC,UAAU,YAAY,CAAA;AAAA,IACvB,CAAC,SAAS,OAAO;AAAA,GAClB,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAM,SAAA;AACpC;AAKO,SAAS,cAAA,CACd,UAAA,EACA,OAAA,GAAiC,EAAC,EAChB;AAClB,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA;AACjB,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,cAAA;AAGhC,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,MAAA,GAAU,QAAA,CAAS,SAAS,CAAA,IAA8B,EAAC;AAGjE,EAAA,MAAM,gBAAA,GAA0C;AAAA,IAC9C,GAAG,OAAA;AAAA,IACH;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,OAAO,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AAGrD,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,QAAQ,cAAA,CAAe,QAAA,CAAS,QAAQ,CAAA,EAAG,SAAS,gBAAgB,CAAA;AAAA,IACpE,OAAO,eAAA,IAAmB;AAAA,GAC5B;AAGA,EAAA,IAAI,SAAS,cAAc,CAAA,IAAK,OAAO,QAAA,CAAS,cAAc,MAAM,QAAA,EAAU;AAC5E,IAAA,KAAA,CAAM,YAAA,GAAe,SAAS,cAAc,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,SAAS,aAAa,CAAA,IAAK,OAAO,QAAA,CAAS,aAAa,MAAM,QAAA,EAAU;AAC1E,IAAA,KAAA,CAAM,WAAA,GAAc,SAAS,aAAa,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,mBACd,GAAA,EACA,SAAA,GAAY,EAAA,EACZ,OAAA,GAAiD,EAAC,EACzB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,aAAa,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA;AAElD,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AAEzE,IAAA,MAAM,cAAc,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,MAAM,YAAA,GAAsC;AAAA,MAC1C,GAAI,cAAc,EAAC;AAAA,MACnB,SAAA,EAAW;AAAA,KACb;AACA,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,KAAA,EAAO,YAAY,CAAA;AAEtD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,GAAA,EAAK;AAAA,QACjC,KAAA,EAAO,WAAA;AAAA,QACP,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AAEtD,MAAA,MAAM,MAAA,GAAS,kBAAA;AAAA,QACb,KAAA;AAAA,QACA,WAAA;AAAA,QACC,cAAwD;AAAC,OAC5D;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,QAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,GAAA,EAAK;AAAA,UACjC,KAAA,EAAO,MAAA;AAAA,UACP,QAAA,EAAU,IAAA;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,kBAAA,CAAmB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACtF,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,OAAO,CAAA;AAErF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAI,CAAA,KAAA,CAAO,CAAA;AACpD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,mBAAmB,SAAS;AAAA,GACrC;AACF;AAKA,SAAS,qBAAA,CAAsB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACzF,EAAA,MAAM,WAAW,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,MAAM,UAAU,CAAA;AAE7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,CAAA,KAAA,CAAO,CAAA;AACvD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,mBAAmB,QAAQ;AAAA,GACvC;AACF;AAKA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACxF,EAAA,MAAM,UAAU,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,SAAS,CAAA;AAErF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,KAAA,CAAO,CAAA;AACtD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,OAAO;AAAA,GACrC;AACF;AAKA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACxF,EAAA,MAAM,UAAU,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,SAAS,CAAA;AAErF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,KAAA,CAAO,CAAA;AACtD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,OAAO;AAAA,GACrC;AACF;AAKA,SAAS,kBAAkB,IAAA,EAA4C;AACrE,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,SAAS,MAAM,CAAA;AAI/D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAmC;AAC1D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,YAAY,CAAA;AAGjD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,YAAY,aAAa,CAAA;AAG5C,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,UAAU,CAAA,GAAI,WAAW,CAAA;AACxD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,EAAE,SAAA,EAAW,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,kBAAA,CAAmB,IAAA,EAAM,EAAA,EAAI;AAAA,MACvC,UAAA,EAAY,MAAA,CAAO,WAAA,CAAY,UAAU;AAAA,KACD;AAAA,GAC5C;AACF;AAKA,SAAS,eAAe,IAAA,EAA4C;AAClE,EAAA,MAAM,OAAO,cAAA,CAAe,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,QAAQ,SAAS,CAAA;AAEvE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,IAAI;AAAA,GAClC;AACF;AAKA,SAAS,cAAc,IAAA,EAA4C;AAEjE,EAAA,MAAM,IAAA,GACJ,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,eAAe,CAAA,IAC/D,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAE1D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,OAAA,GAAiD;AAAA,IACrD,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,IACzB,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA;AAAK,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,kBAAA,CAAmB,IAAA,EAAM,EAAA,EAAI,OAAO;AAAA;AAC9C,GACF;AACF;AAMA,SAAS,8BAA8B,IAAA,EAA4C;AACjF,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,SAAS,MAAM,CAAA;AAE3D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,6CAA6C,CAAA;AAC1D,IAAA,OAAO,EAAC;AAAA,EACV;AAIA,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAuB;AACrD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAA+B,CAAA,EAAG;AAC1E,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,MAAM,QAAA,GAAW,MAAM,QAAQ,CAAA;AAG/B,MAAA,iBAAA,CAAkB,IAAI,GAAA,EAAK;AAAA,QACzB,MAAA,EAAQ,OAAO,QAAA,KAAa,QAAA,GAAW,GAAG,QAAQ,CAAA,EAAA,CAAA,GAAO,OAAO,QAAQ,CAAA;AAAA,QACxE,KAAA,EAAO,WAAA;AAAA,QACP,cAAc,CAAA,aAAA,EAAgB,GAAG,CAAA,EAAA,EAAK,QAAQ,kCAAkC,GAAG,CAAA,UAAA,CAAA;AAAA,QACnF,WAAA,EAAa;AAAA,UACX,QAAA,EAAU;AAAA,YACR,gBAAA,EAAkB,iBAAiB,GAAG,CAAA;AAAA;AACxC;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,MAAA,CAAO,WAAA,CAAY,iBAAiB;AAAA;AAC7C,GACF;AACF;AAKA,SAAS,mBAAmB,IAAA,EAA4C;AACtE,EAAA,MAAM,cAAc,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,aAAa,CAAA;AAEjF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,mBAAmB,WAAW;AAAA;AAC7C,GACF;AACF;AAKA,SAAS,kBAAkB,IAAA,EAA4C;AACrE,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,WAAW,CAAA;AAE7E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,mBAAmB,SAAS;AAAA;AACzC,GACF;AACF;AAKA,SAAS,YAAY,IAAA,EAA4C;AAC/D,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,SAAS,MAAM,CAAA;AAG3D,EAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAEhC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAA2F;AAAA,IAC/F,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,mBAAmB,IAAI;AAAA;AAC/B,GACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,GAAU,kBAAA,CAAmB,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAe,IAAA,EAA4C;AAClE,EAAA,MAAM,OAAO,cAAA,CAAe,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,QAAQ,SAAS,CAAA;AAIvE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuB;AAE7C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,SAAA,GAAY,QAAQ,WAAW,CAAA;AACrC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAmB;AAAA,QACvB,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACT;AAEA,MAAA,IAAI,UAAU,cAAc,CAAA,IAAK,OAAO,SAAA,CAAU,cAAc,MAAM,QAAA,EAAU;AAC9E,QAAA,KAAA,CAAM,YAAA,GAAe,UAAU,cAAc,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,UAAU,aAAa,CAAA,IAAK,OAAO,SAAA,CAAU,aAAa,MAAM,QAAA,EAAU;AAC5E,QAAA,KAAA,CAAM,WAAA,GAAc,UAAU,aAAa,CAAA;AAAA,MAC7C;AAEA,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAE;AACjD;AASA,IAAMO,oBAAAA,GAAyC;AAAA,EAC7C,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,kCAAA,EAAoC,SAAA,EAAW,kBAAA,EAAmB;AAAA,MAC1E,EAAE,IAAA,EAAM,gCAAA,EAAkC,SAAA,EAAW,oBAAA,EAAqB;AAAA,MAC1E,EAAE,IAAA,EAAM,gCAAA,EAAkC,SAAA,EAAW,oBAAA,EAAqB;AAAA,MAC1E,EAAE,IAAA,EAAM,kCAAA,EAAoC,SAAA,EAAW,qBAAA;AAAsB;AAAA;AAAA;AAAA;AAAA;AAK/E,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,kCAAA,EAAoC,SAAA,EAAW,mBAAmB;AAAA,GACtF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,+BAAA,EAAiC,SAAA,EAAW,gBAAgB;AAAA,GAChF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,gCAAA,EAAkC,SAAA,EAAW,eAAe;AAAA,GAChF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,+BAAA,EAAiC,SAAA,EAAW,+BAA+B;AAAA,GAC/F;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,qCAAA,EAAuC,SAAA,EAAW,kBAAA,EAAmB;AAAA,MAC7E,EAAE,IAAA,EAAM,oCAAA,EAAsC,SAAA,EAAW,iBAAA,EAAkB;AAAA,MAC3E,EAAE,IAAA,EAAM,8BAAA,EAAgC,SAAA,EAAW,WAAA;AAAY;AACjE,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,8BAAA,EAAgC,SAAA,EAAW,gBAAgB;AAAA;AAEjF,CAAA;AASA,SAAS,UAAU,QAAA,EAAwB;AACzC,EAAA,MAAM,GAAA,GAAMC,cAAQ,QAAQ,CAAA;AAC5B,EAAA,IAAI,CAACV,cAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAAW,aAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACF;AAKO,SAASC,YAAAA,CAAY,MAAmB,cAAA,EAAmC;AAChF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,EAAM,cAAc,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,MAAM,CAAA;AAChB;AAKA,SAAS,cAAA,CACP,gBAAA,EACA,UAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAYV,UAAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiBA,UAAAA,CAAK,UAAA,EAAY,gBAAA,CAAiB,KAAK,CAAA;AAE9D,EAA6B;AAE3B,IAAA,IAAIF,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAIA,cAAAA,CAAW,cAAc,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6CAAA,EAAsC,gBAAA,CAAiB,KAAK,CAAA,CAAE,CAAA;AAC3E,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAWF;AASO,SAAS,gBAAgB,OAAA,EAA4C;AAC1E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,WAAA,GAAc,OAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,gBAAA,uBAAoC,GAAA,EAAI;AAC9C,EAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,qEAA8D,CAAA;AAC3E,IAAA,OAAA,CAAQ,KAAK,0BAAmB,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAE,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,cAAc,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAA,kBAAA,EAAqB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AAAA,IACtD;AACA,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,EACjB;AAGA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAsB;AACnD,EAAA,MAAM,SAAA,GAAYE,UAAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAC9C,EAAA,IAAIF,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGpC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,gBAAgB,KAAK,MAAA,CAAO,OAAA,CAAQU,oBAAmB,CAAA,EAAG;AAC1E,QAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,QAAA,IAAI,YAAY,SAAA,EAAW;AACzB,UAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAClE,UAAA,MAAM,KAAA,GAAQG,YAAAA,CAAY,SAAA,EAAW,cAAc,CAAA;AACnD,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,YAAA,gBAAA,CAAiB,GAAA,CAAI,gBAAgB,KAAK,CAAA;AAC1C,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,8CAAA,EAAiD,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OAC3G;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,gBAAgB,KAAK,MAAA,CAAO,OAAA,CAAQH,oBAAmB,CAAA,EAAG;AACpF,IAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,cAAc,CAAA,cAAA,CAAgB,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,WAAA,EAAa,SAAkB,CAAA;AAGhE,IAAA,IAAI,CAACT,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAC/C,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAGzB,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,MAAM,UAAA,GAAa,oBAAoB,IAAI,CAAA;AAC3C,QAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,UAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,KAAK,EAAC;AACnF,UAAA,MAAA,CAAO,IAAA,CAAK,gCAAgC,SAAS,CAAA;AAAA,EAAM,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACrF,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,CAAA,kCAAA,CAA+B,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,kBAAkB,SAAS,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,GAAiB,CAAC,WAAW,CAAA;AACjC,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,cAAA,GAAiB,eAAe,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACtF,MAAA,MAAM,qBAAA,GAAwB,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA;AACjE,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,cAAA,GAAiB,qBAAA,CAAsB,OAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MAC/E,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQa,YAAAA,CAAY,IAAA,EAAM,cAAc,CAAA;AAC9C,QAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/C,UAAA,cAAA,GAAiB,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,MAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AAEjC,QAAA,IAAI,aAAa,MAAA,CAAO,IAAA;AACxB,QAAA,IAAI,WAAA,CAAY,SAAA,IAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACtD,UAAA,MAAM,GAAA,GAAML,aAAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC/B,UAAA,MAAM,IAAA,GAAOD,cAAAA,CAAS,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACtC,UAAA,MAAM,GAAA,GAAMI,aAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAE/B,UAAA,IAAI,SAAS,WAAA,EAAa;AACxB,YAAA,UAAA,GAAaR,UAAAA,CAAK,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,WAAA,EAAa,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,UAC9D;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAaA,UAAAA,CAAK,cAAA,EAAgB,UAAU,CAAA;AAElD,QAAA,IAAI;AAEF,UAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,GACvB,MAAA,CAAO,SAAA,CAAU,MAAM,IAAI,CAAA,GAC3B,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAEzB,UAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AACvC,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,wBAAA,EAA2B,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,MAAA,CAAQ,CAAA;AACpE,YAAA;AAAA,UACF;AAEA,UAAA,eAAA,IAAmB,UAAA;AAEnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,YAAA,SAAA,CAAU,UAAU,CAAA;AAGpB,YAAAW,iBAAA,CAAc,YAAY,CAAA,EAAG,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,UAC3E;AAEA,UAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAE5B,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,WAAA,GAAc,SAAS,YAAA,GAAe,EAAA;AAC5C,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,iBAAA,EAAe,UAAU,CAAA,EAAG,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,WAAW,CAAA;AAAA,aACzF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,oBAAoB,UAAU,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,WAC7F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,4BAAA,EAA0B,cAAc,CAAA,CAAE,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,YAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC1C,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,CACd,SAAA,EACA,cAAA,EACA,OAAA,GAA2E,EAAC,EACnE;AACT,EAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,IAC7B,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,GAAG;AAAA,GACJ,CAAA;AAGD,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;ACj9BA,IAAM,uBAAA,GAA0B,mBAAA;AAGhC,IAAM,uBAAA,GAA0B,oBAAA;AAGhC,IAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AAalB,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,aAAa,CAAA;AAS9C,SAAS,mBAAmB,OAAA,EAAyD;AACnF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AAEjC,IAAA,MAAM,OAAA,GAAU,IAAI,IAAI,CAAA,CAAA,CAAA;AACxB,IAAA,IAAI,OAAA,CAAQ,SAAS,OAAO,CAAA,IAAK,QAAQ,QAAA,CAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA,EAAG;AAC9D,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAKA,SAAS,kBAAkB,OAAA,EAAyB;AAElD,EAAA,MAAM,aAAA,GAAgB,uBAAA;AACtB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC3C,EAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACpC;AAKO,SAAS,oBAAoB,SAAA,EAA+D;AACjG,EAAA,OAAO;AAAA,IACL,UAAA,EAAYX,UAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAAA,IACnD,UAAA,EAAYA,UAAAA,CAAK,SAAA,EAAW,uBAAuB;AAAA,GACrD;AACF;AAsBO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,SAAS,KAAA,EAAO,OAAA,GAAU,OAAM,GAAI,OAAA;AAEpE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0DAAmD,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,IAAI,CAACF,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAA,GAAQ,0BAA0B,UAAU,CAAA,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgBD,gBAAAA,CAAa,YAAY,OAAO,CAAA;AAAA,EAClD,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,QAAQ,CAAA,4BAAA,EAA+B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAe,CAAA,CAAA;AACjG,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAG,aAAa,CAAA,CAAA;AAG9C,EAAA,MAAM,YAAA,GAAe,mBAAmB,aAAa,CAAA;AACrD,EAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnC,IAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,OAAA,EAAS;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAE,CAAA;AAAA,IACnD;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,kBAAkB,aAAa,CAAA;AAGnD,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAIC,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkBD,gBAAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACxD,MAAA,IAAI,oBAAoB,SAAA,EAAW;AACjC,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,0CAAqC,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,MAAA,EAAQ;AACtB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAYW,cAAQ,UAAU,CAAA;AACpC,MAAA,IAAI,CAACV,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,QAAAW,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1C;AAEA,MAAAE,iBAAAA,CAAc,UAAA,EAAY,SAAA,EAAW,OAAO,CAAA;AAAA,IAC9C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAQ,CAAA,6BAAA,EAAgC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAe,CAAA,CAAA;AAClG,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAC,KAAK;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAAA,IAC7C;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAE,CAAA;AACjD,IAAA,IAAI,YAAA,CAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,OAAA,CAAQ,KAAK,CAAA,wBAAA,EAA2B,YAAA,CAAa,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,OAAA,CAAQ,KAAK,CAAA,gCAAA,EAAyB,YAAA,CAAa,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,aAAa,CAAC,CAAA;AAAA,IAC7E,WAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACvC;AACF;AAOO,SAAS,aAAA,CACd,WACA,WAAA,EACS;AAET,EAAA,MAAM,UAAA,GAAa,WAAA,EAAa,UAAA,GAC5BX,UAAAA,CAAK,SAAA,EAAW,YAAY,UAAU,CAAA,GACtCA,UAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,WAAA,EAAa,UAAA,GAC5BA,UAAAA,CAAK,SAAA,EAAW,YAAY,UAAU,CAAA,GACtCA,UAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAE3C,EAAA,MAAM,SAAS,UAAA,CAAW;AAAA,IACxB,UAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,EAAG;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;ACxNO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACP,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACT,KAAA,GAA2B,IAAA;AAAA,EAEnC,WAAA,CAAY,MAAA,GAAsB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,aAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,aAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,IAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAuB;AAC7B,IAAA,OAAOA,UAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAACF,cAAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC9B,MAAAW,cAAU,IAAA,CAAK,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,QAAA,EAA0B;AACxC,IAAA,MAAM,OAAA,GAAUZ,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,OAAOe,kBAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,OAAA,EAAyB;AAC1C,IAAA,OAAOA,kBAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAwB;AACtB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AAEpC,IAAA,IAAI,CAACd,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AACnC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,MAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,QACX,GAAG,MAAA;AAAA,QACH,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,QACpC,OAAO,MAAA,CAAO,WAAA;AAAA,UACZ,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC3B,KAAAA,EAAM,KAAK,CAAA,KAAM;AAAA,YAClDA,KAAAA;AAAA,YACA,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAE,WAC1C;AAAA;AACH,OACF;AAEA,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AACnC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAAA,EAAyB;AACjC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAA;AAC7C,MAAAyC,iBAAAA,CAAc,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACzC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,sBAAA,EAAyB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OACnF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAA+B;AACrC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAO;AAAC,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,UAAkB,OAAA,EAA0B;AACzD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,IAAA,MAAM,YAAA,GAAeT,cAAAA,CAAS,OAAA,EAAS,QAAQ,CAAA;AAG/C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,YAAY,CAAA;AACnD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAACJ,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,aAAA,CAAa,QAAA,CAAS,QAAQ,CAAA;AAGlD,IAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,KAAA,GAAQG,aAAS,QAAQ,CAAA;AAC/B,IAAA,MAAM,eAAe,KAAA,CAAM,KAAA;AAE3B,IAAA,OAAO,YAAA,CAAa,SAAQ,KAAM,IAAI,KAAK,KAAA,CAAM,KAAK,EAAE,OAAA,EAAQ;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,SAAA,EAAmB,OAAA,GAAU,WAAA,EAAuB;AAClE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEjB,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,OAAO,CAAA;AACpD,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA,EAAG;AACxC,QAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,WAAmB,OAAA,EAA2B;AAChE,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAsB;AAClC,MAAA,IAAI,CAACH,cAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAUC,eAAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAExD,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,QAAA,GAAWC,UAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAErC,QAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,UAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,QACf,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AAEzB,UAAA,MAAM,YAAA,GAAeE,cAAAA,CAAS,SAAA,EAAW,QAAQ,CAAA;AACjD,UAAA,IAAI,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,CAAA,EAAG;AAC9C,YAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,SAAS,CAAA;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,UAAkB,OAAA,EAA0B;AAEjE,IAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,MAAA,EAAQ;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA;AAC/B,MAAA,OAAO,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA;AAC/B,MAAA,OAAO,QAAA,CAAS,SAAS,GAAG,CAAA;AAAA,IAC9B;AAIA,IAAA,MAAM,YAAA,GAAe,OAAA,CAClB,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CACrB,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA,CACtB,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEvB,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,CAAA;AAC5C,IAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,QAAA,EAAkB,OAAA,EAAiB,OAAA,GAAoB,EAAC,EAAS;AAChF,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,IAAA,MAAM,YAAA,GAAeA,cAAAA,CAAS,OAAA,EAAS,QAAQ,CAAA;AAE/C,IAAA,IAAI,CAACJ,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,aAAA,CAAa,QAAA,CAAS,QAAQ,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQG,aAAS,QAAQ,CAAA;AAE/B,IAAA,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,KAAA,EAAO,YAAA,EAAc;AAAA,MAC/C,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAO,KAAA,CAAM,KAAA;AAAA,QACb;AAAA,OACF;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,KAAA,CAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CACE,SACA,OAAA,EACM;AACN,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAE7B,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,YAAA,GAAeC,cAAAA,CAAS,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAA;AAErD,MAAA,IAAI,CAACJ,cAAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,aAAA,CAAa,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACjD,MAAA,MAAM,KAAA,GAAQG,YAAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAErC,MAAA,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,KAAA,EAAO,YAAA,EAAc;AAAA,QAC/C,KAAA,EAAO;AAAA,UACL,IAAA;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW;AAAC,SAC7B;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,CAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,UAAkB,OAAA,EAAuB;AACvD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,IAAA,MAAM,YAAA,GAAeC,cAAAA,CAAS,OAAA,EAAS,QAAQ,CAAA;AAG/C,IAAA,MAAM,EAAE,CAAC,YAAY,GAAG,UAAU,GAAG,cAAA,KAAmB,KAAA,CAAM,KAAA;AAC9D,IAAA,KAAA,CAAM,KAAA,GAAQ,cAAA;AAEd,IAAA,KAAA,CAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AAEnC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,MAAA,IAAIJ,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,IAAI;AACF,UAAAa,iBAAAA,CAAc,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,QACvE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAME;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAEzC,IAAA,IAAI,WAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,WAAA,GAA2B,IAAA;AAE/B,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAClC,MAAA,IAAI,CAAC,WAAA,IAAe,KAAA,GAAQ,WAAA,EAAa;AACvC,QAAA,WAAA,GAAc,KAAA;AAAA,MAChB;AACA,MAAA,IAAI,CAAC,WAAA,IAAe,KAAA,GAAQ,WAAA,EAAa;AACvC,QAAA,WAAA,GAAc,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,IAAIb,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,SAAA,GAAYG,YAAAA,CAAS,SAAS,CAAA,CAAE,IAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,OAAA,CAAQ,MAAA;AAAA,MACnB,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF,CAAA;ACvXA,eAAsB,cAAA,CACpB,WACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,EAAW,KAAA,EAAO,YAAA,EAAc,SAAQ,GAAI,OAAA;AAGlD,EAAA,IAAgB,KAAA,EAAO;AACrB,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAc,EAAC;AAAA,MACf,gBAAgB,EAAC;AAAA,MACjB,eAAA,EAAiB,QAAQ,yBAAA,GAA4B,2BAAA;AAAA,MACrD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAc,EAAC;AAAA,MACf,gBAAgB,EAAC;AAAA,MACjB,eAAA,EAAiB,4BAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,SAAA,EAAU;AAG3C,EAAA,IAAI,CAAC,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACnD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,uDAA6C,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAc,EAAC;AAAA,MACf,gBAAgB,EAAC;AAAA,MACjB,eAAA,EAAiB,oBAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,SAAS,CAAA;AAElD,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAc,EAAC;AAAA,MACf,gBAAgB,EAAC;AAAA,MACjB,eAAA,EAAiB,uBAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,cAAA,CAAe,IAAA,EAAM,SAAS,CAAA;AAE9D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,MAAA;AAC/B,EAAA,MAAM,gBAAA,GAAoB,YAAA,CAAa,MAAA,GAAS,UAAA,GAAc,GAAA;AAE9D,EAAA,IAAI,OAAA,IAAW,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,sBAAA,EAAkB,aAAa,MAAM,CAAA,CAAA,EAAI,UAAU,CAAA,gBAAA,EAAmB,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,KACnG;AAAA,EACF;AAIA,EAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,0EAAgE,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,YAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA,EAAiB,+BAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,8CAAyC,CAAA;AAAA,IACxD;AACA,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,KAAA;AAAA,MAChB,cAAc,EAAC;AAAA,MACf,cAAA;AAAA,MACA,eAAA,EAAiB,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,KAAA;AAAA,IAChB,YAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAe,eAAe,SAAA,EAAsC;AAClE,EAAA,IAAI,CAACH,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAMe,GAAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMA,GAAAA,CAAG,OAAA,CAAQ,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAEnE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,MAAM,MAAA,EAAO,IAAK,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAClD,QAAA,KAAA,CAAM,IAAA,CAAKb,UAAAA,CAAK,SAAA,EAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,gCAAA,EAAmC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,KAC7F;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAqJA,eAAsB,sBACpB,YAAA,EACA,WAAA,EACA,WAAA,EACA,SAAA,EACA,gBACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAgF,EAAC;AAGvF,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,YAAA,GAAeE,cAAAA,CAAS,SAAA,EAAW,UAAU,CAAA;AAGnD,IAAA,MAAM,cAAA,GAAiBE,cAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACnD,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM;AAC/C,MAAA,MAAM,cAAA,GAAiBA,cAAAA,CAAS,CAAA,EAAG,OAAO,CAAA;AAC1C,MAAA,OAAO,cAAA,CAAe,SAAS,cAAc,CAAA;AAAA,IAC/C,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,YAAA;AAAA,MACA,OAAA,EAAS,eAAe,GAAA,CAAI,CAAC,MAAMF,cAAAA,CAAS,cAAA,EAAgB,CAAC,CAAC;AAAA,KAC/D,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,CAAa,kBAAA;AAAA,IACjB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAClB,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,SAAS,CAAA,CAAE;AAAA,KACb,CAAE,CAAA;AAAA,IACF;AAAA,GACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAAuB,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,EAC9D;AACF;AAKO,SAAS,yBAAA,CACd,QAAA,EACA,SAAA,EACA,oBAAA,EACA,gBAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,KAAK,sCAA+B,CAAA;AAC1C,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAEzB,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,QAAA,CAAS,eAAe,CAAA,CAAE,CAAA;AAChD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EACtC,CAAA,MAAA,IAAW,QAAA,CAAS,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAI,CAAA;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,CAAA,SAAA,CAAW,CAAA;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,MAAM,mBAAmB,gBAAA,GAAmB,oBAAA;AAC5C,IAAA,MAAM,eAAA,GAAA,CAAoB,gBAAA,GAAmB,gBAAA,GAAoB,GAAA,EAAK,QAAQ,CAAC,CAAA;AAE/E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,QAAA,CAAS,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAC/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,oBAAoB,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAE,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,gBAAgB,CAAA,EAAA,EAAK,eAAe,CAAA,EAAA,CAAI,CAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EACtC;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAEzB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AChaA,SAAS,UAAa,GAAA,EAAW;AAC/B,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACvC;AAMA,SAASY,eAAAA,CAAe,KAA8B5C,KAAAA,EAAyB;AAC7E,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,cAAA;AAChC,EAAA,IAAI,OAAA,GAAmB,GAAA;AAEvB,EAAA,KAAA,MAAW,OAAOA,KAAAA,EAAM;AACtB,IAAA,IACE,OAAA,IACA,OAAO,OAAA,KAAY,QAAA,IACnB,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IACtB,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA,EACxB;AACA,MAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AA+BO,SAAS,WAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,EAAE,UAAU,SAAA,GAAY,CAAC,cAAc,OAAO,CAAA,EAAG,qBAAA,GAAwB,IAAA,EAAK,GAAI,OAAA;AAGxF,EAAA,MAAM,YAAA,GAAe,UAAU,MAAM,CAAA;AAGrC,EAAA,MAAM,QAAA,GAAW4C,eAAAA,CAAe,YAAA,EAAc,SAAS,CAAA;AAEvD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,qBAAA,GAAwB,YAAA,GAAe,EAAC;AAAA,MAChD,QAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,YAAY,EAAE,MAAA,GAAS;AAAA,KAChD;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAc,SAAqC,QAAQ,CAAA;AAEjE,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,qBAAA,GAAwB,YAAA,GAAe,EAAC;AAAA,MAChD,QAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,qBAAA,GAAwB,SAAA,CAAU,YAAY,IAAI,EAAC;AAGlE,EAAA,IAAI,OAAA,GAAmC,MAAA;AACvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAE,OAAO,OAAA,CAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,GAAG,IAAI,EAAC;AAAA,IAClB;AACA,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC9C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAA;AAAA,EACrB;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAiBO,SAAS,aACd,MAAA,EACA,SAAA,EACA,YAAsB,CAAC,YAAA,EAAc,OAAO,CAAA,EACT;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAkC;AAEtD,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA,EAAQ,EAAE,QAAA,EAAU,WAAW,CAAA;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,OAAA;AACT;AAeO,SAASJ,aACd,MAAA,EACA,SAAA,GAAsB,CAAC,YAAA,EAAc,OAAO,CAAA,EAClC;AACV,EAAA,MAAM,QAAA,GAAWI,eAAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAEjD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAmC,CAAA,EAAG;AAC9E,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAkBO,SAAS,qBACd,MAAA,EACA,QAAA,EACA,YAAsB,CAAC,YAAA,EAAc,OAAO,CAAA,EACnB;AACzB,EAAA,MAAM,MAAA,GAAS,YAAY,MAAA,EAAQ;AAAA,IACjC,QAAA;AAAA,IACA,SAAA;AAAA,IACA,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAGD,EAAA,MAAM,QAAA,GAAWA,eAAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAA;AAExD,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA;AAChB;;;ACtLA,SAAS,oBAAA,CACP,gBAAA,EACA,QAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAASC,YAAM,gBAAgB,CAAA;AAGrC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,gBAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,SAAS,WAAA,EAAY;AACpC,EAAA,OAAO,GAAG,MAAA,CAAO,IAAI,IAAI,MAAM,CAAA,EAAG,OAAO,GAAG,CAAA,CAAA;AAC9C;AAKA,SAAS,aAAa,QAAA,EAAkD;AACtE,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAUlB,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CAAc,UAAkB,IAAA,EAAwC;AAC/E,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAE5C,IAAAc,iBAAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaO,SAAS,cAAA,CACd,UACA,MAAA,EACyB;AACzB,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,SAAA,EAAW,SAAQ,GAAI,MAAA;AAElE,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,UAAA,EAAY,QAAA;AAAA,IACZ,OAAO,EAAC;AAAA,IACR,WAAA,sBAAiB,GAAA,EAAI;AAAA,IACrB,OAAA,EAAS;AAAA,GACX;AAGA,EAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,CAAO,KAAA,GAAQ,4BAAA;AACf,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,eAAA,IAAmBD,YAAAA,CAAY,MAAA,EAAQ,SAAS,CAAA;AAC9D,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAEf,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qCAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,IACvD;AACA,IAAA,MAAA,CAAO,KAAA,GAAQ,mBAAA;AACf,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAWK,WAAA,CAAM,QAAQ,CAAA,CAAE,IAAA;AACjC,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,CAAA,KAAM,CAAA;AAGxB,IAAA,MAAM,SAAA,GAAY,YAAY,MAAA,EAAQ;AAAA,MACpC,QAAA;AAAA,MACA,SAAA;AAAA,MACA,qBAAA,EAAuB;AAAA,KACxB,CAAA;AAED,IAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAAmC,QAAQ,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC5E;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AACzE,IAAA,MAAM,UAAA,GAAaf,UAAAA,CAAK,SAAA,EAAW,cAAc,CAAA;AAGjD,IAAA,IAAI,aAAA,CAAc,UAAA,EAAY,SAAA,CAAU,MAAM,CAAA,EAAG;AAC/C,MAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAC3C,MAAA,YAAA,EAAA;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAkB,QAAQ,CAAA,SAAA,EAAO,cAAc,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA,IACF,WAAW,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAAwB,QAAQ,CAAA,SAAA,EAAO,cAAc,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,UAAU,YAAA,GAAe,CAAA;AAChC,EAAA,OAAO,MAAA;AACT;AAwBO,SAAS,qBAAqB,MAAA,EAAiD;AACpF,EAAA,MAAM,EAAE,WAAW,SAAA,EAAW,KAAA,EAAO,QAAQ,IAAA,EAAM,OAAA,GAAU,OAAM,GAAI,MAAA;AAEvE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,sCAAA,CAAmC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE,CAAA;AAAA,EACxC;AAIA,EAAA,IAAI,KAAA,IAASF,cAAAA,CAAW,SAAS,CAAA,EAAG;AAClC,IAAAkB,UAAA,CAAO,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA,qCAAA,CAAgC,CAAA;AAAA,IAC/C;AAAA,EACF;AAIA,EAAA,IAAI,CAAClB,cAAAA,CAAW,SAAS,CAAA,EAAG;AAE1B,IAAAW,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,UAAqC,EAAC;AAC5C,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAA,GAAWT,UAAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAGrC,IAAA,IAAI,CAACF,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAAA,MAC9C;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,UAAA,EAAY,QAAA;AAAA,QACZ,OAAO,EAAC;AAAA,QACR,WAAA,sBAAiB,GAAA,EAAI;AAAA,QACrB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,YAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,uBAAA,EAAqB,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAA,EAAU,MAAM,CAAA;AAC9C,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAEnB,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gCAAA,CAA6B,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,YAAY,CAAA,CAAE,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,UAAU,MAAY;AAE1B,IAAA,IAAIA,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAAkB,UAAA,CAAO,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,6CAAA,EAA2C,SAAS,CAAA,CAAE,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB,YAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AASO,SAAS,2BAAA,CACd,QACA,QAAA,EACU;AACV,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,KAAA,EAAO;AACrC,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACtD,IAAA,IAAI,UAAA,CAAW,WAAW,UAAA,EAAY;AACpC,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;ACxUA,IAAM,eAAA,GAAkB,UAAA;AAGxB,IAAM,aAAA,GAAgB,CAAC,mBAAA,EAAqB,uBAAuB,CAAA;AAGnE,IAAM,uBAAA,GAA6C;AAAA,EACjD;AAAA,IACE,WAAA,EAAa,iBAAA;AAAA,IACb,IAAA,EAAM,gBAAA;AAAA,IACN,EAAA,EAAI;AAAA;AAER,CAAA;AASA,SAAS,iBAAA,CACP,OAAA,EACA,YAAA,EACA,OAAA,EACmC;AACnC,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAE/B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAEjC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,MAAA,OAAO,GAAA,GAAM,OAAO,MAAA,EAAQ;AAC1B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AACzC,QAAA,IAAI,QAAQ,EAAA,EAAI;AACd,UAAA;AAAA,QACF;AACA,QAAA,UAAA,EAAA;AACA,QAAA,GAAA,GAAM,GAAA,GAAM,CAAA;AAAA,MACd;AAEA,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,UAAA,GAAa,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACxC,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,EAAE,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,UAAA,IAAc,UAAA;AACd,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,IAAA,GACJ,IAAA,CAAK,WAAA,KAAgB,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAA;AACnF,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,UAAU,CAAA,eAAA,CAAiB,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAW;AACrC;AAmBO,SAAS,eAAe,OAAA,EAAgD;AAC7E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA,GAAa,SAAA;AAAA,IACb,YAAA,GAAe,uBAAA;AAAA,IACf,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAGJ,EAAA,IAAI,CAAClB,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAE;AAAA,KACzC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAUD,gBAAAA,CAAa,WAAW,OAAO,CAAA;AAAA,EAC3C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,qBAAA,EAAwB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE;AAAA,KACzF;AAAA,EACF;AAGA,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,KAAU,iBAAA,CAAkB,OAAA,EAAS,cAAc,OAAO,CAAA;AAG1E,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,CAAC,MAAA,EAAQ;AACxB,IAAA,IAAI;AACF,MAAAc,iBAAAA,CAAc,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,gBAAA,EAAkB,KAAA;AAAA,QAClB,UAAA;AAAA,QACA,MAAA,EAAQ,CAAC,CAAA,sBAAA,EAAyB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE;AAAA,OAC1F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,gBAAA,EAAkB,KAAA;AAAA,IAClB;AAAA,GACF;AACF;AAaO,SAAS,oBAAoB,OAAA,EAMyD;AAC3F,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,KAAA,GAAQ,aAAA;AAAA,IACR,YAAA,GAAe,uBAAA;AAAA,IACf,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0CAAmC,CAAA;AAAA,EAClD;AAEA,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,MAAM,QAAA,GAAWX,UAAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAEtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAM,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,SAAS,cAAA,CAAe;AAAA,MAC5B,SAAA,EAAW,QAAA;AAAA,MACX,YAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAI,MAAA,CAAO,mBAAmB,CAAA,EAAG;AAC/B,QAAA,aAAA,EAAA;AACA,QAAA,iBAAA,IAAqB,MAAA,CAAO,gBAAA;AAAA,MAC9B,WAAW,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAC5B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,MAAW,GAAA,IAAO,OAAO,MAAA,EAAQ;AAC/B,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,iCAAA,EAAiC,aAAa,CAAA,kBAAA,CAAoB,CAAA;AAC/E,IAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,iBAAiB,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,eAAe,SAAA,EAA4B;AACzD,EAAA,MAAM,MAAA,GAASA,UAAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AAE9C,EAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,IACjC,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAKO,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,OAAOA,UAAAA,CAAK,WAAW,eAAe,CAAA;AACxC;AAKO,SAAS,eAAA,GAA4B;AAC1C,EAAA,OAAO,CAAC,GAAG,aAAa,CAAA;AAC1B;AAKO,SAAS,yBAAA,GAA+C;AAC7D,EAAA,OAAO,CAAC,GAAG,uBAAuB,CAAA;AACpC;ACzMO,IAAM,kBAAN,MAAsB;AAAA,EACV,WAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,YAAA;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,EAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,CAAC,WAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,CAAC,sBAAsB,YAAY,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,gBAAwB,WAAA,EAAsC;AAC3E,IAAA,IAAI;AAEF,MAAA,IAAI,CAACF,cAAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,oCAAoC,cAAc,CAAA;AAAA,SAC3D;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,EAAA,EAAI,KAAK,kBAAA,EAAmB;AAAA,QAC5B,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,cAAA;AAAA,QACA,OAAO,EAAC;AAAA,QACR;AAAA,OACF;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AAC/C,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,QAAA,MAAM,QAAA,GAAWE,UAAAA,CAAK,cAAA,EAAgB,QAAQ,CAAA;AAC9C,QAAA,MAAM,OAAA,GAAUH,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAE/C,QAAA,QAAA,CAAS,MAAM,IAAA,CAAK;AAAA,UAClB,IAAA,EAAM,QAAA;AAAA,UACN,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,CAACC,cAAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AACjC,QAAAW,cAAU,IAAA,CAAK,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,eAAeT,UAAAA,CAAK,IAAA,CAAK,aAAa,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AACjE,MAAAW,iBAAAA,CAAc,cAAc,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAGtE,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAAoC;AAC3C,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAC7C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,KAAA,EAAO,uBAAuB,UAAU,CAAA;AAAA,SAC1C;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AACtD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,aAAA,EAAe,CAAA;AAAA,UACf,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAGA,MAAA,IAAI,CAACb,cAAAA,CAAW,QAAA,CAAS,cAAc,CAAA,EAAG;AACxC,QAAAW,cAAU,QAAA,CAAS,cAAA,EAAgB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,QAAA,MAAM,UAAA,GAAaT,UAAAA,CAAK,QAAA,CAAS,cAAA,EAAgB,KAAK,IAAI,CAAA;AAG1D,QAAA,MAAM,SAAA,GAAYQ,cAAQ,UAAU,CAAA;AACpC,QAAA,IAAI,CAACV,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,UAAAW,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,QAC1C;AAGA,QAAAE,iBAAAA,CAAc,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AAC/C,QAAA,aAAA,EAAA;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,aAAA,EAAe,CAAA;AAAA,QACf,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAiC;AAC/B,IAAA,IAAI,CAACb,cAAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,KAAA,GAAQC,eAAAA,CAAY,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAE7E,IAAA,MAAM,YAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAaK,cAAAA,CAAS,IAAA,EAAM,OAAO,CAAC,CAAA;AAC1D,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,GAAG,QAAA;AAAA,UACH,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAChC,GAAG,CAAA;AAAA,YACH,OAAA,EAAS;AAAA,WACX,CAAE;AAAA,SACH,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAS,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA0C;AACxC,IAAA,MAAM,SAAA,GAAY,KAAK,aAAA,EAAc;AACrC,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,CAAC,CAAA,EAAG;AACxC,MAAA,OAAO,UAAU,CAAC,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAA,EAA6B;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,eAAeJ,UAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,UAAU,CAAA,KAAA,CAAO,CAAA;AAChE,MAAA,IAAIF,cAAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,QAAAkB,WAAO,YAAY,CAAA;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,IAAI,CAAClB,cAAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQC,eAAAA,CAAY,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAC7E,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAAiB,UAAAA,CAAOhB,UAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,IAAI,CAAC,CAAA;AACnC,QAAA,OAAA,EAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,GAA6B;AACnC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACxD,IAAA,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAA,EAAyB;AACjD,IAAA,OAAOY,iBAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,GAAA,EAAa,OAAA,GAAU,GAAA,EAAe;AAC1D,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,UAAUb,eAAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAExD,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,QAAA,GAAWC,UAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACrC,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AAE1D,QAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AAEvB,UAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,YAAY,CAAA,EAAG;AACrC,YAAA,KAAA,CAAM,KAAK,GAAG,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,UACrD;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AAEzB,UAAA,IAAI,IAAA,CAAK,aAAA,CAAc,YAAY,CAAA,EAAG;AACpC,YAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc9B,KAAAA,EAAuB;AAE3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,KAAY;AACpC,MAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAE7B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA;AAClC,QAAA,IAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG;AAE3B,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA;AAC9B,UAAA,OAAOA,KAAAA,CAAK,SAAS,GAAG,CAAA;AAAA,QAC1B;AACA,QAAA,OAAOA,KAAAA,CAAK,SAAS,MAAM,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,QAAA,OAAOA,KAAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,OAAOA,KAAAA,KAAS,OAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAcA,KAAAA,EAAuB;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,KAAY;AACpC,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAOA,KAAAA,CAAK,SAAS,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,MAC9D;AACA,MAAA,OAAOA,KAAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAAA,EAA0C;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,eAAe8B,UAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,UAAU,CAAA,KAAA,CAAO,CAAA;AAChE,MAAA,IAAI,CAACF,cAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAClD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGnC,MAAA,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAEhD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAA,EAAwC;AAC/D,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA,EAAG;AAClD,MAAA,OAAO,uBAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA;AAC1D,MAAA,IAAI,cAAA,KAAmB,KAAK,QAAA,EAAU;AACpC,QAAA,OAAO,CAAA,4BAAA,EAA+B,KAAK,IAAI,CAAA,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,CAACC,cAAAA,CAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQC,eAAAA,CAAY,IAAA,CAAK,WAAW,EACvC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAC,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAMC,UAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAAA,MAC9B,OAAO,IAAA,CAAK,uBAAA,CAAwBA,WAAK,IAAA,CAAK,WAAA,EAAa,CAAC,CAAC;AAAA,KAC/D,CAAE,EACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAGnC,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,YAAA,EAAc,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA;AACvB,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,IAAI;AACF,UAAAgB,UAAAA,CAAO,KAAK,IAAI,CAAA;AAAA,QAClB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB9C,KAAAA,EAAsB;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAakC,cAAAA,CAASlC,KAAAA,EAAM,OAAO,CAAC,CAAA;AAC1D,MAAA,OAAO,QAAA,GAAW,QAAA,CAAS,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;ACxRA,IAAM,cAAA,uBAAqB,GAAA,CAAgC;AAAA,EACzD,CAAC,KAAA,EAAO,EAAE,SAAS,6BAAA,EAA+B,MAAA,EAAQ,2BAA2B,CAAA;AAAA,EACrF,CAAC,MAAA,EAAQ,EAAE,SAAS,gBAAA,EAAkB,MAAA,EAAQ,kBAAkB,CAAA;AAAA,EAChE,CAAC,IAAA,EAAM,EAAE,SAAS,qBAAA,EAAuB,MAAA,EAAQ,uBAAuB,CAAA;AAAA,EACxE,CAAC,IAAA,EAAM,EAAE,SAAS,yBAAA,EAA2B,MAAA,EAAQ,2BAA2B,CAAA;AAAA,EAChF,CAAC,MAAA,EAAQ,EAAE,SAAS,aAAA,EAAe,MAAA,EAAQ,eAAe,CAAA;AAAA,EAC1D,CAAC,SAAA,EAAW,EAAE,SAAS,mBAAA,EAAqB,MAAA,EAAQ,qBAAqB,CAAA;AAAA,EACzE,CAAC,KAAA,EAAO,EAAE,SAAS,YAAA,EAAc,MAAA,EAAQ,cAAc;AACzD,CAAC,CAAA;AASD,IAAM,gBAAA,uBAAuB,GAAA,CAA0B;AAAA,EACrD,CAAC,OAAO,YAAY,CAAA;AAAA,EACpB,CAAC,QAAQ,MAAM,CAAA;AAAA,EACf,CAAC,MAAM,WAAW,CAAA;AAAA;AAAA,EAClB,CAAC,MAAM,WAAW,CAAA;AAAA;AAAA,EAClB,CAAC,QAAQ,KAAK,CAAA;AAAA;AAAA,EACd,CAAC,WAAW,SAAS,CAAA;AAAA,EACrB,CAAC,OAAO,KAAK;AACf,CAAC,CAAA;AAwBM,SAAS,yBAAyB,OAAA,EAAwD;AAC/F,EAAA,MAAM,EAAE,eAAA,EAAiB,KAAA,EAAO,SAAA,EAAW,QAAO,GAAI,OAAA;AACtD,EAAA,MAAM,YAAY,eAAA,CAAgB,SAAA;AAGlC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAA2C;AACpE,EAAA,MAAM,iBAAiB,MAAA,CAAO,OAAA;AAE9B,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,IAAA,MAAM,cAAA,GAAiB,sBAAA;AAAA,MACrB,MAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,CAAO;AAAA,KACT;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,cAAc,CAAA;AAAA,IACzC;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAA2D,MAAA,CAAO,WAAA,CAAY,YAAY,CAAA;AAEhG,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA;AAAA,IACA,aAAA,EAAe,CAAC,gBAAgB,CAAA;AAAA;AAAA,IAEhC,QAAA,EAAU,IAAA;AAAA;AAAA,IAEV,GAAA,EAAK;AAAA,MACH,QAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,SAAA;AAAA,MACX,MAAA,EAAQ;AAAA,QACN,gBAAA,EAAkB;AAAA;AACpB;AACF,GACF;AACF;AAWA,SAAS,sBAAA,CACP,MAAA,EACA,eAAA,EACA,SAAA,EACA,WACA,MAAA,EACsC;AACtC,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAC9C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,YAAA,CAAa,OAAA,GAAU,YAAA,CAAa,MAAA;AAGjE,EAAA,MAAM,iBAAiB,IAAI,GAAA,CAAI,OAAO,OAAA,CAAQ,eAAA,CAAgB,WAAW,CAAC,CAAA;AAC1E,EAAA,MAAM,aAAa,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,IAAK,UAAU,MAAM,CAAA,CAAA;AAGjE,EAAA,MAAM,MAAA,GAAS,sBAAsB,MAAM,CAAA;AAC3C,EAAA,MAAM,YAAY,MAAA,GAAS8B,UAAAA,CAAK,WAAW,MAAM,CAAA,GAAI,MAAM,SAAA,GAAY,GAAA;AAEvE,EAAA,MAAM,UAAA,GAAwC;AAAA,IAC5C,WAAA,EAAa,UAAA;AAAA,IACb,MAAA,EAAQ;AAAA,GACV;AAGA,EAAA,IAAI,MAAA,KAAW,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA,CAAA,EAAS;AACrD,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,GAAG,UAAA,CAAW,OAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,CAAC,SAAA,EAAW;AAClC,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,GAAG,UAAA,CAAW,OAAA;AAAA,MACd,UAAU,eAAA,CAAgB;AAAA,KAC5B;AAAA,EACF;AAGA,EAAA,IAAI,eAAA,CAAgB,UAAA,IAAc,MAAA,KAAW,KAAA,IAAS,CAAC,SAAA,EAAW;AAChE,IAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,OAAA,IAAW,EAAC;AAC/C,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,GAAG,eAAA;AAAA,MACH,YAAY,eAAA,CAAgB;AAAA,KAC9B;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,IAAK,MAAA;AAEvD,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA,EAAO,CAAC,UAAU;AAAA,GACpB;AACF;AAQA,SAAS,sBAAsB,MAAA,EAA8B;AAC3D,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAkCA,eAAsB,WAAW,OAAA,EAAuD;AACtF,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ,GAAI,OAAA;AAGtC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,KAAA,EAAO,mCAAmC,SAAS,CAAA,CAAA,CAAA;AAAA,MACnD,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,YAAA,GAAeiB,cAAQ,IAAI,CAAA;AAEjC,IAAA,IAAI,CAACnB,cAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,OAAO,CAAA,+BAAA,EAAkC,SAAS,MAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC/E,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,eAAA,CAAgB,SAAS,CAAA,CAAE,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAA,CAAQ,eAAA,CAAgB,QAAQ,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,yBAAyB,OAAO,CAAA;AAEjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC1E,MAAA,OAAA,CAAQ,IAAA,CAAK,uBAAuB,OAAA,CAAQ,MAAA,CAAO,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAEvE,MAAA,KAAA,MAAW,CAAC,UAAU,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACxE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,GAAA,EAAM,QAAQ,CAAA,EAAA,EAAK,WAAA,CAAY,SAAS,OAAO,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,EAAG,WAAW,CAAA;AAAA,SAClF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB,QAAA,EAAU,OAAO,CAAA;AAE/D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,SAAA,EAAW;AAAA,KACb;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,qBAAA;AAAA,MAChD,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACF;AASA,eAAe,uBAAA,CACb,UACA,OAAA,EACkD;AAElD,EAAA,MAAM,qBAAA,GAAwB,MAAM,OAAO,kBAAkB,CAAA;AAC7D,EAAA,MAAM,kBAAkB,qBAAA,CAAsB,OAAA;AAG9C,EAAA,MAAM,EAAE,eAAA,EAAiB,qBAAA,EAAsB,GAC7C,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,YAAA,EAAA,EAAA,eAAA,CAAA,CAAA;AACR,EAAA,qBAAA,CAAsB,eAAqD,CAAA;AAG3E,EAAA,MAAM,EAAE,kBAAA,EAAoB,wBAAA,EAAyB,GACnD,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AACR,EAAA,wBAAA,CAAyB,eAAqD,CAAA;AAG9E,EAAA,MAAM,EAAE,uBAAA,EAAAoB,wBAAAA,EAAwB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAC1C,EAAAA,yBAAwB,eAAqD,CAAA;AAG7E,EAAA,MAAM,EAAE,qBAAA,EAAAC,sBAAAA,EAAsB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AACxC,EAAAA,uBAAsB,eAAqD,CAAA;AAG3E,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,KAAK,CAAA,wCAAA,CAAmC,CAAA;AAChD,IAAA,KAAA,MAAW,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AACnE,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,MAAA,EAAS,QAAQ,CAAA,kBAAA,EAAqB,MAAA,CAAO,cAAc,cAAc,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA;AAAA,OAClG;AAAA,IACF;AAAA,EACF;AAKA,EAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,QAAQ,CAAA;AAGvC,EAAA,IAAI;AACF,IAAA,MAAM,GAAG,iBAAA,EAAkB;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAoC,KAAK,CAAA;AACvD,IAAA,MAAM,KAAA;AAAA,EACR;AAGA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA4B;AAEnD,EAAA,KAAA,MAAW,CAAC,cAAc,cAAc,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/E,IAAA,MAAM,MAAA,GAAS,YAAA;AACf,IAAA,MAAM,WAAA,GAAc,eAAe,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,CAAA,KAC5CnB,UAAAA,CAAK,cAAA,CAAe,SAAA,EAAW,EAAE,WAAW;AAAA,KAC9C;AACA,IAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,OAAA,GAAmD,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAEtF,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,MAAK,CAAE,MAAA;AACjD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAkB,UAAU,CAAA,aAAA,CAAe,CAAA;AAExD,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,QAAA,MAAM,MAAA,GAASF,eAAW,IAAI,CAAA;AAC9B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAAmB,MAAM,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AA0EA,eAAsB,eACpB,OAAA,EACgC;AAChC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,QAAO,GAAI,OAAA;AAG3D,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,EAAC;AACnD,EAAA,MAAM,iBAAiB,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAG1D,EAAA,MAAM,gBAAgB,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC5D,EAAA,MAAM,UAA8B,EAAC;AAErC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,mBAAA,EAAiB,aAAA,CAAc,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,mBAAmB,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,IAC5D,CAAC,CAAC,CAAA,EAAG,GAAG,MAAM,GAAA,CAAI;AAAA,MAChB,CAAC,CAAA;AACL,EAAA,MAAM,iBAAA,GAAoB,mBAAoB,UAAA,CAAW,GAAA,CAAI,gBAAgB,CAAA,IAAK,KAAM,EAAC;AAGzF,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACvD,IAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA;AAEnD,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,kCAAkC,SAAS,CAAA,CAAA,CAAA;AAAA,QAClD,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,kBAAA,IAAsB,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AAC1D,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAS,EAAC;AAAA,QACV,KAAA,EAAO,6BAA6B,SAAS,CAAA,CAAA,CAAA;AAAA,QAC7C,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,SAAA,GAAY,mBAAmB,SAAA,IAAa,KAAA;AAClD,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,GAAQ,kBAAA;AAAA,IACV,CAAA,MAAO;AAEL,MAAA,KAAA,GAAQ,CAAC,GAAG,iBAAA,EAAmB,GAAG,kBAAkB,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,WAAA,IAAe,EAAC;AAC3D,IAAA,MAAM,eAAA,GAA2C;AAAA,MAC/C,SAAA;AAAA,MACA,QAAQ,kBAAA,CAAmB,MAAA,KAAW,SAAA,GAAY,IAAA,GAAO,IAAI,SAAS,CAAA,CAAA,CAAA;AAAA,MACtE,UACE,kBAAA,CAAmB,QAAA,KAAa,SAAA,GAAY,OAAA,GAAU,qBAAqB,SAAS,CAAA,EAAA,CAAA,CAAA;AAAA,MACtF,YAAY,kBAAA,CAAmB,UAAA;AAAA,MAC/B,aAAA,EAAe,kBAAA,CAAmB,aAAA,IAAiB,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAA;AAAA,MAChF,WAAA,EAAa;AAAA,QACX,KAAK,eAAA,CAAgB,GAAA,KAAQ,SAAA,GAAY,YAAA,GAAe,UAAU,SAAS,CAAA,IAAA,CAAA,CAAA;AAAA,QAC3E,MACE,eAAA,CAAgB,IAAA,KAAS,SAAA,GAAY,iBAAA,GAAoB,cAAc,SAAS,CAAA,KAAA,CAAA,CAAA;AAAA,QAClF,IAAI,eAAA,CAAgB,EAAA,KAAO,SAAA,GAAY,WAAA,GAAc,UAAU,SAAS,CAAA,GAAA,CAAA,CAAA;AAAA,QACxE,IAAI,eAAA,CAAgB,EAAA,KAAO,SAAA,GAAY,aAAA,GAAgB,UAAU,SAAS,CAAA,KAAA,CAAA,CAAA;AAAA,QAC1E,MAAM,eAAA,CAAgB,IAAA,KAAS,SAAA,GAAY,aAAA,GAAgB,UAAU,SAAS,CAAA,KAAA,CAAA,CAAA;AAAA,QAC9E,SAAS,eAAA,CAAgB,OAAA,KAAY,SAAA,GAAY,YAAA,GAAe,UAAU,SAAS,CAAA,IAAA,CAAA,CAAA;AAAA,QACnF,KAAK,eAAA,CAAgB,GAAA,KAAQ,SAAA,GAAY,UAAA,GAAa,UAAU,SAAS,CAAA,EAAA,CAAA;AAAA;AAC3E,KACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW;AAAA,MAC9B,SAAA;AAAA,MACA,eAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAGA,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACtD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAEpD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,6BAAA,CAA0B,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE,CAAA;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAS,CAAA,EAAA,CAAI,CAAA;AAGvD,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC/C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,qBAAA,CAAoB,CAAA;AACjC,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,OAAA,CAAQ,KAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,SAAA,KAAc,CAAA;AAAA,IACvB,OAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACvB,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAYO,SAAS,aAAa,SAAA,EAA4B;AACvD,EAAA,OAAO,YAAY,6BAAA,GAAgC,yBAAA;AACrD;AAQO,SAAS,iBAAiB,eAAA,EAAkD;AACjF,EAAA,OAAO,eAAA,CAAgB,SAAA,GAAY,OAAA,GAAU,eAAA,CAAgB,QAAA;AAC/D;AAaO,SAAS,yBACd,WAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,WAAA,EAAa;AAErC,IAAA,IAAI,IAAI,SAAA,EAAW;AACjB,MAAA,YAAA,EAAA;AACA,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,kCAAA,EAAqC,YAAY,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAChF;AACA,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAGA,IAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA;AACnD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,uBAAuB,GAAA,CAAI,QAAQ,CAAA,kBAAA,EAAqB,gBAAgB,UAAU,IAAI,CAAA,CAAA;AAAA,OACxF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,EAAA;AAC7B,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAC1C,IAAA,IAAI,cAAA,IAAkB,WAAW,EAAA,EAAI;AACnC,MAAA,MAAA,CAAO,KAAK,CAAA,kBAAA,EAAqB,MAAM,qBAAqB,cAAc,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,WAAW,EAAA,EAAI;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,KAAiB,CAAA,IAAK,WAAA,CAAY,IAAA,GAAO,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,MAAA;AACT;ACpxBA,SAAS,iBACP,WAAA,EACqB;AACrB,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAE9C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjE,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,aAAA,CAAc,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,SAAS,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AAKA,SAAS,oBACP,WAAA,EACoB;AACpB,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACjE,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,eAAA,CAAgB,UAAkB,aAAA,EAAwD;AAEjG,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGhD,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,SAAS,CAAA,IAAK,aAAA,CAAc,SAAQ,EAAG;AACzD,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,sBAAA,CACP,WACA,WAAA,EACU;AACV,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AACnD,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,QAAA,CAAS,KAAK,CAAA,EAAG,SAAS,CAAA,KAAA,EAAQ,UAAA,CAAW,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AA6BO,SAAS,kBAAA,CACd,cACA,OAAA,EACiB;AACjB,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,OAAA,GAAU,OAAM,GAAI,OAAA;AAC9D,EAAA,MAAM,EAAE,aAAY,GAAI,YAAA;AAGxB,EAAA,MAAM,aAAA,GAAgB,iBAAiB,WAAW,CAAA;AAClD,EAAA,MAAM,gBAAA,GAAmB,oBAAoB,WAAW,CAAA;AAGxD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAChD,IAAA,aAAA,CAAc,GAAA,CAAI,SAAA,EAAW,EAAE,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,QAAA,GAAWsB,mBAAA,CAAG,IAAA,CAAK,OAAA,EAAS;AAAA,IAChC,GAAA,EAAK,SAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,CAAA,kBAAA,EAAc,QAAA,CAAS,MAAM,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC1E;AAGA,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,QAAA,GAAWlD,wBAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACnC,IAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,QAAA,EAAU,aAAa,CAAA;AAE5D,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA;AAC5C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB,CAAA,MAAA,IAAW,CAAC,YAAA,CAAa,UAAA,EAAY;AAEnC,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAAA,IACF,WAAW,gBAAA,EAAkB;AAE3B,MAAA,aAAA,CAAc,GAAA,CAAI,gBAAgB,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IAChD,CAAA,MAAO;AAEL,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAqC;AAChE,EAAA,MAAM,eAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,CAAA,IAAK,aAAA,CAAc,SAAQ,EAAG;AAExD,IAAA,MAAM,UAAA,GAAa,YAAY,SAAqC,CAAA;AAIpE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,CAAC,MAAMA,wBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA;AAE1D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,IAC5B;AAGA,IAAA,SAAA,CAAU,GAAA,CAAI,WAAW,SAAS,CAAA;AAClC,IAAA,cAAA,CAAe,GAAA,CAAI,WAAW,UAAU,CAAA;AAGxC,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,KAAA,EAAO,SAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAGA,EAAA,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1B,IAAA,IAAI,CAAA,CAAE,WAAW,SAAA,EAAW;AAC1B,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAA,CAAE,WAAW,SAAA,EAAW;AAC1B,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAE1E,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,EAAO,UAAA,MAAgB,YAAA,EAAc;AACvD,MAAA,MAAM,MAAA,GAAS,WAAW,MAAA,IAAU,aAAA;AACpC,MAAA,OAAA,CAAQ,IAAA,CAAK,eAAQ,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,GAAA,EAAM,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAS,WAAA,CAAY,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAA,8BAAA,EAAuB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,cAAA;AAAA,IACb,WAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAgBO,SAAS,aAAA,CACd,SAAA,EACA,YAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,GAAU,WAAA,EAAY,GAAI,OAAA;AAG7C,EAAA,MAAM,iBAAiB,IAAI,GAAA,CAAI,OAAO,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAC,CAAA;AACvE,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,WAAW,SAAA,EAAW;AAExB,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,SAAA,EAAW,YAAA,CAAa,WAAW,CAAA;AAEjF,IAAA,OAAOkD,oBAAG,IAAA,CAAKlD,wBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA,EAAG;AAAA,MAC5C,MAAA,EAAQ,cAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,gBAAgB,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,KAAA,CAAO,CAAA;AAE7E,EAAA,OAAOkD,oBAAG,IAAA,CAAKlD,wBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA,EAAG;AAAA,IAClD,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAaO,SAAS,gBAAA,CACd,SAAA,EACA,OAAA,GAAkB,WAAA,EAClB,kBAA0B,4BAAA,EACgC;AAC1D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAyD;AAG5E,EAAA,MAAM,QAAQkD,mBAAA,CAAG,IAAA,CAAK,SAAS,EAAE,GAAA,EAAK,WAAW,CAAA;AAGjD,EAAA,MAAM,WAAA,GAAc,sBAAA;AACpB,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,EAAG;AACd,MAAA,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,MAAA,CAAO,IAAI,OAAA,EAAS;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AAAA,MACjB,MAAA,EAAQ,IAAI,MAAM,CAAA,CAAA;AAAA,MAClB,QAAA,EAAU,eAAA,CAAgB,OAAA,CAAQ,QAAA,EAAU,MAAM;AAAA,KACnD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;;;AClUA,IAAI,iBAAA,GAAyC,IAAA;AAG7C,IAAM,UAAA,GAAa;AAAA,EACjB,cAAA;AAAA,EACA,8BAAA;AAAA,EACA,sCAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAGV,IAAM,qBAAqB,CAAC,cAAA,EAAgB,8BAA8B,CAAA,CAAE,KAAK,GAAG,CAAA;AAGpF,IAAM,sBAAA,GAA8C;AAAA,EAClD,UAAA;AAAA,EACA,UAAA;AAAA;AAAA,EACA,YAAA;AAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,sBAAA,GAAuD;AAAA,EAC3D,UAAA,EAAY,mBAAA;AAAA,EACZ,UAAA,EAAY,oBAAA;AAAA,EACZ,cAAA,EAAgB,6BAAA;AAAA,EAChB,eAAA,EAAiB,4BAAA;AAAA,EACjB,uBAAA,EAAyB,gCAAA;AAAA,EACzB,kBAAA,EAAoB,8BAAA;AAAA,EACpB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,2BAAA,EAA6B;AAC/B,CAAA;AASA,eAAe,OAAA,CACb,IAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,EAAK,OAAO,CAAA,WAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,KAAK,EAAA,EAAI;AACX,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,EAAG;AAE7B,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAA,CAAQ,MAAM,CAAA,sCAAA,CAAmC,CAAA;AACjD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,iBAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI;AACF,MAAAC,sBAAA,CAAS,KAAK,OAAA,EAAS;AAAA,QACrB,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAAA,QAC7B,KAAA,EAAO,UAAU,SAAA,GAAY,MAAA;AAAA,QAC7B,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,aAAa,GAAA;AAAI,OACzC,CAAA;AACD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,iBAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAiB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAAgB,IAAA,CAAK,IAAI,CAAA,2BAAA,CAA6B,CAAA;AACnE,EAAA,OAAO,IAAA;AACT;AASA,SAAS,iBAAiB,WAAA,EAAgE;AACxF,EAAA,OAAO;AAAA,IACL,GAAG,sBAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAMA,IAAM,kBAAA,uBAAyB,GAAA,CAA+B;AAAA,EAC5D,CAAC,YAAY,iBAAiB,CAAA;AAAA,EAC9B,CAAC,YAAY,wBAAwB,CAAA;AAAA,EACrC,CAAC,cAAc,uBAAuB,CAAA;AAAA,EACtC,CAAC,aAAa,wBAAwB,CAAA;AAAA,EACtC,CAAC,oBAAoB,wBAAwB,CAAA;AAAA,EAC7C,CAAC,eAAe,0BAA0B,CAAA;AAAA,EAC1C,CAAC,QAAQ,qBAAqB,CAAA;AAAA,EAC9B,CAAC,cAAc,sCAAsC,CAAA;AAAA,EACrD,CAAC,uBAAuB,oCAAoC,CAAA;AAAA,EAC5D,CAAC,eAAe,wBAAwB,CAAA;AAAA,EACxC,CAAC,kBAAkB,qCAAqC,CAAA;AAAA,EACxD,CAAC,2BAA2B,mCAAmC,CAAA;AAAA,EAC/D,CAAC,UAAU,kBAAkB;AAC/B,CAAC,CAAA;AAKD,SAAS,mBACP,QAAA,EACA,gBAAA,EACA,iBACA,SAAA,EACA,KAAA,EACA,cACA,MAAA,EACA,eAAA,EACA,cACA,SAAA,EACA,OAAA,GAA0B,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA,EAChD,YAAA,EACA,mBACA,MAAA,EACW;AACX,EAAA,MAAM,cAAc,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,IAAK,YAAY,QAAQ,CAAA,CAAA;AAE5E,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,YAAY;AAEd,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,MAAA,EAAQ;AAAA,cACN,cAAA,EAAgB,SAAA;AAAA,cAChB,SAAA,EAAW;AAAA;AACb,WACF;AAEA,UAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,MAAA,EAAQ;AAAA,YAC1C,OAAA,EAAS,IAAA;AAAA,YACT;AAAA,WACD,CAAA;AAED,UAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,YAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,YACpC;AAAA,UACF;AACA,UAAA,OAAO,MAAA,CAAO,KAAA;AAAA,QAChB;AAAA,OACF;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,MAAM;AACR,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,OAAA,CAAQ,KAAK,4DAAkD,CAAA;AAC/D,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAI;AAGF,YAAA,MAAM,eAAA,GAAkBrB,UAAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACrD,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAyB,eAAe,CAAA,CAAE,CAAA;AACvD,YAAA,MAAM,SAAS,eAAA,CAAgB,cAAA;AAAA,cAC7B,eAAA;AAAA,cACA,CAAA,uBAAA,EAAA,iBAA0B,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAAA,aACpD;AAEA,YAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,QAAA,EAAU;AACvC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA0B,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AACzE,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAA4B,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAC7D,YAAA,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAC5D,YAAA,OAAO,IAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,4BAAA,EAA0B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,aACpF;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAAA,OACF;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,YAAY;AACd,UAAA,IAAI;AACF,YAAA,MAAMsB,UAAAA,GAAYtB,UAAAA,CAAK,eAAA,EAAiB,eAAe,CAAA;AACvD,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAkB,eAAe,CAAA,CAAE,CAAA;AAChD,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAkBsB,UAAS,CAAA,CAAE,CAAA;AAG1C,YAAA,MAAM,SAAA,GAAYvB,eAAAA,CAAY,eAAe,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAEhF,YAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yCAAA,EAAkC,eAAe,CAAA,CAAE,CAAA;AAChE,cAAA,OAAO,IAAA;AAAA,YACT;AAEA,YAAA,MAAM,SAAS,oBAAA,CAAqB;AAAA,cAClC,SAAA,EAAW,eAAA;AAAA,cACX,SAAA,EAAAuB,UAAAA;AAAA,cACA,KAAA,EAAO,SAAA;AAAA,cACP,SAAA,EAAW,CAAC,YAAA,EAAc,OAAO,CAAA;AAAA,cACjC,OAAA,EAAS;AAAA,aACV,CAAA;AAGD,YAAA,MAAM,WAAA,GAAc,OAAO,KAAA,CAAM,MAAA;AAAA,cAC/B,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,EAAE,KAAA,KAAU;AAAA,aACnC;AACA,YAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,WAAA,CAAY,MAAM,CAAA,QAAA,CAAU,CAAA;AAC5E,cAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,gBAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAA,CAAO,UAAU,KAAK,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AAAA,cACnF;AACA,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,MAAM,eAAe,MAAA,CAAO,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACzD,YAAA,MAAM,YAAA,GAAe,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,mBAAmB,CAAA;AAE/E,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAsB,YAAA,CAAa,MAAM,CAAA,QAAA,CAAU,CAAA;AAChE,YAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAAmB,YAAA,CAAa,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAAA,YAC1E;AAEA,YAAA,MAAM,UAAA,GAAa,OAAO,KAAA,CAAM,MAAA;AAAA,cAC9B,CAAC,GAAA,EAAa,IAAA,KAAkC,GAAA,GAAM,KAAK,KAAA,CAAM,MAAA;AAAA,cACjE;AAAA,aACF;AACA,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qCAAA,EAAiC,UAAU,CAAA,CAAE,CAAA;AAG1D,YAAA,iBAAA,GAAoB,MAAA,CAAO,OAAA;AAE3B,YAAA,OAAO,IAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,iCAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,aACzF;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAAA,OACF;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,MAAM;AAER,UAAA,MAAM,eAAA,GAAkBtB,UAAAA,CAAK,eAAA,EAAiB,eAAe,CAAA;AAC7D,UAAA,MAAM,SAAA,GAAYF,cAAAA,CAAW,eAAe,CAAA,GAAI,eAAA,GAAkB,eAAA;AAElE,UAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAAwC,eAAe,CAAA,CAAE,CAAA;AAAA,UACxE;AAEA,UAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,YAC7B,SAAA;AAAA,YACA,cAAA,EAAgB,SAAA;AAAA,YAChB,OAAA,EAAS,IAAA;AAAA,YACT;AAAA,WACD,CAAA;AACD,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,YAC5B;AAAA,UACF;AACA,UAAA,OAAO,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACF;AAAA,IAEF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,mCAAmC,YAAY,CAAA,CAAA;AAAA,QACxD,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,YAAY;AAEd,UAAA,IAAI,CAAC,YAAA,EAAc,OAAA,IAAW,CAAC,cAAc,WAAA,EAAa;AACxD,YAAA,OAAA,CAAQ,KAAK,+EAAqE,CAAA;AAClF,YAAA,OAAA,CAAQ,KAAK,2EAAiE,CAAA;AAC9E,YAAA,OAAO,IAAA;AAAA,UACT;AAEA,UAAA,IAAI;AAEF,YAAA,MAAM,cAAc,IAAI,GAAA,CAAI,OAAO,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAC,CAAA;AAGpE,YAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,cACtB;AAAA,gBACE,OAAA,EAAS,IAAA;AAAA,gBACT,OAAA,EAAS,OAAA;AAAA,gBACT,UAAA,EAAY,IAAA;AAAA,gBACZ,aAAa,EAAC;AAAA,gBACd,eAAA,EAAiB;AAAA,kBACf,OAAA,EAAS,OAAA;AAAA,kBACT,MAAA,EAAQ;AAAA,iBACV;AAAA,gBACA,aAAa,MAAA,CAAO,WAAA;AAAA,kBAClB,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AAAA,oBACrD,IAAA;AAAA,oBACA;AAAA,sBACE,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,IAAA,KAAS,OAAA;AAAA,sBACrC,QAAQ,GAAA,CAAI,MAAA,KAAW,IAAI,SAAA,GAAY,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,sBACtD,UAAU,GAAA,CAAI,QAAA;AAAA,sBACd,YAAY,GAAA,CAAI,UAAA;AAAA,sBAChB,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,CAAA;AAAA,sBAC5D,WAAA,EAAa;AAAA,wBACX,GAAA,EACE,IAAI,WAAA,GAAc,KAAK,MACtB,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,CAAA,OAAA,EAAU,IAAI,CAAA,IAAA,CAAA,CAAA;AAAA,wBAChD,IAAA,EACE,IAAI,WAAA,GAAc,MAAM,MACvB,GAAA,CAAI,SAAA,GAAY,iBAAA,GAAoB,CAAA,WAAA,EAAc,IAAI,CAAA,KAAA,CAAA,CAAA;AAAA,wBACzD,EAAA,EACE,IAAI,WAAA,GAAc,IAAI,MACrB,GAAA,CAAI,SAAA,GAAY,WAAA,GAAc,CAAA,OAAA,EAAU,IAAI,CAAA,GAAA,CAAA,CAAA;AAAA,wBAC/C,EAAA,EACE,IAAI,WAAA,GAAc,IAAI,MACrB,GAAA,CAAI,SAAA,GAAY,aAAA,GAAgB,CAAA,OAAA,EAAU,IAAI,CAAA,KAAA,CAAA,CAAA;AAAA,wBACjD,IAAA,EACE,IAAI,WAAA,GAAc,MAAM,MACvB,GAAA,CAAI,SAAA,GAAY,aAAA,GAAgB,CAAA,OAAA,EAAU,IAAI,CAAA,KAAA,CAAA,CAAA;AAAA,wBACjD,OAAA,EACE,IAAI,WAAA,GAAc,SAAS,MAC1B,GAAA,CAAI,SAAA,GAAY,YAAA,GAAe,CAAA,OAAA,EAAU,IAAI,CAAA,IAAA,CAAA,CAAA;AAAA,wBAChD,GAAA,EACE,IAAI,WAAA,GAAc,KAAK,MACtB,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,OAAA,EAAU,IAAI,CAAA,EAAA,CAAA;AAAA;AAChD;AACF,mBACD;AAAA;AACH,eACF;AAAA,cACA,EAAE,SAAA,EAAWE,UAAAA,CAAK,WAAW,aAAa,CAAA,EAAG,SAAS,IAAA;AAAK,aAC7D;AAEA,YAAA,IAAI,eAAA,CAAgB,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC1C,cAAA,OAAA,CAAQ,IAAA;AAAA,gBACN,CAAA,2CAAA,EAAoC,eAAA,CAAgB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eAC5E;AAAA,YACF;AAEA,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,uBAAgB,eAAA,CAAgB,UAAU,CAAA,cAAA,EAAiB,eAAA,CAAgB,OAAO,IAAI,CAAA,OAAA;AAAA,aACxF;AAGA,YAAA,MAAM,aAAa,eAAA,CAAgB,MAAA;AAGnC,YAAA,MAAM,mBAAmB,MAAA,CAAO,WAAA;AAAA,cAC9B,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM;AAAA,gBACrD,IAAA;AAAA,gBACA;AAAA,kBACE,SAAA,EAAW,GAAA,CAAI,SAAA,IAAa,IAAA,KAAS,OAAA;AAAA,kBACrC,QAAQ,GAAA,CAAI,MAAA,KAAW,IAAI,SAAA,GAAY,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,kBACtD,UAAU,GAAA,CAAI,QAAA;AAAA,kBACd,YAAY,GAAA,CAAI,UAAA;AAAA,kBAChB,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,CAAA;AAAA,kBAC5D,aAAa,GAAA,CAAI;AAAA;AACnB,eACD;AAAA,aACH;AAEA,YAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,cAClC,MAAA,EAAQ;AAAA,gBACN,OAAA;AAAA,gBACA,MAAA;AAAA,gBACA,MAAA,EAAQ;AAAA,kBACN,WAAA,EAAa;AAAA;AACf,eACF;AAAA,cACA,UAAA;AAAA,cACA,SAAA,EAAW,SAAA,IAAa,CAAA,EAAG,gBAAgB,CAAA,KAAA,CAAA;AAAA,cAC3C,OAAA,EAAS;AAAA,aACV,CAAA;AAED,YAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAmC,MAAA,CAAO,SAAS,CAAA,gBAAA,CAAkB,CAAA;AACnF,cAAA,KAAA,MAAW,WAAA,IAAe,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,CAAA,EAAG;AAClE,gBAAA,OAAA,CAAQ,MAAM,CAAA,SAAA,EAAY,WAAA,CAAY,SAAS,CAAA,EAAA,EAAK,WAAA,CAAY,KAAK,CAAA,CAAE,CAAA;AAAA,cACzE;AACA,cAAA,OAAO,KAAA;AAAA,YACT;AAEA,YAAA,OAAA,CAAQ,KAAK,CAAA,iBAAA,EAAe,MAAA,CAAO,YAAY,CAAA,WAAA,EAAc,MAAA,CAAO,QAAQ,CAAA,EAAA,CAAI,CAAA;AAChF,YAAA,OAAO,IAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA;AAAA,cACN,CAAA,oCAAA,EAAkC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,aAC5F;AACA,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAAA,OACF;AAAA,IAEF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,MACF,aAAA,CAAc,gBAAA,EAAkB;AAAA,UAC9B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAY,KAAA,CAAM;AAAA,SACnB;AAAA,OACL;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,UAAU,CAAA,CAAA,EAAI,MAAM,cAAc,CAAA,CAAA,EAAI,MAAM,eAAe,CAAA,CAAA;AAAA,QAC5E,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,qBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,UAAU,CAAA,CAAA,EAAI,MAAM,cAAc,CAAA,CAAA,EAAI,MAAM,uBAAuB,CAAA,mBAAA,CAAA;AAAA,QACpF,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,MAAM;AAGR,UAAA,MAAM,SACJ,YAAA,IAAgB,iBAAA,EAAmB,MAAA,IAAUA,UAAAA,CAAK,kBAAkB,UAAU,CAAA;AAEhF,UAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,YACjC,MAAA;AAAA,YACA,OAAO,iBAAA,EAAmB,KAAA;AAAA,YAC1B,cAAc,iBAAA,EAAmB,YAAA;AAAA,YACjC,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,OAAO,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACF;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,kBAAkB,CAAA,CAAA,EAAI,MAAM,kBAAkB,CAAA,CAAA,EAAI,MAAM,mBAAmB,CAAA,CAAA;AAAA,QAC5F,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,yBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,kBAAkB,CAAA,CAAA,EAAI,MAAM,kBAAkB,CAAA,CAAA,EAAI,MAAM,2BAA2B,CAAA,mBAAA,CAAA;AAAA,QACpG,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP;AAAA,IAEF;AACE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,iBAAiB,QAAQ,CAAA,CAAA;AAAA,QAC/B,IAAI,MAAM;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oCAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AACpD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACF;AAAA;AAEN;AAKA,SAAS,gBAAA,CACP,SAAA,EACA,SAAA,EACA,OAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW,MAAA,GAAS,OAAM,GAAI,OAAA;AAKnE,EAAA,MAAM,gBAAA,GAAmB,UAAU,QAAA,CAAS,cAAc,IACtDQ,aAAAA,CAAQ,SAAS,CAAA,GACjBA,aAAAA,CAAQ,SAAS,CAAA;AAIrB,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,SAAA,IAAa,CAAA,EAAG,gBAAgB,CAAA,cAAA,CAAA;AAGhE,EAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,CAAgB;AAAA,IAC1C,WAAA,EAAa,GAAG,gBAAgB,CAAA,WAAA,CAAA;AAAA,IAChC,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS,CAAC,WAAW;AAAA,GACtB,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,UAAU,KAAA,IAAS,sBAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,UAAU,qBAAA,IAAyB,eAAA;AAGxD,EAAA,MAAM,UAAW,OAAA,CAAQ,OAAA,IAAW,CAAC,KAAA,EAAO,QAAQ,MAAM,CAAA;AAG1D,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,MAAM,IAAA,GAAO,kBAAA;AAAA,MACX,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,OAAA;AAAA,MACA,OAAA,CAAQ,YAAA;AAAA,MACR,OAAA,CAAQ,iBAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAGA,IAAA,IAAI,QAAA,KAAa,cAAc,YAAA,EAAc;AAC3C,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AACA,IAAA,IAAI,QAAA,KAAa,WAAA,KAAgB,aAAA,IAAiB,SAAA,CAAA,EAAY;AAC5D,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAA,IAAa,CAAC,CAAC,YAAA,EAAc,uBAAuB,aAAa,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG;AAEzF,MAAA,IAAI,CAAC,CAAC,UAAU,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,KAAA;AACT;AAgCA,eAAsB,WAAA,CACpB,SAAA,EACA,QAAA,EACA,OAAA,GAAwB,EAAC,EACH;AACtB,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,GAAU,IAAA;AAAA,IACV,KAAA,GAAQ,KAAA;AAAA,IACR,WAAA,GAAc,KAAA;AAAA,IACd,KAAA,GAAQ,KAAA;AAAA,IACR;AAAA,GACF,GAAI,OAAA;AAIJ,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,oBAAoB,OAAA,CAAQ,iBAAA;AAGlC,EAAA,MAAM,iBAAA,GAAkC;AAAA,IACtC,GAAG,OAAA;AAAA,IACH,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI;AACF,IAAA,IAAI,CAACV,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACvB,MAAA,EAAQ,CAAC,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,MAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,MAAA,EAAQ,CAAC,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAE,CAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACvB,MAAA,EAAQ,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,QACjD;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,MAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,MAAA,EAAQ,CAAC,CAAA,iCAAA,EAAoC,QAAQ,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAK,0EAAgE,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAE7E,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,KAAK,qDAA2C,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,KAAK,sDAA4C,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,KAAK,qCAA8B,CAAA;AAC3C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,KAAK,uCAAkC,CAAA;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,mBAAA;AAEJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,MAC9B,QAAA,EAAU,QAAA,IAAY,CAAA,EAAG,SAAS,CAAA,YAAA,CAAA;AAAA,MAClC,OAAA,EAAS;AAAA,KACV,CAAA;AAGD,IAAA,MAAM,eAAA,GAAkB,GAAG,SAAS,CAAA,cAAA,CAAA;AACpC,IAAA,MAAM,kBAAA,GAAyC;AAAA,MAE7C,KAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,WAAW,CAAC;AAAA,KACvB;AAEA,IAAA,mBAAA,GAAsB,MAAM,cAAA,CAAe,eAAA,EAAiB,kBAAkB,CAAA;AAG9E,IAAA,IAAI,CAAC,mBAAA,CAAoB,cAAA,IAAkB,mBAAA,CAAoB,YAAA,CAAa,WAAW,CAAA,EAAG;AACxF,MAAA,MAAMyB,SAAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAK,yBAAA,CAA0B,mBAAA,EAAqB,SAAA,EAAW,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAC9E;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,cAAA,EAAgB,CAAC,aAAa,CAAA;AAAA,QAC9B,aAAa,EAAC;AAAA,QACd,QAAA,EAAAA,SAAAA;AAAA,QACA,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,CAAC,qCAAqC;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,gBAAA;AAAA,IACZ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA,CAAkB;AAAA,GACpB;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAA,EAAM,WAAW,KAAA,CAAM,MAAA,EAAQ,OAAA,IAAW,CAAC,KAAK,CAAA;AAE9E,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,QAAA,cAAA,CAAe,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAGhD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAElC,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM;AAAA,gCAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,MAAM,WAAA,GAAA,CAAe,QAAA,GAAW,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AAG/C,EAAA,IAAI,WAAA,IAAe,gBAAgB,mBAAA,EAAqB;AACtD,IAAA,MAAM,eAAA,GAAkB,GAAG,SAAS,CAAA,cAAA,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,GAAG,SAAS,CAAA,YAAA,CAAA;AAEnC,IAAA,MAAM,qBAAA;AAAA,MACJ,YAAA;AAAA,MACA,mBAAA,CAAoB,YAAA;AAAA,MACpB,EAAC;AAAA;AAAA,MACD,eAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAW,CAAC;AAAA,KACd;AAGA,IAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,yBAAA;AAAA,UACE,mBAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA,CAAe,MAAA;AAAA,UACf,KAAA,CAAM;AAAA;AACR,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,IAAI;AACF,MAAA,iBAAA,EAAkB;AAClB,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAK,yCAAkC,CAAA;AAAA,MACjD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,oDAAA,EAA6C,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,SACvG;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,IAAA,OAAA,CAAQ,KAAK,wXAAkE,CAAA;AAC/E,IAAA,OAAA,CAAQ,KAAK,8EAA+D,CAAA;AAC5E,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,kBAAA,EAAS,cAAA,CAAe,MAAM,CAAA,iBAAA,EAAoB,WAAW,CAAA,qCAAA;AAAA,KAC/D;AACA,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,cAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,cAAA,CACpB,SAAA,EACA,QAAA,EACA,IAAA,GAAiB,EAAC,EACA;AAClB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA;AAC9C,EAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACvC,EAAA,MAAM,cAAc,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,IAAK,IAAA,CAAK,SAAS,SAAS,CAAA;AAC7E,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAGrC,EAAA,MAAM,aAAA,GAAgB,KAAK,SAAA,CAAU,CAAC,QAAQ,GAAA,CAAI,UAAA,CAAW,cAAc,CAAC,CAAA;AAC5E,EAAA,MAAM,cAAc,aAAA,IAAiB,CAAA,GAAI,IAAA,CAAK,EAAA,CAAG,aAAa,CAAA,GAAI,MAAA;AAClE,EAAA,MAAM,QAAA,GAAW,WAAA,EAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,SAAA,EAAW,QAAA,EAAU;AAAA,IACpD,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAS,CAAC,KAAA;AAAA,IACV,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAMA,eAAsB,WAAA,CAAY,WAAmB,QAAA,EAAiC;AACpF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,SAAA,EAAW,UAAU,IAAI,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAC9B;ACt2BO,IAAM,yBAAA,GAA4B,CAAC,MAAM;AAKhD,IAAM,eAAA,GAAkB,CAAC,UAAA,EAAY,YAAY,CAAA;AAKjD,IAAM,qBAAA,GAAwB;AAAA,EAC5B,KAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAaA,SAAS,mBAAA,CAAoB,SAAiB,OAAA,EAAqD;AAEjG,EAAA,MAAM,WAAA,GAAcN,cAAQ,OAAO,CAAA;AACnC,EAAA,MAAM,YAAA,GAAeA,cAAQ,OAAO,CAAA;AAEpC,EAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,WAAA,EAAc,OAAO,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAA;AAAA,KACrE;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAUb,eAAS,WAAW,CAAA;AACpC,EAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,OAAiD,CAAA,EAAG;AACrF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,cAAc,OAAO,CAAA,oCAAA;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAUA,SAAS,WAAA,CAAY,KAAa,OAAA,EAA0B;AAC1D,EAAA,MAAM,IAAI,GAAA,CAAI,MAAA;AACd,EAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAGlB,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAqB;AACpC,EAAA,MAAM,MAAM,CAAC,CAAA,EAAW,MAAsB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAuB,EAAA,CAAG,IAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA,IAAK,KAAA;AACpE,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAuB;AACxD,IAAA,EAAA,CAAG,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,GAAG,GAAG,CAAA;AAAA,EACvB,CAAA;AAIA,EAAA,GAAA,CAAI,CAAA,EAAG,GAAG,IAAI,CAAA;AAGd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AAC1B,MAAA,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA;AAE3B,MAAA,IAAI,UAAU,GAAA,EAAK;AAEjB,QAAA,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,IAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAC1C,WAAW,KAAA,KAAU,GAAA,IAAO,UAAU,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,EAAG;AAEhD,QAAA,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,MAC7B;AAAA,IAEF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AACjB;AAUA,SAAS,gBAAA,CAAiB,UAAkB,OAAA,EAA0B;AAEpE,EAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,GAAG,KAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,IAAA,OAAO,QAAA,KAAa,OAAA;AAAA,EACtB;AAGA,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzF,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AACjC,IAAA,OAAO,QAAA,CAAS,SAAS,SAAS,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,SAAS,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1F,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,IAAA,OAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AAAA,EACnC;AAGA,EAAA,OAAO,WAAA,CAAY,UAAU,OAAO,CAAA;AACtC;AASA,SAAS,cAAA,CAAe,UAAkB,gBAAA,EAAqC;AAC7E,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,eAAA,EAAiB,GAAG,gBAAgB,CAAA;AAC5D,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,YAAY,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAC,CAAA;AAC1E;AAYA,SAAS,cAAc,OAAA,EAAkD;AACvE,EAAA,IAAI,CAACN,cAAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,MAAM,UAAUC,eAAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,IAAA,EAAA;AACA,MAAA,MAAM,YAAY,aAAA,CAAcC,UAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AACzD,MAAA,KAAA,IAAS,SAAA,CAAU,KAAA;AACnB,MAAA,IAAA,IAAQ,SAAA,CAAU,IAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,KAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AASA,SAAS,cAAA,CACP,SACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAUF,eAAW,OAAO,CAAA;AAElC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAAmC,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,YAAA,EAAc,CAAA;AAAA,MACd,kBAAA,EAAoB,CAAA;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AAEpC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,6BAAsB,OAAO,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,aAAA;AAAA,OACtE;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,cAAc,MAAA,CAAO,KAAA;AAAA,MACrB,oBAAoB,MAAA,CAAO,IAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,UAAUC,eAAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,eAAe,CAAA,CAAE,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAEjF,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAEzB,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChD,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,QAC/C;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAYC,UAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAAgB,WAAO,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,MAAO;AAEL,IAAAA,WAAO,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,IAAA,CAAK,qBAAgB,OAAO,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,aAAA,CAAe,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,cAAc,MAAA,CAAO,KAAA;AAAA,IACrB,oBAAoB,MAAA,CAAO,IAAA;AAAA,IAC3B,OAAA,EAAS;AAAA,GACX;AACF;AAiCO,SAAS,iBAAA,CAAkB,OAAA,GAAwB,EAAC,EAAgB;AACzE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAAA,IACxC,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,CAAC,GAAG,yBAAyB,CAAA;AAAA,IACjE,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GACjC;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,IAAA;AAAA,IACT,SAAS,EAAC;AAAA,IACV,iBAAA,EAAmB,CAAA;AAAA,IACnB,uBAAA,EAAyB,CAAA;AAAA,IACzB,QAAQ,EAAC;AAAA,IACT,UAAU,EAAC;AAAA,IACX,QAAQ,iBAAA,CAAkB,MAAA;AAAA,IAC1B,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,GAAS,WAAA,GAAc,EAAA;AACzD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,iCAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,iBAAA,CAAkB,OAAO,CAAA,CAAE,CAAA;AAAA,EACtD;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,kBAAkB,WAAA,EAAa;AAC/C,IAAA,MAAM,YAAA,GAAeC,aAAAA,CAAQ,iBAAA,CAAkB,OAAA,EAAS,GAAG,CAAA;AAG3D,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,YAAA,EAAc,iBAAA,CAAkB,OAAO,CAAA;AAC9E,IAAA,IAAI,CAAC,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO;AACzC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACnC,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,eAAe,YAAA,EAAc;AAAA,QAC3C,QAAQ,iBAAA,CAAkB,MAAA;AAAA,QAC1B,SAAS,iBAAA,CAAkB,OAAA;AAAA,QAC3B,UAAU,iBAAA,CAAkB;AAAA,OAC7B,CAAA;AAED,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC3B,MAAA,MAAA,CAAO,qBAAqB,OAAA,CAAQ,YAAA;AACpC,MAAA,MAAA,CAAO,2BAA2B,OAAA,CAAQ,kBAAA;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,MAAA,CAAO,OAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAC9D,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE/B,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,GAAS,cAAA,GAAiB,SAAA;AAC9D,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,OAAA,EAAK,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,iBAAiB,WACrC,MAAA,CAAO,uBAAuB,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAQ,CAAA,EAAA;AAAA,OACvE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,kCAA6B,CAAA;AAC3C,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,cAAA,CACd,OAAA,EACA,OAAA,GAAyC,EAAC,EACjC;AACT,EAAA,MAAM,SAAS,iBAAA,CAAkB;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AC/cA,SAASxB,SAAQ,GAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,OAAO,OAAA,IAAW,UAAU,QAAA,IAAY,MAAA;AAC1C;AAKA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,GAAG,KAAK,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,EAAU;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAWA,SAAS,SAAA,CACP,MAAA,EACA,MAAA,EACA,OAAA,GAAU,KAAA,EACG;AACb,EAAA,MAAM,SAAsB,MAAA,GAAS,EAAE,GAAG,MAAA,KAAW,EAAC;AAGtD,EAAA,MAAM,aAAA,GAAgBA,SAAQ,MAAM,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgBA,SAAQ,MAAM,CAAA;AACpC,EAAA,MAAM,iBAAA,GAAoB,eAAe,MAAM,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoB,eAAe,MAAM,CAAA;AAE/C,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,sEAA4D,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,gEAAsD,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,EAAE,GAAG,MAAA,EAAO;AAAA,EACrB;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,IAAA,IAAI,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAEjF,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,QACZ,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAErC,MAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,cAAc,EAAC;AAClE,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,GAAG,aAAA,EAAe,GAAG,WAAW,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAW;AAEpC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,MAAA,GAAS,GAAA;AAEf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AAExB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,MAAA,IAAI,OAAA,IAAW,WAAA,IAAe,QAAA,IAAY,WAAA,EAAa;AACrD,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,IAAS,YAAY,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAUA,SAAS,gBAAA,CACP,GAAA,EACA,OAAA,EACA,OAAA,EACA,cAAA,EACM;AACN,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9D,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAG9D,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAG,CAAA;AAEzE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AAErB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAE7E,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAElC,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACzC,UAAA,QAAA,GAAW,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACtC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA;AAGX,MAAA,IAAK,GAAA,CAAI,GAAG,CAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAAG;AACxC,QAAA,IAAI,EAAE,kBAAkB,GAAA,CAAA,EAAM;AAC5B,UAAA,GAAA,CAAI,cAAc,CAAA,GAAI,EAAA;AAAA,QACxB;AACA,QAAA,IAAI,EAAE,qBAAqB,GAAA,CAAA,EAAM;AAC/B,UAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,cAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtE,MAAA,gBAAA,CAAiB,KAAA,EAAsB,OAAA,EAAS,OAAA,EAAS,cAAc,CAAA;AAAA,IACzE;AAAA,EACF;AACF;AASA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAE9C,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,IAAI,OAAA,IAAW,CAAC,OAAA,EAAS;AACvB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AAED,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,cAAA,CAAe,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AACT;AAUA,SAAS,mBAAmB,GAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,GAAoB,IAAA;AACxB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,SAAS,gBAAgB,IAAA,EAAqC;AAC5D,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,QAAA,MAAM,WAAA,GAAc,KAAA;AACpB,QAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,UAAA,cAAA,EAAA;AACA,UAAA,IACE,OAAO,WAAA,CAAY,QAAQ,CAAA,KAAM,QAAA,IAChC,YAAY,QAAQ,CAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAChD;AACA,YAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,iBAAA,GAAoB,KAAA;AACpB,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,eAAA,CAAgB,WAAW,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,CAAgB,GAA8B,CAAA;AAC9C,EAAA,OAAO,qBAAqB,cAAA,GAAiB,EAAA;AAC/C;AAKA,SAAS,kBAAkB,IAAA,EAAqC;AAC9D,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,QAAA,CAAS,UAAkB,OAAA,EAAyC;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWwB,cAAQ,QAAQ,CAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,OAAA,GAAUpB,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,QAAA,CAAS,QAAA,EAAkB,IAAA,EAAe,OAAA,EAA2B;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWoB,cAAQ,QAAQ,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAC5C,IAAAN,iBAAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaO,SAAS,iBAAiB,OAAA,EAAoC;AACnE,EAAA,MAAM,EAAE,aAAa,UAAA,EAAY,QAAA,GAAW,QAAQ,MAAA,GAAS,KAAA,EAAO,OAAA,GAAU,KAAA,EAAM,GAAI,OAAA;AAExF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,wCAAwC;AAAA,KACnD;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,CAACb,cAAAA,CAAW,IAAI,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,uCAAgC,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,cAAgF,EAAC;AAEvF,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,IAAA,MAAM,cAAA,GAAiB,OAClB,IAAA,CAAK,CAAC,EAAE,IAAI,CAAA,GACZ,KAAK,CAAC,CAAA;AACX,IAAA,MAAM,UAAA,GAAa,YAAY,cAAc,CAAA;AAE7C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,EAAmB,IAAA,IAAQ,SAAS,CAAA,GAAA,EAAM,UAAU,CAAA,QAAA,CAAU,CAAA;AAAA,IAC7E;AAEA,IAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,cAAA,EAAgB,YAAY,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,MAC9B,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,uCAAuC;AAAA,KAC/E;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAA;AAC5F,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,CAAC,CAAA,IAAK,QAAA;AAC1C,EAAA,MAAM,cAAc,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA,GACjD,WACA,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,EAAG,MAAO,CAAA,CAAE,MAAA,IAAU,EAAE,MAAA,GAAS,CAAA,GAAI,GAAI,WAAW,CAAA;AAEhF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,oCAAA,EAAkC,WAAW,CAAA,CAAA,CAAG,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,mCAA4B,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,eAAA,GAAkB,YAAY,CAAC,CAAA;AACrC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,yBAAyB;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,IAAI,SAAsB,eAAA,CAAgB,IAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAa,OAAA,EAAS;AAExB,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,IACjD,CAAA,MAAO;AAEL,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,qDAAyC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,GAAO,MAAM,QAAQ,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAE9B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,MAAW,WAAA,IAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7C,UAAA,IAAI,kBAAA,CAAmB,MAAA,CAAO,WAAW,CAAC,CAAA,EAAG;AAC3C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAAqC,WAAW,CAAA,CAAE,CAAA;AAAA,YACjE;AACA,YAAA,OAAO,OAAO,WAAW,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,aAAa,WAAA,CAAY,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gDAAA,EAA4C,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,EACnF;AACA,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,WAAW,CAAA;AAAA,IAC9D;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,gDAAyC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AAGpC,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,CAAA;AAEtC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK,6BAAwB,WAAW,CAAA;AAAA,CAAW,CAAA;AAAA,EAC7D;AAGA,EAAA,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,GAAG,QAAQ,CAAA;AAGzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACxD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,QAC9B,WAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0BAAqB,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAK,oBAAa,CAAA;AAC1B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IACrD;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAgB,WAAW,CAAA,OAAA,CAAS,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,IAC9B,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,IAC9C,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACvC;AACF;AAKO,SAAS,mBAAA,CAAoB,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAAyB;AAC7F,EAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,IAC9B,WAAA,EAAa,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9B,UAAA,EAAY,MAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AChiBA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AASA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,MAAM,KAAA,GAAQ,QACX,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CACnC,OAAA,CAAQ,SAAS,gBAAgB,CAAA,CACjC,QAAQ,KAAA,EAAO,OAAO,EACtB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,mBAAmB,IAAI,CAAA;AAClC,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAChC;AAKA,SAAS,oBAAA,CAAqB,cAAsB,QAAA,EAA6B;AAC/E,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AACjC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAgB0B,0BAAS,YAAY,CAAA;AAC3C,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,cACb,GAAA,EACA,OAAA,EACA,WACA,cAAA,EACA,QAAA,EACA,cACA,cAAA,EAC6B;AAC7B,EAAA,MAAM,QAA4B,EAAC;AAEnC,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAASX,cAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAEtE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,SAAA,GAAiBW,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAC3C,MAAA,MAAM,YAAA,GAAoBA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AAGrD,MAAA,IAAI,oBAAA,CAAqB,YAAA,EAAc,cAAc,CAAA,EAAG;AACtD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,WAAA,EAAY,IAAM,cAAA,IAAkB,KAAA,CAAM,gBAAe,EAAI;AAErE,QAAA,MAAM,WAAW,MAAM,aAAA;AAAA,UACrB,SAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA,GAAe,CAAA;AAAA,UACf;AAAA,SACF;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,IAAK,KAAA,CAAM,KAAK,QAAA,CAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA,EAAG;AAEjE,QAAA,MAAM,IAAA,GAAO,MAASX,cAAA,CAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAC7C,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,YAAA,EAAc,SAAA;AAAA,UACd,YAAA;AAAA,UACA,MAAWW,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,UAC/C,SAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,KAAK,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,EACtF;AAEA,EAAA,OAAO,KAAA;AACT;AAsBA,eAAsB,gBAAgB,OAAA,EAA2D;AAC/F,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,GAAiB,uBAAA;AAAA,IACjB,cAAA,GAAiB,KAAA;AAAA,IACjB,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,WAAA,GAAmBA,yBAAQ,GAAG,CAAA;AAGpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAASX,cAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAC/C,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,QAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAC5B,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAG5B,IAAA,MAAM,aAAa,MAAM,aAAA;AAAA,MACvB,WAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,EAC1B;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAEhE,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA,EAAa,WAAA;AAAA,IACb,kBAAA,EAAoB,WAAA;AAAA,IACpB,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB;AAAA,GACF;AACF;AASO,SAAS,SAAA,CACd,KAAA,EACA,KAAA,GAA4C,cAAA,EACxB;AACpB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA;AAExB,EAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACpD,CAAA,MAAA,IAAW,UAAU,iBAAA,EAAmB;AACtC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAEpB,MAAA,MAAM,IAAA,GAAYW,gBAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA;AACxC,MAAA,MAAM,IAAA,GAAYA,gBAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA;AACxC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,WAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,GAAU,KAAA,EACU;AACpB,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAChE,IAAA,OAAO,OAAA,GAAU,UAAU,CAAC,OAAA;AAAA,EAC9B,CAAC,CAAA;AACH;AAKO,SAAS,wBAAA,GAAqC;AACnD,EAAA,OAAO,CAAC,GAAG,uBAAuB,CAAA;AACpC;ACjPA,SAAS,sBAAsB,OAAA,EAAiC;AAC9D,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,OAAA,GAAU,CAAA;AAAA;AAAA,cAAA,EAEF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AASvB,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,qBAAA,CAAsB,QAAgB,OAAA,EAAiC;AAC9E,EAAA,OAAO,yBAAyB,MAAM,CAAA,cAAA,CAAA;AACxC;AASA,SAAS,iBAAA,CAAkB,SAAiB,MAAA,EAAkC;AAC5E,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,WAAA,GAAc,WAAA,CAAY,MAAA,GAAS,CAAA;AACrD,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,SAAS,SAAS,CAAA,gEAAA;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,YAAY,KAAK,EAAC;AACpD,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,WAAW,CAAA;AACvC,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM;AACzC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,oFAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAQ;AAErB,IAAA,MAAM,kBAAA,GAAqB,kCAAA;AAC3B,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,EAAG;AACpC,MAAA,QAAA,CAAS,KAAK,CAAA,gEAAA,CAAkE,CAAA;AAAA,IAClF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAuBA,eAAsB,YAAA,CACpB,YAAA,EACA,WAAA,EACA,MAAA,GAA+B,EAAC,EACL;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,OAAA,EAAQ,GAAI,MAAA;AAEjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAoB,CAAC,oBAAoB,CAAA;AAC/C,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAGrD,EAAA,IAAI,eAAe,QAAA,EAAU;AAE3B,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,OAAA,CAAQ,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC7B;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,oBAAA,EAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,oBAAA,EAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAE/B,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,OAAA,CAAQ,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACvC,EAAA,QAAA,CAAS,KAAK,GAAG,iBAAA,CAAkB,aAAA,EAAe,YAAA,CAAa,MAAM,CAAC,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,aAAA;AAAA,IACT,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAsB,WAAA,CACpB,KAAA,EACA,IAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,UAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAASC,cAAA,CAAA,QAAA,CAAS,QAAA,CAAS,UAAU,OAAO,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AASO,SAAS,uBAAA,CACd,cACA,SAAA,EACQ;AACR,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,GAAe,CAAC,YAAY,CAAA;AAC1E,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAEhC,IAAA,IAAI,WAAW,UAAA,CAAW,GAAG,KAAK,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAE5D,MAAA,MAAM,YAAA,GAAoBC,gBAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA;AACvD,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,YAAY,CAAA,EAAA,CAAI,CAAA;AAAA,IAC9C,CAAA,MAAO;AAEL,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;;AAAA,CAAA;AACjC;AAUO,SAAS,mBAAA,CACd,OAAA,EACA,YAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,YAAA,EAAc,SAAS,CAAA;AAC9D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,GAAS,OAAA;AAClB;ACpNA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,gDAAA,EAAkD,EAAE,CAAA;AAC7E;AAMA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,OACE,OAAA,CAEG,QAAQ,sCAAA,EAAwC,EAAE,EAElD,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAEnB,OAAA,CAAQ,uBAAuB,IAAI,CAAA,CAEnC,QAAQ,KAAA,EAAO,GAAG,EAElB,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,CAC5B,IAAA,EAAK;AAEZ;AAKA,SAAS,gBAAgB,WAAA,EAAuC;AAC9D,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA;AAC9E,EAAA,OAAO,kBAAkB,OAAA,GAAU,MAAA;AACrC;AAKA,SAAS,iBAAA,CAAkB,OAAA,EAAmB,IAAA,EAAc,SAAA,EAA2B;AACrF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAG,SAAS,CAAA,CAAA;AAAA,IACzB,OAAA;AAAA,IACA,OAAO,EAAC;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA;AAC5C;AAwBA,eAAsB,YAAA,CACpB,aACA,MAAA,EACuB;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,qBAAA,EAAuB,UAAA,EAAY,QAAO,GAAI,MAAA;AAEvE,EAAA,IAAI,UAAU,WAAA,CAAY,OAAA;AAG1B,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,QAAA,GAAW,cAAc,OAAO,CAAA;AACtC,IAAA,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA;AAClD,IAAA,OAAA,GAAU,QAAA;AAAA,EACZ;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAgB,WAAW,CAAA;AAC7C,EAAA,MAAM,aAAkBC,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,GAAG,IAAI,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAG7D,EAAA,MAASC,wBAAS,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAGtD,EAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAGxD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,SAAA,GAAY,iBAAA,CAAkB,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,GAAG,UAAU,CAAA,IAAA,CAAA;AAC7B,IAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAGvD,IAAA,MAAM,MAAA,GAAS;AAAA,qBAAA,EAA0B,IAAI,GAAG,SAAS,CAAA,OAAA,CAAA;AACzD,IAAA,OAAA,IAAW,MAAA;AACX,IAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAO,WAAA,CAAY,OAAA;AAAA,IACnB,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,IACxC;AAAA,GACF;AACF;AAYA,eAAsB,aAAA,CACpB,QAAA,EACA,SAAA,EACA,QAAA,EACA,WACA,MAAA,EACsD;AACtD,EAAA,MAAM,EAAE,QAAA,GAAW,eAAA,EAAiB,GAAG,cAAa,GAAI,MAAA;AACxD,EAAA,MAAM,UAAuD,EAAC;AAG9D,EAAA,MAAM,SAAA,GAAY,UAAU,QAAQ,CAAA;AACpC,EAAA,IAAI,QAAA,IAAY,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,MAAM,cAAc,MAAM,WAAA;AAAA,MACxB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,MACnC,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAM,EAAG,WAAW,CAAA;AAExF,IAAA,OAAA,CAAQ,GAAA,GAAM,MAAM,YAAA,CAAa,WAAA,EAAa;AAAA,MAC5C,GAAG,YAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,GAAa,UAAU,SAAS,CAAA;AACtC,EAAA,IAAI,SAAA,IAAa,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,MAAM,cAAc,MAAM,WAAA;AAAA,MACxB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,MACpC,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAO,EAAG,WAAW,CAAA;AAE1F,IAAA,OAAA,CAAQ,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,EAAa;AAAA,MAC7C,GAAG,YAAA;AAAA,MACH,IAAA,EAAM,IAAI,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAUA,eAAsB,qBAAA,CACpB,KAAA,EACA,MAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,MAAM,cAAc,MAAM,WAAA;AAAA,IACxB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,IAChC,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,EAAA,EAAI,MAAA,IAAU,WAAW,CAAA;AAE3E,EAAA,OAAO,YAAA,CAAa,aAAa,MAAM,CAAA;AACzC;AC7MO,IAAM,kBAAA,GAAmD;AAAA,EAC9D,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,GAAA,EAAK;AACP;AAaO,SAAS,mBAAA,CAAoB,UAAkB,MAAA,EAAmC;AACvF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,OAAO,KAAA,IAAS,SAAA;AAAA,IACvB,IAAA,EAAM,OAAO,IAAA,IAAQ,QAAA;AAAA,IACrB,MAAA,EAAQ,OAAO,MAAA,IAAU,EAAA;AAAA,IACzB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,GAAA,CAAI,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAAA,IACxD,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,GAAA,CAAI,WAAA;AAAY,GACjD;AAEA,EAAA,IAAI,MAAA,GAAS,QAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,CAAA,CAAA,EAAI,GAAG,KAAK,KAAK,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAA;AACT;AAyBO,SAAS,iBAAA,CACd,MAAA,EACA,MAAA,EACA,MAAA,GAA4B,EAAC,EACrB;AAER,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,MAAM,KAAK,MAAA,CAAO,OAAA;AAGhD,EAAA,IAAI,WAAW,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,IAAK,mBAAmB,MAAM,CAAA;AAGpE,EAAA,QAAA,GAAW,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAE/C,EAAA,OAAYC,gBAAA,CAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAChC;AAUO,SAAS,qBAAA,CACd,OAAA,EACA,MAAA,EACA,MAAA,GAA4B,EAAC,EACC;AAC9B,EAAA,MAAM,SAAgD,EAAC;AAEvD,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,MAAM,CAAA,GAAI,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,MAAA;AACT;AAYO,SAAS,oBAAoB,KAAA,EAGlC;AACA,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,MAAM,eAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,IAAA,MAAM,UAAA,GAAkBA,2BAAU,UAAU,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,aAAa,UAAU,CAAA;AAE9C,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,CAAC,cAAA,EAAgB,MAAM,CAAC,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,UAAU,CAAA,GAAI,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAU,MAAA,KAAW,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AAYA,eAAsB,iBAAiB,KAAA,EAAkD;AACvF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AAC7C,IAAA,WAAA,CAAY,GAAA,CAASA,gBAAA,CAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAASC,wBAAS,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,mBAAmB,WAAA,EAIlB;AACf,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAY,SAAA,IAAa,MAAA;AAAA,IAClC,UAAA,EAAY,WAAA,CAAY,UAAA,IAAc,EAAC;AAAA,IACvC,SAAA,EAAW,WAAA,CAAY,eAAA,IAAmB,EAAC;AAAA,IAC3C,UAAA,EAAY;AAAA,GACd;AACF;;;ACuKO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA;AAGd,EAAA,IAAI,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,QAAA,EAAU;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,KAAA,EAAyB;AACpD,EAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAC1B;AAKO,SAAS,gBAAgB,KAAA,EAAyB;AACvD,EAAA,OAAO,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AAC/B;AAKO,SAAS,eAAe,KAAA,EAAoC;AACjE,EAAA,OAAO,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA;AAC9B;;;AC5YA,YAAA,EAAA;AACA,WAAA,EAAA;AACA,kBAAA,EAAA;AACA,eAAA,EAAA;AAaA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,0BAAA;AAAA,EACA,+BAAA;AAAA,EACA,4BAAA;AAAA,EACA,2BAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAA;AAKA,IAAM,oBAAsC,CAAC,KAAA,EAAO,MAAM,IAAA,EAAM,MAAA,EAAQ,aAAa,MAAM,CAAA;AA2BpF,SAAS,2BAAA,CACd,UAAA,EACA,OAAA,GAA0C,EAAC,EACjC;AACV,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,uBAAA;AAAA,IACT,MAAA,GAAS,WAAW,MAAA,CAAO,MAAA;AAAA,IAC3B,SAAA,GAAY,WAAW,MAAA,CAAO,SAAA;AAAA,IAC9B,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,YAAA,IAAgB,EAAA;AAAA,IACjD,gBAAA,GAAmB,UAAA,CAAW,MAAA,CAAO,gBAAA,IAAoB,IAAA;AAAA,IACzD,SAAA,GAAY,iBAAA;AAAA,IACZ,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,KAAA,IAAS;AAAA,GACvC,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,UAAU,SAAA,GAAY,SAAA;AAAA,MACjC,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,aAAA,EAAe,CAAC,gBAAgB,CAAA;AAAA,IAChC,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU;AAAA,QACR,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,YAAA,EAAc,WAAA;AAAA,QACd,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,MAAA;AAAA,IACA,WAAW;AAAC,GACd;AAGA,EAAA,MAAM,sBAAsB,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,GAAI,SAAA,GAAY,GAAG,SAAS,CAAA,CAAA,CAAA;AAE9E,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,EAAC;AAG7C,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,IAAA,eAAA,CAAgB,KAAK,CAAA,GAAI;AAAA,MACvB,cAAA,EAAgB,YAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,IAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,eAAA;AAAA,UACb,MAAA,EAAQ,6BAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,MAAA;AAAA;AAAA;AAAA;AAAA,YAIA,gBAAA,EAAkB;AAAA;AACpB;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,IAAA,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,MACtB,cAAA,EAAgB,WAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,GAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB,SAC9B;AAAA,QACA;AAAA,UACE,WAAA,EAAa,YAAA;AAAA,UACb,MAAA,EAAQ,mBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB;AAC9B;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,IAAA,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,MACtB,cAAA,EAAgB,WAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,GAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB,SAC9B;AAAA,QACA;AAAA,UACE,WAAA,EAAa,aAAA;AAAA,UACb,MAAA,EAAQ;AAAA;AACV;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,MAAM,CAAA,GAAI;AAAA,MACxB,cAAA,EAAgB,aAAA;AAAA,MAChB,SAAA,EAAW,WAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,iBAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,gBAAA;AAAA,YACA,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AACnC,IAAA,eAAA,CAAgB,WAAW,CAAA,GAAI;AAAA,MAC7B,cAAA,EAAgB,aAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,KAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,iBAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,gBAAA;AAAA,YACA,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,MAAM,CAAA,GAAI;AAAA,MACxB,cAAA,EAAgB,IAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,KAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL,EAAE,WAAA,EAAa,aAAA,EAAe,MAAA,EAAQ,WAAA,EAAY;AAAA,QAClD,EAAE,WAAA,EAAa,oBAAA,EAAsB,MAAA,EAAQ,aAAA;AAAc;AAC7D,KACF;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,SAAA,GAAY,eAAA;AACnB,EAAA,OAAO,MAAA;AACT;AAsBO,SAAS,WAAA,CACd,EAAA,EACA,OAAA,GAA0C,EAAC,EACrC;AACN,EAAA,MAAM,EAAE,gBAAA,GAAmB,EAAC,EAAG,aAAA,GAAgB,EAAC,EAAG,mBAAA,GAAsB,EAAC,EAAE,GAAI,OAAA;AAGhF,EAAA,kBAAA,CAAmB,IAAI,gBAAgB,CAAA;AACvC,EAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,EAAA,eAAA,CAAgB,IAAI,aAAa,CAAA;AACjC,EAAA,qBAAA,CAAsB,IAAI,mBAAmB,CAAA;AAC/C;AAyBO,SAAS,oBAAA,CACd,EAAA,EACA,UAAA,EACA,OAAA,GAA0C,EAAC,EACjC;AACV,EAAA,WAAA,CAAY,IAAI,OAAO,CAAA;AACvB,EAAA,OAAO,2BAAA,CAA4B,YAAY,OAAO,CAAA;AACxD;;;AC1MA,eAAA,EAAA;AAgBA,YAAA,EAAA;AAcA,kBAAA,EAAA;AAcA,WAAA,EAAA;;;AC9GA,cAAA,EAAA;AAMA,WAAA,EAAA;AACA,WAAA,EAAA;ACyCA,SAAS,WAAW,IAAA,EAAoB;AACtC,EAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AACjC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,WAAA,KAAgB,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACrD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC;AAKA,SAAS,WAAA,CAAY,KAAA,EAAgB,SAAA,GAAY,GAAA,EAAa;AAC5D,EAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AAEpE,EAAA,IAAI,GAAA,CAAI,UAAU,SAAA,EAAW;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA;AACnC;AAKA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA;AACzC;AAKA,SAAS,YAAA,CAAa,QAAqB,OAAA,EAAmC;AAC5E,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,GAAW,4BAAA,GAAqB,EAAA;AACxD,EAAA,KAAA,CAAM,IAAA,CAAK,OAAO,cAAA,CAAe,MAAA,CAAO,IAAI,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAG5D,EAAA,IAAI,OAAA,CAAQ,mBAAA,IAAuB,MAAA,CAAO,WAAA,EAAa;AACrD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,WAAW,CAAA,CAAE,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,OAAA,CAAQ,aAAA,IAAiB,MAAA,CAAO,WAAA,EAAa;AAC/C,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,OAAA,KAAY,MAAA,CAAO,WAAA;AAExD,IAAA,IAAI,MAAA,CAAO,SAAS,cAAA,EAAgB;AAClC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,OAAO,CAAA,YAAA,EAAU,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,QAAA,EAAU,OAAA,CAAQ,cAAc,CAAA;AACjE,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,QAAA,EAAU,OAAA,CAAQ,cAAc,CAAA;AAEjE,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,MAAA,CAAO,SAAS,cAAA,EAAgB;AAChE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,cAAA,CAAe,YAAY,CAAC,CAAA,EAAA,CAAI,CAAA;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,cAAA,CAAe,YAAY,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,aAAA,CAAc,KAAA,EAAe,OAAA,EAAwB,OAAA,EAAmC;AAC/F,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AACzB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAaO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,GAA4B,EAAC,EACZ;AACjB,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,YAAA;AAAA,IACV,IAAA,uBAAW,IAAA,EAAK;AAAA,IAChB,MAAA;AAAA,IACA,mBAAA,GAAsB,IAAA;AAAA,IACtB,aAAA,GAAgB,IAAA;AAAA,IAChB,cAAA,GAAiB,GAAA;AAAA,IACjB,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,WAAW,IAAI,CAAA;AAC/B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,OAAO,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MACxB,UAAA,EAAY,CAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,KAAA,CAAM,KAAK,0DAAgD,CAAA;AAC3D,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AACpD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,WAAA,EAAa;AAEf,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,GAAS,KAAK,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,aAAA,CAAc,oBAAoB,CAAC,GAAG,KAAK,OAAA,EAAS,GAAG,IAAA,CAAK,WAAW,CAAA,EAAG;AAAA,UACxE,GAAG,OAAA;AAAA,UACH,mBAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,aAAA,CAAc,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO;AAAA,UACjC,GAAG,OAAA;AAAA,UACH,mBAAA;AAAA,UACA,aAAA,EAAe,KAAA;AAAA;AAAA,UACf;AAAA,SACD;AAAA,OACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,aAAA,CAAc,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU;AAAA,UACtC,GAAG,OAAA;AAAA,UACH,mBAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,aAAA,CAAc,YAAA,EAAc,IAAA,CAAK,UAAA,EAAY;AAAA,UAC3C,GAAG,OAAA;AAAA,UACH,mBAAA;AAAA,UACA,aAAA,EAAe,KAAA;AAAA,UACf;AAAA,SACD;AAAA,OACH;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,GAAG,IAAA,CAAK,WAAA;AAAA,MACR,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,GAAG,IAAA,CAAK,QAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AAEA,IAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,aAAa,MAAA,EAAQ;AAAA,UACnB,GAAG,OAAA;AAAA,UACH,mBAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACxB,YAAY,IAAA,CAAK,YAAA;AAAA,IACjB,aAAa,IAAA,CAAK;AAAA,GACpB;AACF;AASA,eAAsB,cAAA,CAAe,SAAiB,QAAA,EAAoC;AACxF,EAAA,IAAI;AACF,IAAA,IAAI,YAAA,GAAe,OAAA;AAInB,IAAA,IAAIhC,cAAAA,CAAW,QAAQ,CAAA,EAAG;AAExB,MAAA,MAAM,eAAA,GAAkB,MAAMiC,iBAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAGxD,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA;AAEvD,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AACxC,QAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,QAAA,MAAM,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACrC,QAAA,YAAA,GAAe,GAAG,MAAM;;AAAA,EAAO,OAAO,GAAG,IAAI,CAAA,CAAA;AAAA,MAC/C,CAAA,MAAO;AAEL,QAAA,YAAA,GAAe,GAAG,OAAO;AAAA,EAAK,eAAe,CAAA,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,YAAA,GAAe,CAAA;;AAAA;;AAAA,EAA2F,OAAO,CAAA,CAAA;AAAA,IACnH;AAGA,IAAA,MAAMC,kBAAA,CAAU,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAUA,eAAsB,yBAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,GAA4B,EAAC,EACoB;AACjD,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,MAAA,CAAO,SAAS,QAAQ,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH;AAAA,GACF;AACF;AAWA,eAAsB,oBAAA,CACpB,aAAA,EACA,aAAA,EACA,UAAA,GAAa,uBACb,OAAA,EACkB;AAElB,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAI,2CAAoC,CAAA;AAGhD,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,OAAO,aAAkB,CAAA;AAChE,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,SAAA,EAAA,EAAA,YAAA,CAAA,CAAA;AAGrC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAA0B,aAAa,CAAA,CAAE,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAe,OAAO,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAEvC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAA0B,aAAa,CAAA,CAAE,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,aAAA,EAAe,OAAO,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAGvC,IAAA,OAAA,CAAQ,IAAI,oCAA6B,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAI,6BAAwB,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,kBAAA,CAAe,CAAA;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAc,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,aAAA,CAAK,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAiB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAAqB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,aAAA,CAAK,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAmB,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAA,CAAQ,IAAI,kEAAwD,CAAA;AAAA,IACtE;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,gCAAA,EAA8B,UAAU,CAAA,CAAE,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B,IAAA,EAAM,UAAA,EAAY;AAAA,MAC/D,OAAA;AAAA,MACA,mBAAA,EAAqB,IAAA;AAAA,MACrB,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,IAAI,0CAAqC,CAAA;AACjD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,uCAAkC,CAAA;AAChD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAiC,KAAK,CAAA;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AAEF;;;AC9HA,SAAA,EAAA","file":"index.cjs","sourcesContent":["/**\r\n * CSS Dark Mode Variables Format\r\n *\r\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\r\n * following Bootstrap 5.3+ color mode pattern.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-dark-mode\r\n * @see https://getbootstrap.com/docs/5.3/customize/color-modes/\r\n */\r\n\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * css/variables-dark-mode format\r\n *\r\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\r\n * for Bootstrap-compatible dark mode theming.\r\n *\r\n * @example\r\n * Output:\r\n * ```css\r\n * [data-bs-theme=\"dark\"] {\r\n * --dsai-body-bg: #212529;\r\n * --dsai-body-color: #dee2e6;\r\n * }\r\n * ```\r\n */\r\nexport const cssDarkModeVariables: FormatDefinition = {\r\n name: 'css/variables-dark-mode',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const prefix = (options['prefix'] as string) ?? '--';\r\n const selector = (options['selector'] as string) ?? '[data-bs-theme=\"dark\"]';\r\n\r\n const variables = dictionary.allTokens.map((token) => {\r\n const lines: string[] = [];\r\n\r\n // Add comment if present\r\n if (token.comment) {\r\n lines.push(` /* ${token.comment} */`);\r\n }\r\n\r\n // Add description if present (DTCG $description or legacy description)\r\n const description = token.$description ?? token.description;\r\n if (description && description !== token.comment) {\r\n lines.push(` /* ${description} */`);\r\n }\r\n\r\n // Get value (DTCG $value or legacy value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add variable\r\n lines.push(` ${prefix}${token.name}: ${value};`);\r\n\r\n return lines.join('\\n');\r\n });\r\n\r\n return `${selector} {\\n${variables.join('\\n')}\\n}\\n`;\r\n },\r\n};\r\n","/**\r\n * CSS Variables Format\r\n *\r\n * Generates CSS custom properties with descriptive comments.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-variables\r\n */\r\n\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * css/variables-with-comments format\r\n *\r\n * Generates CSS custom properties with descriptive comments.\r\n * Supports configurable prefix via options.\r\n *\r\n * @example\r\n * Output:\r\n * ```css\r\n * :root {\r\n * /* Primary brand color *\\/\r\n * --dsai-color-primary: #007bff;\r\n * --dsai-spacing-md: 1rem;\r\n * }\r\n * ```\r\n */\r\nexport const cssVariablesWithComments: FormatDefinition = {\r\n name: 'css/variables-with-comments',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const prefix = (options['prefix'] as string) ?? '--';\r\n\r\n const variables = dictionary.allTokens.map((token) => {\r\n const lines: string[] = [];\r\n\r\n // Add comment if present\r\n if (token.comment) {\r\n lines.push(` /* ${token.comment} */`);\r\n }\r\n\r\n // Add description if present (DTCG $description or legacy description)\r\n const description = token.$description ?? token.description;\r\n if (description && description !== token.comment) {\r\n lines.push(` /* ${description} */`);\r\n }\r\n\r\n // Get value (DTCG $value or legacy value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add variable\r\n lines.push(` ${prefix}${token.name}: ${value};`);\r\n\r\n return lines.join('\\n');\r\n });\r\n\r\n return `:root {\\n${variables.join('\\n')}\\n}\\n`;\r\n },\r\n};\r\n","/**\r\n * JavaScript Format\r\n *\r\n * Custom JavaScript ES6 format that uses the transformed token.name\r\n * to ensure valid JavaScript identifiers.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/javascript\r\n */\r\n\r\nimport type { FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Prefix numeric identifiers with underscore to make them valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * Convert token path to valid JavaScript identifier\r\n */\r\nfunction toJsIdentifier(path: string[]): string {\r\n return path.map(toPascalCaseSegment).join('');\r\n}\r\n\r\n/**\r\n * JavaScript ES6 format with valid identifiers\r\n *\r\n * Manually applies the name transformation to ensure valid JS variable names.\r\n */\r\nexport const javascriptEsm: FormatDefinition = {\r\n name: 'javascript/esm-safe',\r\n format: ({ dictionary, file, options }) => {\r\n const tokens = dictionary.allTokens;\r\n // Check if tokens are in DTCG format (auto-detected by Style Dictionary)\r\n const usesDtcg = options?.['usesDtcg'] ?? false;\r\n\r\n let output = `/**\\n * ${file.destination}\\n * Design Tokens - Generated\\n * DO NOT EDIT\\n */\\n\\n`;\r\n\r\n for (const token of tokens) {\r\n // Use the transformed name or generate it from path\r\n const name = toJsIdentifier(token.path);\r\n\r\n // For DTCG tokens, use $value; for regular tokens, use value\r\n const tokenValue = usesDtcg ? token.$value : token.value;\r\n const value = JSON.stringify(tokenValue);\r\n\r\n // Handle DTCG $description or regular description/comment\r\n const comment = token.comment || token.$description || token.description || '';\r\n\r\n if (comment) {\r\n output += `// ${comment}\\n`;\r\n }\r\n output += `export const ${name} = ${value};\\n`;\r\n }\r\n\r\n return output;\r\n },\r\n};\r\n","/**\r\n * Bootstrap Framework Mapper\r\n *\r\n * Maps Figma/DTCG token names to Bootstrap 5.x variable names.\r\n * This is the complete mapping list extracted from the playground's\r\n * _variables.scss compatibility layer.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// Bootstrap Name Mappings\r\n// ============================================================================\r\n\r\n/**\r\n * Complete token name → Bootstrap variable name mappings\r\n *\r\n * These mappings handle cases where Figma/DTCG token naming conventions\r\n * differ from Bootstrap 5.x variable naming conventions.\r\n *\r\n * The mappings are extracted from the playground's manual _variables.scss\r\n * compatibility layer to ensure complete parity.\r\n *\r\n * CATEGORIES:\r\n * - Typography: Font sizes, weights, headings, display, line heights, letter spacing\r\n * - Colors: Pass through (no mapping needed - names match)\r\n * - Spacing: Pass through (no mapping needed - names match)\r\n * - Layout: Pass through (no mapping needed - names match)\r\n * - Shadows: Custom mappings to Bootstrap shadow variable names\r\n * - Border Radius: Custom mappings to Bootstrap radius variable names\r\n */\r\nexport const BOOTSTRAP_MAPPINGS: Record<string, string> = {\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Sizes\r\n // ==========================================================================\r\n // Figma uses \"text\" prefix, Bootstrap uses \"font-size\" prefix\r\n 'typography-text-base': 'font-size-base',\r\n 'typography-text-sm': 'font-size-sm',\r\n 'typography-text-lead': 'font-size-lg',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Weights\r\n // ==========================================================================\r\n // Figma uses descriptive names, Bootstrap uses semantic names\r\n 'typography-font-weight-thin': 'font-weight-lighter',\r\n 'typography-font-weight-extra-light': 'font-weight-lighter',\r\n 'typography-font-weight-light': 'font-weight-light',\r\n 'typography-font-weight-regular': 'font-weight-normal',\r\n 'typography-font-weight-medium': 'font-weight-medium',\r\n 'typography-font-weight-semi-bold': 'font-weight-semibold',\r\n 'typography-font-weight-bold': 'font-weight-bold',\r\n 'typography-font-weight-extra-bold': 'font-weight-bold',\r\n 'typography-font-weight-black': 'font-weight-bolder',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Font Families\r\n // ==========================================================================\r\n 'typography-font-family-base': 'font-family-base',\r\n 'typography-font-family-monospace': 'font-family-monospace',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Headings (h1-h6)\r\n // ==========================================================================\r\n // Figma: heading-h1 → Bootstrap: h1-font-size\r\n 'typography-heading-h1': 'h1-font-size',\r\n 'typography-heading-h2': 'h2-font-size',\r\n 'typography-heading-h3': 'h3-font-size',\r\n 'typography-heading-h4': 'h4-font-size',\r\n 'typography-heading-h5': 'h5-font-size',\r\n 'typography-heading-h6': 'h6-font-size',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Display Headings (d1-d6)\r\n // ==========================================================================\r\n // Figma: display-d1 → Bootstrap: display1-size (part of $display-font-sizes map)\r\n 'typography-display-d1': 'display1-size',\r\n 'typography-display-d2': 'display2-size',\r\n 'typography-display-d3': 'display3-size',\r\n 'typography-display-d4': 'display4-size',\r\n 'typography-display-d5': 'display5-size',\r\n 'typography-display-d6': 'display6-size',\r\n // Alternative naming: display-h1 → display1-size\r\n 'typography-display-h1': 'display1-size',\r\n 'typography-display-h2': 'display2-size',\r\n 'typography-display-h3': 'display3-size',\r\n 'typography-display-h4': 'display4-size',\r\n 'typography-display-h5': 'display5-size',\r\n 'typography-display-h6': 'display6-size',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Line Heights\r\n // ==========================================================================\r\n 'typography-line-height-xs': 'line-height-xs',\r\n 'typography-line-height-sm': 'line-height-sm',\r\n 'typography-line-height-tight': 'headings-line-height',\r\n 'typography-line-height-base': 'line-height-base',\r\n 'typography-line-height-relaxed': 'line-height-relaxed',\r\n 'typography-line-height-lg': 'line-height-lg',\r\n 'typography-line-height-display-sm': 'display-line-height',\r\n 'typography-line-height-display-md': 'display-line-height-md',\r\n 'typography-line-height-display-lg': 'display-line-height-lg',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Letter Spacing\r\n // ==========================================================================\r\n 'typography-letter-spacing-tighter': 'letter-spacing-tighter',\r\n 'typography-letter-spacing-tightest': 'letter-spacing-tighter',\r\n 'typography-letter-spacing-tight': 'letter-spacing-tight',\r\n 'typography-letter-spacing-normal': 'letter-spacing-normal',\r\n 'typography-letter-spacing-wide': 'letter-spacing-wide',\r\n 'typography-letter-spacing-wider': 'letter-spacing-wider',\r\n 'typography-letter-spacing-widest': 'letter-spacing-widest',\r\n\r\n // ==========================================================================\r\n // TYPOGRAPHY - Lead\r\n // ==========================================================================\r\n 'typography-lead-font-size': 'lead-font-size',\r\n\r\n // ==========================================================================\r\n // SHADOWS\r\n // ==========================================================================\r\n // Figma: shadow-default → Bootstrap: box-shadow\r\n 'shadow-default': 'box-shadow',\r\n 'shadow-sm': 'box-shadow-sm',\r\n 'shadow-lg': 'box-shadow-lg',\r\n 'shadow-inset': 'box-shadow-inset',\r\n\r\n // ==========================================================================\r\n // BORDER WIDTH\r\n // ==========================================================================\r\n // Figma: border-width-0 → Bootstrap: border-width-0\r\n 'border-width-0': 'border-width-0',\r\n 'border-width-1': 'border-width-1',\r\n 'border-width-2': 'border-width-2',\r\n 'border-width-3': 'border-width-3',\r\n 'border-width-4': 'border-width-4',\r\n 'border-width-5': 'border-width-5',\r\n\r\n // ==========================================================================\r\n // BORDER RADIUS\r\n // ==========================================================================\r\n // Figma: border-radius-default → Bootstrap: border-radius\r\n 'border-radius-0': 'border-radius-0',\r\n 'border-radius-default': 'border-radius',\r\n 'border-radius-sm': 'border-radius-sm',\r\n 'border-radius-lg': 'border-radius-lg',\r\n 'border-radius-xl': 'border-radius-xl',\r\n 'border-radius-xxl': 'border-radius-xxl',\r\n 'border-radius-pill': 'border-radius-pill',\r\n 'border-radius-circle': 'border-radius-circle',\r\n\r\n // ==========================================================================\r\n // SEMANTIC / THEME COLORS\r\n // ==========================================================================\r\n // Figma: theme-primary → Bootstrap uses these directly\r\n 'theme-primary': 'primary',\r\n 'theme-secondary': 'secondary',\r\n 'theme-success': 'success',\r\n 'theme-danger': 'danger',\r\n 'theme-warning': 'warning',\r\n 'theme-info': 'info',\r\n 'theme-light': 'light',\r\n 'theme-dark': 'dark',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Grid\r\n // ==========================================================================\r\n 'layout-grid-columns': 'grid-columns',\r\n 'layout-grid-gutter-width': 'grid-gutter-width',\r\n 'layout-grid-row-columns': 'grid-row-columns',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Container\r\n // ==========================================================================\r\n 'layout-container-padding-x': 'container-padding-x',\r\n 'layout-container-max-width-sm': 'container-max-width-sm',\r\n 'layout-container-max-width-md': 'container-max-width-md',\r\n 'layout-container-max-width-lg': 'container-max-width-lg',\r\n 'layout-container-max-width-xl': 'container-max-width-xl',\r\n 'layout-container-max-width-xxl': 'container-max-width-xxl',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Breakpoints (for reference, typically used in maps)\r\n // ==========================================================================\r\n 'layout-breakpoints-xs': 'breakpoint-xs',\r\n 'layout-breakpoints-sm': 'breakpoint-sm',\r\n 'layout-breakpoints-md': 'breakpoint-md',\r\n 'layout-breakpoints-lg': 'breakpoint-lg',\r\n 'layout-breakpoints-xl': 'breakpoint-xl',\r\n 'layout-breakpoints-xxl': 'breakpoint-xxl',\r\n\r\n // ==========================================================================\r\n // LAYOUT - Gutters\r\n // ==========================================================================\r\n 'layout-gutters-0': 'gutters-0',\r\n 'layout-gutters-1': 'gutters-1',\r\n 'layout-gutters-2': 'gutters-2',\r\n 'layout-gutters-3': 'gutters-3',\r\n 'layout-gutters-4': 'gutters-4',\r\n 'layout-gutters-5': 'gutters-5',\r\n};\r\n\r\n/**\r\n * Pattern-based mappings for Bootstrap\r\n *\r\n * Applied after explicit mappings for tokens that follow\r\n * predictable naming patterns. These handle bulk transformations\r\n * for categories with consistent naming.\r\n */\r\nexport const BOOTSTRAP_PATTERNS: FrameworkMappingPattern[] = [\r\n // ==========================================================================\r\n // COLOR SCALES - Pass through unchanged\r\n // ==========================================================================\r\n // color-blue-500 → color-blue-500 (no transformation needed)\r\n // These tokens keep their original names as Bootstrap color scales\r\n // match the DSAi/Figma naming convention.\r\n // ==========================================================================\r\n // SPACING SCALE - Strip \"spacing-\" prefix for Bootstrap $spacer map\r\n // ==========================================================================\r\n // spacing-1 → spacer-1 (Bootstrap uses $spacers map)\r\n // Note: Not applied by default since playground keeps spacing- prefix\r\n // ==========================================================================\r\n // LAYOUT BREAKPOINTS - Already handled in explicit mappings\r\n // ==========================================================================\r\n];\r\n\r\n/**\r\n * Bootstrap framework mapping configuration\r\n */\r\nexport const bootstrapMapper: FrameworkMappingConfig = {\r\n framework: 'bootstrap',\r\n mappings: BOOTSTRAP_MAPPINGS,\r\n patterns: BOOTSTRAP_PATTERNS,\r\n variablePrefix: '$',\r\n header: `// ============================================================================\r\n// DSAi Design Tokens for Bootstrap 5.x\r\n// ============================================================================\r\n// Auto-generated from Figma design tokens via @dsai-io/tools\r\n// DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\r\n//\r\n// These variables are mapped to Bootstrap 5.x naming conventions.\r\n// Use with Bootstrap's SCSS customization workflow:\r\n//\r\n// @use './_variables' as dsai;\r\n// @use 'bootstrap/scss/bootstrap' with (\r\n// $primary: dsai.$primary,\r\n// $font-size-base: dsai.$font-size-base,\r\n// );\r\n//\r\n// @see https://getbootstrap.com/docs/5.3/customize/sass/\r\n// ============================================================================\r\n\r\n`,\r\n};\r\n\r\n/**\r\n * Apply Bootstrap-specific name mapping to a token name\r\n *\r\n * @param tokenName - Original token name (e.g., 'typography-heading-h1')\r\n * @returns Mapped name (e.g., 'h1-font-size')\r\n *\r\n * @example\r\n * ```typescript\r\n * mapToBootstrapName('typography-text-base')\r\n * // Returns: 'font-size-base'\r\n *\r\n * mapToBootstrapName('typography-heading-h1')\r\n * // Returns: 'h1-font-size'\r\n *\r\n * mapToBootstrapName('color-blue-500')\r\n * // Returns: 'color-blue-500' (pass through)\r\n * ```\r\n */\r\nexport function mapToBootstrapName(tokenName: string): string {\r\n // Check explicit mappings first using Map for safe access\r\n const mappingsMap = new Map(Object.entries(BOOTSTRAP_MAPPINGS));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of BOOTSTRAP_PATTERNS) {\r\n // Pre-compiled regex patterns only - no dynamic construction from untrusted input\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n}\r\n","/**\r\n * shadcn/ui Framework Mapper\r\n *\r\n * Maps Figma/DTCG token names to shadcn/ui CSS variable names.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// shadcn/ui Name Mappings\r\n// ============================================================================\r\n\r\n/**\r\n * Explicit token name → shadcn/ui variable name mappings\r\n *\r\n * shadcn/ui uses a simplified naming convention with CSS custom properties.\r\n * @see https://ui.shadcn.com/docs/theming\r\n */\r\nexport const SHADCN_MAPPINGS: Record<string, string> = {\r\n // Semantic Colors → shadcn theme colors\r\n 'semantic-primary': 'primary',\r\n 'semantic-secondary': 'secondary',\r\n 'semantic-success': 'success',\r\n 'semantic-danger': 'destructive',\r\n 'semantic-warning': 'warning',\r\n 'semantic-info': 'info',\r\n 'semantic-body-bg': 'background',\r\n 'semantic-body-color': 'foreground',\r\n 'theme-primary': 'primary',\r\n 'theme-secondary': 'secondary',\r\n\r\n // Neutral colors\r\n 'neutral-white': 'background',\r\n 'neutral-black': 'foreground',\r\n 'color-gray-100': 'muted',\r\n 'color-gray-600': 'muted-foreground',\r\n\r\n // Card colors\r\n 'semantic-light': 'card',\r\n 'color-gray-900': 'card-foreground',\r\n\r\n // Border\r\n 'semantic-border-color': 'border',\r\n 'color-gray-200': 'input',\r\n\r\n // Focus ring\r\n 'color-blue-500': 'ring',\r\n\r\n // Border radius\r\n 'border-radius': 'radius',\r\n 'border-radius-sm': 'radius-sm',\r\n 'border-radius-lg': 'radius-lg',\r\n\r\n // Typography\r\n 'typography-font-family-base': 'font-sans',\r\n 'typography-font-family-monospace': 'font-mono',\r\n};\r\n\r\n/**\r\n * Pattern-based mappings for shadcn/ui\r\n */\r\nexport const SHADCN_PATTERNS: FrameworkMappingPattern[] = [\r\n // Accent colors from color scales\r\n {\r\n pattern: /^color-blue-500$/,\r\n replacement: 'accent',\r\n description: 'Primary accent color',\r\n },\r\n {\r\n pattern: /^color-blue-100$/,\r\n replacement: 'accent-foreground',\r\n description: 'Accent foreground color',\r\n },\r\n];\r\n\r\n/**\r\n * shadcn/ui framework mapping configuration\r\n */\r\nexport const shadcnMapper: FrameworkMappingConfig = {\r\n framework: 'shadcn',\r\n mappings: SHADCN_MAPPINGS,\r\n patterns: SHADCN_PATTERNS,\r\n variablePrefix: '--',\r\n header: `/* ============================================================================\r\n * DSAi Design Tokens for shadcn/ui\r\n * ============================================================================\r\n * Auto-generated from Figma design tokens via @dsai-io/tools\r\n * DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\r\n *\r\n * Usage in CSS:\r\n * background-color: hsl(var(--background));\r\n * color: hsl(var(--foreground));\r\n *\r\n * @see https://ui.shadcn.com/docs/theming\r\n * ============================================================================ */\r\n`,\r\n};\r\n\r\n/**\r\n * Apply shadcn-specific name mapping to a token name\r\n *\r\n * @param tokenName - Original token name (e.g., 'semantic-primary')\r\n * @returns Mapped name (e.g., 'primary')\r\n */\r\nexport function mapToShadcnName(tokenName: string): string {\r\n // Check explicit mappings first using Map for safe access\r\n const mappingsMap = new Map(Object.entries(SHADCN_MAPPINGS));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of SHADCN_PATTERNS) {\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n}\r\n","/**\r\n * Framework Mapper Utilities\r\n *\r\n * Core utilities for applying framework-specific name mappings to tokens.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { bootstrapMapper, mapToBootstrapName } from './bootstrap.js';\r\nimport { mapToShadcnName, shadcnMapper } from './shadcn.js';\r\n\r\nimport type {\r\n FrameworkMappingConfig,\r\n FrameworkMappingPattern,\r\n FrameworkTarget,\r\n} from '../../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Framework mapper function type\r\n */\r\nexport type FrameworkMapper = (tokenName: string) => string;\r\n\r\n/**\r\n * Framework mapper with configuration\r\n */\r\nexport interface FrameworkMapperWithConfig {\r\n /** The mapping function */\r\n map: FrameworkMapper;\r\n /** The framework configuration */\r\n config: FrameworkMappingConfig;\r\n}\r\n\r\n// ============================================================================\r\n// Framework Registry\r\n// ============================================================================\r\n\r\n/**\r\n * Built-in framework mappers\r\n */\r\nconst FRAMEWORK_MAPPERS: Record<FrameworkTarget, FrameworkMapperWithConfig> = {\r\n bootstrap: {\r\n map: mapToBootstrapName,\r\n config: bootstrapMapper,\r\n },\r\n shadcn: {\r\n map: mapToShadcnName,\r\n config: shadcnMapper,\r\n },\r\n tailwind: {\r\n // Tailwind uses config.js format, not SCSS variables\r\n // Pass through names as-is for now\r\n map: (name) => name,\r\n config: {\r\n framework: 'tailwind',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '',\r\n header: '// Tailwind config - use tokens.js instead\\n',\r\n },\r\n },\r\n mui: {\r\n // MUI uses JavaScript theme objects\r\n // Pass through names as-is for now\r\n map: (name) => name,\r\n config: {\r\n framework: 'mui',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '',\r\n header: '// MUI theme - use tokens.js instead\\n',\r\n },\r\n },\r\n custom: {\r\n // Custom uses user-provided mappings only\r\n map: (name) => name,\r\n config: {\r\n framework: 'custom',\r\n mappings: {},\r\n patterns: [],\r\n variablePrefix: '$',\r\n header: '// Custom token mappings\\n',\r\n },\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n\r\n/**\r\n * Valid framework targets for safe lookup\r\n */\r\nconst VALID_FRAMEWORKS = new Set<FrameworkTarget>([\r\n 'bootstrap',\r\n 'shadcn',\r\n 'tailwind',\r\n 'mui',\r\n 'custom',\r\n]);\r\n\r\n/**\r\n * Get the framework mapper for a specific target\r\n *\r\n * @param framework - Target framework\r\n * @returns Framework mapper with config\r\n */\r\nexport function getFrameworkMapper(framework: FrameworkTarget): FrameworkMapperWithConfig {\r\n // Use safe lookup with validated key\r\n if (VALID_FRAMEWORKS.has(framework)) {\r\n switch (framework) {\r\n case 'bootstrap':\r\n return FRAMEWORK_MAPPERS.bootstrap;\r\n case 'shadcn':\r\n return FRAMEWORK_MAPPERS.shadcn;\r\n case 'tailwind':\r\n return FRAMEWORK_MAPPERS.tailwind;\r\n case 'mui':\r\n return FRAMEWORK_MAPPERS.mui;\r\n case 'custom':\r\n return FRAMEWORK_MAPPERS.custom;\r\n }\r\n }\r\n return FRAMEWORK_MAPPERS.custom;\r\n}\r\n\r\n/**\r\n * Create a custom framework mapper with user-provided mappings\r\n *\r\n * @param baseFramework - Base framework to extend (or 'custom' for empty)\r\n * @param customMappings - Additional name mappings\r\n * @param customPatterns - Additional pattern mappings\r\n * @returns Combined framework mapper\r\n */\r\nexport function createFrameworkMapper(\r\n baseFramework: FrameworkTarget,\r\n customMappings?: Record<string, string>,\r\n customPatterns?: FrameworkMappingPattern[]\r\n): FrameworkMapperWithConfig {\r\n const base = getFrameworkMapper(baseFramework);\r\n\r\n // Merge custom mappings (custom takes precedence)\r\n const mergedMappings = {\r\n ...base.config.mappings,\r\n ...customMappings,\r\n };\r\n\r\n // Merge patterns (custom patterns applied after base patterns)\r\n const mergedPatterns = [...(base.config.patterns ?? []), ...(customPatterns ?? [])];\r\n\r\n // Create the combined mapper function\r\n const map: FrameworkMapper = (tokenName: string) => {\r\n // Check custom mappings first\r\n const mappingsMap = new Map(Object.entries(mergedMappings));\r\n if (mappingsMap.has(tokenName)) {\r\n return mappingsMap.get(tokenName) ?? tokenName;\r\n }\r\n\r\n // Apply pattern-based mappings\r\n for (const pattern of mergedPatterns) {\r\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\r\n return tokenName.replace(pattern.pattern, pattern.replacement);\r\n }\r\n }\r\n\r\n // No mapping found - return original name\r\n return tokenName;\r\n };\r\n\r\n return {\r\n map,\r\n config: {\r\n ...base.config,\r\n mappings: mergedMappings,\r\n patterns: mergedPatterns,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Apply name mapping to a token name using specified framework\r\n *\r\n * @param tokenName - Original token name\r\n * @param framework - Target framework\r\n * @param customMappings - Optional custom mappings to merge\r\n * @returns Mapped token name\r\n */\r\nexport function applyNameMapping(\r\n tokenName: string,\r\n framework: FrameworkTarget = 'bootstrap',\r\n customMappings?: Record<string, string>\r\n): string {\r\n if (customMappings) {\r\n const mapper = createFrameworkMapper(framework, customMappings);\r\n return mapper.map(tokenName);\r\n }\r\n\r\n const mapper = getFrameworkMapper(framework);\r\n return mapper.map(tokenName);\r\n}\r\n\r\n/**\r\n * Apply name mappings to all tokens in a collection\r\n *\r\n * @param tokens - Map of token names to values\r\n * @param framework - Target framework\r\n * @param customMappings - Optional custom mappings\r\n * @returns New map with mapped token names\r\n */\r\nexport function applyNameMappingsToTokens<T>(\r\n tokens: Map<string, T>,\r\n framework: FrameworkTarget = 'bootstrap',\r\n customMappings?: Record<string, string>\r\n): Map<string, T> {\r\n const mapper = customMappings\r\n ? createFrameworkMapper(framework, customMappings)\r\n : getFrameworkMapper(framework);\r\n\r\n const result = new Map<string, T>();\r\n\r\n for (const [name, value] of tokens) {\r\n const mappedName = mapper.map(name);\r\n result.set(mappedName, value);\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * SCSS Framework Variables Format\r\n *\r\n * Generates SCSS variables with framework-specific name mappings.\r\n * Transforms Figma token names to match target framework conventions.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/scss-framework\r\n */\r\n\r\nimport { getFrameworkMapper, applyNameMapping } from '../../framework-mappers/mapper.js';\r\n\r\nimport type { FrameworkTarget } from '../../../config/types.js';\r\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\r\n\r\n/**\r\n * Format options for scss/framework-variables\r\n */\r\nexport interface ScssFrameworkOptions {\r\n /**\r\n * Target framework for name mapping\r\n * @default 'bootstrap'\r\n */\r\n framework?: FrameworkTarget;\r\n\r\n /**\r\n * Custom name mappings to apply in addition to framework defaults\r\n * Key: original token name pattern, Value: mapped name\r\n */\r\n customMappings?: Record<string, string>;\r\n\r\n /**\r\n * Whether to output references for alias tokens\r\n * @default true\r\n */\r\n outputReferences?: boolean;\r\n\r\n /**\r\n * Variable prefix (without $)\r\n * @default ''\r\n */\r\n variablePrefix?: string;\r\n\r\n /**\r\n * Include header comment in output\r\n * @default true\r\n */\r\n includeHeader?: boolean;\r\n\r\n /**\r\n * Custom header comment\r\n */\r\n customHeader?: string;\r\n}\r\n\r\n/**\r\n * scss/framework-variables format\r\n *\r\n * Generates SCSS variables with framework-specific name mappings.\r\n * Supports Bootstrap, shadcn, and custom frameworks.\r\n *\r\n * @example\r\n * ```typescript\r\n * // In Style Dictionary config\r\n * {\r\n * format: 'scss/framework-variables',\r\n * options: {\r\n * framework: 'bootstrap',\r\n * customMappings: {\r\n * 'my-custom-token': 'bs-custom-var'\r\n * }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * Output for Bootstrap:\r\n * ```scss\r\n * // Generated by DSAi - Bootstrap 5.x compatible variables\r\n * // Do not edit manually - regenerate with: pnpm tokens:build\r\n *\r\n * $font-size-base: 1rem;\r\n * $headings-font-weight: 600;\r\n * $primary: #007bff;\r\n * ```\r\n */\r\nexport const scssFrameworkVariables: FormatDefinition = {\r\n name: 'scss/framework-variables',\r\n format: ({ dictionary, options }: SDFormatArgs): string => {\r\n const framework = (options['framework'] as FrameworkTarget) ?? 'bootstrap';\r\n const customMappings = (options['customMappings'] as Record<string, string>) ?? {};\r\n const variablePrefix = (options['variablePrefix'] as string) ?? '';\r\n const includeHeader = (options['includeHeader'] as boolean) ?? true;\r\n const customHeader = options['customHeader'] as string | undefined;\r\n\r\n // Get framework mapper\r\n const mapper = getFrameworkMapper(framework);\r\n\r\n // Build header\r\n const lines: string[] = [];\r\n\r\n if (includeHeader) {\r\n if (customHeader) {\r\n lines.push(customHeader);\r\n } else {\r\n lines.push(mapper.config.header || `// ${framework} variables generated by DSAi`);\r\n lines.push('// Do not edit manually - regenerate with: pnpm tokens:build');\r\n lines.push('');\r\n }\r\n }\r\n\r\n // Process each token\r\n for (const token of dictionary.allTokens) {\r\n // Apply framework name mapping\r\n const mappedName = applyNameMapping(token.name, framework, customMappings);\r\n\r\n // Format the mapped name: remove dashes and apply prefix\r\n const scssVarName = `$${variablePrefix}${mappedName}`;\r\n\r\n // Get token value (DTCG format uses $value)\r\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\r\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\r\n\r\n // Add description comment if present\r\n const description = token.$description ?? token.description;\r\n if (description) {\r\n lines.push(`// ${description}`);\r\n }\r\n\r\n // Add the variable\r\n lines.push(`${scssVarName}: ${value};`);\r\n }\r\n\r\n return lines.join('\\n') + '\\n';\r\n },\r\n};\r\n\r\n/**\r\n * scss/bootstrap-variables format\r\n *\r\n * Convenience format that uses Bootstrap mappings by default.\r\n *\r\n * @example\r\n * ```typescript\r\n * {\r\n * format: 'scss/bootstrap-variables'\r\n * }\r\n * ```\r\n */\r\nexport const scssBootstrapVariables: FormatDefinition = {\r\n name: 'scss/bootstrap-variables',\r\n format: (args: SDFormatArgs): string => {\r\n const optionsWithBootstrap = {\r\n ...args.options,\r\n framework: 'bootstrap' as FrameworkTarget,\r\n };\r\n return scssFrameworkVariables.format({ ...args, options: optionsWithBootstrap });\r\n },\r\n};\r\n\r\n/**\r\n * scss/shadcn-variables format\r\n *\r\n * Convenience format that uses shadcn/ui mappings by default.\r\n * Outputs CSS custom properties in SCSS for compatibility.\r\n *\r\n * @example\r\n * ```typescript\r\n * {\r\n * format: 'scss/shadcn-variables'\r\n * }\r\n * ```\r\n */\r\nexport const scssShadcnVariables: FormatDefinition = {\r\n name: 'scss/shadcn-variables',\r\n format: (args: SDFormatArgs): string => {\r\n const optionsWithShadcn = {\r\n ...args.options,\r\n framework: 'shadcn' as FrameworkTarget,\r\n };\r\n return scssFrameworkVariables.format({ ...args, options: optionsWithShadcn });\r\n },\r\n};\r\n","/**\r\n * TypeScript Declarations Format\r\n *\r\n * Generates TypeScript type declarations for design tokens.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats/typescript\r\n */\r\n\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport type { SDFormatArgs, FormatDefinition, SDToken } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Prefix numeric identifiers with underscore to make them valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * Convert token path to valid JavaScript identifier\r\n */\r\nfunction toJsIdentifier(path: string[]): string {\r\n return path.map(toPascalCaseSegment).join('');\r\n}\r\n\r\n/**\r\n * Get TypeScript type from token value\r\n */\r\nfunction getTypeScriptType(token: SDToken): string {\r\n const value = token.value;\r\n if (typeof value === 'number') {\r\n return 'number';\r\n }\r\n if (typeof value === 'boolean') {\r\n return 'boolean';\r\n }\r\n return 'string';\r\n}\r\n\r\n/**\r\n * Token tree node for building interfaces\r\n */\r\ninterface TokenTreeNode {\r\n _isToken?: boolean;\r\n _type?: string;\r\n [key: string]: TokenTreeNode | boolean | string | undefined;\r\n}\r\n\r\n/**\r\n * Build nested interface structure\r\n */\r\nfunction buildTokenInterface(obj: TokenTreeNode, indent = 0): string {\r\n const spaces = ' '.repeat(indent);\r\n let output = '{\\n';\r\n\r\n for (const key of Object.keys(obj)) {\r\n // Skip internal markers\r\n if (key.startsWith('_')) {\r\n continue;\r\n }\r\n\r\n const value = obj[key];\r\n if (!value || typeof value !== 'object') {\r\n continue;\r\n }\r\n\r\n // Quote keys that need it (contain hyphens or start with numbers)\r\n const quotedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `\"${key}\"`;\r\n\r\n const typedValue = value as TokenTreeNode;\r\n\r\n // Check if this is a leaf token (has _isToken marker)\r\n if (typedValue._isToken) {\r\n output += `${spaces} ${quotedKey}: ${typedValue._type};\\n`;\r\n } else {\r\n // Nested object\r\n output += `${spaces} ${quotedKey}: ${buildTokenInterface(typedValue, indent + 1)}\\n`;\r\n }\r\n }\r\n\r\n output += `${spaces}}`;\r\n return output;\r\n}\r\n\r\n/**\r\n * Capitalize first letter\r\n */\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * typescript/declarations format\r\n *\r\n * Generates TypeScript declarations with:\r\n * - DesignTokens interface with nested structure\r\n * - String literal types for each token category\r\n * - Flat token exports with proper types\r\n *\r\n * @example\r\n * Output:\r\n * ```typescript\r\n * export type ColorTokenName =\r\n * | 'color.primary'\r\n * | 'color.secondary';\r\n *\r\n * export interface DesignTokens {\r\n * color: {\r\n * primary: string;\r\n * secondary: string;\r\n * };\r\n * }\r\n *\r\n * export declare const colorPrimary: string;\r\n * export declare const tokens: DesignTokens;\r\n * ```\r\n */\r\nexport const typescriptDeclarations: FormatDefinition = {\r\n name: 'typescript/declarations',\r\n format: ({ dictionary }: SDFormatArgs): string => {\r\n // Build nested structure with type markers\r\n const tokenTree: TokenTreeNode = {};\r\n\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n for (const token of dictionary.allTokens) {\r\n let current: TokenTreeNode = tokenTree;\r\n for (let i = 0; i < token.path.length - 1; i++) {\r\n const key = token.path[i] as string;\r\n // Guard against prototype pollution\r\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\r\n continue;\r\n }\r\n if (!hasOwn.call(current, key) || typeof current[key] !== 'object') {\r\n current[key] = {};\r\n }\r\n current = current[key] as TokenTreeNode;\r\n }\r\n\r\n const lastKey = token.path[token.path.length - 1];\r\n if (lastKey) {\r\n current[lastKey] = {\r\n _isToken: true,\r\n _type: getTypeScriptType(token),\r\n };\r\n }\r\n }\r\n\r\n // Group tokens by category for string literal types\r\n const categories: Record<string, string[]> = {};\r\n for (const token of dictionary.allTokens) {\r\n const category = token.path[0];\r\n if (category) {\r\n if (!categories[category]) {\r\n categories[category] = [];\r\n }\r\n categories[category].push(token.path.join('.'));\r\n }\r\n }\r\n\r\n // Generate category types\r\n let literalTypes = '';\r\n for (const category of Object.keys(categories).sort()) {\r\n const categoryTokens = categories[category];\r\n if (!categoryTokens) {\r\n continue;\r\n }\r\n const typeName = `${capitalize(category)}TokenName`;\r\n literalTypes += `/**\\n * All ${category} token names as string literals\\n */\\n`;\r\n literalTypes += `export type ${typeName} =\\n`;\r\n literalTypes += categoryTokens.map((t) => ` | '${t}'`).join('\\n');\r\n literalTypes += ';\\n\\n';\r\n }\r\n\r\n // Generate all token names type\r\n const allTokenNames = dictionary.allTokens.map((t) => t.path.join('.'));\r\n literalTypes += `/**\\n * All token names as string literals\\n */\\n`;\r\n literalTypes += `export type TokenName =\\n`;\r\n literalTypes += allTokenNames.map((t) => ` | '${t}'`).join('\\n');\r\n literalTypes += ';\\n\\n';\r\n\r\n // Generate flat token exports\r\n let flatExports = '/**\\n * Flat token exports (camelCase names)\\n */\\n';\r\n for (const token of dictionary.allTokens) {\r\n const type = getTypeScriptType(token);\r\n const name = toJsIdentifier(token.path); // Generate valid identifier from path\r\n flatExports += `export declare const ${name}: ${type};\\n`;\r\n }\r\n\r\n return `/**\r\n * Design Tokens - TypeScript Declarations\r\n * Auto-generated by @dsai-io/tools\r\n * DO NOT EDIT DIRECTLY\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// ============================================================================\r\n// String Literal Types (for type-safe token access)\r\n// ============================================================================\r\n\r\n${literalTypes}\r\n// ============================================================================\r\n// Nested Token Interface\r\n// ============================================================================\r\n\r\n/**\r\n * Design tokens organized by category\r\n */\r\nexport interface DesignTokens ${buildTokenInterface(tokenTree)}\r\n\r\n// ============================================================================\r\n// Flat Token Exports\r\n// ============================================================================\r\n\r\n${flatExports}\r\n// ============================================================================\r\n// Default Export\r\n// ============================================================================\r\n\r\nexport declare const tokens: DesignTokens;\r\nexport default tokens;\r\n`;\r\n },\r\n};\r\n","/**\r\n * Style Dictionary Formats\r\n *\r\n * Exports all built-in formats and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/formats\r\n */\r\n\r\nimport { cssDarkModeVariables } from './css-dark-mode.js';\r\nimport { cssVariablesWithComments } from './css-variables.js';\r\nimport { javascriptEsm } from './javascript.js';\r\nimport {\r\n scssBootstrapVariables,\r\n scssFrameworkVariables,\r\n scssShadcnVariables,\r\n} from './scss-framework.js';\r\nimport { typescriptDeclarations } from './typescript.js';\r\n\r\nimport type { FormatDefinition, StyleDictionaryInstance } from '../types.js';\r\n\r\n/**\r\n * All built-in formats\r\n */\r\nexport const builtInFormats: FormatDefinition[] = [\r\n cssDarkModeVariables,\r\n cssVariablesWithComments,\r\n javascriptEsm,\r\n typescriptDeclarations,\r\n scssFrameworkVariables,\r\n scssBootstrapVariables,\r\n scssShadcnVariables,\r\n];\r\n\r\n/**\r\n * Register all formats with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customFormats - Additional custom formats to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerFormats } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerFormats(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerFormats(\r\n sd: StyleDictionaryInstance,\r\n customFormats: FormatDefinition[] = []\r\n): void {\r\n const allFormats = [...builtInFormats, ...customFormats];\r\n\r\n for (const format of allFormats) {\r\n sd.registerFormat({\r\n name: format.name,\r\n format: format.format,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual formats\r\nexport { cssDarkModeVariables } from './css-dark-mode.js';\r\nexport { cssVariablesWithComments } from './css-variables.js';\r\nexport { javascriptEsm } from './javascript.js';\r\nexport {\r\n scssBootstrapVariables,\r\n scssFrameworkVariables,\r\n scssShadcnVariables,\r\n} from './scss-framework.js';\r\nexport type { ScssFrameworkOptions } from './scss-framework.js';\r\nexport { typescriptDeclarations } from './typescript.js';\r\n","/**\r\n * Dimension Transform\r\n *\r\n * Converts dimension values to rem units.\r\n * Handles raw numbers and pixel strings.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/dimension\r\n */\r\n\r\nimport type { SDToken, SDTransformOptions, TransformDefinition } from '../types.js';\r\n\r\n/** Default base font size for rem conversion */\r\nconst DEFAULT_BASE_FONT_SIZE = 16;\r\n\r\n/**\r\n * Check if token is a dimension (but not font-weight or line-height)\r\n */\r\nfunction isDimension(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Exclude font-weights\r\n if (tokenType === 'fontWeight') {\r\n return false;\r\n }\r\n const pathHasFontWeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower.includes('fontweight') || lower.includes('font-weight');\r\n });\r\n if (pathHasFontWeight) {\r\n return false;\r\n }\r\n\r\n // Exclude line-heights\r\n if (tokenType === 'lineHeight') {\r\n return false;\r\n }\r\n const pathHasLineHeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower.includes('lineheight') || lower.includes('line-height');\r\n });\r\n if (pathHasLineHeight) {\r\n return false;\r\n }\r\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\r\n if (scopeHasLineHeight) {\r\n return false;\r\n }\r\n\r\n // Exclude grid config (unitless counts)\r\n const pathHasGridConfig = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'columns' || lower === 'row-columns';\r\n });\r\n if (pathHasGridConfig) {\r\n return false;\r\n }\r\n\r\n // Include dimension, spacing, sizing types\r\n return tokenType === 'dimension' || tokenType === 'spacing' || tokenType === 'sizing';\r\n}\r\n\r\n/**\r\n * dimension/rem transform\r\n *\r\n * Converts dimension values to rem.\r\n * Uses basePxFontSize from options (default: 16).\r\n *\r\n * @example\r\n * // Numeric input\r\n * Input: { $value: 16, $type: \"dimension\" }\r\n * Output: \"1rem\"\r\n *\r\n * @example\r\n * // Pixel string\r\n * Input: { $value: \"24px\", $type: \"dimension\" }\r\n * Output: \"1.5rem\"\r\n *\r\n * @example\r\n * // Zero value\r\n * Input: { $value: 0, $type: \"dimension\" }\r\n * Output: \"0\"\r\n */\r\nexport const dimensionRem: TransformDefinition = {\r\n name: 'dimension/rem',\r\n type: 'value',\r\n filter: isDimension,\r\n transform: (token, options?: SDTransformOptions) => {\r\n const value = token.$value ?? token.value;\r\n const baseFontSize = options?.basePxFontSize ?? DEFAULT_BASE_FONT_SIZE;\r\n\r\n // Handle raw numbers\r\n if (typeof value === 'number') {\r\n if (value === 0) {\r\n return '0';\r\n }\r\n return `${value / baseFontSize}rem`;\r\n }\r\n\r\n // Handle px strings\r\n if (typeof value === 'string' && value.endsWith('px')) {\r\n const numValue = Number.parseFloat(value);\r\n if (numValue === 0) {\r\n return '0';\r\n }\r\n return `${numValue / baseFontSize}rem`;\r\n }\r\n\r\n // Return as-is if not convertible\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Font Weight Transform\r\n *\r\n * Keeps font-weight values as unitless numbers (300, 400, 700, etc.)\r\n * CSS font-weight must be unitless for proper inheritance.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/font-weight\r\n */\r\n\r\nimport type { SDToken, TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * Named font weight values mapped to numeric values\r\n */\r\nconst NAMED_WEIGHTS: Record<string, number> = {\r\n thin: 100,\r\n hairline: 100,\r\n extralight: 200,\r\n ultralight: 200,\r\n light: 300,\r\n normal: 400,\r\n regular: 400,\r\n medium: 500,\r\n semibold: 600,\r\n demibold: 600,\r\n bold: 700,\r\n extrabold: 800,\r\n ultrabold: 800,\r\n black: 900,\r\n heavy: 900,\r\n};\r\n\r\n/**\r\n * Check if token is a font weight\r\n */\r\nfunction isFontWeight(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Direct type match\r\n if (tokenType === 'fontWeight' || tokenType === 'number') {\r\n return true;\r\n }\r\n\r\n // Path-based detection\r\n const pathHasFontWeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'fontweight' || lower.includes('font-weight') || lower.includes('fontweight');\r\n });\r\n\r\n return pathHasFontWeight ?? false;\r\n}\r\n\r\n/**\r\n * fontWeight/unitless transform\r\n *\r\n * Ensures font-weight values are unitless numbers.\r\n * Handles numeric values, string values, and named weights.\r\n *\r\n * @example\r\n * // Numeric input\r\n * Input: { $value: 700, $type: \"fontWeight\" }\r\n * Output: 700\r\n *\r\n * @example\r\n * // String input\r\n * Input: { $value: \"700\", $type: \"fontWeight\" }\r\n * Output: 700\r\n *\r\n * @example\r\n * // Named weight\r\n * Input: { $value: \"bold\", $type: \"fontWeight\" }\r\n * Output: 700\r\n */\r\nexport const fontWeightUnitless: TransformDefinition = {\r\n name: 'fontWeight/unitless',\r\n type: 'value',\r\n filter: isFontWeight,\r\n transform: (token) => {\r\n const value = token.$value ?? token.value;\r\n\r\n // Already a number - return as-is\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n\r\n // String value\r\n if (typeof value === 'string') {\r\n // Try to parse as number\r\n const parsed = Number.parseInt(value, 10);\r\n if (!Number.isNaN(parsed)) {\r\n return parsed;\r\n }\r\n\r\n // Handle named weights\r\n const normalized = value.toLowerCase().replace(/[^a-z]/g, '');\r\n if (Object.hasOwn(NAMED_WEIGHTS, normalized)) {\r\n // eslint-disable-next-line security/detect-object-injection\r\n const namedWeight = NAMED_WEIGHTS[normalized];\r\n if (namedWeight !== undefined) {\r\n return namedWeight;\r\n }\r\n }\r\n }\r\n\r\n // Fallback - return as-is\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Line Height Transform\r\n *\r\n * Keeps line-height values as unitless ratios (1, 1.5, 2, etc.)\r\n * CSS line-height should be unitless for proper inheritance.\r\n *\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/line-height\r\n */\r\n\r\nimport type { SDToken, TransformDefinition } from '../types.js';\r\n\r\n/** Default base font size for conversion */\r\nconst DEFAULT_BASE_FONT_SIZE = 16;\r\n\r\n/**\r\n * Check if token is a line height\r\n */\r\nfunction isLineHeight(token: SDToken): boolean {\r\n const tokenType = token.$type ?? token.type;\r\n\r\n // Direct type match\r\n if (tokenType === 'lineHeight') {\r\n return true;\r\n }\r\n\r\n // Path-based detection\r\n const pathHasLineHeight = token.path?.some((part) => {\r\n const lower = String(part).toLowerCase();\r\n return lower === 'lineheight' || lower.includes('line-height') || lower.includes('lineheight');\r\n });\r\n\r\n // Scope-based detection (from Figma Variables)\r\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\r\n\r\n return (pathHasLineHeight ?? false) || (scopeHasLineHeight ?? false);\r\n}\r\n\r\n/**\r\n * lineHeight/unitless transform\r\n *\r\n * Converts line-height values to unitless ratios.\r\n * Handles numbers, percentages, and pixel values.\r\n *\r\n * @example\r\n * // Percentage input\r\n * Input: { $value: \"150%\", $type: \"lineHeight\" }\r\n * Output: 1.5\r\n *\r\n * @example\r\n * // Already unitless\r\n * Input: { $value: 1.5, $type: \"lineHeight\" }\r\n * Output: 1.5\r\n *\r\n * @example\r\n * // Pixel value from Figma\r\n * Input: { $value: 24, $type: \"lineHeight\" }\r\n * Output: 1.5 (assuming 16px base)\r\n */\r\nexport const lineHeightUnitless: TransformDefinition = {\r\n name: 'lineHeight/unitless',\r\n type: 'value',\r\n filter: isLineHeight,\r\n transform: (token) => {\r\n const value = token.$value ?? token.value;\r\n\r\n // Already a number\r\n if (typeof value === 'number') {\r\n // If <= 3, already a multiplier (1, 1.5, 2)\r\n if (value <= 3) {\r\n return value;\r\n }\r\n // If > 3, likely px from Figma - convert to unitless\r\n return value / DEFAULT_BASE_FONT_SIZE;\r\n }\r\n\r\n // Handle percentage strings (e.g., \"150%\" -> 1.5)\r\n if (typeof value === 'string' && value.endsWith('%')) {\r\n return Number.parseFloat(value) / 100;\r\n }\r\n\r\n // Handle strings with units\r\n if (typeof value === 'string') {\r\n const numValue = Number.parseFloat(value);\r\n if (!Number.isNaN(numValue)) {\r\n if (numValue <= 3) {\r\n return numValue;\r\n }\r\n return numValue / DEFAULT_BASE_FONT_SIZE;\r\n }\r\n }\r\n\r\n // Fallback - return as-is\r\n return value;\r\n },\r\n};\r\n","/**\r\n * Name transform for JavaScript/TypeScript that ensures valid identifiers\r\n *\r\n * Converts token paths to PascalCase, prefixing numeric-only segments\r\n * to ensure valid JavaScript identifiers.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name-js-identifier\r\n */\r\n\r\nimport type { TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * Convert a path segment to PascalCase, handling numeric segments\r\n */\r\nfunction toPascalCaseSegment(segment: string): string {\r\n const needsNumericPrefix = /^\\d/.test(segment);\r\n\r\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\r\n const pascal = segment\r\n .split(/[^a-zA-Z0-9]+/)\r\n .filter(Boolean)\r\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\r\n .join('');\r\n\r\n // Preserve underscore prefix for numeric identifiers so they stay valid\r\n return needsNumericPrefix ? `_${pascal}` : pascal;\r\n}\r\n\r\n/**\r\n * name/js-identifier transform\r\n *\r\n * Converts token path to a valid JavaScript identifier in PascalCase.\r\n * Handles numeric segments by prefixing with underscore.\r\n *\r\n * @example\r\n * ```\r\n * colors.neutral.gray.100 → ColorsNeutralGray_100\r\n * spacing.0 → Spacing_0\r\n * typography.fontSize.base → TypographyFontSizeBase\r\n * ```\r\n */\r\nexport const nameJsIdentifier: TransformDefinition = {\r\n name: 'name/js-identifier',\r\n type: 'name',\r\n transform: ({ path }) => {\r\n return path.map(toPascalCaseSegment).join('');\r\n },\r\n};\r\n","/**\r\n * Name Transform\r\n *\r\n * Converts token paths to kebab-case names.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name\r\n */\r\n\r\nimport type { TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * name/kebab transform\r\n *\r\n * Converts token path to kebab-case CSS variable name.\r\n * Replaces underscores with hyphens and lowercases.\r\n *\r\n * @example\r\n * Input: path = ['color', 'blue', '500']\r\n * Output: \"color-blue-500\"\r\n *\r\n * @example\r\n * Input: path = ['typography', 'fontWeight', 'bold']\r\n * Output: \"typography-fontweight-bold\"\r\n */\r\nexport const nameKebab: TransformDefinition = {\r\n name: 'name/kebab',\r\n type: 'name',\r\n transform: (token) => {\r\n return token.path.join('-').replace(/_/g, '-').toLowerCase();\r\n },\r\n};\r\n","/**\r\n * Style Dictionary Transforms\r\n *\r\n * Exports all built-in transforms and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/transforms\r\n */\r\n\r\nimport { dimensionRem } from './dimension.js';\r\nimport { fontWeightUnitless } from './font-weight.js';\r\nimport { lineHeightUnitless } from './line-height.js';\r\nimport { nameJsIdentifier } from './name-js-identifier.js';\r\nimport { nameKebab } from './name.js';\r\n\r\nimport type { StyleDictionaryInstance, TransformDefinition } from '../types.js';\r\n\r\n/**\r\n * All built-in transforms\r\n */\r\nexport const builtInTransforms: TransformDefinition[] = [\r\n fontWeightUnitless,\r\n lineHeightUnitless,\r\n dimensionRem,\r\n nameKebab,\r\n nameJsIdentifier,\r\n];\r\n\r\n/**\r\n * Register all transforms with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customTransforms - Additional custom transforms to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerTransforms } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerTransforms(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerTransforms(\r\n sd: StyleDictionaryInstance,\r\n customTransforms: TransformDefinition[] = []\r\n): void {\r\n const allTransforms = [...builtInTransforms, ...customTransforms];\r\n\r\n for (const transform of allTransforms) {\r\n sd.registerTransform({\r\n name: transform.name,\r\n type: transform.type,\r\n filter: transform.filter,\r\n transform: transform.transform,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual transforms\r\nexport { fontWeightUnitless } from './font-weight.js';\r\nexport { lineHeightUnitless } from './line-height.js';\r\nexport { dimensionRem } from './dimension.js';\r\nexport { nameKebab } from './name.js';\r\nexport { nameJsIdentifier } from './name-js-identifier.js';\r\n","/**\r\n * CSS Transform Group\r\n *\r\n * Transform group for generating CSS output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/css\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * custom/css transform group\r\n *\r\n * Transforms for generating CSS custom properties:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/kebab: kebab-case names\r\n * - time/seconds: Convert time to seconds\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n */\r\nexport const cssTransformGroup: TransformGroupDefinition = {\r\n name: 'custom/css',\r\n transforms: [\r\n 'attribute/cti',\r\n 'name/kebab',\r\n 'time/seconds',\r\n 'fontWeight/unitless', // Must run before dimension/rem\r\n 'lineHeight/unitless', // Must run before dimension/rem\r\n 'dimension/rem',\r\n 'color/css',\r\n ],\r\n};\r\n","/**\r\n * JavaScript Transform Group\r\n *\r\n * Transform group for generating JavaScript output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/js\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * js-custom transform group\r\n *\r\n * Transforms for generating JavaScript/TypeScript exports:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/js-identifier: PascalCase names with numeric segment handling\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n */\r\nexport const jsTransformGroup: TransformGroupDefinition = {\r\n name: 'js-custom',\r\n transforms: [\r\n 'attribute/cti',\r\n 'name/js-identifier', // Use custom transform for valid JS identifiers\r\n 'fontWeight/unitless', // Must run before dimension/rem\r\n 'lineHeight/unitless', // Must run before dimension/rem\r\n 'dimension/rem',\r\n 'color/css',\r\n ],\r\n};\r\n","/**\r\n * SCSS Transform Group\r\n *\r\n * Transform group for generating SCSS output.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups/scss\r\n */\r\n\r\nimport type { TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * custom/scss transform group\r\n *\r\n * Transforms for generating SCSS variables:\r\n * - attribute/cti: Add CTI attributes\r\n * - name/kebab: kebab-case names\r\n * - time/seconds: Convert time to seconds\r\n * - fontWeight/unitless: Keep font weights unitless\r\n * - lineHeight/unitless: Keep line heights unitless\r\n * - dimension/rem: Convert dimensions to rem\r\n * - color/css: Convert colors to CSS format\r\n *\r\n * This follows Style Dictionary v5 best practices:\r\n * - Source tokens are raw numbers\r\n * - Transforms add appropriate units (or keep unitless for font-weight/line-height)\r\n */\r\nexport const scssTransformGroup: TransformGroupDefinition = {\r\n name: 'custom/scss',\r\n transforms: [\r\n 'attribute/cti', // Add CTI attributes\r\n 'name/kebab', // kebab-case names\r\n 'time/seconds', // Convert time to seconds\r\n 'fontWeight/unitless', // Font weights stay unitless (MUST run before dimension/rem)\r\n 'lineHeight/unitless', // Line heights stay unitless (MUST run before dimension/rem)\r\n 'dimension/rem', // Convert dimensions to rem\r\n 'color/css', // Convert colors to CSS format\r\n ],\r\n};\r\n","/**\r\n * Style Dictionary Transform Groups\r\n *\r\n * Exports all built-in transform groups and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/groups\r\n */\r\n\r\nimport { cssTransformGroup } from './css.js';\r\nimport { jsTransformGroup } from './js.js';\r\nimport { scssTransformGroup } from './scss.js';\r\n\r\nimport type { StyleDictionaryInstance, TransformGroupDefinition } from '../types.js';\r\n\r\n/**\r\n * All built-in transform groups\r\n */\r\nexport const transformGroups: TransformGroupDefinition[] = [\r\n cssTransformGroup,\r\n jsTransformGroup,\r\n scssTransformGroup,\r\n];\r\n\r\n/**\r\n * Register all transform groups with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customGroups - Additional custom transform groups to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerTransformGroups } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerTransformGroups(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerTransformGroups(\r\n sd: StyleDictionaryInstance,\r\n customGroups: TransformGroupDefinition[] = []\r\n): void {\r\n const allGroups = [...transformGroups, ...customGroups];\r\n\r\n for (const group of allGroups) {\r\n sd.registerTransformGroup({\r\n name: group.name,\r\n transforms: group.transforms,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual transform groups\r\nexport { cssTransformGroup } from './css.js';\r\nexport { jsTransformGroup } from './js.js';\r\nexport { scssTransformGroup } from './scss.js';\r\n","/**\r\n * Fix References Preprocessor\r\n *\r\n * Fixes token reference paths that may be mismatched between\r\n * Figma exports and the actual token structure.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors/fix-references\r\n */\r\n\r\nimport type { PreprocessorDefinition } from '../types.js';\r\n\r\n/**\r\n * Default reference path mappings\r\n * Maps incorrect reference paths to correct paths\r\n */\r\nconst DEFAULT_PATH_MAPPINGS: Array<[string, string]> = [\r\n ['{colors.brand.', '{color.'],\r\n ['{colors.neutral.', '{neutral.'],\r\n ['{borders.width.', '{border.width.'],\r\n];\r\n\r\n/**\r\n * Fix a single value's reference path\r\n */\r\nfunction fixValue(value: unknown, mappings: Array<[string, string]>): unknown {\r\n if (typeof value !== 'string' || !value.startsWith('{')) {\r\n return value;\r\n }\r\n\r\n let result = value;\r\n for (const mapping of mappings) {\r\n result = result.split(mapping[0]).join(mapping[1]);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Process tokens recursively to fix reference paths\r\n */\r\nfunction processTokens(obj: Record<string, unknown>, mappings: Array<[string, string]>): void {\r\n for (const key of Object.keys(obj)) {\r\n // eslint-disable-next-line security/detect-object-injection\r\n const value = obj[key];\r\n\r\n if (value && typeof value === 'object') {\r\n const typedValue = value as Record<string, unknown>;\r\n\r\n // DTCG format - fix $value\r\n if ('$value' in typedValue) {\r\n typedValue['$value'] = fixValue(typedValue['$value'], mappings);\r\n }\r\n // Legacy format - fix value\r\n else if ('value' in typedValue) {\r\n typedValue['value'] = fixValue(typedValue['value'], mappings);\r\n }\r\n // Recurse into nested objects\r\n else {\r\n processTokens(typedValue, mappings);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * fix-references preprocessor\r\n *\r\n * Fixes token reference paths that may be mismatched.\r\n * Our tokens use \"color.blue.500\" but Figma exports may reference\r\n * \"{colors.brand.blue.500}\" - this preprocessor fixes the mismatch.\r\n *\r\n * @example\r\n * Before: { $value: \"{colors.brand.primary}\" }\r\n * After: { $value: \"{color.primary}\" }\r\n */\r\nexport const fixReferences: PreprocessorDefinition = {\r\n name: 'fix-references',\r\n preprocessor: (dictionary) => {\r\n processTokens(dictionary, DEFAULT_PATH_MAPPINGS);\r\n return dictionary;\r\n },\r\n};\r\n\r\n/**\r\n * Create a custom fix-references preprocessor with custom mappings\r\n *\r\n * @param mappings - Array of [from, to] path mapping pairs\r\n * @returns Custom preprocessor definition\r\n *\r\n * @example\r\n * ```typescript\r\n * const customFixReferences = createFixReferencesPreprocessor([\r\n * ['{colors.brand.', '{color.'],\r\n * ['{acme.', '{brand.'],\r\n * ]);\r\n * ```\r\n */\r\nexport function createFixReferencesPreprocessor(\r\n mappings: Array<[string, string]>\r\n): PreprocessorDefinition {\r\n return {\r\n name: 'fix-references-custom',\r\n preprocessor: (dictionary) => {\r\n processTokens(dictionary, mappings);\r\n return dictionary;\r\n },\r\n };\r\n}\r\n","/**\r\n * Style Dictionary Preprocessors\r\n *\r\n * Exports all built-in preprocessors and registration utilities.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors\r\n */\r\n\r\nimport { fixReferences } from './fix-references.js';\r\n\r\nimport type { PreprocessorDefinition, StyleDictionaryInstance } from '../types.js';\r\n\r\n/**\r\n * All built-in preprocessors\r\n */\r\nexport const builtInPreprocessors: PreprocessorDefinition[] = [fixReferences];\r\n\r\n/**\r\n * Register all preprocessors with Style Dictionary\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param customPreprocessors - Additional custom preprocessors to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerPreprocessors } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerPreprocessors(StyleDictionary);\r\n * ```\r\n */\r\nexport function registerPreprocessors(\r\n sd: StyleDictionaryInstance,\r\n customPreprocessors: PreprocessorDefinition[] = []\r\n): void {\r\n const allPreprocessors = [...builtInPreprocessors, ...customPreprocessors];\r\n\r\n for (const preprocessor of allPreprocessors) {\r\n sd.registerPreprocessor({\r\n name: preprocessor.name,\r\n preprocessor: preprocessor.preprocessor,\r\n });\r\n }\r\n}\r\n\r\n// Re-export individual preprocessors\r\nexport { fixReferences, createFixReferencesPreprocessor } from './fix-references.js';\r\n","/**\r\n * Token Diff Utility\r\n *\r\n * Compares token collections to detect changes for changelog generation.\r\n * Identifies added, removed, modified, and type-changed tokens.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { TokenCollection } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Types of changes that can occur to tokens\r\n */\r\nexport type TokenChangeType = 'added' | 'removed' | 'modified' | 'type-changed' | 'deprecated';\r\n\r\n/**\r\n * Details about a token value change\r\n */\r\nexport interface TokenValueChange {\r\n /** Previous value */\r\n oldValue: unknown;\r\n /** New value */\r\n newValue: unknown;\r\n /** Previous type */\r\n oldType?: string;\r\n /** New type */\r\n newType?: string;\r\n}\r\n\r\n/**\r\n * Information about a single token change\r\n */\r\nexport interface TokenChange {\r\n /** Full token path (e.g., 'color.brand.primary') */\r\n path: string;\r\n /** Type of change */\r\n type: TokenChangeType;\r\n /** Value change details (for modified/type-changed) */\r\n valueChange?: TokenValueChange;\r\n /** Token description */\r\n description?: string;\r\n /** Whether this is a breaking change */\r\n breaking: boolean;\r\n}\r\n\r\n/**\r\n * Result of comparing two token collections\r\n */\r\nexport interface TokenDiff {\r\n /** Tokens that were added */\r\n added: TokenChange[];\r\n /** Tokens that were removed */\r\n removed: TokenChange[];\r\n /** Tokens whose values changed */\r\n modified: TokenChange[];\r\n /** Tokens whose types changed (breaking) */\r\n typeChanged: TokenChange[];\r\n /** Tokens marked as deprecated */\r\n deprecated: TokenChange[];\r\n /** Total number of changes */\r\n totalChanges: number;\r\n /** Whether there are breaking changes */\r\n hasBreaking: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a value is a token (has $value or value property)\r\n */\r\nfunction isToken(\r\n obj: unknown\r\n): obj is { $value?: unknown; value?: unknown; $type?: string; type?: string } {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const token = obj as Record<string, unknown>;\r\n return '$value' in token || 'value' in token;\r\n}\r\n\r\n/**\r\n * Get token value (supports both DTCG and legacy formats)\r\n */\r\nfunction getTokenValue(token: unknown): unknown {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n return token.$value ?? token.value;\r\n}\r\n\r\n/**\r\n * Get token type (supports both DTCG and legacy formats)\r\n */\r\nfunction getTokenType(token: unknown): string | undefined {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n return token.$type ?? token.type;\r\n}\r\n\r\n/**\r\n * Get token description\r\n */\r\nfunction getTokenDescription(token: unknown): string | undefined {\r\n if (!isToken(token)) {\r\n return undefined;\r\n }\r\n\r\n const t = token as { $description?: string; description?: string; comment?: string };\r\n return t.$description ?? t.description ?? t.comment;\r\n}\r\n\r\n/**\r\n * Flatten nested token collection into path-value pairs\r\n */\r\nfunction flattenTokens(\r\n collection: TokenCollection,\r\n prefix = ''\r\n): Map<string, { value: unknown; type?: string; description?: string; token: unknown }> {\r\n const result = new Map<\r\n string,\r\n { value: unknown; type?: string; description?: string; token: unknown }\r\n >();\r\n\r\n for (const [key, value] of Object.entries(collection)) {\r\n const path = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (isToken(value)) {\r\n result.set(path, {\r\n value: getTokenValue(value),\r\n type: getTokenType(value),\r\n description: getTokenDescription(value),\r\n token: value,\r\n });\r\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n // Recurse into nested objects\r\n const nested = flattenTokens(value as TokenCollection, path);\r\n for (const [nestedPath, nestedValue] of nested) {\r\n result.set(nestedPath, nestedValue);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Check if a token is deprecated\r\n */\r\nfunction isDeprecated(token: unknown): boolean {\r\n if (!isToken(token)) {\r\n return false;\r\n }\r\n\r\n const t = token as {\r\n $deprecated?: boolean;\r\n deprecated?: boolean;\r\n $extensions?: { deprecated?: boolean };\r\n };\r\n return t.$deprecated === true || t.deprecated === true || t.$extensions?.deprecated === true;\r\n}\r\n\r\n/**\r\n * Deep equality check for values\r\n */\r\nfunction isEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) {\r\n return true;\r\n }\r\n\r\n if (typeof a !== typeof b) {\r\n return false;\r\n }\r\n\r\n if (typeof a === 'object' && a !== null && b !== null) {\r\n const aKeys = Object.keys(a as object);\r\n const bKeys = Object.keys(b as object);\r\n\r\n if (aKeys.length !== bKeys.length) {\r\n return false;\r\n }\r\n\r\n return aKeys.every((key) => {\r\n const aObj = a as Record<string, unknown>;\r\n const bObj = b as Record<string, unknown>;\r\n // eslint-disable-next-line security/detect-object-injection\r\n const aValue = aObj[key];\r\n // eslint-disable-next-line security/detect-object-injection\r\n const bValue = bObj[key];\r\n return isEqual(aValue, bValue);\r\n });\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Main Diff Function\r\n// ============================================================================\r\n\r\n/**\r\n * Compare two token collections and return the differences\r\n *\r\n * @param oldTokens - Previous version of tokens\r\n * @param newTokens - New version of tokens\r\n * @returns Detailed diff of all changes\r\n */\r\nexport function diffTokens(oldTokens: TokenCollection, newTokens: TokenCollection): TokenDiff {\r\n const oldFlat = flattenTokens(oldTokens);\r\n const newFlat = flattenTokens(newTokens);\r\n\r\n const added: TokenChange[] = [];\r\n const removed: TokenChange[] = [];\r\n const modified: TokenChange[] = [];\r\n const typeChanged: TokenChange[] = [];\r\n const deprecated: TokenChange[] = [];\r\n\r\n // Find added and modified tokens\r\n for (const [path, newData] of newFlat) {\r\n const oldData = oldFlat.get(path);\r\n\r\n if (!oldData) {\r\n // Token was added\r\n added.push({\r\n path,\r\n type: 'added',\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n } else {\r\n // Check for type change (breaking)\r\n if (oldData.type && newData.type && oldData.type !== newData.type) {\r\n typeChanged.push({\r\n path,\r\n type: 'type-changed',\r\n valueChange: {\r\n oldValue: oldData.value,\r\n newValue: newData.value,\r\n oldType: oldData.type,\r\n newType: newData.type,\r\n },\r\n description: newData.description,\r\n breaking: true,\r\n });\r\n }\r\n // Check for value change\r\n else if (!isEqual(oldData.value, newData.value)) {\r\n modified.push({\r\n path,\r\n type: 'modified',\r\n valueChange: {\r\n oldValue: oldData.value,\r\n newValue: newData.value,\r\n oldType: oldData.type,\r\n newType: newData.type,\r\n },\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n }\r\n // Check for deprecation\r\n else if (isDeprecated(newData.token) && !isDeprecated(oldData.token)) {\r\n deprecated.push({\r\n path,\r\n type: 'deprecated',\r\n description: newData.description,\r\n breaking: false,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Find removed tokens (breaking)\r\n for (const [path, oldData] of oldFlat) {\r\n if (!newFlat.has(path)) {\r\n removed.push({\r\n path,\r\n type: 'removed',\r\n description: oldData.description,\r\n breaking: true,\r\n });\r\n }\r\n }\r\n\r\n const totalChanges =\r\n added.length + removed.length + modified.length + typeChanged.length + deprecated.length;\r\n const hasBreaking = removed.length > 0 || typeChanged.length > 0;\r\n\r\n return {\r\n added,\r\n removed,\r\n modified,\r\n typeChanged,\r\n deprecated,\r\n totalChanges,\r\n hasBreaking,\r\n };\r\n}\r\n\r\n/**\r\n * Get a summary of changes as a plain text description\r\n */\r\nexport function summarizeDiff(diff: TokenDiff): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`Total changes: ${diff.totalChanges}`);\r\n\r\n if (diff.hasBreaking) {\r\n lines.push('⚠️ Contains breaking changes');\r\n }\r\n\r\n if (diff.added.length > 0) {\r\n lines.push(`Added: ${diff.added.length}`);\r\n }\r\n\r\n if (diff.removed.length > 0) {\r\n lines.push(`Removed: ${diff.removed.length} (breaking)`);\r\n }\r\n\r\n if (diff.modified.length > 0) {\r\n lines.push(`Modified: ${diff.modified.length}`);\r\n }\r\n\r\n if (diff.typeChanged.length > 0) {\r\n lines.push(`Type changed: ${diff.typeChanged.length} (breaking)`);\r\n }\r\n\r\n if (diff.deprecated.length > 0) {\r\n lines.push(`Deprecated: ${diff.deprecated.length}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Filter diff by change type\r\n */\r\nexport function filterDiff(diff: TokenDiff, types: TokenChangeType[]): TokenChange[] {\r\n const changes: TokenChange[] = [];\r\n\r\n if (types.includes('added')) {\r\n changes.push(...diff.added);\r\n }\r\n if (types.includes('removed')) {\r\n changes.push(...diff.removed);\r\n }\r\n if (types.includes('modified')) {\r\n changes.push(...diff.modified);\r\n }\r\n if (types.includes('type-changed')) {\r\n changes.push(...diff.typeChanged);\r\n }\r\n if (types.includes('deprecated')) {\r\n changes.push(...diff.deprecated);\r\n }\r\n\r\n return changes;\r\n}\r\n\r\n/**\r\n * Get only breaking changes\r\n */\r\nexport function getBreakingChanges(diff: TokenDiff): TokenChange[] {\r\n return [...diff.removed, ...diff.typeChanged];\r\n}\r\n","/**\r\n * Token-specific type definitions\r\n *\r\n * Defines types for DTCG-compliant tokens, validation, transformation,\r\n * and build processes.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// ============================================================================\r\n// DTCG Token Types\r\n// ============================================================================\r\n\r\n/**\r\n * DTCG-compliant token value\r\n * @see https://www.designtokens.org/\r\n */\r\nexport interface DTCGToken {\r\n /** The resolved value of the token */\r\n $value: unknown;\r\n\r\n /** Token type (color, dimension, etc.) */\r\n $type?: TokenType;\r\n\r\n /** Human-readable description */\r\n $description?: string;\r\n\r\n /** Extension data */\r\n $extensions?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Legacy Style Dictionary token format\r\n */\r\nexport interface LegacyToken {\r\n /** The resolved value of the token */\r\n value: unknown;\r\n\r\n /** Token type */\r\n type?: string;\r\n\r\n /** Human-readable description */\r\n description?: string;\r\n\r\n /** Comment (older format) */\r\n comment?: string;\r\n}\r\n\r\n/**\r\n * Combined token type supporting both DTCG and legacy formats\r\n */\r\nexport type Token = DTCGToken | LegacyToken;\r\n\r\n/**\r\n * Token collection (nested structure of tokens or groups)\r\n */\r\nexport interface TokenCollection {\r\n [key: string]: Token | TokenCollection | unknown;\r\n}\r\n\r\n/**\r\n * Figma export format (from Tokens Studio)\r\n */\r\nexport interface FigmaExport {\r\n [collectionName: string]: FigmaCollection;\r\n}\r\n\r\n/**\r\n * Single Figma collection with optional modes\r\n */\r\nexport interface FigmaCollection {\r\n /** Mode-specific token values */\r\n modes?: Record<string, TokenCollection>;\r\n\r\n /** Direct tokens if no modes */\r\n [key: string]: unknown;\r\n}\r\n\r\n// ============================================================================\r\n// Token Type Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Valid token types per DTCG specification\r\n */\r\nexport const VALID_TOKEN_TYPES = [\r\n 'color',\r\n 'dimension',\r\n 'fontFamily',\r\n 'fontWeight',\r\n 'fontStyle',\r\n 'shadow',\r\n 'number',\r\n 'string',\r\n 'duration',\r\n 'cubicBezier',\r\n 'strokeStyle',\r\n 'border',\r\n 'transition',\r\n 'gradient',\r\n 'typography',\r\n 'letterSpacing',\r\n 'lineHeight',\r\n 'paragraphSpacing',\r\n 'textDecoration',\r\n 'textCase',\r\n] as const;\r\n\r\n/**\r\n * Token type (DTCG specification)\r\n */\r\nexport type TokenType = (typeof VALID_TOKEN_TYPES)[number];\r\n\r\n// ============================================================================\r\n// Validation Types\r\n// ============================================================================\r\n\r\n/**\r\n * Severity level for validation issues\r\n */\r\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\r\n\r\n/**\r\n * A single validation issue\r\n */\r\nexport interface ValidationIssue {\r\n /** Token path (e.g., \"color.brand.primary\") */\r\n path: string;\r\n\r\n /** Human-readable message */\r\n message: string;\r\n\r\n /** Issue severity */\r\n severity: ValidationSeverity;\r\n\r\n /** The problematic value (if applicable) */\r\n value?: unknown;\r\n\r\n /** Suggested fix (if applicable) */\r\n suggestion?: string;\r\n}\r\n\r\n/**\r\n * Result of token validation\r\n */\r\nexport interface ValidationResult {\r\n /** Whether validation passed (no errors) */\r\n valid: boolean;\r\n\r\n /** Validation errors (blocking issues) */\r\n errors: ValidationIssue[];\r\n\r\n /** Validation warnings (non-blocking) */\r\n warnings: ValidationIssue[];\r\n\r\n /** Total number of tokens validated */\r\n tokenCount: number;\r\n\r\n /** Number of files validated */\r\n fileCount: number;\r\n\r\n /** Validation duration in milliseconds */\r\n duration?: number;\r\n}\r\n\r\n/**\r\n * Options for validation\r\n */\r\nexport interface ValidateOptions {\r\n /** Directory containing token files */\r\n collectionsDir?: string;\r\n\r\n /** File patterns to validate */\r\n patterns?: string[];\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Suppress output */\r\n quiet?: boolean;\r\n\r\n /** Treat warnings as errors */\r\n strict?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Transform Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for Figma token transformation\r\n */\r\nexport interface TransformOptions {\r\n /** Source directory with Figma exports */\r\n sourceDir: string;\r\n\r\n /** Output directory for collections */\r\n collectionsDir: string;\r\n\r\n /**\r\n * Glob patterns for finding source files\r\n * @example ['theme.json', '*.tokens.json', 'figma-variables-*.json']\r\n */\r\n sourcePatterns?: string[];\r\n\r\n /**\r\n * Map of collection names to specific file paths\r\n * @example { 'primitives': './colors.json', 'semantic': './semantic.json' }\r\n */\r\n collectionMapping?: Record<string, string>;\r\n\r\n /** Preserve $codeSyntax references from Figma */\r\n preserveCodeSyntax?: boolean;\r\n\r\n /** Modes to ignore during transformation */\r\n ignoreModes?: string[];\r\n\r\n /** Default mode name */\r\n defaultMode?: string;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Enable strict schema validation */\r\n strict?: boolean;\r\n\r\n /** Enable incremental build (only process changed files) */\r\n incremental?: boolean;\r\n\r\n /** Force full rebuild (ignore cache) */\r\n force?: boolean;\r\n\r\n /** Cache directory for incremental builds */\r\n cacheDir?: string;\r\n}\r\n\r\n/**\r\n * Result of token transformation\r\n */\r\nexport interface TransformResult {\r\n /** Whether transformation succeeded */\r\n success: boolean;\r\n\r\n /** Files written during transformation */\r\n filesWritten: string[];\r\n\r\n /** Number of tokens processed */\r\n tokensProcessed: number;\r\n\r\n /** Modes detected in Figma export */\r\n modesDetected: string[];\r\n\r\n /** Errors encountered */\r\n errors: string[];\r\n\r\n /** Warnings generated */\r\n warnings: string[];\r\n\r\n /** Duration in milliseconds */\r\n duration?: number;\r\n}\r\n\r\n// ============================================================================\r\n// Build Types\r\n// ============================================================================\r\n\r\n/**\r\n * A single build step\r\n */\r\nexport interface BuildStep {\r\n /** Step name for display */\r\n name: string;\r\n\r\n /** Shell command to run (if external) */\r\n command?: string;\r\n\r\n /** Function to execute (if internal). Returns boolean for success/failure, or undefined */\r\n fn?: () => boolean | undefined | Promise<boolean | undefined>;\r\n\r\n /** Whether to skip this step */\r\n skip?: boolean;\r\n\r\n /** Working directory for command */\r\n cwd?: string;\r\n}\r\n\r\n/**\r\n * Options for token build\r\n */\r\nexport interface BuildOptions {\r\n /** Skip validation step */\r\n skipValidate?: boolean;\r\n\r\n /** Skip transformation step */\r\n skipTransform?: boolean;\r\n\r\n /** Only build theme CSS */\r\n onlyTheme?: boolean;\r\n\r\n /** Source directory for Figma exports */\r\n sourceDir?: string;\r\n\r\n /** Enable watch mode */\r\n watch?: boolean;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n\r\n /** Suppress output */\r\n quiet?: boolean;\r\n\r\n /** Enable strict schema validation */\r\n strict?: boolean;\r\n\r\n /** Enable incremental build (only process changed files) */\r\n incremental?: boolean;\r\n\r\n /** Force full rebuild (ignore cache) */\r\n force?: boolean;\r\n\r\n /** Cache directory for incremental builds */\r\n cacheDir?: string;\r\n\r\n /** Output directory for all formats */\r\n outputDir?: string;\r\n\r\n /** Output formats to generate (default: ['css', 'scss', 'json']) */\r\n formats?: Array<'css' | 'scss' | 'js' | 'ts' | 'json' | 'android' | 'ios'>;\r\n\r\n /** CSS custom property prefix (default: '--dsai-') */\r\n prefix?: string;\r\n\r\n /** Per-format output directories */\r\n outputDirs?: Partial<Record<string, string>>;\r\n\r\n /** Per-format output file names */\r\n outputFileNames?: Partial<Record<string, string>>;\r\n\r\n /** Additional SCSS directories to merge */\r\n additionalScssDirectories?: string[];\r\n\r\n /** Additional CSS directories to merge */\r\n additionalCssDirectories?: string[];\r\n\r\n /** Merge order for additional styles */\r\n mergeOrder?: 'before' | 'after';\r\n\r\n /** Create combined bundle files */\r\n createBundle?: boolean;\r\n\r\n /** Custom SCSS import header */\r\n scssImportHeader?: string;\r\n\r\n /** Additional directories to watch */\r\n watchDirectories?: string[];\r\n\r\n /** Build pipeline configuration */\r\n pipeline?: {\r\n /** Steps to include in the build */\r\n steps?: Array<\r\n | 'validate'\r\n | 'transform'\r\n | 'style-dictionary'\r\n | 'sync'\r\n | 'sass-theme'\r\n | 'sass-theme-minified'\r\n | 'postprocess'\r\n | 'sass-utilities'\r\n | 'sass-utilities-minified'\r\n | 'bundle'\r\n >;\r\n /** Paths configuration for build steps */\r\n paths?: {\r\n syncSource?: string;\r\n syncTarget?: string;\r\n sassThemeInput?: string;\r\n sassThemeOutput?: string;\r\n sassThemeMinifiedOutput?: string;\r\n sassUtilitiesInput?: string;\r\n sassUtilitiesOutput?: string;\r\n sassUtilitiesMinifiedOutput?: string;\r\n };\r\n /** Style Dictionary config file name */\r\n styleDictionaryConfig?: string;\r\n };\r\n\r\n /**\r\n * Themes configuration for multi-theme builds.\r\n * When provided with enabled: true, the 'multi-theme' step will\r\n * use config-driven theme definitions instead of hardcoded themes.\r\n */\r\n themesConfig?: {\r\n /** Whether theme building is enabled */\r\n enabled?: boolean;\r\n /** Theme definitions by name */\r\n definitions?: Record<\r\n string,\r\n {\r\n isDefault?: boolean;\r\n suffix?: string | null;\r\n selector: string;\r\n mediaQuery?: string;\r\n dataAttribute?: string;\r\n outputFiles?: Partial<Record<string, string>>;\r\n }\r\n >;\r\n };\r\n\r\n /**\r\n * Post-process configuration for CSS files\r\n */\r\n postprocessConfig?: {\r\n /** Whether postprocessing is enabled */\r\n enabled?: boolean;\r\n /** CSS output directory */\r\n cssDir?: string;\r\n /** CSS files to process */\r\n files?: string[];\r\n /** Text replacements to apply */\r\n replacements?: Array<{\r\n description?: string;\r\n from: string | RegExp;\r\n to: string;\r\n }>;\r\n };\r\n\r\n /**\r\n * CSS output directory (from SCSS config)\r\n */\r\n cssOutputDir?: string;\r\n}\r\n\r\n/**\r\n * Result of token build\r\n */\r\nexport interface BuildResult {\r\n /** Whether build succeeded */\r\n success: boolean;\r\n\r\n /** Steps that completed successfully */\r\n stepsCompleted: string[];\r\n\r\n /** Steps that failed */\r\n stepsFailed: string[];\r\n\r\n /** Total duration in milliseconds */\r\n duration: number;\r\n\r\n /** Errors encountered */\r\n errors: string[];\r\n\r\n /** Warnings generated */\r\n warnings: string[];\r\n\r\n /** Generated output files */\r\n outputFiles?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Sync Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for token sync\r\n */\r\nexport interface SyncOptions {\r\n /** Source file (Style Dictionary output) */\r\n sourceFile: string;\r\n\r\n /** Target file (TypeScript source) */\r\n targetFile: string;\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of token sync\r\n */\r\nexport interface SyncResult {\r\n /** Whether sync succeeded */\r\n success: boolean;\r\n\r\n /** Number of tokens synced */\r\n tokensCount: number;\r\n\r\n /** Whether file was changed */\r\n changed: boolean;\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Postprocess Types\r\n// ============================================================================\r\n\r\n/**\r\n * A text replacement rule\r\n */\r\nexport interface ReplacementRule {\r\n /** Pattern to search for (string or regex) */\r\n from: string | RegExp;\r\n\r\n /** Replacement string */\r\n to: string;\r\n\r\n /** Optional description */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * Options for CSS post-processing\r\n */\r\nexport interface PostprocessOptions {\r\n /** Input CSS file */\r\n inputFile: string;\r\n\r\n /** Output CSS file (defaults to input) */\r\n outputFile?: string;\r\n\r\n /** Replacements to make */\r\n replacements?: ReplacementRule[];\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of post-processing\r\n */\r\nexport interface PostprocessResult {\r\n /** Whether post-processing succeeded */\r\n success: boolean;\r\n\r\n /** Number of replacements made */\r\n replacementsMade: number;\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Merge Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for merging collections\r\n */\r\nexport interface MergeOptions {\r\n /** Source files to merge */\r\n sourceFiles: string[];\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Merge strategy for conflicts */\r\n strategy?: 'first' | 'last' | 'error';\r\n\r\n /** Dry run (don't write files) */\r\n dryRun?: boolean;\r\n\r\n /** Enable verbose output */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of collection merge\r\n */\r\nexport interface MergeResult {\r\n /** Whether merge succeeded */\r\n success: boolean;\r\n\r\n /** Number of collections merged */\r\n collectionsCount: number;\r\n\r\n /** Number of tokens in result */\r\n tokensCount: number;\r\n\r\n /** Output file path */\r\n outputFile: string;\r\n\r\n /** Conflicts detected */\r\n conflicts?: string[];\r\n\r\n /** Errors encountered */\r\n errors?: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an object is a DTCG token\r\n */\r\nexport function isDTCGToken(obj: unknown): obj is DTCGToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n return '$value' in obj;\r\n}\r\n\r\n/**\r\n * Check if an object is a legacy token\r\n */\r\nexport function isLegacyToken(obj: unknown): obj is LegacyToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n return 'value' in obj && !('$value' in obj);\r\n}\r\n\r\n/**\r\n * Check if an object is any token type\r\n */\r\nexport function isToken(obj: unknown): obj is Token {\r\n return isDTCGToken(obj) || isLegacyToken(obj);\r\n}\r\n\r\n/**\r\n * Check if a string is a valid token type\r\n */\r\nexport function isValidTokenType(type: string): type is TokenType {\r\n return VALID_TOKEN_TYPES.includes(type as TokenType);\r\n}\r\n\r\n/**\r\n * Check if a value is a token reference\r\n */\r\nexport function isTokenReference(value: unknown): boolean {\r\n return typeof value === 'string' && value.startsWith('{') && value.endsWith('}');\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Get the value from a token regardless of format\r\n */\r\nexport function getTokenValue(token: Token): unknown {\r\n return isDTCGToken(token) ? token.$value : token.value;\r\n}\r\n\r\n/**\r\n * Get the type from a token regardless of format\r\n */\r\nexport function getTokenType(token: Token): string | undefined {\r\n if (isDTCGToken(token)) {\r\n return token.$type;\r\n }\r\n return (token as LegacyToken).type;\r\n}\r\n\r\n/**\r\n * Get the description from a token regardless of format\r\n */\r\nexport function getTokenDescription(token: Token): string | undefined {\r\n if (isDTCGToken(token)) {\r\n return token.$description;\r\n }\r\n const legacy = token as LegacyToken;\r\n return legacy.description ?? legacy.comment;\r\n}\r\n\r\n/**\r\n * Convert a legacy token to DTCG format\r\n */\r\nexport function toDTCGToken(token: LegacyToken): DTCGToken {\r\n const dtcg: DTCGToken = {\r\n $value: token.value,\r\n };\r\n\r\n if (token.type && isValidTokenType(token.type)) {\r\n dtcg.$type = token.type;\r\n }\r\n\r\n const desc = token.description ?? token.comment;\r\n if (desc) {\r\n dtcg.$description = desc;\r\n }\r\n\r\n return dtcg;\r\n}\r\n\r\n/**\r\n * Parse a token reference string\r\n * @param ref - Reference string like \"{color.brand.primary}\"\r\n * @returns Path segments like [\"color\", \"brand\", \"primary\"]\r\n */\r\nexport function parseTokenReference(ref: string): string[] | null {\r\n if (!isTokenReference(ref)) {\r\n return null;\r\n }\r\n const inner = ref.slice(1, -1);\r\n return inner.split('.');\r\n}\r\n","/**\r\n * Token validation module\r\n *\r\n * Validates design tokens for DTCG compliance and structural integrity.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\n\r\nimport {\r\n getTokenType,\r\n getTokenValue,\r\n isDTCGToken,\r\n isToken,\r\n isTokenReference,\r\n isValidTokenType,\r\n VALID_TOKEN_TYPES,\r\n} from './types.js';\r\n\r\nimport type {\r\n Token,\r\n TokenCollection,\r\n TokenType,\r\n ValidateOptions,\r\n ValidationIssue,\r\n ValidationResult,\r\n} from './types.js';\r\nimport type { ResolvedConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Color Validation\r\n// ============================================================================\r\n\r\n/** Hex color pattern */\r\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\r\n\r\n/** RGB/RGBA pattern */\r\nconst RGB_PATTERN = /^rgba?\\s*\\(/i;\r\n\r\n/** HSL/HSLA pattern */\r\nconst HSL_PATTERN = /^hsla?\\s*\\(/i;\r\n\r\n/** Named colors (common subset) */\r\nconst NAMED_COLORS = new Set([\r\n 'transparent',\r\n 'currentcolor',\r\n 'inherit',\r\n 'initial',\r\n 'unset',\r\n 'black',\r\n 'white',\r\n 'red',\r\n 'green',\r\n 'blue',\r\n 'yellow',\r\n 'orange',\r\n 'purple',\r\n 'pink',\r\n 'gray',\r\n 'grey',\r\n]);\r\n\r\n/**\r\n * Check if a value is a valid color\r\n */\r\nfunction isValidColor(value: string): boolean {\r\n // Hex colors\r\n if (HEX_COLOR_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // RGB/RGBA\r\n if (RGB_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // HSL/HSLA\r\n if (HSL_PATTERN.test(value)) {\r\n return true;\r\n }\r\n // Token references\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n // Named colors\r\n if (NAMED_COLORS.has(value.toLowerCase())) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Dimension Validation\r\n// ============================================================================\r\n\r\n/** Valid dimension units */\r\nconst VALID_UNITS = new Set([\r\n 'px',\r\n 'rem',\r\n 'em',\r\n '%',\r\n 'vh',\r\n 'vw',\r\n 'vmin',\r\n 'vmax',\r\n 'pt',\r\n 'cm',\r\n 'mm',\r\n 'in',\r\n 'ch',\r\n 'ex',\r\n]);\r\n\r\n/**\r\n * Check if a value is a valid dimension\r\n */\r\nfunction isValidDimension(value: string): boolean {\r\n // Zero without unit\r\n if (value === '0') {\r\n return true;\r\n }\r\n // Token reference\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n // Parse numeric value and unit manually (safer than regex)\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return false;\r\n }\r\n // Find where the numeric part ends\r\n let i = 0;\r\n const firstChar = trimmed.charAt(0);\r\n if (firstChar === '-' || firstChar === '+') {\r\n i = 1;\r\n }\r\n let hasDigits = false;\r\n let hasDot = false;\r\n while (i < trimmed.length) {\r\n const char = trimmed.charAt(i);\r\n if (char >= '0' && char <= '9') {\r\n hasDigits = true;\r\n i++;\r\n } else if (char === '.' && !hasDot) {\r\n hasDot = true;\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n if (!hasDigits) {\r\n return false;\r\n }\r\n // Extract unit part\r\n const unit = trimmed.slice(i).toLowerCase();\r\n // Pure number (for unitless values like line-height)\r\n if (unit === '') {\r\n return true;\r\n }\r\n // Check valid units\r\n return VALID_UNITS.has(unit);\r\n}\r\n\r\n// ============================================================================\r\n// Token Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single token\r\n */\r\nfunction validateSingleToken(\r\n path: string,\r\n token: Token,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n const value = getTokenValue(token);\r\n const type = getTokenType(token);\r\n const isDtcg = isDTCGToken(token);\r\n\r\n // Warn if not using DTCG format\r\n if (!isDtcg) {\r\n warnings.push({\r\n path,\r\n message: 'Token uses legacy format. Consider migrating to DTCG ($value, $type).',\r\n severity: 'warning',\r\n suggestion: 'Use $value instead of value, $type instead of type',\r\n });\r\n }\r\n\r\n // Check for missing value\r\n if (value === undefined || value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has no value',\r\n severity: 'error',\r\n });\r\n return;\r\n }\r\n\r\n // Check for empty string value\r\n if (value === '') {\r\n warnings.push({\r\n path,\r\n message: 'Token has empty string value',\r\n severity: 'warning',\r\n value,\r\n });\r\n }\r\n\r\n // Check for missing type\r\n if (!type) {\r\n warnings.push({\r\n path,\r\n message: 'Token has no type specified',\r\n severity: 'warning',\r\n suggestion: `Add $type property with one of: ${VALID_TOKEN_TYPES.slice(0, 5).join(', ')}...`,\r\n });\r\n } else if (!isValidTokenType(type)) {\r\n warnings.push({\r\n path,\r\n message: `Unknown token type: \"${type}\"`,\r\n severity: 'warning',\r\n value: type,\r\n suggestion: `Valid types: ${VALID_TOKEN_TYPES.join(', ')}`,\r\n });\r\n }\r\n\r\n // Type-specific validation\r\n if (type && typeof value === 'string') {\r\n validateTypedValue(path, value, type as TokenType, errors);\r\n }\r\n}\r\n\r\n/**\r\n * Validate a typed value\r\n */\r\nfunction validateTypedValue(\r\n path: string,\r\n value: string,\r\n type: TokenType,\r\n errors: ValidationIssue[]\r\n): void {\r\n switch (type) {\r\n case 'color':\r\n if (!isValidColor(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid color value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use hex (#fff), rgb(), hsl(), or token reference',\r\n });\r\n }\r\n break;\r\n\r\n case 'dimension':\r\n if (!isValidDimension(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid dimension value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use value with unit (16px, 1rem) or token reference',\r\n });\r\n }\r\n break;\r\n\r\n case 'fontWeight':\r\n if (!isValidFontWeight(value)) {\r\n errors.push({\r\n path,\r\n message: `Invalid fontWeight value: \"${value}\"`,\r\n severity: 'error',\r\n value,\r\n suggestion: 'Use numeric (100-900) or keyword (normal, bold)',\r\n });\r\n }\r\n break;\r\n\r\n // Add more type-specific validations as needed\r\n default:\r\n // Other types pass through\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a value is a valid font weight\r\n */\r\nfunction isValidFontWeight(value: string): boolean {\r\n // Numeric weights\r\n const numeric = parseInt(value, 10);\r\n if (!Number.isNaN(numeric) && numeric >= 1 && numeric <= 1000) {\r\n return true;\r\n }\r\n // Keywords\r\n const keywords = ['normal', 'bold', 'lighter', 'bolder'];\r\n if (keywords.includes(value.toLowerCase())) {\r\n return true;\r\n }\r\n // Token reference\r\n if (isTokenReference(value)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Collection Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Recursively validate a token collection\r\n */\r\nfunction validateCollection(\r\n collection: TokenCollection,\r\n basePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[],\r\n tokenCount: { count: number }\r\n): void {\r\n for (const [key, value] of Object.entries(collection)) {\r\n // Skip metadata keys\r\n if (key.startsWith('$')) {\r\n continue;\r\n }\r\n\r\n const path = basePath ? `${basePath}.${key}` : key;\r\n\r\n if (isToken(value)) {\r\n tokenCount.count += 1;\r\n validateSingleToken(path, value, errors, warnings);\r\n } else if (typeof value === 'object' && value !== null) {\r\n validateCollection(value as TokenCollection, path, errors, warnings, tokenCount);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate a JSON token file\r\n */\r\nfunction validateFile(\r\n filePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): number {\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n const data = JSON.parse(content) as TokenCollection;\r\n const tokenCount = { count: 0 };\r\n\r\n validateCollection(data, '', errors, warnings, tokenCount);\r\n\r\n return tokenCount.count;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n errors.push({\r\n path: filePath,\r\n message: `Failed to parse file: ${errorMessage}`,\r\n severity: 'error',\r\n });\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Find all JSON files recursively in a directory\r\n */\r\nfunction findJsonFiles(dir: string, files: string[] = []): string[] {\r\n if (!existsSync(dir)) {\r\n return files;\r\n }\r\n\r\n const entries = readdirSync(dir);\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry);\r\n const stat = statSync(fullPath);\r\n\r\n if (stat.isDirectory()) {\r\n findJsonFiles(fullPath, files);\r\n } else if (entry.endsWith('.json')) {\r\n files.push(fullPath);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Main Validation Function\r\n// ============================================================================\r\n\r\n/**\r\n * Validate all tokens in a directory\r\n *\r\n * @param config - Resolved configuration\r\n * @param options - Validation options\r\n * @returns Validation result\r\n *\r\n * @example\r\n * ```typescript\r\n * import { validateTokens, loadConfig } from '@dsai-io/tools';\r\n *\r\n * const { config } = await loadConfig();\r\n * const result = await validateTokens(config);\r\n *\r\n * if (!result.valid) {\r\n * console.error('Validation failed:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport async function validateTokens(\r\n config: ResolvedConfig,\r\n options: ValidateOptions = {}\r\n): Promise<ValidationResult> {\r\n const startTime = Date.now();\r\n const { verbose = false, quiet = false, strict = false } = options;\r\n\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n let totalTokens = 0;\r\n let fileCount = 0;\r\n\r\n // Use provided directory or config\r\n const collectionsDir = options.collectionsDir ?? config.tokens.collectionsDir;\r\n\r\n if (!existsSync(collectionsDir)) {\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: collectionsDir,\r\n message: 'Collections directory does not exist',\r\n severity: 'error',\r\n },\r\n ],\r\n warnings: [],\r\n tokenCount: 0,\r\n fileCount: 0,\r\n duration: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Find all JSON files\r\n const jsonFiles = findJsonFiles(collectionsDir);\r\n\r\n if (!quiet) {\r\n logInfo(`Validating ${jsonFiles.length} token files...`);\r\n }\r\n\r\n // Validate each file\r\n for (const file of jsonFiles) {\r\n fileCount += 1;\r\n const relativePath = relative(collectionsDir, file);\r\n\r\n if (verbose) {\r\n logDebug(`Validating: ${relativePath}`);\r\n }\r\n\r\n const tokenCount = validateFile(file, errors, warnings);\r\n totalTokens += tokenCount;\r\n }\r\n\r\n // Determine validity\r\n const valid = strict ? errors.length === 0 && warnings.length === 0 : errors.length === 0;\r\n\r\n // Report results\r\n if (!quiet) {\r\n if (valid) {\r\n logSuccess(`Validated ${totalTokens} tokens in ${fileCount} files`);\r\n if (warnings.length > 0) {\r\n logWarn(`${warnings.length} warnings found`);\r\n }\r\n } else {\r\n logError(`Validation failed with ${errors.length} errors`);\r\n }\r\n }\r\n\r\n return {\r\n valid,\r\n errors,\r\n warnings,\r\n tokenCount: totalTokens,\r\n fileCount,\r\n duration: Date.now() - startTime,\r\n };\r\n}\r\n\r\n/**\r\n * Validate tokens and exit with code (for CLI usage)\r\n *\r\n * @param config - Resolved configuration\r\n * @param options - Validation options\r\n */\r\nexport async function validateTokensCLI(\r\n config: ResolvedConfig,\r\n options: ValidateOptions = {}\r\n): Promise<void> {\r\n const result = await validateTokens(config, { ...options, verbose: true });\r\n\r\n if (!result.valid) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error.path}: ${error.message}`);\r\n }\r\n process.exit(1);\r\n }\r\n\r\n for (const warning of result.warnings) {\r\n console.warn(`⚠️ ${warning.path}: ${warning.message}`);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Simple Logging (will be replaced with proper logger in future)\r\n// ============================================================================\r\n\r\nfunction logInfo(message: string): void {\r\n console.info(`ℹ️ ${message}`);\r\n}\r\n\r\nfunction logDebug(message: string): void {\r\n console.info(`🔍 ${message}`);\r\n}\r\n\r\nfunction logSuccess(message: string): void {\r\n console.info(`✅ ${message}`);\r\n}\r\n\r\nfunction logWarn(message: string): void {\r\n console.warn(`⚠️ ${message}`);\r\n}\r\n\r\nfunction logError(message: string): void {\r\n console.error(`❌ ${message}`);\r\n}\r\n","/**\r\n * @fileoverview Zod schemas for DTCG (Design Tokens Community Group) token format\r\n * @see https://design-tokens.github.io/community-group/format/\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * DTCG token types as specified in the DTCG specification\r\n */\r\nexport const tokenTypeSchema = z.enum([\r\n 'color',\r\n 'dimension',\r\n 'fontFamily',\r\n 'fontWeight',\r\n 'duration',\r\n 'cubicBezier',\r\n 'number',\r\n 'string',\r\n 'shadow',\r\n 'typography',\r\n 'transition',\r\n 'strokeStyle',\r\n 'border',\r\n 'gradient',\r\n]);\r\n\r\nexport type TokenType = z.infer<typeof tokenTypeSchema>;\r\n\r\n/**\r\n * DTCG color value (can be hex string or object)\r\n */\r\nexport const colorValueSchema = z.union([\r\n z.string().regex(/^#[0-9A-Fa-f]{3,8}$/),\r\n z.string().regex(/^rgba?\\(/),\r\n z.string().regex(/^hsla?\\(/),\r\n z.object({\r\n r: z.number().min(0).max(1),\r\n g: z.number().min(0).max(1),\r\n b: z.number().min(0).max(1),\r\n a: z.number().min(0).max(1).optional(),\r\n }),\r\n]);\r\n\r\n/**\r\n * DTCG dimension value (number with unit)\r\n */\r\nexport const dimensionValueSchema = z.union([\r\n z.string().regex(/^-?\\d+\\.?\\d*px$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*rem$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*em$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*%$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*vh$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*vw$/),\r\n z.string().regex(/^-?\\d+\\.?\\d*pt$/),\r\n z.number(),\r\n]);\r\n\r\n/**\r\n * DTCG duration value (time with unit)\r\n */\r\nexport const durationValueSchema = z.union([\r\n z.string().regex(/^\\d+\\.?\\d*ms$/),\r\n z.string().regex(/^\\d+\\.?\\d*s$/),\r\n]);\r\n\r\n/**\r\n * DTCG cubic bezier value\r\n */\r\nexport const cubicBezierValueSchema = z.tuple([\r\n z.number().min(0).max(1),\r\n z.number(),\r\n z.number().min(0).max(1),\r\n z.number(),\r\n]);\r\n\r\n/**\r\n * DTCG shadow value\r\n */\r\nexport const shadowValueSchema = z.object({\r\n color: colorValueSchema,\r\n offsetX: dimensionValueSchema,\r\n offsetY: dimensionValueSchema,\r\n blur: dimensionValueSchema,\r\n spread: dimensionValueSchema.optional(),\r\n inset: z.boolean().optional(),\r\n});\r\n\r\n/**\r\n * DTCG typography value\r\n */\r\nexport const typographyValueSchema = z.object({\r\n fontFamily: z.union([z.string(), z.array(z.string())]),\r\n fontSize: dimensionValueSchema,\r\n fontWeight: z.union([z.number().int().min(1).max(1000), z.string()]),\r\n lineHeight: z.union([dimensionValueSchema, z.number()]),\r\n letterSpacing: dimensionValueSchema.optional(),\r\n textTransform: z.enum(['none', 'uppercase', 'lowercase', 'capitalize']).optional(),\r\n textDecoration: z.enum(['none', 'underline', 'overline', 'line-through']).optional(),\r\n});\r\n\r\n/**\r\n * DTCG stroke style value\r\n */\r\nexport const strokeStyleValueSchema = z.union([\r\n z.enum(['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset']),\r\n z.object({\r\n dashArray: z.array(dimensionValueSchema),\r\n lineCap: z.enum(['round', 'butt', 'square']).optional(),\r\n }),\r\n]);\r\n\r\n/**\r\n * DTCG border value\r\n */\r\nexport const borderValueSchema = z.object({\r\n color: colorValueSchema,\r\n width: dimensionValueSchema,\r\n style: strokeStyleValueSchema,\r\n});\r\n\r\n/**\r\n * DTCG gradient stop\r\n */\r\nexport const gradientStopSchema = z.object({\r\n color: colorValueSchema,\r\n position: z.number().min(0).max(1),\r\n});\r\n\r\n/**\r\n * DTCG gradient value\r\n */\r\nexport const gradientValueSchema = z.array(gradientStopSchema);\r\n\r\n/**\r\n * Token alias/reference (e.g., \"{colors.primary}\")\r\n */\r\nexport const tokenReferenceSchema = z.string().regex(/^\\{[^}]+\\}$/);\r\n\r\n/**\r\n * Base DTCG token structure\r\n */\r\nexport const dtcgTokenBaseSchema = z.object({\r\n $value: z.unknown(),\r\n $type: tokenTypeSchema.optional(),\r\n $description: z.string().optional(),\r\n $extensions: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\nexport type DTCGTokenBase = z.infer<typeof dtcgTokenBaseSchema>;\r\n\r\n/**\r\n * DTCG color token\r\n */\r\nexport const dtcgColorTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('color').optional(),\r\n $value: z.union([colorValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG dimension token\r\n */\r\nexport const dtcgDimensionTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('dimension').optional(),\r\n $value: z.union([dimensionValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG font family token\r\n */\r\nexport const dtcgFontFamilyTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('fontFamily').optional(),\r\n $value: z.union([z.string(), z.array(z.string()), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG font weight token\r\n */\r\nexport const dtcgFontWeightTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('fontWeight').optional(),\r\n $value: z.union([\r\n z.number().int().min(1).max(1000),\r\n z.enum(['thin', 'light', 'regular', 'medium', 'semibold', 'bold', 'extrabold', 'black']),\r\n tokenReferenceSchema,\r\n ]),\r\n});\r\n\r\n/**\r\n * DTCG duration token\r\n */\r\nexport const dtcgDurationTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('duration').optional(),\r\n $value: z.union([durationValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG cubic bezier token\r\n */\r\nexport const dtcgCubicBezierTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('cubicBezier').optional(),\r\n $value: z.union([cubicBezierValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG number token\r\n */\r\nexport const dtcgNumberTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('number').optional(),\r\n $value: z.union([z.number(), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG string token\r\n */\r\nexport const dtcgStringTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('string').optional(),\r\n $value: z.union([z.string(), tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG shadow token\r\n */\r\nexport const dtcgShadowTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('shadow').optional(),\r\n $value: z.union([\r\n shadowValueSchema,\r\n z.array(shadowValueSchema), // Multiple shadows\r\n tokenReferenceSchema,\r\n ]),\r\n});\r\n\r\n/**\r\n * DTCG typography token\r\n */\r\nexport const dtcgTypographyTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('typography').optional(),\r\n $value: z.union([typographyValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG stroke style token\r\n */\r\nexport const dtcgStrokeStyleTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('strokeStyle').optional(),\r\n $value: z.union([strokeStyleValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG border token\r\n */\r\nexport const dtcgBorderTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('border').optional(),\r\n $value: z.union([borderValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * DTCG gradient token\r\n */\r\nexport const dtcgGradientTokenSchema = dtcgTokenBaseSchema.extend({\r\n $type: z.literal('gradient').optional(),\r\n $value: z.union([gradientValueSchema, tokenReferenceSchema]),\r\n});\r\n\r\n/**\r\n * Union of all specific DTCG token schemas\r\n */\r\nexport const dtcgTypedTokenSchema = z.union([\r\n dtcgColorTokenSchema,\r\n dtcgDimensionTokenSchema,\r\n dtcgFontFamilyTokenSchema,\r\n dtcgFontWeightTokenSchema,\r\n dtcgDurationTokenSchema,\r\n dtcgCubicBezierTokenSchema,\r\n dtcgNumberTokenSchema,\r\n dtcgStringTokenSchema,\r\n dtcgShadowTokenSchema,\r\n dtcgTypographyTokenSchema,\r\n dtcgStrokeStyleTokenSchema,\r\n dtcgBorderTokenSchema,\r\n dtcgGradientTokenSchema,\r\n]);\r\n\r\n/**\r\n * Generic DTCG token (allows any token or group)\r\n */\r\nexport const dtcgTokenSchema: z.ZodType<DTCGTokenOrGroup> = z.lazy(() =>\r\n z.union([dtcgTokenBaseSchema, z.record(z.string(), dtcgTokenSchema)])\r\n);\r\n\r\nexport type DTCGTokenOrGroup = DTCGTokenBase | { [key: string]: DTCGTokenOrGroup };\r\n\r\n/**\r\n * DTCG token collection (root level)\r\n */\r\nexport const dtcgTokenCollectionSchema = z.record(z.string(), dtcgTokenSchema);\r\n\r\nexport type DTCGTokenCollection = z.infer<typeof dtcgTokenCollectionSchema>;\r\n\r\n/**\r\n * DTCG file format with optional metadata\r\n */\r\nexport const dtcgFileSchema = z\r\n .object({\r\n $schema: z.string().optional(),\r\n $description: z.string().optional(),\r\n $extensions: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .catchall(dtcgTokenSchema);\r\n\r\nexport type DTCGFile = z.infer<typeof dtcgFileSchema>;\r\n","/**\r\n * @fileoverview Zod schemas for Figma token export format\r\n * Validates the structure of tokens exported from Figma Variables API\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Figma color value (RGBA object)\r\n */\r\nexport const figmaColorSchema = z.object({\r\n r: z.number().min(0).max(1),\r\n g: z.number().min(0).max(1),\r\n b: z.number().min(0).max(1),\r\n a: z.number().min(0).max(1),\r\n});\r\n\r\n/**\r\n * Figma variable alias reference\r\n */\r\nexport const figmaAliasSchema = z.object({\r\n type: z.literal('VARIABLE_ALIAS'),\r\n id: z.string(),\r\n});\r\n\r\n/**\r\n * Figma variable value (can be primitive or alias)\r\n */\r\nexport const figmaVariableValueSchema = z.union([\r\n z.string(),\r\n z.number(),\r\n z.boolean(),\r\n figmaColorSchema,\r\n figmaAliasSchema,\r\n]);\r\n\r\n/**\r\n * Figma variable mode\r\n */\r\nexport const figmaModeSchema = z.object({\r\n modeId: z.string(),\r\n name: z.string(),\r\n});\r\n\r\n/**\r\n * Figma variable collection\r\n */\r\nexport const figmaCollectionSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n modes: z.array(figmaModeSchema),\r\n defaultModeId: z.string(),\r\n remote: z.boolean(),\r\n hiddenFromPublishing: z.boolean(),\r\n variableIds: z.array(z.string()),\r\n});\r\n\r\n/**\r\n * Figma variable resolved type\r\n */\r\nexport const figmaResolvedTypeSchema = z.enum(['BOOLEAN', 'FLOAT', 'STRING', 'COLOR']);\r\n\r\n/**\r\n * Figma variable\r\n */\r\nexport const figmaVariableSchema = z.object({\r\n id: z.string(),\r\n name: z.string(),\r\n key: z.string().optional(),\r\n resolvedType: figmaResolvedTypeSchema,\r\n valuesByMode: z.record(z.string(), figmaVariableValueSchema),\r\n variableCollectionId: z.string(),\r\n remote: z.boolean(),\r\n description: z.string(),\r\n hiddenFromPublishing: z.boolean(),\r\n scopes: z.array(z.string()),\r\n codeSyntax: z.record(z.string(), z.string()),\r\n});\r\n\r\n/**\r\n * Figma style type\r\n */\r\nexport const figmaStyleTypeSchema = z.enum(['FILL', 'TEXT', 'EFFECT', 'GRID']);\r\n\r\n/**\r\n * Figma style\r\n */\r\nexport const figmaStyleSchema = z.object({\r\n key: z.string(),\r\n name: z.string(),\r\n styleType: figmaStyleTypeSchema,\r\n description: z.string().optional(),\r\n remote: z.boolean().optional(),\r\n node_id: z.string().optional(),\r\n});\r\n\r\n/**\r\n * Figma node document (simplified - contains style data)\r\n */\r\nexport const figmaNodeDocumentSchema = z\r\n .object({\r\n id: z.string(),\r\n name: z.string(),\r\n type: z.string(),\r\n fills: z.array(z.unknown()).optional(),\r\n effects: z.array(z.unknown()).optional(),\r\n style: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Figma node (as returned by getFileNodes)\r\n */\r\nexport const figmaNodeSchema = z.object({\r\n document: figmaNodeDocumentSchema,\r\n components: z.record(z.string(), z.unknown()).optional(),\r\n schemaVersion: z.number().optional(),\r\n styles: z.record(z.string(), z.unknown()).optional(),\r\n});\r\n\r\n/**\r\n * Figma file response\r\n */\r\nexport const figmaFileSchema = z\r\n .object({\r\n name: z.string(),\r\n lastModified: z.string(),\r\n thumbnailUrl: z.string().optional(),\r\n version: z.string(),\r\n role: z.string().optional(),\r\n editorType: z.string().optional(),\r\n linkAccess: z.string().optional(),\r\n document: z.record(z.string(), z.unknown()),\r\n components: z.record(z.string(), z.unknown()).optional(),\r\n componentSets: z.record(z.string(), z.unknown()).optional(),\r\n schemaVersion: z.number().optional(),\r\n styles: z.record(z.string(), figmaStyleSchema).optional(),\r\n mainFileKey: z.string().optional(),\r\n branches: z.array(z.unknown()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Figma variables API response\r\n */\r\nexport const figmaVariablesResponseSchema = z.object({\r\n meta: z.object({\r\n variables: z.record(z.string(), figmaVariableSchema),\r\n variableCollections: z.record(z.string(), figmaCollectionSchema),\r\n }),\r\n});\r\n\r\n/**\r\n * Figma published variables response\r\n */\r\nexport const figmaPublishedVariablesResponseSchema = z.union([\r\n figmaVariablesResponseSchema,\r\n z.object({\r\n variables: z.record(z.string(), figmaVariableSchema),\r\n variableCollections: z.record(z.string(), figmaCollectionSchema),\r\n }),\r\n]);\r\n\r\n/**\r\n * Figma export format (as produced by @dsai-io/figma-tokens)\r\n * This is the format after exportTokens() processes the Figma API response\r\n */\r\nexport const figmaExportSchema = z.record(\r\n z.string(),\r\n z.union([\r\n z\r\n .object({\r\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\r\n })\r\n .passthrough(),\r\n z.record(z.string(), z.unknown()),\r\n ])\r\n);\r\n\r\n/**\r\n * Figma export with metadata\r\n */\r\nexport const figmaExportWithMetadataSchema = z\r\n .object({\r\n $schema: z.string().optional(),\r\n $description: z.string().optional(),\r\n $version: z.string().optional(),\r\n $source: z.string().optional(),\r\n $figmaFileKey: z.string().optional(),\r\n $exportedAt: z.string().optional(),\r\n })\r\n .catchall(\r\n z.union([\r\n z\r\n .object({\r\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\r\n })\r\n .passthrough(),\r\n z.record(z.string(), z.unknown()),\r\n ])\r\n );\r\n\r\nexport type FigmaColor = z.infer<typeof figmaColorSchema>;\r\nexport type FigmaAlias = z.infer<typeof figmaAliasSchema>;\r\nexport type FigmaVariableValue = z.infer<typeof figmaVariableValueSchema>;\r\nexport type FigmaMode = z.infer<typeof figmaModeSchema>;\r\nexport type FigmaCollection = z.infer<typeof figmaCollectionSchema>;\r\nexport type FigmaVariable = z.infer<typeof figmaVariableSchema>;\r\nexport type FigmaStyle = z.infer<typeof figmaStyleSchema>;\r\nexport type FigmaNode = z.infer<typeof figmaNodeSchema>;\r\nexport type FigmaFile = z.infer<typeof figmaFileSchema>;\r\nexport type FigmaVariablesResponse = z.infer<typeof figmaVariablesResponseSchema>;\r\nexport type FigmaExport = z.infer<typeof figmaExportSchema>;\r\nexport type FigmaExportWithMetadata = z.infer<typeof figmaExportWithMetadataSchema>;\r\n","/**\r\n * @fileoverview Zod schemas for Style Dictionary token format\r\n * @see https://amzn.github.io/style-dictionary/\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Style Dictionary token attributes\r\n */\r\nexport const styleDictionaryAttributesSchema = z\r\n .object({\r\n category: z.string().optional(),\r\n type: z.string().optional(),\r\n item: z.string().optional(),\r\n subitem: z.string().optional(),\r\n state: z.string().optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary token (legacy format - uses \"value\" not \"$value\")\r\n */\r\nexport const styleDictionaryTokenSchema = z\r\n .object({\r\n value: z.unknown(),\r\n type: z.string().optional(),\r\n comment: z.string().optional(),\r\n themeable: z.boolean().optional(),\r\n attributes: styleDictionaryAttributesSchema.optional(),\r\n name: z.string().optional(),\r\n path: z.array(z.string()).optional(),\r\n original: z\r\n .object({\r\n value: z.unknown(),\r\n })\r\n .passthrough()\r\n .optional(),\r\n filePath: z.string().optional(),\r\n isSource: z.boolean().optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary token or group (recursive)\r\n */\r\nexport const styleDictionaryTokenOrGroupSchema: z.ZodType<StyleDictionaryTokenOrGroup> = z.lazy(\r\n () =>\r\n z.union([styleDictionaryTokenSchema, z.record(z.string(), styleDictionaryTokenOrGroupSchema)])\r\n);\r\n\r\nexport type StyleDictionaryTokenOrGroup =\r\n | z.infer<typeof styleDictionaryTokenSchema>\r\n | { [key: string]: StyleDictionaryTokenOrGroup };\r\n\r\n/**\r\n * Style Dictionary tokens collection\r\n */\r\nexport const styleDictionaryTokensSchema = z.record(z.string(), styleDictionaryTokenOrGroupSchema);\r\n\r\nexport type StyleDictionaryTokens = z.infer<typeof styleDictionaryTokensSchema>;\r\n\r\n/**\r\n * Style Dictionary config source\r\n */\r\nexport const styleDictionarySourceSchema = z.union([z.string(), z.array(z.string())]);\r\n\r\n/**\r\n * Style Dictionary platform config\r\n */\r\nexport const styleDictionaryPlatformSchema = z\r\n .object({\r\n transformGroup: z.string().optional(),\r\n transforms: z.array(z.string()).optional(),\r\n buildPath: z.string().optional(),\r\n files: z\r\n .array(\r\n z\r\n .object({\r\n destination: z.string(),\r\n format: z.string(),\r\n filter: z.function().optional(),\r\n options: z.record(z.string(), z.unknown()).optional(),\r\n })\r\n .passthrough()\r\n )\r\n .optional(),\r\n actions: z.array(z.string()).optional(),\r\n })\r\n .passthrough();\r\n\r\n/**\r\n * Style Dictionary config\r\n */\r\nexport const styleDictionaryConfigSchema = z\r\n .object({\r\n source: styleDictionarySourceSchema.optional(),\r\n include: styleDictionarySourceSchema.optional(),\r\n platforms: z.record(z.string(), styleDictionaryPlatformSchema).optional(),\r\n hooks: z\r\n .object({\r\n parsers: z.record(z.string(), z.function()).optional(),\r\n preprocessors: z.record(z.string(), z.function()).optional(),\r\n transformGroups: z.record(z.string(), z.array(z.string())).optional(),\r\n transforms: z.record(z.string(), z.function()).optional(),\r\n formats: z.record(z.string(), z.function()).optional(),\r\n filters: z.record(z.string(), z.function()).optional(),\r\n fileHeaders: z.record(z.string(), z.function()).optional(),\r\n actions: z.record(z.string(), z.function()).optional(),\r\n })\r\n .optional(),\r\n log: z\r\n .object({\r\n warnings: z.enum(['warn', 'error', 'disabled']).optional(),\r\n verbosity: z.enum(['default', 'silent', 'verbose']).optional(),\r\n errors: z\r\n .object({\r\n brokenReferences: z.enum(['throw', 'console']).optional(),\r\n })\r\n .optional(),\r\n })\r\n .optional(),\r\n })\r\n .passthrough();\r\n\r\nexport type StyleDictionaryConfig = z.infer<typeof styleDictionaryConfigSchema>;\r\n\r\n/**\r\n * Style Dictionary input file format\r\n */\r\nexport const styleDictionaryInputSchema = styleDictionaryTokensSchema;\r\n\r\nexport type StyleDictionaryInput = z.infer<typeof styleDictionaryInputSchema>;\r\n","/**\r\n * @fileoverview Token schema validation\r\n * Exports Zod schemas and validation functions for token formats\r\n */\r\n\r\nexport * from './dtcg-token.schema.js';\r\nexport * from './figma-export.schema.js';\r\nexport * from './style-dictionary.schema.js';\r\n\r\nimport { z, type ZodError, type ZodIssue } from 'zod';\r\n\r\nimport {\r\n dtcgFileSchema,\r\n dtcgTokenCollectionSchema,\r\n type DTCGFile,\r\n type DTCGTokenCollection,\r\n} from './dtcg-token.schema.js';\r\nimport {\r\n figmaExportSchema,\r\n figmaExportWithMetadataSchema,\r\n figmaVariablesResponseSchema,\r\n type FigmaExport,\r\n type FigmaExportWithMetadata,\r\n type FigmaVariablesResponse,\r\n} from './figma-export.schema.js';\r\nimport {\r\n styleDictionaryInputSchema,\r\n styleDictionaryTokensSchema,\r\n type StyleDictionaryInput,\r\n type StyleDictionaryTokens,\r\n} from './style-dictionary.schema.js';\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n /** Path to the invalid token (e.g., \"colors.primary.$value\") */\r\n path: string;\r\n /** Error message */\r\n message: string;\r\n /** The invalid value */\r\n value?: unknown;\r\n /** Error code from Zod */\r\n code?: string;\r\n}\r\n\r\n/**\r\n * Validation result\r\n */\r\nexport interface ValidationResult<T = unknown> {\r\n /** Whether validation passed */\r\n valid: boolean;\r\n /** Validated and typed data (only if valid) */\r\n data?: T;\r\n /** Validation errors (only if invalid) */\r\n errors?: ValidationError[];\r\n /** Original Zod error (for debugging) */\r\n zodError?: ZodError;\r\n}\r\n\r\n/**\r\n * Validation options\r\n */\r\nexport interface ValidationOptions {\r\n /** Strict mode - treat warnings as errors */\r\n strict?: boolean;\r\n /** Abort after first error */\r\n abortEarly?: boolean;\r\n}\r\n\r\n/**\r\n * Format Zod errors into readable validation errors\r\n */\r\nfunction formatZodErrors(zodError: ZodError): ValidationError[] {\r\n return zodError.issues.map((err: ZodIssue) => ({\r\n path: err.path.join('.'),\r\n message: err.message,\r\n value: undefined,\r\n code: err.code,\r\n }));\r\n}\r\n\r\n/**\r\n * Validate DTCG token collection\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateDTCGTokens({\r\n * colors: {\r\n * primary: {\r\n * $value: '#0066ff',\r\n * $type: 'color',\r\n * },\r\n * },\r\n * });\r\n *\r\n * if (result.valid) {\r\n * console.log('Valid tokens:', result.data);\r\n * } else {\r\n * console.error('Validation errors:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateDTCGTokens(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<DTCGTokenCollection> {\r\n try {\r\n const validated = dtcgTokenCollectionSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate DTCG file format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateDTCGFile(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<DTCGFile> {\r\n try {\r\n const validated = dtcgFileSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma export format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateFigmaExport(exportedData);\r\n * if (!result.valid) {\r\n * console.error('Invalid Figma export:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateFigmaExport(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaExport> {\r\n try {\r\n const validated = figmaExportSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma export with metadata\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateFigmaExportWithMetadata(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaExportWithMetadata> {\r\n try {\r\n const validated = figmaExportWithMetadataSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Figma Variables API response\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateFigmaVariablesResponse(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<FigmaVariablesResponse> {\r\n try {\r\n const validated = figmaVariablesResponseSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Style Dictionary input format\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n *\r\n * @example\r\n * ```ts\r\n * const result = validateStyleDictionaryInput(tokens);\r\n * if (!result.valid) {\r\n * throw new Error(`Invalid tokens: ${result.errors.map(e => e.message).join(', ')}`);\r\n * }\r\n * ```\r\n */\r\nexport function validateStyleDictionaryInput(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<StyleDictionaryInput> {\r\n try {\r\n const validated = styleDictionaryInputSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Validate Style Dictionary tokens\r\n *\r\n * @param data - Data to validate\r\n * @param options - Validation options\r\n * @returns Validation result with typed data\r\n */\r\nexport function validateStyleDictionaryTokens(\r\n data: unknown,\r\n _options: ValidationOptions = {}\r\n): ValidationResult<StyleDictionaryTokens> {\r\n try {\r\n const validated = styleDictionaryTokensSchema.parse(data);\r\n return {\r\n valid: true,\r\n data: validated,\r\n };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return {\r\n valid: false,\r\n errors: formatZodErrors(error),\r\n zodError: error,\r\n };\r\n }\r\n return {\r\n valid: false,\r\n errors: [\r\n {\r\n path: '',\r\n message: error instanceof Error ? error.message : String(error),\r\n },\r\n ],\r\n };\r\n }\r\n}\r\n","/**\r\n * Figma Export Validation module\r\n *\r\n * Validates Figma token exports before transformation to ensure\r\n * they meet the expected structure and format requirements.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\r\nimport { basename, extname, join } from 'node:path';\r\n\r\nimport { isDTCGToken, isLegacyToken, isToken, isValidTokenType } from './types.js';\r\n\r\nimport type { FigmaCollection, FigmaExport, ValidationIssue, ValidationResult } from './types.js';\r\nimport type { ResolvedConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Expected structure for a Figma collection\r\n */\r\ninterface ExpectedCollection {\r\n /** File name for this collection */\r\n input: string;\r\n /** Whether the collection has mode variants (Light/Dark) */\r\n modeAware: boolean;\r\n /** Expected mode names */\r\n modes?: string[];\r\n}\r\n\r\n/**\r\n * Expected collections configuration\r\n */\r\ninterface ExpectedCollections {\r\n [key: string]: ExpectedCollection;\r\n}\r\n\r\n/**\r\n * Figma validation options\r\n */\r\nexport interface ValidateFigmaOptions {\r\n /** Path to the figma-exports directory */\r\n exportsDir?: string;\r\n /** Expected collection definitions */\r\n collections?: ExpectedCollections;\r\n /** Strict mode - treat warnings as errors */\r\n strict?: boolean;\r\n /** Skip missing files */\r\n skipMissing?: boolean;\r\n /** Configuration object */\r\n config?: ResolvedConfig;\r\n}\r\n\r\n/**\r\n * Figma validation result\r\n */\r\nexport interface ValidateFigmaResult extends ValidationResult {\r\n /** Per-file validation results */\r\n files: Map<string, ValidationResult>;\r\n /** Detected modes across all files */\r\n detectedModes: Set<string>;\r\n /** Missing expected files */\r\n missingFiles: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default expected collections configuration\r\n */\r\nconst DEFAULT_COLLECTIONS: ExpectedCollections = {\r\n foundation: {\r\n input: 'foundation.json',\r\n modeAware: true,\r\n modes: ['Light', 'Dark'],\r\n },\r\n typography: {\r\n input: 'typography.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n spacing: {\r\n input: 'spacing.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n radius: {\r\n input: 'radius.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n layout: {\r\n input: 'layout.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n shadows: {\r\n input: 'shadows.json',\r\n modeAware: false,\r\n modes: ['Base'],\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Validation Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single token from Figma export\r\n */\r\nfunction validateFigmaToken(\r\n path: string,\r\n token: unknown,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n if (!isToken(token)) {\r\n // Not a token object, might be a nested group\r\n return;\r\n }\r\n\r\n // Check for required $value\r\n if (isDTCGToken(token)) {\r\n if (token.$value === undefined || token.$value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has $value property but value is undefined or null',\r\n severity: 'error',\r\n });\r\n }\r\n\r\n // Validate token type if present\r\n if (token.$type !== undefined) {\r\n if (!isValidTokenType(token.$type)) {\r\n warnings.push({\r\n path,\r\n message: `Unknown token type: ${token.$type}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n } else if (isLegacyToken(token)) {\r\n if (token.value === undefined || token.value === null) {\r\n errors.push({\r\n path,\r\n message: 'Token has value property but value is undefined or null',\r\n severity: 'error',\r\n });\r\n }\r\n\r\n // Suggest migrating to DTCG format\r\n warnings.push({\r\n path,\r\n message: 'Token uses legacy format (value instead of $value), consider migrating to DTCG',\r\n severity: 'warning',\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Recursively validate a token tree\r\n */\r\nfunction validateTokenTree(\r\n obj: unknown,\r\n basePath: string,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): void {\r\n if (obj === null || typeof obj !== 'object') {\r\n return;\r\n }\r\n\r\n for (const [key, value] of Object.entries(obj)) {\r\n const path = basePath ? `${basePath}.${key}` : key;\r\n\r\n // Check if this is a token\r\n if (isToken(value)) {\r\n validateFigmaToken(path, value, errors, warnings);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Recursively validate nested objects\r\n validateTokenTree(value, path, errors, warnings);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Validate a Figma collection structure\r\n */\r\nfunction validateCollectionStructure(\r\n data: FigmaExport,\r\n collectionName: string,\r\n expectedCollection: ExpectedCollection,\r\n errors: ValidationIssue[],\r\n warnings: ValidationIssue[]\r\n): Set<string> {\r\n const detectedModes = new Set<string>();\r\n\r\n // Find the collection in the data\r\n const collection = Object.entries(data).find(\r\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\r\n )?.[1] as FigmaCollection | undefined;\r\n\r\n if (!collection) {\r\n errors.push({\r\n path: collectionName,\r\n message: `Expected collection \"${collectionName}\" not found in export`,\r\n severity: 'error',\r\n });\r\n return detectedModes;\r\n }\r\n\r\n // Validate modes structure\r\n if (collection.modes) {\r\n const modes = Object.keys(collection.modes);\r\n\r\n for (const mode of modes) {\r\n detectedModes.add(mode);\r\n }\r\n\r\n // Check if expected modes are present\r\n if (expectedCollection.modeAware && expectedCollection.modes) {\r\n for (const expectedMode of expectedCollection.modes) {\r\n if (!modes.includes(expectedMode)) {\r\n warnings.push({\r\n path: `${collectionName}.modes`,\r\n message: `Expected mode \"${expectedMode}\" not found, available modes: ${modes.join(', ')}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Validate tokens in each mode\r\n for (const [modeName, modeData] of Object.entries(collection.modes)) {\r\n if (modeData && typeof modeData === 'object') {\r\n validateTokenTree(modeData, `${collectionName}.modes.${modeName}`, errors, warnings);\r\n }\r\n }\r\n } else {\r\n // No modes structure, validate at collection level\r\n validateTokenTree(collection, collectionName, errors, warnings);\r\n }\r\n\r\n return detectedModes;\r\n}\r\n\r\n// ============================================================================\r\n// Main Validation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validate a single Figma export file\r\n */\r\nexport function validateFigmaFile(\r\n filePath: string,\r\n expectedCollection?: ExpectedCollection\r\n): ValidationResult & { detectedModes: Set<string> } {\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n const detectedModes = new Set<string>();\r\n let tokenCount = 0;\r\n\r\n // Check file exists\r\n if (!existsSync(filePath)) {\r\n errors.push({\r\n path: filePath,\r\n message: 'File not found',\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 0 };\r\n }\r\n\r\n // Parse JSON\r\n let data: FigmaExport;\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n data = JSON.parse(content) as FigmaExport;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error';\r\n errors.push({\r\n path: filePath,\r\n message: `Failed to parse JSON: ${message}`,\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\r\n }\r\n\r\n // Validate basic structure\r\n if (data === null || typeof data !== 'object' || Array.isArray(data)) {\r\n errors.push({\r\n path: filePath,\r\n message: 'Figma export must be a JSON object',\r\n severity: 'error',\r\n });\r\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\r\n }\r\n\r\n // Get collection name from filename\r\n const fileName = basename(filePath, extname(filePath));\r\n const collectionName = fileName.charAt(0).toUpperCase() + fileName.slice(1);\r\n\r\n // Count tokens helper\r\n const countTokens = (obj: unknown): number => {\r\n if (obj === null || typeof obj !== 'object') {\r\n return 0;\r\n }\r\n if (isToken(obj)) {\r\n return 1;\r\n }\r\n let count = 0;\r\n for (const value of Object.values(obj)) {\r\n count += countTokens(value);\r\n }\r\n return count;\r\n };\r\n\r\n // Validate collection structure if expected collection provided\r\n if (expectedCollection) {\r\n const modes = validateCollectionStructure(\r\n data,\r\n collectionName,\r\n expectedCollection,\r\n errors,\r\n warnings\r\n );\r\n for (const mode of modes) {\r\n detectedModes.add(mode);\r\n }\r\n } else {\r\n // General validation without expected structure\r\n for (const [key, value] of Object.entries(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as FigmaCollection;\r\n if (collection.modes) {\r\n for (const mode of Object.keys(collection.modes)) {\r\n detectedModes.add(mode);\r\n }\r\n }\r\n validateTokenTree(value, key, errors, warnings);\r\n }\r\n }\r\n }\r\n\r\n tokenCount = countTokens(data);\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n detectedModes,\r\n tokenCount,\r\n fileCount: 1,\r\n };\r\n}\r\n\r\n/**\r\n * Validate all Figma exports in a directory\r\n */\r\nexport function validateFigmaExports(options: ValidateFigmaOptions = {}): ValidateFigmaResult {\r\n const {\r\n exportsDir,\r\n collections = DEFAULT_COLLECTIONS,\r\n strict = false,\r\n skipMissing = false,\r\n } = options;\r\n\r\n const errors: ValidationIssue[] = [];\r\n const warnings: ValidationIssue[] = [];\r\n const files = new Map<string, ValidationResult>();\r\n const detectedModes = new Set<string>();\r\n const missingFiles: string[] = [];\r\n let totalTokenCount = 0;\r\n let totalFileCount = 0;\r\n\r\n // Resolve exports directory\r\n const targetDir = exportsDir ?? options.config?.tokens.sourceDir;\r\n\r\n if (!targetDir) {\r\n errors.push({\r\n path: 'config',\r\n message: 'Figma exports directory not specified',\r\n severity: 'error',\r\n });\r\n return {\r\n valid: false,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: 0,\r\n fileCount: 0,\r\n };\r\n }\r\n\r\n // Check directory exists\r\n if (!existsSync(targetDir)) {\r\n errors.push({\r\n path: targetDir,\r\n message: 'Figma exports directory not found',\r\n severity: 'error',\r\n });\r\n return {\r\n valid: false,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: 0,\r\n fileCount: 0,\r\n };\r\n }\r\n\r\n // Validate each expected collection\r\n for (const [_name, expectedCollection] of Object.entries(collections)) {\r\n const filePath = join(targetDir, expectedCollection.input);\r\n\r\n if (!existsSync(filePath)) {\r\n missingFiles.push(expectedCollection.input);\r\n if (!skipMissing) {\r\n errors.push({\r\n path: filePath,\r\n message: `Expected Figma export \"${expectedCollection.input}\" not found`,\r\n severity: 'error',\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n const result = validateFigmaFile(filePath, expectedCollection);\r\n files.set(expectedCollection.input, {\r\n valid: result.valid,\r\n errors: result.errors,\r\n warnings: result.warnings,\r\n tokenCount: result.tokenCount,\r\n fileCount: result.fileCount,\r\n });\r\n\r\n // Aggregate results\r\n errors.push(...result.errors);\r\n warnings.push(...result.warnings);\r\n totalTokenCount += result.tokenCount;\r\n totalFileCount += result.fileCount;\r\n for (const mode of result.detectedModes) {\r\n detectedModes.add(mode);\r\n }\r\n }\r\n\r\n // Check for unexpected files in the exports directory\r\n try {\r\n const existingFiles = readdirSync(targetDir).filter(\r\n (f) => f.endsWith('.json') && statSync(join(targetDir, f)).isFile()\r\n );\r\n const expectedFiles = new Set(Object.values(collections).map((c) => c.input));\r\n\r\n for (const file of existingFiles) {\r\n if (!expectedFiles.has(file)) {\r\n warnings.push({\r\n path: join(targetDir, file),\r\n message: `Unexpected file in exports directory: ${file}`,\r\n severity: 'warning',\r\n });\r\n }\r\n }\r\n } catch {\r\n // Ignore read errors\r\n }\r\n\r\n // In strict mode, treat warnings as errors\r\n const effectiveErrors = strict ? [...errors, ...warnings] : errors;\r\n\r\n return {\r\n valid: effectiveErrors.length === 0,\r\n errors,\r\n warnings,\r\n files,\r\n detectedModes,\r\n missingFiles,\r\n tokenCount: totalTokenCount,\r\n fileCount: totalFileCount,\r\n };\r\n}\r\n\r\n/**\r\n * Detect modes from Figma export data\r\n */\r\nexport function detectModes(data: FigmaExport, collectionName?: string): string[] {\r\n if (!data || typeof data !== 'object') {\r\n return ['Base'];\r\n }\r\n\r\n // If collection name is specified, look for that collection\r\n if (collectionName) {\r\n const collection = Object.entries(data).find(\r\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\r\n )?.[1] as FigmaCollection | undefined;\r\n\r\n if (collection?.modes) {\r\n return Object.keys(collection.modes);\r\n }\r\n return ['Base'];\r\n }\r\n\r\n // Otherwise, look for modes in any collection\r\n for (const [, value] of Object.entries(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as FigmaCollection;\r\n if (collection.modes) {\r\n return Object.keys(collection.modes);\r\n }\r\n }\r\n }\r\n\r\n return ['Base'];\r\n}\r\n\r\n// ============================================================================\r\n// CLI Support\r\n// ============================================================================\r\n\r\n/**\r\n * CLI entry point for Figma validation\r\n */\r\nexport function validateFigmaCLI(\r\n exportsDir: string,\r\n options: Omit<ValidateFigmaOptions, 'exportsDir'> = {}\r\n): boolean {\r\n console.info(`\\n🔍 Validating Figma exports in: ${exportsDir}\\n`);\r\n\r\n const result = validateFigmaExports({ ...options, exportsDir });\r\n\r\n // Report results per file\r\n for (const [file, fileResult] of result.files) {\r\n if (fileResult.errors.length === 0 && fileResult.warnings.length === 0) {\r\n console.info(`✅ ${file}`);\r\n } else {\r\n console.info(`\\n📄 ${file}`);\r\n for (const error of fileResult.errors) {\r\n console.error(` ❌ ${error.path}: ${error.message}`);\r\n }\r\n for (const warning of fileResult.warnings) {\r\n console.warn(` ⚠️ ${warning.path}: ${warning.message}`);\r\n }\r\n }\r\n }\r\n\r\n // Report missing files\r\n if (result.missingFiles.length > 0) {\r\n console.warn(`\\n⚠️ Missing files: ${result.missingFiles.join(', ')}`);\r\n }\r\n\r\n // Report detected modes\r\n if (result.detectedModes.size > 0) {\r\n console.info(`\\n📊 Detected modes: ${[...result.detectedModes].join(', ')}`);\r\n }\r\n\r\n // Summary\r\n console.info(`\\n${'─'.repeat(50)}`);\r\n if (result.valid) {\r\n console.info('✅ All Figma exports are valid');\r\n } else {\r\n console.error(\r\n `❌ Validation failed: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`\r\n );\r\n }\r\n\r\n return result.valid;\r\n}\r\n","/**\r\n * Token Transformation module\r\n *\r\n * Transforms Figma token exports to Style Dictionary format with DTCG compliance.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { basename, dirname, extname, join } from 'node:path';\r\n\r\nimport { validateFigmaExport } from './schemas/index.js';\r\n\r\nimport type {\r\n DTCGToken,\r\n FigmaExport,\r\n TokenType,\r\n TransformOptions,\r\n TransformResult,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Extractor function type\r\n */\r\ntype ExtractorFn = (data: FigmaExport, mode?: string) => Record<string, unknown>;\r\n\r\n/**\r\n * Collection output configuration\r\n */\r\ninterface CollectionOutput {\r\n /** Output file path relative to output directory */\r\n file: string;\r\n /** Extractor function for this output */\r\n extractor: ExtractorFn;\r\n}\r\n\r\n/**\r\n * Collection configuration\r\n */\r\ninterface CollectionConfig {\r\n /** Input filename */\r\n input: string;\r\n /** Whether collection has mode variants (Light/Dark) */\r\n modeAware: boolean;\r\n /** Output configurations */\r\n outputs: CollectionOutput[];\r\n}\r\n\r\n/**\r\n * Collections configuration map\r\n */\r\ninterface CollectionsConfig {\r\n [key: string]: CollectionConfig;\r\n}\r\n\r\n/**\r\n * Transform options specific to token values\r\n */\r\ninterface TokenTransformOptions {\r\n /** Font stack to prepend font name to */\r\n fontStack?: string;\r\n /** Token path for context-aware transformations */\r\n tokenPath?: string;\r\n /** Token scopes from Figma */\r\n scopes?: string[];\r\n /** Whether value represents a circle (50%) */\r\n isCircle?: boolean;\r\n /** Whether value represents a pill (9999px) */\r\n isPill?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\n/** Keys that could cause prototype pollution */\r\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\r\n\r\n/** Check if a key is safe from prototype pollution */\r\nfunction isSafeKey(key: string): boolean {\r\n return !UNSAFE_KEYS.has(key);\r\n}\r\n\r\n/**\r\n * Safe nested property access for objects with index signatures\r\n */\r\nfunction getNestedValue(obj: unknown, ...keys: string[]): unknown {\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n let current: unknown = obj;\r\n for (const key of keys) {\r\n if (current === null || current === undefined || typeof current !== 'object') {\r\n return undefined;\r\n }\r\n if (!isSafeKey(key)) {\r\n return undefined;\r\n }\r\n // Only access own properties to prevent prototype pollution\r\n if (!hasOwn.call(current, key)) {\r\n return undefined;\r\n }\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n return current;\r\n}\r\n\r\n// ============================================================================\r\n// Value Transformation\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a token should remain unitless\r\n */\r\nfunction shouldKeepUnitless(_type: string, scopes: string[] = [], tokenPath = ''): boolean {\r\n // Font weights must be unitless (300, 400, 700, etc.)\r\n if (scopes.includes('FONT_WEIGHT')) {\r\n return true;\r\n }\r\n\r\n // Line heights should be unitless for proper inheritance (1, 1.5, 2, etc.)\r\n if (scopes.includes('LINE_HEIGHT')) {\r\n return true;\r\n }\r\n\r\n // Opacity values must be unitless decimals (0, 0.5, 1, etc.)\r\n if (scopes.includes('OPACITY')) {\r\n return true;\r\n }\r\n\r\n // Grid configuration values should be unitless (12 columns, 6 row-columns, etc.)\r\n const pathLower = tokenPath.toLowerCase();\r\n if (pathLower.includes('columns') || pathLower.includes('row-columns')) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if px units should be added to a number value\r\n */\r\nfunction shouldAddUnit(type: string, scopes: string[] = [], tokenPath = ''): boolean {\r\n // Don't add units to font-weights, line-heights, or grid configuration\r\n if (shouldKeepUnitless(type, scopes, tokenPath)) {\r\n return false;\r\n }\r\n\r\n return type === 'number';\r\n}\r\n\r\n/**\r\n * Transform value based on type\r\n */\r\nexport function transformValue(\r\n value: unknown,\r\n type: string | undefined,\r\n options: TokenTransformOptions = {}\r\n): unknown {\r\n // Handle font family special case - prepend font name to font stack\r\n if (type === 'string' && options.fontStack && typeof value === 'string') {\r\n const fontName = value;\r\n const stack = options.fontStack;\r\n\r\n // Check if font name is already in the stack (avoid duplicates)\r\n if (stack.toLowerCase().includes(fontName.toLowerCase())) {\r\n return stack;\r\n }\r\n\r\n // Prepend font name to stack\r\n return `${fontName}, ${stack}`;\r\n }\r\n\r\n // Handle opacity: convert percentage (0-100) to decimal (0-1)\r\n if (typeof value === 'number' && options.scopes?.includes('OPACITY')) {\r\n // If value is > 1, it's a percentage that needs conversion\r\n if (value > 1) {\r\n return value / 100;\r\n }\r\n // Value is already a decimal (0-1)\r\n return value;\r\n }\r\n\r\n // Handle line-height and font-weight: keep as unitless number (CSS best practice)\r\n if (\r\n typeof value === 'number' &&\r\n shouldKeepUnitless(type ?? '', options.scopes, options.tokenPath)\r\n ) {\r\n return value;\r\n }\r\n\r\n // Handle numbers that should be dimensions\r\n if (typeof value === 'number' && shouldAddUnit(type ?? '', options.scopes, options.tokenPath)) {\r\n // Special case for circle radius (percentage)\r\n if (options.isCircle) {\r\n return '50%';\r\n }\r\n // Special case for pill radius\r\n if (options.isPill) {\r\n return '9999px';\r\n }\r\n return `${value}px`;\r\n }\r\n\r\n // Return value as-is for colors, strings, etc.\r\n return value;\r\n}\r\n\r\n/**\r\n * Transform type from Figma to DTCG standard\r\n * @param figmaType - The original Figma type\r\n * @param scopes - Token scopes to determine type-specific handling\r\n */\r\nexport function transformType(\r\n figmaType: string | undefined,\r\n scopes: string[] = []\r\n): TokenType | undefined {\r\n if (!figmaType) {\r\n return undefined;\r\n }\r\n\r\n // Keep 'number' type for unitless values (opacity, font-weight, line-height)\r\n if (figmaType === 'number') {\r\n const unitlessScopes = ['OPACITY', 'FONT_WEIGHT', 'LINE_HEIGHT'];\r\n if (scopes.some((scope) => unitlessScopes.includes(scope))) {\r\n return 'number' as TokenType;\r\n }\r\n // Default: convert number to dimension\r\n return 'dimension';\r\n }\r\n\r\n const typeMap = new Map<string, TokenType>([\r\n ['string', 'fontFamily'],\r\n ['color', 'color'],\r\n ]);\r\n\r\n return typeMap.get(figmaType) ?? (figmaType as TokenType);\r\n}\r\n\r\n/**\r\n * Transform a single token from Figma format to DTCG-compliant format\r\n */\r\nexport function transformToken(\r\n figmaToken: unknown,\r\n options: TokenTransformOptions = {}\r\n): DTCGToken | null {\r\n if (!figmaToken || typeof figmaToken !== 'object') {\r\n return null;\r\n }\r\n\r\n const tokenObj = figmaToken as Record<string, unknown>;\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n\r\n // Skip if this is not a leaf token (no $value property)\r\n if (!hasOwn.call(tokenObj, '$value')) {\r\n return null;\r\n }\r\n\r\n // Extract scopes for type-specific handling\r\n const scopes = (tokenObj['$scopes'] as string[] | undefined) ?? [];\r\n\r\n // Pass scopes to transformValue for type-specific handling\r\n const transformOptions: TokenTransformOptions = {\r\n ...options,\r\n scopes,\r\n };\r\n\r\n const rawType = tokenObj['$type'] as string | undefined;\r\n const transformedType = transformType(rawType, scopes);\r\n\r\n // DTCG Format: Keep $ prefix for all properties\r\n const token: DTCGToken = {\r\n $value: transformValue(tokenObj['$value'], rawType, transformOptions),\r\n $type: transformedType ?? 'string',\r\n };\r\n\r\n // Add description if present (DTCG property)\r\n if (tokenObj['$description'] && typeof tokenObj['$description'] === 'string') {\r\n token.$description = tokenObj['$description'];\r\n }\r\n\r\n // Preserve extensions (DTCG property) - keeps all metadata\r\n if (tokenObj['$extensions'] && typeof tokenObj['$extensions'] === 'object') {\r\n token.$extensions = tokenObj['$extensions'] as Record<string, unknown>;\r\n }\r\n\r\n return token;\r\n}\r\n\r\n/**\r\n * Recursively transform nested token objects\r\n */\r\nexport function transformTokenTree(\r\n obj: unknown,\r\n parentKey = '',\r\n options: Record<string, TokenTransformOptions> = {}\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n const optionsMap = new Map(Object.entries(options));\r\n\r\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\r\n return result;\r\n }\r\n\r\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\r\n // Build the full path for this token\r\n const currentPath = parentKey ? `${parentKey}.${key}` : key;\r\n\r\n // Try to transform as a token\r\n const keyOptions = optionsMap.get(key);\r\n const tokenOptions: TokenTransformOptions = {\r\n ...(keyOptions ?? {}),\r\n tokenPath: currentPath,\r\n };\r\n const transformed = transformToken(value, tokenOptions);\r\n\r\n if (transformed) {\r\n Object.defineProperty(result, key, {\r\n value: transformed,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Recursively process nested objects\r\n const nested = transformTokenTree(\r\n value,\r\n currentPath,\r\n (keyOptions as Record<string, TokenTransformOptions>) ?? {}\r\n );\r\n if (Object.keys(nested).length > 0) {\r\n Object.defineProperty(result, key, {\r\n value: nested,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Extractors\r\n// ============================================================================\r\n\r\n/**\r\n * Extract brand colors from foundation collection\r\n */\r\nfunction extractBrandColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const brandData = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'brand');\r\n\r\n if (!brandData) {\r\n console.warn(`No brand colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n color: transformTokenTree(brandData),\r\n };\r\n}\r\n\r\n/**\r\n * Extract semantic/component colors from foundation collection\r\n */\r\nfunction extractSemanticColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const semantic = getNestedValue(data, 'Foundation', 'modes', mode, 'semantic');\r\n\r\n if (!semantic) {\r\n console.warn(`No semantic colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n semantic: transformTokenTree(semantic),\r\n };\r\n}\r\n\r\n/**\r\n * Extract neutral colors (black, white, grays)\r\n */\r\nfunction extractNeutralColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const neutral = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'neutral');\r\n\r\n if (!neutral) {\r\n console.warn(`No neutral colors found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n neutral: transformTokenTree(neutral),\r\n };\r\n}\r\n\r\n/**\r\n * Extract opacity scale\r\n */\r\nfunction extractOpacityColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\r\n const opacity = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'opacity');\r\n\r\n if (!opacity) {\r\n console.warn(`No opacity tokens found in ${mode} mode`);\r\n return {};\r\n }\r\n\r\n return {\r\n opacity: transformTokenTree(opacity),\r\n };\r\n}\r\n\r\n/**\r\n * Extract typography tokens\r\n */\r\nfunction extractTypography(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Typography', 'modes', 'Base') as\r\n | Record<string, unknown>\r\n | undefined;\r\n\r\n if (!base) {\r\n console.warn('No typography tokens found');\r\n return {};\r\n }\r\n\r\n // Special handling for font families - use font stacks from extensions\r\n const optionsMap = new Map<string, TokenTransformOptions>();\r\n const fontFamily = Reflect.get(base, 'fontFamily') as\r\n | Record<string, Record<string, unknown>>\r\n | undefined;\r\n if (fontFamily) {\r\n for (const key of Object.keys(fontFamily)) {\r\n const fontToken = Reflect.get(fontFamily, key) as Record<string, unknown> | undefined;\r\n const extensions = fontToken?.['$extensions'] as\r\n | Record<string, Record<string, string>>\r\n | undefined;\r\n const fontStack = extensions?.['platform']?.['fontStack'];\r\n if (fontStack) {\r\n optionsMap.set(key, { fontStack });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n typography: transformTokenTree(base, '', {\r\n fontFamily: Object.fromEntries(optionsMap),\r\n } as Record<string, TokenTransformOptions>),\r\n };\r\n}\r\n\r\n/**\r\n * Extract spacing tokens\r\n */\r\nfunction extractSpacing(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Spacing', 'modes', 'Base', 'spacing');\r\n\r\n if (!base) {\r\n console.warn('No spacing tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n spacing: transformTokenTree(base),\r\n };\r\n}\r\n\r\n/**\r\n * Extract border radius tokens\r\n */\r\nfunction extractRadius(data: FigmaExport): Record<string, unknown> {\r\n // Support both 'border-radius' (Bootstrap naming) and 'radius' (legacy Figma naming)\r\n const base =\r\n getNestedValue(data, 'Radius', 'modes', 'Base', 'border-radius') ||\r\n getNestedValue(data, 'Radius', 'modes', 'Base', 'radius');\r\n\r\n if (!base) {\r\n console.warn('No radius tokens found');\r\n return {};\r\n }\r\n\r\n // Special handling for circle and pill\r\n const options: Record<string, TokenTransformOptions> = {\r\n circle: { isCircle: true },\r\n pill: { isPill: true },\r\n };\r\n\r\n return {\r\n border: {\r\n radius: transformTokenTree(base, '', options),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract border widths from border.json file\r\n * Structure: Border.modes.Base.[0-5] → border.width.[0-5]\r\n */\r\nfunction extractBorderWidthsFromBorder(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Border', 'modes', 'Base');\r\n\r\n if (!base) {\r\n console.warn('No border width tokens found in border.json');\r\n return {};\r\n }\r\n\r\n // Transform numeric keys to proper width tokens\r\n // The tokens are numbers (0-5) representing pixel values\r\n const transformedWidths = new Map<string, DTCGToken>();\r\n for (const [key, value] of Object.entries(base as Record<string, unknown>)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const token = value as Record<string, unknown>;\r\n const numValue = token['$value'];\r\n\r\n // Convert to dimension type with px unit for border widths\r\n transformedWidths.set(key, {\r\n $value: typeof numValue === 'number' ? `${numValue}px` : String(numValue),\r\n $type: 'dimension',\r\n $description: `Border width ${key} (${numValue}px). Bootstrap's $border-width-${key} variable.`,\r\n $extensions: {\r\n platform: {\r\n scssVariableName: `$border-width-${key}`,\r\n },\r\n },\r\n });\r\n }\r\n }\r\n\r\n return {\r\n border: {\r\n width: Object.fromEntries(transformedWidths),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract breakpoint tokens\r\n */\r\nfunction extractBreakpoints(data: FigmaExport): Record<string, unknown> {\r\n const breakpoints = getNestedValue(data, 'Layout', 'modes', 'Base', 'breakpoints');\r\n\r\n if (!breakpoints) {\r\n console.warn('No breakpoint tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n layout: {\r\n breakpoints: transformTokenTree(breakpoints),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract container tokens\r\n */\r\nfunction extractContainers(data: FigmaExport): Record<string, unknown> {\r\n const container = getNestedValue(data, 'Layout', 'modes', 'Base', 'container');\r\n\r\n if (!container) {\r\n console.warn('No container tokens found');\r\n return {};\r\n }\r\n\r\n return {\r\n layout: {\r\n container: transformTokenTree(container),\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Extract grid tokens\r\n */\r\nfunction extractGrid(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Layout', 'modes', 'Base') as\r\n | Record<string, unknown>\r\n | undefined;\r\n const grid = base?.['grid'];\r\n const gutters = base?.['gutters'];\r\n\r\n if (!grid) {\r\n console.warn('No grid tokens found');\r\n return {};\r\n }\r\n\r\n const result: { layout: { grid: Record<string, unknown>; gutters?: Record<string, unknown> } } = {\r\n layout: {\r\n grid: transformTokenTree(grid),\r\n },\r\n };\r\n\r\n if (gutters) {\r\n result.layout.gutters = transformTokenTree(gutters);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Extract shadow tokens (use composite values)\r\n */\r\nfunction extractShadows(data: FigmaExport): Record<string, unknown> {\r\n const base = getNestedValue(data, 'Shadows', 'modes', 'Base', 'shadows') as\r\n | Record<string, Record<string, unknown>>\r\n | undefined;\r\n\r\n if (!base) {\r\n console.warn('No shadow tokens found');\r\n return {};\r\n }\r\n\r\n const shadowMap = new Map<string, DTCGToken>();\r\n\r\n for (const [key, value] of Object.entries(base)) {\r\n const composite = value?.['composite'] as Record<string, unknown> | undefined;\r\n if (composite) {\r\n const token: DTCGToken = {\r\n $value: composite['$value'],\r\n $type: 'shadow',\r\n };\r\n\r\n if (composite['$description'] && typeof composite['$description'] === 'string') {\r\n token.$description = composite['$description'];\r\n }\r\n\r\n if (composite['$extensions'] && typeof composite['$extensions'] === 'object') {\r\n token.$extensions = composite['$extensions'] as Record<string, unknown>;\r\n }\r\n\r\n shadowMap.set(key, token);\r\n }\r\n }\r\n\r\n return { shadow: Object.fromEntries(shadowMap) };\r\n}\r\n\r\n// ============================================================================\r\n// Default Collections Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Default collections configuration matching the original script\r\n */\r\nconst DEFAULT_COLLECTIONS: CollectionsConfig = {\r\n foundation: {\r\n input: 'foundation.json',\r\n modeAware: true,\r\n outputs: [\r\n { file: 'collections/color/primitive.json', extractor: extractBrandColors },\r\n { file: 'collections/color/neutral.json', extractor: extractNeutralColors },\r\n { file: 'collections/color/opacity.json', extractor: extractOpacityColors },\r\n { file: 'collections/color/component.json', extractor: extractSemanticColors },\r\n // Note: These paths don't exist in current Figma exports:\r\n // - colors.theme (extractThemeColors) - use semantic tokens instead\r\n // - colors.background (extractBackgroundColors) - backgrounds are in semantic\r\n // - borders.color (extractBorderColors) - border colors are in semantic.border-color\r\n ],\r\n },\r\n typography: {\r\n input: 'typography.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/typography/base.json', extractor: extractTypography }],\r\n },\r\n spacing: {\r\n input: 'spacing.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/spacing/base.json', extractor: extractSpacing }],\r\n },\r\n radius: {\r\n input: 'radius.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/border/radius.json', extractor: extractRadius }],\r\n },\r\n border: {\r\n input: 'border.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/border/width.json', extractor: extractBorderWidthsFromBorder }],\r\n },\r\n layout: {\r\n input: 'layout.json',\r\n modeAware: false,\r\n outputs: [\r\n { file: 'collections/layout/breakpoints.json', extractor: extractBreakpoints },\r\n { file: 'collections/layout/containers.json', extractor: extractContainers },\r\n { file: 'collections/layout/grid.json', extractor: extractGrid },\r\n ],\r\n },\r\n shadows: {\r\n input: 'shadows.json',\r\n modeAware: false,\r\n outputs: [{ file: 'collections/shadow/base.json', extractor: extractShadows }],\r\n },\r\n};\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Ensure directory exists\r\n */\r\nfunction ensureDir(filePath: string): void {\r\n const dir = dirname(filePath);\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Detect modes from Figma export data\r\n */\r\nexport function detectModes(data: FigmaExport, collectionPath?: string): string[] {\r\n if (!data || typeof data !== 'object') {\r\n return ['Base'];\r\n }\r\n\r\n // If collection path is specified, look for that collection\r\n if (collectionPath) {\r\n const collection = getNestedValue(data, collectionPath) as Record<string, unknown> | undefined;\r\n const modes = collection?.['modes'] as Record<string, unknown> | undefined;\r\n if (modes) {\r\n return Object.keys(modes);\r\n }\r\n return ['Base'];\r\n }\r\n\r\n // Otherwise, look for modes in any collection\r\n for (const value of Object.values(data)) {\r\n if (typeof value === 'object' && value !== null) {\r\n const collection = value as Record<string, unknown>;\r\n const modes = collection['modes'] as Record<string, unknown> | undefined;\r\n if (modes) {\r\n return Object.keys(modes);\r\n }\r\n }\r\n }\r\n\r\n return ['Base'];\r\n}\r\n\r\n/**\r\n * Get input source based on configuration with automatic fallback\r\n */\r\nfunction getInputSource(\r\n collectionConfig: CollectionConfig,\r\n exportsDir: string,\r\n buildSource: string\r\n): string {\r\n const themeFile = join(exportsDir, 'theme.json');\r\n const collectionFile = join(exportsDir, collectionConfig.input);\r\n\r\n if (buildSource === 'theme') {\r\n // Prefer theme.json, fallback to collection file\r\n if (existsSync(themeFile)) {\r\n return themeFile;\r\n }\r\n if (existsSync(collectionFile)) {\r\n console.warn(` ⚠️ theme.json not found, using ${collectionConfig.input}`);\r\n return collectionFile;\r\n }\r\n return themeFile;\r\n }\r\n\r\n // Prefer collection file, fallback to theme.json\r\n if (existsSync(collectionFile)) {\r\n return collectionFile;\r\n }\r\n if (existsSync(themeFile)) {\r\n console.warn(` ⚠️ ${collectionConfig.input} not found, using theme.json`);\r\n return themeFile;\r\n }\r\n return collectionFile;\r\n}\r\n\r\n// ============================================================================\r\n// Main Transformation\r\n// ============================================================================\r\n\r\n/**\r\n * Transform Figma tokens to Style Dictionary format\r\n */\r\nexport function transformTokens(options: TransformOptions): TransformResult {\r\n const {\r\n sourceDir,\r\n collectionsDir,\r\n ignoreModes = [],\r\n defaultMode = 'Light',\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n const startTime = Date.now();\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const filesWritten: string[] = [];\r\n const allModesDetected: Set<string> = new Set();\r\n let tokensProcessed = 0;\r\n\r\n if (verbose) {\r\n console.info('🎨 Transforming Figma tokens to Style Dictionary format...\\n');\r\n console.info('📋 Configuration:');\r\n console.info(` Source directory: ${sourceDir}`);\r\n console.info(` Output directory: ${collectionsDir}`);\r\n console.info(` Default mode: ${defaultMode}`);\r\n if (ignoreModes.length > 0) {\r\n console.info(` Ignored modes: ${ignoreModes.join(', ')}`);\r\n }\r\n if (dryRun) {\r\n console.info(' DRY RUN - no files will be written');\r\n }\r\n console.info('');\r\n }\r\n\r\n // Detect modes from theme.json\r\n const detectedModesMap = new Map<string, string[]>();\r\n const themeFile = join(sourceDir, 'theme.json');\r\n if (existsSync(themeFile)) {\r\n try {\r\n const content = readFileSync(themeFile, 'utf-8');\r\n const themeData = JSON.parse(content) as FigmaExport;\r\n\r\n // Detect modes for each collection\r\n for (const [name, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\r\n const typedConfig = collectionConfig as CollectionConfig;\r\n if (typedConfig.modeAware) {\r\n const collectionPath = name.charAt(0).toUpperCase() + name.slice(1);\r\n const modes = detectModes(themeData, collectionPath);\r\n if (modes.length > 0) {\r\n detectedModesMap.set(collectionPath, modes);\r\n for (const mode of modes) {\r\n allModesDetected.add(mode);\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n warnings.push(\r\n `Failed to read theme.json for mode detection: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n\r\n // Process each collection\r\n for (const [collectionName, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\r\n const typedConfig = collectionConfig as CollectionConfig;\r\n if (verbose) {\r\n console.info(`Processing ${collectionName} collection...`);\r\n }\r\n\r\n // Get input path based on configuration\r\n const inputPath = getInputSource(typedConfig, sourceDir, 'theme');\r\n\r\n // Check if input file exists\r\n if (!existsSync(inputPath)) {\r\n warnings.push(`Input file not found: ${inputPath}`);\r\n continue;\r\n }\r\n\r\n // Read input file\r\n let data: FigmaExport;\r\n try {\r\n const content = readFileSync(inputPath, 'utf-8');\r\n data = JSON.parse(content) as FigmaExport;\r\n\r\n // Validate schema if strict mode is enabled\r\n if (options.strict) {\r\n const validation = validateFigmaExport(data);\r\n if (!validation.valid) {\r\n const errorMessages = validation.errors?.map((e) => `${e.path}: ${e.message}`) || [];\r\n errors.push(`Schema validation failed for ${inputPath}:\\n${errorMessages.join('\\n')}`);\r\n continue;\r\n }\r\n if (verbose) {\r\n console.info(` ✓ Schema validation passed`);\r\n }\r\n }\r\n } catch (error) {\r\n errors.push(\r\n `Failed to read ${inputPath}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n continue;\r\n }\r\n\r\n // Determine which modes to process for this collection\r\n let modesToProcess = [defaultMode];\r\n if (typedConfig.modeAware) {\r\n const collectionPath = collectionName.charAt(0).toUpperCase() + collectionName.slice(1);\r\n const detectedForCollection = detectedModesMap.get(collectionPath);\r\n if (detectedForCollection) {\r\n modesToProcess = detectedForCollection.filter((m) => !ignoreModes.includes(m));\r\n } else {\r\n const modes = detectModes(data, collectionPath);\r\n if (modes.length > 1 || !modes.includes('Base')) {\r\n modesToProcess = modes.filter((m) => !ignoreModes.includes(m));\r\n }\r\n }\r\n }\r\n\r\n // Process each output\r\n for (const output of typedConfig.outputs) {\r\n for (const mode of modesToProcess) {\r\n // Generate the output file path\r\n let outputFile = output.file;\r\n if (typedConfig.modeAware && modesToProcess.length > 1) {\r\n const ext = extname(output.file);\r\n const base = basename(output.file, ext);\r\n const dir = dirname(output.file);\r\n\r\n if (mode !== defaultMode) {\r\n outputFile = join(dir, `${base}-${mode.toLowerCase()}${ext}`);\r\n }\r\n }\r\n\r\n const outputPath = join(collectionsDir, outputFile);\r\n\r\n try {\r\n // Extract and transform tokens\r\n const tokens = typedConfig.modeAware\r\n ? output.extractor(data, mode)\r\n : output.extractor(data);\r\n\r\n const tokenCount = Object.keys(tokens).length;\r\n if (tokenCount === 0) {\r\n warnings.push(`No tokens extracted for ${outputFile} (${mode} mode)`);\r\n continue;\r\n }\r\n\r\n tokensProcessed += tokenCount;\r\n\r\n if (!dryRun) {\r\n // Ensure output directory exists\r\n ensureDir(outputPath);\r\n\r\n // Write output file\r\n writeFileSync(outputPath, `${JSON.stringify(tokens, null, 2)}\\n`, 'utf-8');\r\n }\r\n\r\n filesWritten.push(outputFile);\r\n\r\n if (verbose) {\r\n const dryRunLabel = dryRun ? ' (dry run)' : '';\r\n console.info(\r\n ` ✅ Created ${outputFile}${modesToProcess.length > 1 ? ` (${mode})` : ''}${dryRunLabel}`\r\n );\r\n }\r\n } catch (error) {\r\n errors.push(\r\n `Error processing ${outputFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n\r\n if (verbose) {\r\n console.info('\\n✨ Transformation complete!');\r\n console.info(`\\n📁 Output directory: ${collectionsDir}`);\r\n console.info(`⏱️ Duration: ${duration}ms`);\r\n }\r\n\r\n return {\r\n success: errors.length === 0,\r\n filesWritten,\r\n tokensProcessed,\r\n modesDetected: Array.from(allModesDetected),\r\n errors,\r\n warnings,\r\n duration,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token transformation\r\n */\r\nexport function transformTokensCLI(\r\n sourceDir: string,\r\n collectionsDir: string,\r\n options: Partial<Omit<TransformOptions, 'sourceDir' | 'collectionsDir'>> = {}\r\n): boolean {\r\n const result = transformTokens({\r\n sourceDir,\r\n collectionsDir,\r\n verbose: true,\r\n ...options,\r\n });\r\n\r\n // Report errors\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n\r\n // Report warnings\r\n for (const warning of result.warnings) {\r\n console.warn(`⚠️ ${warning}`);\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @file Token Sync Module\r\n * @description Synchronizes generated tokens from Style Dictionary output to TypeScript source\r\n *\r\n * This module handles syncing the generated tokens from dist/js/tokens.js\r\n * to src/tokens-flat.ts so that tsup can bundle them correctly.\r\n *\r\n * This ensures that when font families or other tokens change in Figma,\r\n * the changes automatically propagate to the TypeScript source.\r\n *\r\n * @module @dsai-io/tools/tokens/sync\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport type { SyncOptions, SyncResult } from './types';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Default source file relative path from tokens package */\r\nconst DEFAULT_SOURCE_RELATIVE = 'dist/js/tokens.js';\r\n\r\n/** Default target file relative path from tokens package */\r\nconst DEFAULT_TARGET_RELATIVE = 'src/tokens-flat.ts';\r\n\r\n/** TypeScript header template for generated file */\r\nconst TS_HEADER = `/**\r\n * Do not edit directly, this file was auto-generated.\r\n * Generated from Style Dictionary output (dist/js/tokens.js)\r\n *\r\n * To update: run \\`pnpm tokens:build\\` which will:\r\n * 1. Transform Figma tokens\r\n * 2. Build with Style Dictionary\r\n * 3. Sync this file automatically\r\n */\r\n\r\n`;\r\n\r\n/** Font families to verify in output */\r\nconst EXPECTED_FONTS = ['Inter', 'Roboto Mono'] as const;\r\n\r\n// ============================================================================\r\n// Helpers\r\n// ============================================================================\r\n\r\n/**\r\n * Verify that expected font families are present in the content\r\n */\r\nfunction verifyFontFamilies(content: string): { found: string[]; missing: string[] } {\r\n const found: string[] = [];\r\n const missing: string[] = [];\r\n\r\n for (const font of EXPECTED_FONTS) {\r\n // Check for font in various formats: \"'Inter,\" or \"Inter,\"\r\n const pattern = `'${font},`;\r\n if (content.includes(pattern) || content.includes(`\"${font},`)) {\r\n found.push(font);\r\n } else {\r\n missing.push(font);\r\n }\r\n }\r\n\r\n return { found, missing };\r\n}\r\n\r\n/**\r\n * Count token exports in content\r\n */\r\nfunction countTokenExports(content: string): number {\r\n // Count export const declarations\r\n const exportPattern = /export\\s+const\\s+\\w+/g;\r\n const matches = content.match(exportPattern);\r\n return matches ? matches.length : 0;\r\n}\r\n\r\n/**\r\n * Compute default file paths from tokens directory\r\n */\r\nexport function getDefaultSyncPaths(tokensDir: string): { sourceFile: string; targetFile: string } {\r\n return {\r\n sourceFile: join(tokensDir, DEFAULT_SOURCE_RELATIVE),\r\n targetFile: join(tokensDir, DEFAULT_TARGET_RELATIVE),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Sync tokens from Style Dictionary output to TypeScript source\r\n *\r\n * @example\r\n * ```typescript\r\n * // Sync with explicit paths\r\n * const result = syncTokens({\r\n * sourceFile: './packages/@dsai-io/tokens/dist/js/tokens.js',\r\n * targetFile: './packages/@dsai-io/tokens/src/tokens-flat.ts',\r\n * });\r\n *\r\n * // Sync with paths computed from tokens directory\r\n * const paths = getDefaultSyncPaths('./packages/@dsai-io/tokens');\r\n * const result = syncTokens(paths);\r\n * ```\r\n */\r\nexport function syncTokens(options: SyncOptions): SyncResult {\r\n const { sourceFile, targetFile, dryRun = false, verbose = false } = options;\r\n\r\n const errors: string[] = [];\r\n\r\n if (verbose) {\r\n console.info('🔄 Syncing tokens from Style Dictionary output...');\r\n console.info(` Source: ${sourceFile}`);\r\n console.info(` Target: ${targetFile}`);\r\n if (dryRun) {\r\n console.info(' DRY RUN - no files will be written');\r\n }\r\n }\r\n\r\n // Check if source file exists\r\n if (!existsSync(sourceFile)) {\r\n const error = `Source file not found: ${sourceFile}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount: 0,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n\r\n // Read source content\r\n let sourceContent: string;\r\n try {\r\n sourceContent = readFileSync(sourceFile, 'utf-8');\r\n } catch (err) {\r\n const error = `Failed to read source file: ${err instanceof Error ? err.message : 'Unknown error'}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount: 0,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n\r\n // Generate TypeScript content\r\n const tsContent = `${TS_HEADER}${sourceContent}`;\r\n\r\n // Verify font families\r\n const fontFamilies = verifyFontFamilies(sourceContent);\r\n if (fontFamilies.missing.length > 0) {\r\n for (const font of fontFamilies.missing) {\r\n errors.push(`Font family may be missing: ${font}`);\r\n }\r\n }\r\n\r\n // Count tokens\r\n const tokensCount = countTokenExports(sourceContent);\r\n\r\n // Check if target already exists and has same content\r\n let changed = true;\r\n if (existsSync(targetFile)) {\r\n try {\r\n const existingContent = readFileSync(targetFile, 'utf-8');\r\n if (existingContent === tsContent) {\r\n changed = false;\r\n if (verbose) {\r\n console.info('✅ Target file is already up to date');\r\n }\r\n }\r\n } catch {\r\n // Ignore read errors, will overwrite\r\n }\r\n }\r\n\r\n // Write target file if changed\r\n if (changed && !dryRun) {\r\n try {\r\n // Ensure target directory exists\r\n const targetDir = dirname(targetFile);\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n writeFileSync(targetFile, tsContent, 'utf-8');\r\n } catch (err) {\r\n const error = `Failed to write target file: ${err instanceof Error ? err.message : 'Unknown error'}`;\r\n if (verbose) {\r\n console.error(`❌ ${error}`);\r\n }\r\n return {\r\n success: false,\r\n tokensCount,\r\n changed: false,\r\n errors: [error],\r\n };\r\n }\r\n }\r\n\r\n if (verbose) {\r\n if (changed) {\r\n console.info('✅ Successfully synced tokens');\r\n }\r\n console.info(` Tokens exported: ${tokensCount}`);\r\n if (fontFamilies.found.length > 0) {\r\n console.info(` Font families found: ${fontFamilies.found.join(', ')}`);\r\n }\r\n if (fontFamilies.missing.length > 0) {\r\n console.warn(` ⚠️ Missing fonts: ${fontFamilies.missing.join(', ')}`);\r\n }\r\n }\r\n\r\n return {\r\n success: errors.length === 0 || errors.every((e) => e.includes('Font family')),\r\n tokensCount,\r\n changed,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token sync\r\n * @param tokensDir - The tokens package directory\r\n * @param customPaths - Optional custom paths for source and target files\r\n */\r\nexport function syncTokensCLI(\r\n tokensDir: string,\r\n customPaths?: { syncSource?: string; syncTarget?: string }\r\n): boolean {\r\n // Use custom paths if provided, otherwise use defaults\r\n const sourceFile = customPaths?.syncSource\r\n ? join(tokensDir, customPaths.syncSource)\r\n : join(tokensDir, DEFAULT_SOURCE_RELATIVE);\r\n const targetFile = customPaths?.syncTarget\r\n ? join(tokensDir, customPaths.syncTarget)\r\n : join(tokensDir, DEFAULT_TARGET_RELATIVE);\r\n\r\n const result = syncTokens({\r\n sourceFile,\r\n targetFile,\r\n verbose: true,\r\n });\r\n\r\n // Report errors (non-critical ones like missing fonts)\r\n if (result.errors) {\r\n for (const error of result.errors) {\r\n if (error.includes('Font family')) {\r\n console.warn(`⚠️ ${error}`);\r\n } else {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @fileoverview Token cache management for incremental builds\r\n * Provides hash-based change detection and cache storage\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { createHash } from 'node:crypto';\r\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\r\nimport { join, relative } from 'node:path';\r\n\r\n/**\r\n * Cache entry for a single token file\r\n */\r\nexport interface CacheEntry {\r\n /** SHA-256 hash of file content */\r\n hash: string;\r\n /** Last modification time */\r\n mtime: Date;\r\n /** Generated output files */\r\n outputs: string[];\r\n}\r\n\r\n/**\r\n * Token cache structure\r\n */\r\nexport interface TokenCache {\r\n /** Cache format version */\r\n version: string;\r\n /** Cache creation timestamp */\r\n timestamp: Date;\r\n /** Cached file entries */\r\n files: Record<string, CacheEntry>;\r\n}\r\n\r\n/**\r\n * Cache configuration\r\n */\r\nexport interface CacheConfig {\r\n /** Cache directory path */\r\n cacheDir?: string;\r\n /** Enable/disable caching */\r\n enabled?: boolean;\r\n /** Cache file name */\r\n cacheFile?: string;\r\n}\r\n\r\n/**\r\n * Cache storage service for token builds\r\n */\r\nexport class CacheService {\r\n private readonly cacheDir: string;\r\n private readonly cacheFile: string;\r\n private readonly enabled: boolean;\r\n private cache: TokenCache | null = null;\r\n\r\n constructor(config: CacheConfig = {}) {\r\n this.cacheDir = config.cacheDir ?? '.dsai-cache';\r\n this.cacheFile = config.cacheFile ?? 'tokens.json';\r\n this.enabled = config.enabled ?? true;\r\n }\r\n\r\n /**\r\n * Get full path to cache file\r\n */\r\n private getCachePath(): string {\r\n return join(this.cacheDir, this.cacheFile);\r\n }\r\n\r\n /**\r\n * Ensure cache directory exists\r\n */\r\n private ensureCacheDir(): void {\r\n if (!existsSync(this.cacheDir)) {\r\n mkdirSync(this.cacheDir, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Calculate SHA-256 hash of file content\r\n */\r\n static hashFile(filePath: string): string {\r\n const content = readFileSync(filePath, 'utf-8');\r\n return createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Calculate hash of string content\r\n */\r\n static hashContent(content: string): string {\r\n return createHash('sha256').update(content).digest('hex');\r\n }\r\n\r\n /**\r\n * Load cache from disk\r\n */\r\n loadCache(): TokenCache {\r\n if (!this.enabled) {\r\n return this.createEmptyCache();\r\n }\r\n\r\n if (this.cache) {\r\n return this.cache;\r\n }\r\n\r\n const cachePath = this.getCachePath();\r\n\r\n if (!existsSync(cachePath)) {\r\n this.cache = this.createEmptyCache();\r\n return this.cache;\r\n }\r\n\r\n try {\r\n const content = readFileSync(cachePath, 'utf-8');\r\n const parsed = JSON.parse(content) as TokenCache;\r\n\r\n // Convert date strings back to Date objects\r\n this.cache = {\r\n ...parsed,\r\n timestamp: new Date(parsed.timestamp),\r\n files: Object.fromEntries(\r\n Object.entries(parsed.files).map(([path, entry]) => [\r\n path,\r\n { ...entry, mtime: new Date(entry.mtime) },\r\n ])\r\n ),\r\n };\r\n\r\n return this.cache;\r\n } catch {\r\n // Invalid cache, start fresh\r\n this.cache = this.createEmptyCache();\r\n return this.cache;\r\n }\r\n }\r\n\r\n /**\r\n * Save cache to disk\r\n */\r\n saveCache(cache: TokenCache): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n this.ensureCacheDir();\r\n const cachePath = this.getCachePath();\r\n\r\n try {\r\n const content = JSON.stringify(cache, null, 2);\r\n writeFileSync(cachePath, content, 'utf-8');\r\n this.cache = cache;\r\n } catch (error) {\r\n console.warn(\r\n `Failed to save cache: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Create empty cache structure\r\n */\r\n private createEmptyCache(): TokenCache {\r\n return {\r\n version: '1.0.0',\r\n timestamp: new Date(),\r\n files: {},\r\n };\r\n }\r\n\r\n /**\r\n * Check if a file has changed since last cache\r\n */\r\n hasFileChanged(filePath: string, baseDir: string): boolean {\r\n if (!this.enabled) {\r\n return true; // Always rebuild if caching disabled\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n // File not in cache = changed\r\n const entry = Reflect.get(cache.files, relativePath) as CacheEntry | undefined;\r\n if (!entry) {\r\n return true;\r\n }\r\n\r\n // Check if file still exists\r\n if (!existsSync(filePath)) {\r\n return true;\r\n }\r\n\r\n const currentHash = CacheService.hashFile(filePath);\r\n\r\n // Hash mismatch = changed\r\n if (entry.hash !== currentHash) {\r\n return true;\r\n }\r\n\r\n // Check mtime as fast path (but hash is source of truth)\r\n const stats = statSync(filePath);\r\n const currentMtime = stats.mtime;\r\n\r\n return currentMtime.getTime() !== new Date(entry.mtime).getTime();\r\n }\r\n\r\n /**\r\n * Get list of changed files in a directory\r\n */\r\n getChangedFiles(directory: string, pattern = '**/*.json'): string[] {\r\n if (!this.enabled) {\r\n // Return all files if caching disabled\r\n return this.getAllFiles(directory, pattern);\r\n }\r\n\r\n const allFiles = this.getAllFiles(directory, pattern);\r\n const changedFiles: string[] = [];\r\n\r\n for (const file of allFiles) {\r\n if (this.hasFileChanged(file, directory)) {\r\n changedFiles.push(file);\r\n }\r\n }\r\n\r\n return changedFiles;\r\n }\r\n\r\n /**\r\n * Get all files matching pattern\r\n */\r\n private getAllFiles(directory: string, pattern: string): string[] {\r\n const files: string[] = [];\r\n\r\n const scan = (dir: string): void => {\r\n if (!existsSync(dir)) {\r\n return;\r\n }\r\n\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n scan(fullPath);\r\n } else if (entry.isFile()) {\r\n // Get relative path for pattern matching\r\n const relativePath = relative(directory, fullPath);\r\n if (this.matchesPattern(relativePath, pattern)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n };\r\n\r\n scan(directory);\r\n return files;\r\n }\r\n\r\n /**\r\n * Simple pattern matching for file globs\r\n * Supports: *.json, **\\/*.json, *.tokens.json\r\n */\r\n private matchesPattern(filename: string, pattern: string): boolean {\r\n // Simple cases\r\n if (pattern === '*' || pattern === '**/*') {\r\n return true;\r\n }\r\n\r\n if (pattern === '*.*') {\r\n return filename.includes('.');\r\n }\r\n\r\n // Handle **.ext patterns\r\n if (pattern.startsWith('**/*.')) {\r\n const ext = pattern.substring(4); // Remove **/*\r\n return filename.endsWith(ext);\r\n }\r\n\r\n // Handle *.ext patterns\r\n if (pattern.startsWith('*.')) {\r\n const ext = pattern.substring(1); // Remove *\r\n return filename.endsWith(ext);\r\n }\r\n\r\n // Convert glob pattern to regex for complex patterns\r\n /* eslint-disable security/detect-non-literal-regexp */\r\n const regexPattern = pattern\r\n .replace(/\\*\\*/g, '.*')\r\n .replace(/\\*/g, '[^/]*')\r\n .replace(/\\./g, '\\\\.');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(filename);\r\n /* eslint-enable security/detect-non-literal-regexp */\r\n }\r\n\r\n /**\r\n * Update cache entry for a file\r\n */\r\n updateCacheEntry(filePath: string, baseDir: string, outputs: string[] = []): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n if (!existsSync(filePath)) {\r\n return;\r\n }\r\n\r\n const hash = CacheService.hashFile(filePath);\r\n const stats = statSync(filePath);\r\n\r\n Object.defineProperty(cache.files, relativePath, {\r\n value: {\r\n hash,\r\n mtime: stats.mtime,\r\n outputs,\r\n },\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Update multiple cache entries at once\r\n */\r\n updateCacheEntries(\r\n entries: Array<{ filePath: string; outputs?: string[] }>,\r\n baseDir: string\r\n ): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n\r\n for (const entry of entries) {\r\n const relativePath = relative(baseDir, entry.filePath);\r\n\r\n if (!existsSync(entry.filePath)) {\r\n continue;\r\n }\r\n\r\n const hash = CacheService.hashFile(entry.filePath);\r\n const stats = statSync(entry.filePath);\r\n\r\n Object.defineProperty(cache.files, relativePath, {\r\n value: {\r\n hash,\r\n mtime: stats.mtime,\r\n outputs: entry.outputs ?? [],\r\n },\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Clear cache entry for a file\r\n */\r\n clearCacheEntry(filePath: string, baseDir: string): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n const cache = this.loadCache();\r\n const relativePath = relative(baseDir, filePath);\r\n\r\n // Safe deletion using Map-like operation\r\n const { [relativePath]: _removed, ...remainingFiles } = cache.files;\r\n cache.files = remainingFiles;\r\n\r\n cache.timestamp = new Date();\r\n this.saveCache(cache);\r\n }\r\n\r\n /**\r\n * Clear entire cache\r\n */\r\n clearCache(): void {\r\n this.cache = this.createEmptyCache();\r\n\r\n if (this.enabled) {\r\n const cachePath = this.getCachePath();\r\n if (existsSync(cachePath)) {\r\n try {\r\n writeFileSync(cachePath, JSON.stringify(this.cache, null, 2), 'utf-8');\r\n } catch {\r\n // Ignore write errors during clear\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n getCacheStats(): {\r\n enabled: boolean;\r\n fileCount: number;\r\n cacheSize: number;\r\n oldestEntry: Date | null;\r\n newestEntry: Date | null;\r\n } {\r\n const cache = this.loadCache();\r\n const entries = Object.values(cache.files);\r\n\r\n let oldestEntry: Date | null = null;\r\n let newestEntry: Date | null = null;\r\n\r\n for (const entry of entries) {\r\n const mtime = new Date(entry.mtime);\r\n if (!oldestEntry || mtime < oldestEntry) {\r\n oldestEntry = mtime;\r\n }\r\n if (!newestEntry || mtime > newestEntry) {\r\n newestEntry = mtime;\r\n }\r\n }\r\n\r\n let cacheSize = 0;\r\n const cachePath = this.getCachePath();\r\n if (existsSync(cachePath)) {\r\n cacheSize = statSync(cachePath).size;\r\n }\r\n\r\n return {\r\n enabled: this.enabled,\r\n fileCount: entries.length,\r\n cacheSize,\r\n oldestEntry,\r\n newestEntry,\r\n };\r\n }\r\n\r\n /**\r\n * Check if cache is enabled\r\n */\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n /**\r\n * Get cache directory path\r\n */\r\n getCacheDir(): string {\r\n return this.cacheDir;\r\n }\r\n}\r\n","/**\r\n * Incremental Build System\r\n *\r\n * Provides intelligent change detection and incremental processing for token builds.\r\n * Only transforms and processes tokens that have changed since the last build.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { basename, join, relative } from 'node:path';\r\n\r\nimport type { CacheService } from './cache.js';\r\nimport type { TransformOptions } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for incremental builds\r\n */\r\nexport interface IncrementalOptions {\r\n /** Whether incremental mode is enabled */\r\n enabled: boolean;\r\n /** Force full rebuild (ignores cache) */\r\n force?: boolean;\r\n /** Cache service instance */\r\n cacheService?: CacheService;\r\n /** Verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Result of incremental analysis\r\n */\r\nexport interface IncrementalAnalysis {\r\n /** Whether a full build is required */\r\n needsFullBuild: boolean;\r\n /** Files that have changed since last build */\r\n changedFiles: string[];\r\n /** Files that can be skipped */\r\n unchangedFiles: string[];\r\n /** Reason for full build (if needed) */\r\n fullBuildReason?: string;\r\n /** Total files analyzed */\r\n totalFiles: number;\r\n}\r\n\r\n/**\r\n * Collection dependency information\r\n */\r\ninterface CollectionDependency {\r\n /** Collection name */\r\n name: string;\r\n /** Input file path */\r\n inputFile: string;\r\n /** Output file paths */\r\n outputFiles: string[];\r\n /** Collections that depend on this one */\r\n dependents: string[];\r\n /** Collections this one depends on */\r\n dependencies: string[];\r\n}\r\n\r\n/**\r\n * Dependency graph for collections\r\n */\r\ninterface DependencyGraph {\r\n /** Map of collection name to dependency info */\r\n collections: Map<string, CollectionDependency>;\r\n /** Collections in topological order */\r\n buildOrder: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Incremental Analysis\r\n// ============================================================================\r\n\r\n/**\r\n * Analyze files to determine what needs to be rebuilt\r\n */\r\nexport async function analyzeChanges(\r\n sourceDir: string,\r\n options: IncrementalOptions\r\n): Promise<IncrementalAnalysis> {\r\n const { enabled, force, cacheService, verbose } = options;\r\n\r\n // If not enabled or force build, do full build\r\n if (!enabled || force) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: force ? 'Force rebuild requested' : 'Incremental mode disabled',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // If no cache service, do full build\r\n if (!cacheService) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No cache service available',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Load cache\r\n const cache = await cacheService.loadCache();\r\n\r\n // If no cache exists, do full build\r\n if (!cache || Object.keys(cache.files).length === 0) {\r\n if (verbose) {\r\n console.info(' ℹ️ No cache found, performing full build');\r\n }\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No cache available',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Get all source files\r\n const sourceFiles = await getSourceFiles(sourceDir);\r\n\r\n if (sourceFiles.length === 0) {\r\n return {\r\n needsFullBuild: true,\r\n changedFiles: [],\r\n unchangedFiles: [],\r\n fullBuildReason: 'No source files found',\r\n totalFiles: 0,\r\n };\r\n }\r\n\r\n // Check which files have changed\r\n const changedFiles: string[] = [];\r\n const unchangedFiles: string[] = [];\r\n\r\n for (const file of sourceFiles) {\r\n const hasChanged = cacheService.hasFileChanged(file, sourceDir);\r\n\r\n if (hasChanged) {\r\n changedFiles.push(file);\r\n } else {\r\n unchangedFiles.push(file);\r\n }\r\n }\r\n\r\n const totalFiles = sourceFiles.length;\r\n const changePercentage = (changedFiles.length / totalFiles) * 100;\r\n\r\n if (verbose && changedFiles.length > 0) {\r\n console.info(\r\n ` 📊 Analysis: ${changedFiles.length}/${totalFiles} files changed (${changePercentage.toFixed(1)}%)`\r\n );\r\n }\r\n\r\n // If more than 50% of files changed, do full build\r\n // This is more efficient than selective processing\r\n if (changePercentage > 50) {\r\n if (verbose) {\r\n console.info(' ℹ️ >50% files changed, performing full build for efficiency');\r\n }\r\n return {\r\n needsFullBuild: true,\r\n changedFiles,\r\n unchangedFiles,\r\n fullBuildReason: 'Too many files changed (>50%)',\r\n totalFiles,\r\n };\r\n }\r\n\r\n // If no files changed, skip build entirely\r\n if (changedFiles.length === 0) {\r\n if (verbose) {\r\n console.info(' ✅ No changes detected, skipping build');\r\n }\r\n return {\r\n needsFullBuild: false,\r\n changedFiles: [],\r\n unchangedFiles,\r\n fullBuildReason: undefined,\r\n totalFiles,\r\n };\r\n }\r\n\r\n // Incremental build is possible\r\n return {\r\n needsFullBuild: false,\r\n changedFiles,\r\n unchangedFiles,\r\n totalFiles,\r\n };\r\n}\r\n\r\n/**\r\n * Get all source files in directory\r\n */\r\nasync function getSourceFiles(sourceDir: string): Promise<string[]> {\r\n if (!existsSync(sourceDir)) {\r\n return [];\r\n }\r\n\r\n const fs = await import('node:fs/promises');\r\n const files: string[] = [];\r\n\r\n try {\r\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (entry.isFile() && entry.name.endsWith('.json')) {\r\n files.push(join(sourceDir, entry.name));\r\n }\r\n }\r\n } catch (error) {\r\n console.error(\r\n `Error reading source directory: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Dependency Graph\r\n// ============================================================================\r\n\r\n/**\r\n * Build dependency graph for collections\r\n *\r\n * Currently returns empty graph as collections are independent.\r\n * This can be extended to support collection dependencies in the future.\r\n */\r\nexport function buildDependencyGraph(\r\n collections: Array<{ name: string; inputFile: string; outputFiles: string[] }>\r\n): DependencyGraph {\r\n const graph: DependencyGraph = {\r\n collections: new Map(),\r\n buildOrder: [],\r\n };\r\n\r\n // Add all collections\r\n for (const collection of collections) {\r\n graph.collections.set(collection.name, {\r\n name: collection.name,\r\n inputFile: collection.inputFile,\r\n outputFiles: collection.outputFiles,\r\n dependents: [],\r\n dependencies: [],\r\n });\r\n graph.buildOrder.push(collection.name);\r\n }\r\n\r\n // TODO: Add dependency detection logic\r\n // For now, collections are processed independently in the order they're defined\r\n\r\n return graph;\r\n}\r\n\r\n/**\r\n * Get collections that need to be rebuilt based on changed files\r\n */\r\nexport function getAffectedCollections(\r\n changedFiles: string[],\r\n collections: Array<{ name: string; inputFile: string }>,\r\n dependencyGraph: DependencyGraph\r\n): string[] {\r\n const affected = new Set<string>();\r\n\r\n // Find directly affected collections\r\n for (const file of changedFiles) {\r\n const fileName = basename(file);\r\n\r\n for (const collection of collections) {\r\n const collectionFile = basename(collection.inputFile);\r\n\r\n if (collectionFile === fileName) {\r\n affected.add(collection.name);\r\n\r\n // Add dependent collections\r\n const deps = dependencyGraph.collections.get(collection.name);\r\n if (deps) {\r\n for (const dependent of deps.dependents) {\r\n affected.add(dependent);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Array.from(affected);\r\n}\r\n\r\n// ============================================================================\r\n// Incremental Transform\r\n// ============================================================================\r\n\r\n/**\r\n * Filter transform options to only process changed collections\r\n * Returns both the options and list of affected collections\r\n */\r\nexport function filterTransformForIncremental(\r\n options: TransformOptions,\r\n analysis: IncrementalAnalysis,\r\n collections: Array<{ name: string; inputFile: string }>\r\n): { options: TransformOptions; affectedCollections: string[] } {\r\n // If full build needed, return original options\r\n if (analysis.needsFullBuild) {\r\n return { options, affectedCollections: [] };\r\n }\r\n\r\n // If no changes, return options that will skip processing\r\n if (analysis.changedFiles.length === 0) {\r\n return {\r\n options: {\r\n ...options,\r\n sourceDir: '',\r\n },\r\n affectedCollections: [],\r\n };\r\n }\r\n\r\n // Build dependency graph\r\n const graph = buildDependencyGraph(\r\n collections.map((c) => ({\r\n name: c.name,\r\n inputFile: c.inputFile,\r\n outputFiles: [], // Will be populated after transform\r\n }))\r\n );\r\n\r\n // Get affected collections\r\n const affectedCollections = getAffectedCollections(analysis.changedFiles, collections, graph);\r\n\r\n if (options.verbose) {\r\n console.info(\r\n ` 🎯 Incremental: processing ${affectedCollections.length}/${collections.length} collections`\r\n );\r\n for (const name of affectedCollections) {\r\n console.info(` - ${name}`);\r\n }\r\n }\r\n\r\n // Return original options and affected collections list\r\n return { options, affectedCollections };\r\n}\r\n\r\n/**\r\n * Check if a collection should be processed in incremental mode\r\n */\r\nexport function shouldProcessCollection(\r\n collectionName: string,\r\n affectedCollections?: string[]\r\n): boolean {\r\n // If no incremental filter, process all\r\n if (!affectedCollections || affectedCollections.length === 0) {\r\n return true;\r\n }\r\n\r\n // Check if in affected list\r\n return affectedCollections.includes(collectionName);\r\n}\r\n\r\n// ============================================================================\r\n// Cache Updates\r\n// ============================================================================\r\n\r\n/**\r\n * Update cache after successful incremental build\r\n */\r\nexport async function updateCacheAfterBuild(\r\n cacheService: CacheService | undefined,\r\n sourceFiles: string[],\r\n outputFiles: string[],\r\n sourceDir: string,\r\n collectionsDir: string,\r\n verbose: boolean\r\n): Promise<void> {\r\n if (!cacheService) {\r\n return;\r\n }\r\n\r\n const updates: Array<{ filePath: string; relativePath: string; outputs: string[] }> = [];\r\n\r\n // Update source file cache entries\r\n for (const sourceFile of sourceFiles) {\r\n const relativePath = relative(sourceDir, sourceFile);\r\n\r\n // Find corresponding output files\r\n const sourceBaseName = basename(sourceFile, '.json');\r\n const relatedOutputs = outputFiles.filter((f) => {\r\n const outputBaseName = basename(f, '.json');\r\n return outputBaseName.includes(sourceBaseName);\r\n });\r\n\r\n updates.push({\r\n filePath: sourceFile,\r\n relativePath,\r\n outputs: relatedOutputs.map((f) => relative(collectionsDir, f)),\r\n });\r\n }\r\n\r\n // Batch update cache\r\n await cacheService.updateCacheEntries(\r\n updates.map((u) => ({\r\n filePath: u.filePath,\r\n outputs: u.outputs,\r\n })),\r\n sourceDir\r\n );\r\n\r\n if (verbose) {\r\n console.info(` 💾 Cache updated: ${updates.length} entries`);\r\n }\r\n}\r\n\r\n/**\r\n * Generate incremental build report\r\n */\r\nexport function generateIncrementalReport(\r\n analysis: IncrementalAnalysis,\r\n startTime: number,\r\n collectionsProcessed: number,\r\n totalCollections: number\r\n): string {\r\n const duration = Date.now() - startTime;\r\n const lines: string[] = [];\r\n\r\n lines.push('\\n📊 Incremental Build Report');\r\n lines.push('─'.repeat(50));\r\n\r\n if (analysis.needsFullBuild) {\r\n lines.push(`Reason: ${analysis.fullBuildReason}`);\r\n lines.push(`Duration: ${duration}ms`);\r\n } else if (analysis.changedFiles.length === 0) {\r\n lines.push('Result: No changes detected');\r\n lines.push(`Duration: ${duration}ms`);\r\n lines.push(`Time saved: ~${duration}ms (100%)`);\r\n } else {\r\n const savedCollections = totalCollections - collectionsProcessed;\r\n const savedPercentage = ((savedCollections / totalCollections) * 100).toFixed(1);\r\n\r\n lines.push(`Files analyzed: ${analysis.totalFiles}`);\r\n lines.push(`Files changed: ${analysis.changedFiles.length}`);\r\n lines.push(`Files unchanged: ${analysis.unchangedFiles.length}`);\r\n lines.push(`Collections processed: ${collectionsProcessed}/${totalCollections}`);\r\n lines.push(`Collections skipped: ${savedCollections} (${savedPercentage}%)`);\r\n lines.push(`Duration: ${duration}ms`);\r\n }\r\n\r\n lines.push('─'.repeat(50));\r\n\r\n return lines.join('\\n');\r\n}\r\n","/**\r\n * Mode Extractor Module\r\n *\r\n * Extracts specific modes from nested Figma token structures.\r\n * Handles the conversion from Figma's nested mode structure to flat token files.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/mode-extractor\r\n */\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Mode extraction options\r\n */\r\nexport interface ModeExtractionOptions {\r\n /** Mode name to extract (e.g., 'Light', 'Dark') */\r\n modeName: string;\r\n /** Path to the modes in the token structure (e.g., ['Foundation', 'modes']) */\r\n modesPath?: string[];\r\n /** Whether to preserve non-mode tokens */\r\n preserveNonModeTokens?: boolean;\r\n}\r\n\r\n/**\r\n * Mode extraction result\r\n */\r\nexport interface ModeExtractionResult {\r\n /** Extracted tokens for the specified mode */\r\n tokens: Record<string, unknown>;\r\n /** Mode name that was extracted */\r\n modeName: string;\r\n /** Whether any tokens were found */\r\n hasTokens: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Deep clone an object\r\n */\r\nfunction deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Get nested value from object using path array\r\n * Uses hasOwn.call() to prevent prototype pollution attacks\r\n */\r\nfunction getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n let current: unknown = obj;\r\n\r\n for (const key of path) {\r\n if (\r\n current &&\r\n typeof current === 'object' &&\r\n !Array.isArray(current) &&\r\n hasOwn.call(current, key)\r\n ) {\r\n current = (current as Record<string, unknown>)[key];\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n return current;\r\n}\r\n\r\n// ============================================================================\r\n// Main Extraction Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Extract a specific mode from token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param options - Extraction options\r\n * @returns Extracted tokens for the specified mode\r\n *\r\n * @example\r\n * ```typescript\r\n * const tokens = {\r\n * Foundation: {\r\n * modes: {\r\n * Light: { colors: { primary: { $value: '#0000ff' } } },\r\n * Dark: { colors: { primary: { $value: '#ffffff' } } }\r\n * }\r\n * }\r\n * };\r\n *\r\n * const result = extractMode(tokens, {\r\n * modeName: 'Light',\r\n * modesPath: ['Foundation', 'modes']\r\n * });\r\n * // result.tokens = { colors: { primary: { $value: '#0000ff' } } }\r\n * ```\r\n */\r\nexport function extractMode(\r\n tokens: Record<string, unknown>,\r\n options: ModeExtractionOptions\r\n): ModeExtractionResult {\r\n const { modeName, modesPath = ['Foundation', 'modes'], preserveNonModeTokens = true } = options;\r\n\r\n // Clone to avoid mutations\r\n const clonedTokens = deepClone(tokens);\r\n\r\n // Get the modes object\r\n const modesObj = getNestedValue(clonedTokens, modesPath);\r\n\r\n if (!modesObj || typeof modesObj !== 'object') {\r\n return {\r\n tokens: preserveNonModeTokens ? clonedTokens : {},\r\n modeName,\r\n hasTokens: Object.keys(clonedTokens).length > 0,\r\n };\r\n }\r\n\r\n // Get the specific mode\r\n const modeTokens = (modesObj as Record<string, unknown>)[modeName];\r\n\r\n if (!modeTokens || typeof modeTokens !== 'object') {\r\n return {\r\n tokens: preserveNonModeTokens ? clonedTokens : {},\r\n modeName,\r\n hasTokens: false,\r\n };\r\n }\r\n\r\n // Build result: preserve structure but replace mode content\r\n const result = preserveNonModeTokens ? deepClone(clonedTokens) : {};\r\n\r\n // Navigate to the modes parent and replace with mode-specific tokens\r\n let current: Record<string, unknown> = result;\r\n for (let i = 0; i < modesPath.length - 1; i++) {\r\n const key = modesPath[i];\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n if (!(key in current)) {\r\n current[key] = {};\r\n }\r\n const next = current[key];\r\n if (next && typeof next === 'object') {\r\n current = next as Record<string, unknown>;\r\n }\r\n }\r\n\r\n // Replace the modes object with the specific mode content\r\n const lastKey = modesPath[modesPath.length - 1];\r\n if (lastKey) {\r\n current[lastKey] = modeTokens;\r\n }\r\n\r\n return {\r\n tokens: result,\r\n modeName,\r\n hasTokens: true,\r\n };\r\n}\r\n\r\n/**\r\n * Extract multiple modes from token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param modeNames - Array of mode names to extract\r\n * @param modesPath - Path to modes in structure\r\n * @returns Map of mode name to extracted tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = extractModes(tokens, ['Light', 'Dark']);\r\n * // results.get('Light') = light mode tokens\r\n * // results.get('Dark') = dark mode tokens\r\n * ```\r\n */\r\nexport function extractModes(\r\n tokens: Record<string, unknown>,\r\n modeNames: string[],\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): Map<string, ModeExtractionResult> {\r\n const results = new Map<string, ModeExtractionResult>();\r\n\r\n for (const modeName of modeNames) {\r\n const result = extractMode(tokens, { modeName, modesPath });\r\n results.set(modeName, result);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Auto-detect available modes in token structure\r\n *\r\n * @param tokens - Source token object\r\n * @param modesPath - Path to modes in structure\r\n * @returns Array of detected mode names\r\n *\r\n * @example\r\n * ```typescript\r\n * const modes = detectModes(tokens);\r\n * // modes = ['Light', 'Dark']\r\n * ```\r\n */\r\nexport function detectModes(\r\n tokens: Record<string, unknown>,\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): string[] {\r\n const modesObj = getNestedValue(tokens, modesPath);\r\n\r\n if (!modesObj || typeof modesObj !== 'object') {\r\n return [];\r\n }\r\n\r\n const modes: string[] = [];\r\n for (const [key, value] of Object.entries(modesObj as Record<string, unknown>)) {\r\n if (value && typeof value === 'object') {\r\n modes.push(key);\r\n }\r\n }\r\n\r\n return modes;\r\n}\r\n\r\n/**\r\n * Flatten mode structure by hoisting mode tokens to top level\r\n *\r\n * Useful when you want to completely flatten the structure instead of preserving nesting\r\n *\r\n * @param tokens - Source token object\r\n * @param modeName - Mode to extract\r\n * @param modesPath - Path to modes\r\n * @returns Flattened token structure\r\n *\r\n * @example\r\n * ```typescript\r\n * const flattened = flattenModeStructure(tokens, 'Light');\r\n * // { colors: { primary: { $value: '#0000ff' } } }\r\n * ```\r\n */\r\nexport function flattenModeStructure(\r\n tokens: Record<string, unknown>,\r\n modeName: string,\r\n modesPath: string[] = ['Foundation', 'modes']\r\n): Record<string, unknown> {\r\n const result = extractMode(tokens, {\r\n modeName,\r\n modesPath,\r\n preserveNonModeTokens: false,\r\n });\r\n\r\n // Get just the mode content\r\n const modesObj = getNestedValue(result.tokens, modesPath);\r\n\r\n if (modesObj && typeof modesObj === 'object') {\r\n return modesObj as Record<string, unknown>;\r\n }\r\n\r\n return result.tokens;\r\n}\r\n","/**\r\n * Mode Preprocessor Module\r\n *\r\n * Preprocesses token files by extracting mode-specific tokens into separate files.\r\n * This allows theme builders to work with mode-specific token sets.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/mode-preprocessor\r\n */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { join, parse } from 'node:path';\r\n\r\nimport { detectModes, extractMode } from './mode-extractor.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocessor configuration\r\n */\r\nexport interface PreprocessorConfig {\r\n /** Source directory containing original token files */\r\n sourceDir: string;\r\n /** Output directory for preprocessed files */\r\n outputDir: string;\r\n /** Files to preprocess (glob patterns or file paths) */\r\n files: string[];\r\n /** Mode names to extract (auto-detected if not provided) */\r\n modes?: string[];\r\n /** Path to modes in token structure */\r\n modesPath?: string[];\r\n /** Whether to preserve original files */\r\n preserveOriginals?: boolean;\r\n /** Whether to clean output directory before processing */\r\n clean?: boolean;\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Preprocessing result for a single file\r\n */\r\nexport interface FilePreprocessingResult {\r\n /** Original file path */\r\n sourceFile: string;\r\n /** Detected or configured modes */\r\n modes: string[];\r\n /** Generated output files by mode */\r\n outputFiles: Map<string, string>;\r\n /** Whether preprocessing succeeded */\r\n success: boolean;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Overall preprocessing result\r\n */\r\nexport interface PreprocessingResult {\r\n /** Results for each processed file */\r\n files: FilePreprocessingResult[];\r\n /** Total files processed */\r\n totalFiles: number;\r\n /** Number of successful preprocessings */\r\n successCount: number;\r\n /** Number of failed preprocessings */\r\n failureCount: number;\r\n /** Output directory used */\r\n outputDir: string;\r\n /** Cleanup function to remove preprocessed files */\r\n cleanup: () => void;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Generate output filename for a mode\r\n */\r\nfunction generateModeFilename(\r\n originalFilename: string,\r\n modeName: string,\r\n isDefault: boolean\r\n): string {\r\n const parsed = parse(originalFilename);\r\n\r\n // Default mode keeps original name, others get suffix\r\n if (isDefault) {\r\n return originalFilename;\r\n }\r\n\r\n const suffix = modeName.toLowerCase();\r\n return `${parsed.name}-${suffix}${parsed.ext}`;\r\n}\r\n\r\n/**\r\n * Read and parse JSON file\r\n */\r\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\r\n try {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const content = readFileSync(filePath, 'utf-8');\r\n return JSON.parse(content) as Record<string, unknown>;\r\n } catch (error) {\r\n console.error(`Failed to read ${filePath}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Write JSON file with formatting\r\n */\r\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): boolean {\r\n try {\r\n const content = JSON.stringify(data, null, 2);\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n writeFileSync(filePath, content, 'utf-8');\r\n return true;\r\n } catch (error) {\r\n console.error(`Failed to write ${filePath}:`, error);\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Main Preprocessing Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocess a single token file\r\n *\r\n * @param filePath - Path to the token file\r\n * @param config - Preprocessor configuration\r\n * @returns Preprocessing result\r\n */\r\nexport function preprocessFile(\r\n filePath: string,\r\n config: PreprocessorConfig\r\n): FilePreprocessingResult {\r\n const { outputDir, modes: configuredModes, modesPath, verbose } = config;\r\n\r\n const result: FilePreprocessingResult = {\r\n sourceFile: filePath,\r\n modes: [],\r\n outputFiles: new Map(),\r\n success: false,\r\n };\r\n\r\n // Read source file\r\n const tokens = readJsonFile(filePath);\r\n if (!tokens) {\r\n result.error = 'Failed to read source file';\r\n return result;\r\n }\r\n\r\n // Detect or use configured modes\r\n const modes = configuredModes ?? detectModes(tokens, modesPath);\r\n result.modes = modes;\r\n\r\n if (modes.length === 0) {\r\n if (verbose) {\r\n console.warn(` ⚠️ No modes detected in ${filePath}`);\r\n }\r\n result.error = 'No modes detected';\r\n return result;\r\n }\r\n\r\n // Extract each mode to a separate file\r\n const filename = parse(filePath).base;\r\n let successCount = 0;\r\n\r\n for (let i = 0; i < modes.length; i++) {\r\n const modeName = modes[i];\r\n if (!modeName) {\r\n continue;\r\n }\r\n\r\n const isDefault = i === 0; // First mode is default\r\n\r\n // Extract mode\r\n const extracted = extractMode(tokens, {\r\n modeName,\r\n modesPath,\r\n preserveNonModeTokens: true,\r\n });\r\n\r\n if (!extracted.hasTokens) {\r\n if (verbose) {\r\n console.warn(` ⚠️ No tokens found for mode \"${modeName}\" in ${filename}`);\r\n }\r\n continue;\r\n }\r\n\r\n // Generate output filename\r\n const outputFilename = generateModeFilename(filename, modeName, isDefault);\r\n const outputPath = join(outputDir, outputFilename);\r\n\r\n // Write preprocessed file\r\n if (writeJsonFile(outputPath, extracted.tokens)) {\r\n result.outputFiles.set(modeName, outputPath);\r\n successCount++;\r\n\r\n if (verbose) {\r\n console.warn(` ✅ Extracted \"${modeName}\" → ${outputFilename}`);\r\n }\r\n } else if (verbose) {\r\n console.error(` ❌ Failed to write \"${modeName}\" → ${outputFilename}`);\r\n }\r\n }\r\n\r\n result.success = successCount > 0;\r\n return result;\r\n}\r\n\r\n/**\r\n * Preprocess all token files\r\n *\r\n * @param config - Preprocessor configuration\r\n * @returns Overall preprocessing result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = preprocessTokenFiles({\r\n * sourceDir: './src/figma-exports',\r\n * outputDir: './src/.preprocessed',\r\n * files: ['foundation.json', 'semantic.json'],\r\n * modes: ['Light', 'Dark'],\r\n * clean: true,\r\n * });\r\n *\r\n * // Build tokens using preprocessed files...\r\n *\r\n * // Cleanup when done\r\n * result.cleanup();\r\n * ```\r\n */\r\nexport function preprocessTokenFiles(config: PreprocessorConfig): PreprocessingResult {\r\n const { sourceDir, outputDir, files, clean = true, verbose = false } = config;\r\n\r\n if (verbose) {\r\n console.warn(`\\n🔧 Preprocessing token files...`);\r\n console.warn(` Source: ${sourceDir}`);\r\n console.warn(` Output: ${outputDir}`);\r\n }\r\n\r\n // Clean output directory if requested\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (clean && existsSync(outputDir)) {\r\n rmSync(outputDir, { recursive: true, force: true });\r\n if (verbose) {\r\n console.warn(` 🧹 Cleaned output directory`);\r\n }\r\n }\r\n\r\n // Create output directory\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(outputDir)) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Process each file\r\n const results: FilePreprocessingResult[] = [];\r\n let successCount = 0;\r\n let failureCount = 0;\r\n\r\n for (const file of files) {\r\n const filePath = join(sourceDir, file);\r\n\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(filePath)) {\r\n if (verbose) {\r\n console.warn(` ⚠️ File not found: ${file}`);\r\n }\r\n results.push({\r\n sourceFile: filePath,\r\n modes: [],\r\n outputFiles: new Map(),\r\n success: false,\r\n error: 'File not found',\r\n });\r\n failureCount++;\r\n continue;\r\n }\r\n\r\n if (verbose) {\r\n console.warn(`\\n 📄 Processing ${file}...`);\r\n }\r\n\r\n const result = preprocessFile(filePath, config);\r\n results.push(result);\r\n\r\n if (result.success) {\r\n successCount++;\r\n } else {\r\n failureCount++;\r\n }\r\n }\r\n\r\n // Summary\r\n if (verbose) {\r\n console.warn(`\\n📊 Preprocessing Summary:`);\r\n console.warn(` Total: ${files.length}`);\r\n console.warn(` Success: ${successCount}`);\r\n console.warn(` Failed: ${failureCount}`);\r\n }\r\n\r\n // Create cleanup function\r\n const cleanup = (): void => {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (existsSync(outputDir)) {\r\n rmSync(outputDir, { recursive: true, force: true });\r\n if (verbose) {\r\n console.warn(`\\n🧹 Cleaned up preprocessed files from ${outputDir}`);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n files: results,\r\n totalFiles: files.length,\r\n successCount,\r\n failureCount,\r\n outputDir,\r\n cleanup,\r\n };\r\n}\r\n\r\n/**\r\n * Get list of preprocessed files for a specific mode\r\n *\r\n * @param result - Preprocessing result\r\n * @param modeName - Mode to get files for\r\n * @returns Array of file paths for the mode\r\n */\r\nexport function getPreprocessedFilesForMode(\r\n result: PreprocessingResult,\r\n modeName: string\r\n): string[] {\r\n const files: string[] = [];\r\n\r\n for (const fileResult of result.files) {\r\n const outputPath = fileResult.outputFiles.get(modeName);\r\n if (fileResult.success && outputPath) {\r\n files.push(outputPath);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n","/**\r\n * @file CSS Post-processing Module\r\n * @description Post-processes CSS files after SASS compilation\r\n *\r\n * This module applies DSAi-specific transformations to compiled CSS:\r\n * - Replaces `data-bs-theme` with `data-dsai-theme` for custom theme attribute\r\n * - Applies configurable text replacements\r\n *\r\n * @module @dsai-io/tools/tokens/postprocess\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { PostprocessOptions, PostprocessResult, ReplacementRule } from './types';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Default CSS distribution directory relative to tokens package */\r\nconst DEFAULT_CSS_DIR = 'dist/css';\r\n\r\n/** Default files to process */\r\nconst DEFAULT_FILES = ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'];\r\n\r\n/** Default transformations to apply */\r\nconst DEFAULT_TRANSFORMATIONS: ReplacementRule[] = [\r\n {\r\n description: 'Theme attribute',\r\n from: /data-bs-theme/g,\r\n to: 'data-dsai-theme',\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// Core Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Apply all replacements to content\r\n */\r\nfunction applyReplacements(\r\n content: string,\r\n replacements: ReplacementRule[],\r\n verbose: boolean\r\n): { result: string; count: number } {\r\n let result = content;\r\n let totalCount = 0;\r\n\r\n for (const rule of replacements) {\r\n // Count matches first\r\n let matchCount = 0;\r\n\r\n if (typeof rule.from === 'string') {\r\n // For string patterns, count occurrences manually\r\n let pos = 0;\r\n const searchStr = rule.from;\r\n while (pos < result.length) {\r\n const idx = result.indexOf(searchStr, pos);\r\n if (idx === -1) {\r\n break;\r\n }\r\n matchCount++;\r\n pos = idx + 1;\r\n }\r\n // Replace all occurrences using split/join (safe, no regex)\r\n if (matchCount > 0) {\r\n result = result.split(rule.from).join(rule.to);\r\n }\r\n } else {\r\n // For regex patterns, use as-is\r\n const matches = result.match(rule.from);\r\n matchCount = matches ? matches.length : 0;\r\n if (matchCount > 0) {\r\n result = result.replace(rule.from, rule.to);\r\n }\r\n }\r\n\r\n if (matchCount > 0) {\r\n totalCount += matchCount;\r\n if (verbose) {\r\n const desc =\r\n rule.description ?? (typeof rule.from === 'string' ? rule.from : String(rule.from));\r\n console.info(` ✓ ${desc}: ${matchCount} replacement(s)`);\r\n }\r\n }\r\n }\r\n\r\n return { result, count: totalCount };\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Post-process a single CSS file\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = postprocessCss({\r\n * inputFile: './dist/css/theme.css',\r\n * replacements: [\r\n * { from: /data-bs-theme/g, to: 'data-dsai-theme', description: 'Theme attribute' }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport function postprocessCss(options: PostprocessOptions): PostprocessResult {\r\n const {\r\n inputFile,\r\n outputFile = inputFile,\r\n replacements = DEFAULT_TRANSFORMATIONS,\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n // Check if input file exists\r\n if (!existsSync(inputFile)) {\r\n return {\r\n success: false,\r\n replacementsMade: 0,\r\n outputFile,\r\n errors: [`File not found: ${inputFile}`],\r\n };\r\n }\r\n\r\n // Read input content\r\n let content: string;\r\n try {\r\n content = readFileSync(inputFile, 'utf-8');\r\n } catch (err) {\r\n return {\r\n success: false,\r\n replacementsMade: 0,\r\n outputFile,\r\n errors: [`Failed to read file: ${err instanceof Error ? err.message : 'Unknown error'}`],\r\n };\r\n }\r\n\r\n // Apply replacements\r\n const { result, count } = applyReplacements(content, replacements, verbose);\r\n\r\n // Write output if changed and not dry run\r\n if (count > 0 && !dryRun) {\r\n try {\r\n writeFileSync(outputFile, result, 'utf-8');\r\n } catch (err) {\r\n return {\r\n success: false,\r\n replacementsMade: count,\r\n outputFile,\r\n errors: [`Failed to write file: ${err instanceof Error ? err.message : 'Unknown error'}`],\r\n };\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n replacementsMade: count,\r\n outputFile,\r\n };\r\n}\r\n\r\n/**\r\n * Post-process multiple CSS files in a directory\r\n *\r\n * @example\r\n * ```typescript\r\n * const results = postprocessCssFiles({\r\n * cssDir: './packages/@dsai-io/tokens/dist/css',\r\n * files: ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'],\r\n * });\r\n * ```\r\n */\r\nexport function postprocessCssFiles(options: {\r\n cssDir: string;\r\n files?: string[];\r\n replacements?: ReplacementRule[];\r\n dryRun?: boolean;\r\n verbose?: boolean;\r\n}): { success: boolean; filesModified: number; totalReplacements: number; errors: string[] } {\r\n const {\r\n cssDir,\r\n files = DEFAULT_FILES,\r\n replacements = DEFAULT_TRANSFORMATIONS,\r\n dryRun = false,\r\n verbose = false,\r\n } = options;\r\n\r\n let filesModified = 0;\r\n let totalReplacements = 0;\r\n const errors: string[] = [];\r\n\r\n if (verbose) {\r\n console.info('🔧 Post-processing CSS files...\\n');\r\n }\r\n\r\n for (const fileName of files) {\r\n const filePath = join(cssDir, fileName);\r\n\r\n if (verbose) {\r\n console.info(`📄 ${fileName}`);\r\n }\r\n\r\n const result = postprocessCss({\r\n inputFile: filePath,\r\n replacements,\r\n dryRun,\r\n verbose,\r\n });\r\n\r\n if (result.success) {\r\n if (result.replacementsMade > 0) {\r\n filesModified++;\r\n totalReplacements += result.replacementsMade;\r\n } else if (verbose) {\r\n console.info(' (no changes needed)');\r\n }\r\n } else if (result.errors) {\r\n errors.push(...result.errors);\r\n if (verbose) {\r\n for (const err of result.errors) {\r\n console.warn(` ⚠️ ${err}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.info(`\\n✅ Post-processing complete. ${filesModified} file(s) modified.`);\r\n if (totalReplacements > 0) {\r\n console.info(` Total replacements: ${totalReplacements}`);\r\n }\r\n }\r\n\r\n return {\r\n success: errors.length === 0,\r\n filesModified,\r\n totalReplacements,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for CSS post-processing\r\n */\r\nexport function postprocessCLI(tokensDir: string): boolean {\r\n const cssDir = join(tokensDir, DEFAULT_CSS_DIR);\r\n\r\n const result = postprocessCssFiles({\r\n cssDir,\r\n verbose: true,\r\n });\r\n\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Get the default CSS distribution directory path\r\n */\r\nexport function getDefaultCssDir(tokensDir: string): string {\r\n return join(tokensDir, DEFAULT_CSS_DIR);\r\n}\r\n\r\n/**\r\n * Get the default files to process\r\n */\r\nexport function getDefaultFiles(): string[] {\r\n return [...DEFAULT_FILES];\r\n}\r\n\r\n/**\r\n * Get the default transformation rules\r\n */\r\nexport function getDefaultTransformations(): ReplacementRule[] {\r\n return [...DEFAULT_TRANSFORMATIONS];\r\n}\r\n","/**\r\n * @fileoverview Token snapshot service for backup and rollback\r\n * Creates snapshots of token collections before transformations\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { createHash } from 'node:crypto';\r\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\r\nimport { basename, dirname, join } from 'node:path';\r\n\r\n/**\r\n * Token snapshot metadata\r\n */\r\nexport interface TokenSnapshot {\r\n /** Unique snapshot ID */\r\n id: string;\r\n /** Timestamp when snapshot was created */\r\n timestamp: Date;\r\n /** Directory that was snapshotted */\r\n collectionsDir: string;\r\n /** Files included in snapshot */\r\n files: TokenSnapshotFile[];\r\n /** Optional description */\r\n description?: string;\r\n}\r\n\r\n/**\r\n * File in a token snapshot\r\n */\r\nexport interface TokenSnapshotFile {\r\n /** Relative path from collections directory */\r\n path: string;\r\n /** File content */\r\n content: string;\r\n /** SHA-256 checksum */\r\n checksum: string;\r\n}\r\n\r\n/**\r\n * Snapshot configuration\r\n */\r\nexport interface SnapshotConfig {\r\n /** Directory to store snapshots */\r\n snapshotDir?: string;\r\n /** Maximum number of snapshots to keep */\r\n maxSnapshots?: number;\r\n /** File patterns to include (glob) */\r\n include?: string[];\r\n /** File patterns to exclude */\r\n exclude?: string[];\r\n}\r\n\r\n/**\r\n * Snapshot result\r\n */\r\nexport interface SnapshotResult {\r\n /** Whether snapshot was successful */\r\n success: boolean;\r\n /** Snapshot metadata */\r\n snapshot?: TokenSnapshot;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Rollback result\r\n */\r\nexport interface RollbackResult {\r\n /** Whether rollback was successful */\r\n success: boolean;\r\n /** Number of files restored */\r\n filesRestored: number;\r\n /** Error message if failed */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Token snapshot service\r\n */\r\nexport class SnapshotService {\r\n private readonly snapshotDir: string;\r\n private readonly maxSnapshots: number;\r\n private readonly include: string[];\r\n private readonly exclude: string[];\r\n\r\n constructor(config: SnapshotConfig = {}) {\r\n this.snapshotDir = config.snapshotDir ?? '.snapshots';\r\n this.maxSnapshots = config.maxSnapshots ?? 10;\r\n this.include = config.include ?? ['**/*.json'];\r\n this.exclude = config.exclude ?? ['**/node_modules/**', '**/.git/**'];\r\n }\r\n\r\n /**\r\n * Create a snapshot of the collections directory\r\n */\r\n createSnapshot(collectionsDir: string, description?: string): SnapshotResult {\r\n try {\r\n // Verify directory exists\r\n if (!existsSync(collectionsDir)) {\r\n return {\r\n success: false,\r\n error: `Collections directory not found: ${collectionsDir}`,\r\n };\r\n }\r\n\r\n // Create snapshot metadata\r\n const snapshot: TokenSnapshot = {\r\n id: this.generateSnapshotId(),\r\n timestamp: new Date(),\r\n collectionsDir,\r\n files: [],\r\n description,\r\n };\r\n\r\n // Scan directory for files\r\n const files = this.scanDirectory(collectionsDir);\r\n if (files.length === 0) {\r\n return {\r\n success: false,\r\n error: 'No files found to snapshot',\r\n };\r\n }\r\n\r\n // Create snapshot files\r\n for (const filePath of files) {\r\n const fullPath = join(collectionsDir, filePath);\r\n const content = readFileSync(fullPath, 'utf-8');\r\n const checksum = this.calculateChecksum(content);\r\n\r\n snapshot.files.push({\r\n path: filePath,\r\n content,\r\n checksum,\r\n });\r\n }\r\n\r\n // Ensure snapshot directory exists\r\n if (!existsSync(this.snapshotDir)) {\r\n mkdirSync(this.snapshotDir, { recursive: true });\r\n }\r\n\r\n // Write snapshot to disk\r\n const snapshotPath = join(this.snapshotDir, `${snapshot.id}.json`);\r\n writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\r\n\r\n // Clean up old snapshots\r\n this.cleanupOldSnapshots();\r\n\r\n return {\r\n success: true,\r\n snapshot,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Rollback to a specific snapshot\r\n */\r\n rollback(snapshotId: string): RollbackResult {\r\n try {\r\n // Load snapshot\r\n const snapshot = this.loadSnapshot(snapshotId);\r\n if (!snapshot) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: `Snapshot not found: ${snapshotId}`,\r\n };\r\n }\r\n\r\n // Validate snapshot\r\n const validationError = this.validateSnapshot(snapshot);\r\n if (validationError) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: validationError,\r\n };\r\n }\r\n\r\n // Ensure target directory exists\r\n if (!existsSync(snapshot.collectionsDir)) {\r\n mkdirSync(snapshot.collectionsDir, { recursive: true });\r\n }\r\n\r\n // Restore files\r\n let filesRestored = 0;\r\n for (const file of snapshot.files) {\r\n const targetPath = join(snapshot.collectionsDir, file.path);\r\n\r\n // Ensure directory exists\r\n const targetDir = dirname(targetPath);\r\n if (!existsSync(targetDir)) {\r\n mkdirSync(targetDir, { recursive: true });\r\n }\r\n\r\n // Write file\r\n writeFileSync(targetPath, file.content, 'utf-8');\r\n filesRestored++;\r\n }\r\n\r\n return {\r\n success: true,\r\n filesRestored,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n filesRestored: 0,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Get list of available snapshots\r\n */\r\n listSnapshots(): TokenSnapshot[] {\r\n if (!existsSync(this.snapshotDir)) {\r\n return [];\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\r\n\r\n const snapshots: TokenSnapshot[] = [];\r\n for (const file of files) {\r\n const snapshot = this.loadSnapshot(basename(file, '.json'));\r\n if (snapshot) {\r\n // Don't include file contents in list\r\n snapshots.push({\r\n ...snapshot,\r\n files: snapshot.files.map((f) => ({\r\n ...f,\r\n content: '',\r\n })),\r\n });\r\n }\r\n }\r\n\r\n // Sort by timestamp (newest first)\r\n return snapshots.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n }\r\n\r\n /**\r\n * Get the most recent snapshot\r\n */\r\n getLatestSnapshot(): TokenSnapshot | null {\r\n const snapshots = this.listSnapshots();\r\n if (snapshots.length > 0 && snapshots[0]) {\r\n return snapshots[0];\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Delete a snapshot\r\n */\r\n deleteSnapshot(snapshotId: string): boolean {\r\n try {\r\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\r\n if (existsSync(snapshotPath)) {\r\n rmSync(snapshotPath);\r\n return true;\r\n }\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Delete all snapshots\r\n */\r\n clearSnapshots(): number {\r\n if (!existsSync(this.snapshotDir)) {\r\n return 0;\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\r\n let deleted = 0;\r\n\r\n for (const file of files) {\r\n try {\r\n rmSync(join(this.snapshotDir, file));\r\n deleted++;\r\n } catch {\r\n // Continue on error\r\n }\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n // Private methods\r\n\r\n /**\r\n * Generate unique snapshot ID\r\n */\r\n private generateSnapshotId(): string {\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return `snapshot-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Calculate SHA-256 checksum\r\n */\r\n private calculateChecksum(content: string): string {\r\n return createHash('sha256').update(content, 'utf-8').digest('hex');\r\n }\r\n\r\n /**\r\n * Scan directory for files matching include/exclude patterns\r\n */\r\n private scanDirectory(dir: string, baseDir = dir): string[] {\r\n const files: string[] = [];\r\n\r\n try {\r\n const entries = readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relativePath = fullPath.substring(baseDir.length + 1);\r\n\r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n if (!this.shouldExclude(relativePath)) {\r\n files.push(...this.scanDirectory(fullPath, baseDir));\r\n }\r\n } else if (entry.isFile()) {\r\n // Include files matching patterns\r\n if (this.shouldInclude(relativePath)) {\r\n files.push(relativePath);\r\n }\r\n }\r\n }\r\n } catch {\r\n // Ignore errors\r\n }\r\n\r\n return files;\r\n }\r\n\r\n /**\r\n * Check if path should be included\r\n */\r\n private shouldInclude(path: string): boolean {\r\n // Simple pattern matching (supports *.ext and **/*.ext)\r\n return this.include.some((pattern) => {\r\n if (pattern === '**/*') {\r\n return true;\r\n }\r\n if (pattern.startsWith('**/')) {\r\n // **/*.json matches any path ending with .json\r\n const suffix = pattern.substring(3); // Remove **/\r\n if (suffix.startsWith('*.')) {\r\n // Pattern like **/*.json - check extension\r\n const ext = suffix.substring(1); // .json\r\n return path.endsWith(ext);\r\n }\r\n return path.endsWith(suffix);\r\n }\r\n if (pattern.startsWith('*.')) {\r\n return path.endsWith(pattern.substring(1));\r\n }\r\n return path === pattern;\r\n });\r\n }\r\n\r\n /**\r\n * Check if path should be excluded\r\n */\r\n private shouldExclude(path: string): boolean {\r\n return this.exclude.some((pattern) => {\r\n if (pattern.startsWith('**/')) {\r\n return path.includes(pattern.substring(3).replace('/**', ''));\r\n }\r\n return path.includes(pattern);\r\n });\r\n }\r\n\r\n /**\r\n * Load snapshot from disk\r\n */\r\n private loadSnapshot(snapshotId: string): TokenSnapshot | null {\r\n try {\r\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\r\n if (!existsSync(snapshotPath)) {\r\n return null;\r\n }\r\n\r\n const content = readFileSync(snapshotPath, 'utf-8');\r\n const snapshot = JSON.parse(content) as TokenSnapshot;\r\n\r\n // Convert timestamp string to Date\r\n snapshot.timestamp = new Date(snapshot.timestamp);\r\n\r\n return snapshot;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Validate snapshot integrity\r\n */\r\n private validateSnapshot(snapshot: TokenSnapshot): string | null {\r\n if (!snapshot.files || snapshot.files.length === 0) {\r\n return 'Snapshot has no files';\r\n }\r\n\r\n for (const file of snapshot.files) {\r\n const actualChecksum = this.calculateChecksum(file.content);\r\n if (actualChecksum !== file.checksum) {\r\n return `Checksum mismatch for file: ${file.path}`;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Clean up old snapshots keeping only maxSnapshots most recent\r\n */\r\n private cleanupOldSnapshots(): void {\r\n if (!existsSync(this.snapshotDir)) {\r\n return;\r\n }\r\n\r\n const files = readdirSync(this.snapshotDir)\r\n .filter((f) => f.endsWith('.json'))\r\n .map((f) => ({\r\n name: f,\r\n path: join(this.snapshotDir, f),\r\n mtime: this.getFileModificationTime(join(this.snapshotDir, f)),\r\n }))\r\n .sort((a, b) => b.mtime - a.mtime);\r\n\r\n // Delete old snapshots\r\n for (let i = this.maxSnapshots; i < files.length; i++) {\r\n const file = files.at(i);\r\n if (file?.path) {\r\n try {\r\n rmSync(file.path);\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get file modification time\r\n */\r\n private getFileModificationTime(path: string): number {\r\n try {\r\n const snapshot = this.loadSnapshot(basename(path, '.json'));\r\n return snapshot ? snapshot.timestamp.getTime() : 0;\r\n } catch {\r\n return 0;\r\n }\r\n }\r\n}\r\n","/**\r\n * @file Theme Builder Module\r\n * @description Builds token outputs for a single theme using Style Dictionary\r\n *\r\n * This module orchestrates the build process for individual themes, generating\r\n * the appropriate Style Dictionary configuration based on the theme definition.\r\n *\r\n * Key responsibilities:\r\n * - Generate Style Dictionary config for a theme\r\n * - Use correct CSS format based on theme type (default vs non-default)\r\n * - Support all output formats (CSS, SCSS, JS, TS, JSON)\r\n * - Generate output file paths from theme definition\r\n *\r\n * @example\r\n * ```typescript\r\n * import { buildTheme, generateThemeBuildConfig } from '@dsai-io/tools';\r\n *\r\n * const result = await buildTheme({\r\n * themeName: 'dark',\r\n * themeDefinition: {\r\n * isDefault: false,\r\n * suffix: '-dark',\r\n * selector: '[data-dsai-theme=\"dark\"]',\r\n * outputFiles: { css: 'tokens-dark.css' },\r\n * },\r\n * files: ['collections/color-dark.json', 'collections/semantic-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * });\r\n * ```\r\n *\r\n * @module @dsai-io/tools/tokens/theme-builder\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { join, resolve } from 'node:path';\r\n\r\nimport type { OutputFormat, ResolvedThemeDefinition, ThemeDefinition } from '../config/types.js';\r\nimport type { StyleDictionaryInstance } from './style-dictionary/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Minimal configuration required for theme building\r\n *\r\n * This interface only includes the properties actually used by the theme builder,\r\n * allowing callers to pass either a full ResolvedTokensConfig or a minimal object.\r\n */\r\nexport interface ThemeBuildConfig {\r\n /** Output formats to generate */\r\n formats: OutputFormat[];\r\n\r\n /** CSS custom property prefix (e.g., '--dsai-') */\r\n prefix?: string;\r\n\r\n /** Theme definitions (used by buildAllThemes to lookup theme metadata) */\r\n themes?: {\r\n definitions?: Record<string, ThemeDefinition | ResolvedThemeDefinition>;\r\n };\r\n}\r\n\r\n/**\r\n * Options for building a single theme\r\n */\r\nexport interface ThemeBuildOptions {\r\n /** Name of the theme (e.g., 'light', 'dark', 'pro') */\r\n themeName: string;\r\n\r\n /** Resolved theme definition with all required fields */\r\n themeDefinition: ResolvedThemeDefinition;\r\n\r\n /** Array of token file paths for this theme */\r\n files: string[];\r\n\r\n /** Output directory for generated files */\r\n outputDir: string;\r\n\r\n /** Build configuration (formats and optionally theme definitions) */\r\n config: ThemeBuildConfig;\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n\r\n /** Skip cache lookup (force rebuild) */\r\n skipCache?: boolean;\r\n}\r\n\r\n/**\r\n * Result of building a single theme\r\n */\r\nexport interface ThemeBuildResult {\r\n /** Whether the build succeeded */\r\n success: boolean;\r\n\r\n /** Theme name that was built */\r\n themeName: string;\r\n\r\n /** Generated output files by format */\r\n outputs: Partial<Record<OutputFormat, string[]>>;\r\n\r\n /** Error message if build failed */\r\n error?: string;\r\n\r\n /** Duration in milliseconds */\r\n duration: number;\r\n\r\n /** Whether result was from cache */\r\n fromCache: boolean;\r\n}\r\n\r\n/**\r\n * Style Dictionary configuration for a theme\r\n */\r\nexport interface ThemeStyleDictionaryConfig {\r\n /** Source token files */\r\n source: string[];\r\n\r\n /** Platform configurations */\r\n platforms: Record<string, StyleDictionaryPlatformConfig>;\r\n\r\n /** Preprocessors to apply before building */\r\n preprocessors?: string[];\r\n\r\n /** Whether tokens use DTCG format ($value, $type, etc.) */\r\n usesDtcg?: boolean;\r\n\r\n /** Logging configuration */\r\n log?: {\r\n warnings?: 'warn' | 'error' | 'disabled';\r\n verbosity?: 'default' | 'silent' | 'verbose';\r\n errors?: {\r\n brokenReferences?: 'throw' | 'console';\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Style Dictionary platform configuration\r\n */\r\nexport interface StyleDictionaryPlatformConfig {\r\n /** Transform group to use */\r\n transformGroup?: string;\r\n\r\n /** Build path for outputs */\r\n buildPath: string;\r\n\r\n /** Output file configurations */\r\n files: StyleDictionaryFileConfig[];\r\n\r\n /** Custom options for formats */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Style Dictionary file configuration\r\n */\r\nexport interface StyleDictionaryFileConfig {\r\n /** Output file path (relative to buildPath) */\r\n destination: string;\r\n\r\n /** Format to use for output */\r\n format: string;\r\n\r\n /** Filter for tokens to include */\r\n filter?: Record<string, unknown>;\r\n\r\n /** Format-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Format config type for mapping\r\n */\r\ninterface FormatConfig {\r\n default: string;\r\n themed: string;\r\n}\r\n\r\n/**\r\n * Mapping of OutputFormat to Style Dictionary format names\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n */\r\nconst FORMAT_MAPPING = new Map<OutputFormat, FormatConfig>([\r\n ['css', { default: 'css/variables-with-comments', themed: 'css/variables-dark-mode' }],\r\n ['scss', { default: 'scss/variables', themed: 'scss/variables' }],\r\n ['js', { default: 'javascript/esm-safe', themed: 'javascript/esm-safe' }],\r\n ['ts', { default: 'typescript/declarations', themed: 'typescript/declarations' }],\r\n ['json', { default: 'json/nested', themed: 'json/nested' }],\r\n ['android', { default: 'android/resources', themed: 'android/resources' }],\r\n ['ios', { default: 'ios/macros', themed: 'ios/macros' }],\r\n]);\r\n\r\n/**\r\n * Default Style Dictionary transform groups by platform\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n * Note: Style Dictionary built-in groups are: web, js, scss, css, less, html, android, compose, ios, ios-swift, assets, flutter, react-native\r\n *\r\n * We use 'js-custom' for JS/TS to ensure valid JavaScript identifiers with our custom name/js-identifier transform\r\n */\r\nconst TRANSFORM_GROUPS = new Map<OutputFormat, string>([\r\n ['css', 'custom/css'],\r\n ['scss', 'scss'],\r\n ['js', 'js-custom'], // Use custom transform group for valid JS identifiers\r\n ['ts', 'js-custom'], // TypeScript uses same transforms as JS\r\n ['json', 'web'], // JSON uses web transforms (no \"json\" transformGroup exists)\r\n ['android', 'android'],\r\n ['ios', 'ios'],\r\n]);\r\n\r\n// ============================================================================\r\n// Configuration Generators\r\n// ============================================================================\r\n\r\n/**\r\n * Generate Style Dictionary configuration for a single theme\r\n *\r\n * @param options - Theme build options\r\n * @returns Style Dictionary configuration object\r\n *\r\n * @example\r\n * ```typescript\r\n * const sdConfig = generateThemeBuildConfig({\r\n * themeName: 'dark',\r\n * themeDefinition: { isDefault: false, selector: '[data-dsai-theme=\"dark\"]' },\r\n * files: ['collections/color-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * });\r\n * // Returns Style Dictionary config with dark mode format\r\n * ```\r\n */\r\nexport function generateThemeBuildConfig(options: ThemeBuildOptions): ThemeStyleDictionaryConfig {\r\n const { themeDefinition, files, outputDir, config } = options;\r\n const isDefault = themeDefinition.isDefault;\r\n\r\n // Build platforms based on enabled formats using Map for safe access\r\n const platformsMap = new Map<string, StyleDictionaryPlatformConfig>();\r\n const enabledFormats = config.formats;\r\n\r\n for (const format of enabledFormats) {\r\n const platformConfig = generatePlatformConfig(\r\n format,\r\n themeDefinition,\r\n outputDir,\r\n isDefault,\r\n config.prefix\r\n );\r\n if (platformConfig) {\r\n platformsMap.set(format, platformConfig);\r\n }\r\n }\r\n\r\n // Convert Map to object for Style Dictionary compatibility\r\n const platforms: Record<string, StyleDictionaryPlatformConfig> = Object.fromEntries(platformsMap);\r\n\r\n return {\r\n source: files,\r\n platforms,\r\n preprocessors: ['fix-references'],\r\n // Enable DTCG format support (tokens with $value, $type, etc.)\r\n usesDtcg: true,\r\n // Configure logging to not throw on broken references (they'll be logged but build continues)\r\n log: {\r\n warnings: 'warn' as const,\r\n verbosity: 'default' as const,\r\n errors: {\r\n brokenReferences: 'console' as const,\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Generate platform configuration for a specific output format\r\n *\r\n * @param format - Output format (css, scss, js, etc.)\r\n * @param themeDefinition - Theme definition\r\n * @param outputDir - Output directory\r\n * @param isDefault - Whether this is the default theme\r\n * @returns Style Dictionary platform configuration\r\n */\r\nfunction generatePlatformConfig(\r\n format: OutputFormat,\r\n themeDefinition: ResolvedThemeDefinition,\r\n outputDir: string,\r\n isDefault: boolean,\r\n prefix?: string\r\n): StyleDictionaryPlatformConfig | null {\r\n const formatConfig = FORMAT_MAPPING.get(format);\r\n if (!formatConfig) {\r\n console.warn(`Unknown format: ${format}`);\r\n return null;\r\n }\r\n\r\n const sdFormat = isDefault ? formatConfig.default : formatConfig.themed;\r\n\r\n // Use Map for safe access to outputFiles\r\n const outputFilesMap = new Map(Object.entries(themeDefinition.outputFiles));\r\n const outputFile = outputFilesMap.get(format) ?? `tokens.${format}`;\r\n\r\n // Determine subdirectory based on format\r\n const subDir = getFormatSubdirectory(format);\r\n const buildPath = subDir ? join(outputDir, subDir) + '/' : outputDir + '/';\r\n\r\n const fileConfig: StyleDictionaryFileConfig = {\r\n destination: outputFile,\r\n format: sdFormat,\r\n };\r\n\r\n // Add prefix option for CSS/SCSS formats\r\n if (prefix && (format === 'css' || format === 'scss')) {\r\n fileConfig.options = {\r\n ...fileConfig.options,\r\n prefix,\r\n };\r\n }\r\n\r\n // Add selector option for themed CSS\r\n if (format === 'css' && !isDefault) {\r\n fileConfig.options = {\r\n ...fileConfig.options,\r\n selector: themeDefinition.selector,\r\n };\r\n }\r\n\r\n // Add media query if defined\r\n if (themeDefinition.mediaQuery && format === 'css' && !isDefault) {\r\n const existingOptions = fileConfig.options ?? {};\r\n fileConfig.options = {\r\n ...existingOptions,\r\n mediaQuery: themeDefinition.mediaQuery,\r\n };\r\n }\r\n\r\n const transformGroup = TRANSFORM_GROUPS.get(format) ?? format;\r\n\r\n return {\r\n transformGroup,\r\n buildPath,\r\n files: [fileConfig],\r\n };\r\n}\r\n\r\n/**\r\n * Get subdirectory for a format (e.g., 'css' -> 'css', 'js' -> 'js')\r\n *\r\n * @param format - Output format\r\n * @returns Subdirectory name\r\n */\r\nfunction getFormatSubdirectory(format: OutputFormat): string {\r\n switch (format) {\r\n case 'css':\r\n return 'css';\r\n case 'scss':\r\n return 'scss';\r\n case 'js':\r\n return 'js';\r\n case 'ts':\r\n return 'ts';\r\n case 'json':\r\n return 'json';\r\n case 'android':\r\n return 'android';\r\n case 'ios':\r\n return 'ios';\r\n default:\r\n return '';\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Build Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Build token outputs for a single theme\r\n *\r\n * This function generates Style Dictionary configuration from the theme\r\n * definition and runs the build process. For default themes, it uses\r\n * `css/variables-with-comments` format with `:root` selector. For\r\n * non-default themes, it uses `css/variables-dark-mode` with the\r\n * theme-specific selector.\r\n *\r\n * @param options - Theme build options\r\n * @returns Build result with success status and output files\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await buildTheme({\r\n * themeName: 'dark',\r\n * themeDefinition: resolvedThemeDef,\r\n * files: ['collections/color-dark.json'],\r\n * outputDir: 'dist',\r\n * config: resolvedConfig,\r\n * verbose: true,\r\n * });\r\n *\r\n * if (result.success) {\r\n * console.log('Built files:', result.outputs);\r\n * }\r\n * ```\r\n */\r\nexport async function buildTheme(options: ThemeBuildOptions): Promise<ThemeBuildResult> {\r\n const startTime = Date.now();\r\n const { themeName, files, verbose } = options;\r\n\r\n // Validate inputs\r\n if (files.length === 0) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No token files found for theme \"${themeName}\"`,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n\r\n // Validate files exist (resolve to absolute paths for checking)\r\n const missingFiles: string[] = [];\r\n for (const file of files) {\r\n const resolvedPath = resolve(file);\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(resolvedPath)) {\r\n missingFiles.push(file);\r\n }\r\n }\r\n if (missingFiles.length > 0) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `Missing token files for theme \"${themeName}\": ${missingFiles.join(', ')}`,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n\r\n if (verbose) {\r\n console.warn(`🎨 Building theme: ${themeName}`);\r\n console.warn(` Files: ${files.length}`);\r\n console.warn(` Default: ${options.themeDefinition.isDefault}`);\r\n console.warn(` Selector: ${options.themeDefinition.selector}`);\r\n }\r\n\r\n try {\r\n // Generate Style Dictionary configuration\r\n const sdConfig = generateThemeBuildConfig(options);\r\n\r\n if (verbose) {\r\n console.warn(` Platforms: ${Object.keys(sdConfig.platforms).join(', ')}`);\r\n console.warn(` Enabled formats: ${options.config.formats.join(', ')}`);\r\n // Debug: show platform build paths\r\n for (const [platform, platformCfg] of Object.entries(sdConfig.platforms)) {\r\n console.warn(\r\n ` ${platform}: ${platformCfg.buildPath} -> ${platformCfg.files[0]?.destination}`\r\n );\r\n }\r\n }\r\n\r\n // Run Style Dictionary build\r\n const outputs = await runStyleDictionaryBuild(sdConfig, options);\r\n\r\n return {\r\n success: true,\r\n themeName,\r\n outputs,\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: error instanceof Error ? error.message : 'Unknown build error',\r\n duration: Date.now() - startTime,\r\n fromCache: false,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Run Style Dictionary build with generated configuration\r\n *\r\n * @param sdConfig - Style Dictionary configuration\r\n * @param options - Build options for context\r\n * @returns Map of format to output file paths\r\n */\r\nasync function runStyleDictionaryBuild(\r\n sdConfig: ThemeStyleDictionaryConfig,\r\n options: ThemeBuildOptions\r\n): Promise<Partial<Record<OutputFormat, string[]>>> {\r\n // Dynamic import to avoid circular dependencies\r\n const StyleDictionaryModule = await import('style-dictionary');\r\n const StyleDictionary = StyleDictionaryModule.default;\r\n\r\n // Register custom formats using type assertion for compatibility\r\n const { registerFormats: registerCustomFormats } =\r\n await import('./style-dictionary/formats/index.js');\r\n registerCustomFormats(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Register custom transforms\r\n const { registerTransforms: registerCustomTransforms } =\r\n await import('./style-dictionary/transforms/index.js');\r\n registerCustomTransforms(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Register custom transform groups (including js-custom with name/js-identifier)\r\n const { registerTransformGroups } = await import('./style-dictionary/groups/index.js');\r\n registerTransformGroups(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Register custom preprocessors (fix-references for path mapping)\r\n const { registerPreprocessors } = await import('./style-dictionary/preprocessors/index.js');\r\n registerPreprocessors(StyleDictionary as unknown as StyleDictionaryInstance);\r\n\r\n // Debug: log platforms being built\r\n if (options.verbose) {\r\n console.warn(` 🔧 Style Dictionary platforms:`);\r\n for (const [platform, config] of Object.entries(sdConfig.platforms)) {\r\n console.warn(\r\n ` ${platform}: transformGroup=\"${config.transformGroup}\", format=\"${config.files[0]?.format}\"`\r\n );\r\n }\r\n }\r\n\r\n // Create and build Style Dictionary instance\r\n // Note: The built-in 'js' transform group includes 'name/pascal' which\r\n // generates valid JS identifiers like 'Spacing0', 'NeutralGray100', etc.\r\n const sd = new StyleDictionary(sdConfig);\r\n\r\n // Build all platforms and capture any errors\r\n try {\r\n await sd.buildAllPlatforms();\r\n } catch (error) {\r\n console.error(`❌ Style Dictionary build failed:`, error);\r\n throw error;\r\n }\r\n\r\n // Collect output files using Map for safe access\r\n const outputsMap = new Map<OutputFormat, string[]>();\r\n\r\n for (const [platformName, platformConfig] of Object.entries(sdConfig.platforms)) {\r\n const format = platformName as OutputFormat;\r\n const outputFiles = platformConfig.files.map((f) =>\r\n join(platformConfig.buildPath, f.destination)\r\n );\r\n outputsMap.set(format, outputFiles);\r\n }\r\n\r\n const outputs: Partial<Record<OutputFormat, string[]>> = Object.fromEntries(outputsMap);\r\n\r\n if (options.verbose) {\r\n const totalFiles = Object.values(outputs).flat().length;\r\n console.warn(` ✅ Generated ${totalFiles} output files`);\r\n // Debug: check if files actually exist\r\n for (const [format, files] of Object.entries(outputs)) {\r\n for (const file of files) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const exists = existsSync(file);\r\n if (!exists) {\r\n console.warn(` ⚠️ Missing: ${format} -> ${file}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return outputs;\r\n}\r\n\r\n// ============================================================================\r\n// Batch Build Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Options for building multiple themes\r\n */\r\nexport interface MultiThemeBuildOptions {\r\n /** Build configuration with formats and theme definitions */\r\n config: ThemeBuildConfig;\r\n\r\n /** Map of theme name to file paths */\r\n themeFiles: Map<string, string[]>;\r\n\r\n /** Output directory for all themes */\r\n outputDir: string;\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n\r\n /** Only build these specific themes (if not set, build all) */\r\n themes?: string[];\r\n\r\n /** Skip cache lookup */\r\n skipCache?: boolean;\r\n}\r\n\r\n/**\r\n * Result of building multiple themes\r\n */\r\nexport interface MultiThemeBuildResult {\r\n /** Overall success (true if all themes succeeded) */\r\n success: boolean;\r\n\r\n /** Individual theme results */\r\n results: ThemeBuildResult[];\r\n\r\n /** Total duration in milliseconds */\r\n duration: number;\r\n\r\n /** Number of themes built successfully */\r\n successCount: number;\r\n\r\n /** Number of themes that failed */\r\n failCount: number;\r\n}\r\n\r\n/**\r\n * Build multiple themes in sequence\r\n *\r\n * This function iterates through all configured themes and builds each one\r\n * using the appropriate Style Dictionary configuration. It collects results\r\n * and returns a summary of the build process.\r\n *\r\n * @param options - Multi-theme build options\r\n * @returns Aggregated build results\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await buildAllThemes({\r\n * config: resolvedConfig,\r\n * themeFiles: new Map([\r\n * ['light', ['collections/color.json']],\r\n * ['dark', ['collections/color-dark.json']],\r\n * ]),\r\n * outputDir: 'dist',\r\n * verbose: true,\r\n * });\r\n *\r\n * console.log(`Built ${result.successCount}/${result.results.length} themes`);\r\n * ```\r\n */\r\nexport async function buildAllThemes(\r\n options: MultiThemeBuildOptions\r\n): Promise<MultiThemeBuildResult> {\r\n const startTime = Date.now();\r\n const { config, themeFiles, outputDir, verbose, themes } = options;\r\n\r\n // Get theme definitions\r\n const definitions = config.themes?.definitions ?? {};\r\n const definitionsMap = new Map(Object.entries(definitions));\r\n\r\n // Determine which themes to build\r\n const themesToBuild = themes ?? Array.from(themeFiles.keys());\r\n const results: ThemeBuildResult[] = [];\r\n\r\n if (verbose) {\r\n console.warn(`\\n🎨 Building ${themesToBuild.length} themes...`);\r\n }\r\n\r\n // Find the default theme's files (needed for non-default themes to resolve references)\r\n const defaultThemeName = Array.from(definitionsMap.entries()).find(\r\n ([_, def]) => def.isDefault\r\n )?.[0];\r\n const defaultThemeFiles = defaultThemeName ? (themeFiles.get(defaultThemeName) ?? []) : [];\r\n\r\n // Build each theme\r\n for (const themeName of themesToBuild) {\r\n const rawThemeDefinition = definitionsMap.get(themeName);\r\n const themeSpecificFiles = themeFiles.get(themeName);\r\n\r\n if (!rawThemeDefinition) {\r\n results.push({\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No theme definition found for \"${themeName}\"`,\r\n duration: 0,\r\n fromCache: false,\r\n });\r\n continue;\r\n }\r\n\r\n if (!themeSpecificFiles || themeSpecificFiles.length === 0) {\r\n results.push({\r\n success: false,\r\n themeName,\r\n outputs: {},\r\n error: `No files found for theme \"${themeName}\"`,\r\n duration: 0,\r\n fromCache: false,\r\n });\r\n continue;\r\n }\r\n\r\n // For non-default themes, include default theme files first, then theme-specific files\r\n // This allows references to be resolved and theme-specific values to override defaults\r\n const isDefault = rawThemeDefinition.isDefault ?? false;\r\n let files: string[];\r\n if (isDefault) {\r\n files = themeSpecificFiles;\r\n } else {\r\n // Include default files first, then theme-specific files (which override)\r\n files = [...defaultThemeFiles, ...themeSpecificFiles];\r\n }\r\n\r\n // Resolve the theme definition to ensure all required fields are present\r\n const baseOutputFiles = rawThemeDefinition.outputFiles ?? {};\r\n const themeDefinition: ResolvedThemeDefinition = {\r\n isDefault,\r\n suffix: rawThemeDefinition.suffix ?? (isDefault ? null : `-${themeName}`),\r\n selector:\r\n rawThemeDefinition.selector ?? (isDefault ? ':root' : `[data-dsai-theme=\"${themeName}\"]`),\r\n mediaQuery: rawThemeDefinition.mediaQuery,\r\n dataAttribute: rawThemeDefinition.dataAttribute ?? `data-dsai-theme=\"${themeName}\"`,\r\n outputFiles: {\r\n css: baseOutputFiles.css ?? (isDefault ? 'tokens.css' : `tokens-${themeName}.css`),\r\n scss:\r\n baseOutputFiles.scss ?? (isDefault ? '_variables.scss' : `_variables-${themeName}.scss`),\r\n js: baseOutputFiles.js ?? (isDefault ? 'tokens.js' : `tokens-${themeName}.js`),\r\n ts: baseOutputFiles.ts ?? (isDefault ? 'tokens.d.ts' : `tokens-${themeName}.d.ts`),\r\n json: baseOutputFiles.json ?? (isDefault ? 'tokens.json' : `tokens-${themeName}.json`),\r\n android: baseOutputFiles.android ?? (isDefault ? 'tokens.xml' : `tokens-${themeName}.xml`),\r\n ios: baseOutputFiles.ios ?? (isDefault ? 'tokens.h' : `tokens-${themeName}.h`),\r\n },\r\n };\r\n\r\n const result = await buildTheme({\r\n themeName,\r\n themeDefinition,\r\n files,\r\n outputDir,\r\n config,\r\n verbose,\r\n skipCache: options.skipCache,\r\n });\r\n\r\n results.push(result);\r\n }\r\n\r\n // Calculate totals\r\n const successCount = results.filter((r) => r.success).length;\r\n const failCount = results.filter((r) => !r.success).length;\r\n\r\n if (verbose) {\r\n console.warn(`\\n📊 Theme Build Summary`);\r\n console.warn(` Total: ${results.length}`);\r\n console.warn(` Success: ${successCount}`);\r\n console.warn(` Failed: ${failCount}`);\r\n console.warn(` Duration: ${Date.now() - startTime}ms`);\r\n\r\n // Log failed themes\r\n const failed = results.filter((r) => !r.success);\r\n if (failed.length > 0) {\r\n console.warn(`\\n❌ Failed themes:`);\r\n for (const f of failed) {\r\n console.warn(` - ${f.themeName}: ${f.error}`);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: failCount === 0,\r\n results,\r\n duration: Date.now() - startTime,\r\n successCount,\r\n failCount,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Get the appropriate CSS format for a theme\r\n *\r\n * @param isDefault - Whether this is the default theme\r\n * @returns Style Dictionary format name\r\n */\r\nexport function getCssFormat(isDefault: boolean): string {\r\n return isDefault ? 'css/variables-with-comments' : 'css/variables-dark-mode';\r\n}\r\n\r\n/**\r\n * Get the CSS selector for a theme\r\n *\r\n * @param themeDefinition - Resolved theme definition\r\n * @returns CSS selector string\r\n */\r\nexport function getThemeSelector(themeDefinition: ResolvedThemeDefinition): string {\r\n return themeDefinition.isDefault ? ':root' : themeDefinition.selector;\r\n}\r\n\r\n/**\r\n * Validate theme definitions for conflicts\r\n *\r\n * Checks for:\r\n * - Multiple default themes\r\n * - Duplicate selectors\r\n * - Duplicate suffixes\r\n *\r\n * @param definitions - Map of theme name to definition\r\n * @returns Array of validation error messages\r\n */\r\nexport function validateThemeDefinitions(\r\n definitions: Map<string, ResolvedThemeDefinition>\r\n): string[] {\r\n const errors: string[] = [];\r\n const selectors = new Map<string, string>();\r\n const suffixes = new Map<string, string>();\r\n let defaultCount = 0;\r\n let defaultTheme = '';\r\n\r\n for (const [name, def] of definitions) {\r\n // Check for multiple defaults\r\n if (def.isDefault) {\r\n defaultCount++;\r\n if (defaultCount > 1) {\r\n errors.push(`Multiple default themes defined: \"${defaultTheme}\" and \"${name}\"`);\r\n }\r\n defaultTheme = name;\r\n }\r\n\r\n // Check for duplicate selectors\r\n const existingSelector = selectors.get(def.selector);\r\n if (existingSelector) {\r\n errors.push(\r\n `Duplicate selector \"${def.selector}\" used by themes \"${existingSelector}\" and \"${name}\"`\r\n );\r\n } else {\r\n selectors.set(def.selector, name);\r\n }\r\n\r\n // Check for duplicate suffixes\r\n const suffix = def.suffix ?? '';\r\n const existingSuffix = suffixes.get(suffix);\r\n if (existingSuffix && suffix !== '') {\r\n errors.push(`Duplicate suffix \"${suffix}\" used by themes \"${existingSuffix}\" and \"${name}\"`);\r\n } else if (suffix !== '') {\r\n suffixes.set(suffix, name);\r\n }\r\n }\r\n\r\n // Ensure at least one default\r\n if (defaultCount === 0 && definitions.size > 0) {\r\n errors.push('No default theme defined. One theme must have isDefault: true');\r\n }\r\n\r\n return errors;\r\n}\r\n","/**\r\n * Theme Discovery Module\r\n *\r\n * Discovers and categorizes token files by theme based on file suffix patterns.\r\n * Supports both auto-detection from file names and explicit theme definitions.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/theme-discovery\r\n */\r\n\r\nimport path from 'node:path';\r\n\r\nimport fg from 'fast-glob';\r\n\r\nimport type { ResolvedThemeDefinition, ResolvedThemesConfig } from '../config/types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Result of theme file discovery\r\n */\r\nexport interface ThemeFilesResult {\r\n /** Theme name */\r\n theme: string;\r\n /** Theme definition */\r\n definition: ResolvedThemeDefinition;\r\n /** Files belonging to this theme */\r\n files: string[];\r\n}\r\n\r\n/**\r\n * Discovery result with all themes\r\n */\r\nexport interface DiscoveryResult {\r\n /** Files organized by theme - Map of theme name to file paths */\r\n themes: Map<string, string[]>;\r\n /** Theme definitions organized by theme name */\r\n definitions: Map<string, ResolvedThemeDefinition>;\r\n /** Files that couldn't be matched to any theme (when autoDetect is false) */\r\n orphanFiles: string[];\r\n /** Themes with no files found */\r\n emptyThemes: string[];\r\n /** Total files discovered */\r\n totalFiles: number;\r\n}\r\n\r\n/**\r\n * Options for theme discovery\r\n */\r\nexport interface DiscoveryOptions {\r\n /** Base directory for file patterns */\r\n sourceDir: string;\r\n /** Glob pattern for finding token files */\r\n pattern?: string;\r\n /** Whether to include verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Extract theme suffixes from definitions\r\n */\r\nfunction getThemeSuffixes(\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): Map<string, string> {\r\n const suffixToTheme = new Map<string, string>();\r\n\r\n for (const [themeName, definition] of Object.entries(definitions)) {\r\n if (definition.suffix) {\r\n suffixToTheme.set(definition.suffix, themeName);\r\n }\r\n }\r\n\r\n return suffixToTheme;\r\n}\r\n\r\n/**\r\n * Get the default theme name from definitions\r\n */\r\nfunction getDefaultThemeName(\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): string | undefined {\r\n for (const [themeName, definition] of Object.entries(definitions)) {\r\n if (definition.isDefault) {\r\n return themeName;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if a file matches a theme suffix\r\n * Returns the theme name if matched, undefined otherwise\r\n */\r\nfunction matchFileSuffix(filename: string, suffixToTheme: Map<string, string>): string | undefined {\r\n // Remove .json extension\r\n const baseName = filename.replace(/\\.json$/i, '');\r\n\r\n // Check each suffix\r\n for (const [suffix, themeName] of suffixToTheme.entries()) {\r\n if (baseName.endsWith(suffix)) {\r\n return themeName;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Generate ignore patterns for non-default theme files\r\n */\r\nfunction generateIgnorePatterns(\r\n sourceDir: string,\r\n definitions: Record<string, ResolvedThemeDefinition>\r\n): string[] {\r\n const patterns: string[] = [];\r\n\r\n for (const definition of Object.values(definitions)) {\r\n if (definition.suffix) {\r\n patterns.push(`${sourceDir}/**/*${definition.suffix}.json`);\r\n }\r\n }\r\n\r\n return patterns;\r\n}\r\n\r\n// ============================================================================\r\n// Main Discovery Function\r\n// ============================================================================\r\n\r\n/**\r\n * Discover token files organized by theme\r\n *\r\n * This function scans the source directory for JSON token files and\r\n * categorizes them by theme based on their file suffix patterns.\r\n *\r\n * @param themesConfig - Resolved themes configuration\r\n * @param options - Discovery options including source directory\r\n * @returns Discovery result with files organized by theme\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = discoverThemeFiles(themesConfig, {\r\n * sourceDir: 'src/collections',\r\n * pattern: '**\\/*.json',\r\n * });\r\n *\r\n * // result.themes = [\r\n * // { theme: 'light', files: ['foundation.json', 'semantic.json'] },\r\n * // { theme: 'dark', files: ['foundation-dark.json', 'semantic-dark.json'] },\r\n * // ]\r\n * ```\r\n */\r\nexport function discoverThemeFiles(\r\n themesConfig: ResolvedThemesConfig,\r\n options: DiscoveryOptions\r\n): DiscoveryResult {\r\n const { sourceDir, pattern = '**/*.json', verbose = false } = options;\r\n const { definitions } = themesConfig;\r\n\r\n // Build suffix mapping\r\n const suffixToTheme = getThemeSuffixes(definitions);\r\n const defaultThemeName = getDefaultThemeName(definitions);\r\n\r\n // Initialize result containers\r\n const themeFilesMap = new Map<string, string[]>();\r\n const orphanFiles: string[] = [];\r\n const emptyThemes: string[] = [];\r\n\r\n // Initialize theme file arrays\r\n for (const themeName of Object.keys(definitions)) {\r\n themeFilesMap.set(themeName, []);\r\n }\r\n\r\n // Discover all JSON files\r\n const allFiles = fg.sync(pattern, {\r\n cwd: sourceDir,\r\n absolute: false,\r\n });\r\n\r\n if (verbose) {\r\n console.warn(` 📂 Found ${allFiles.length} token files in ${sourceDir}`);\r\n }\r\n\r\n // Categorize each file\r\n for (const file of allFiles) {\r\n const filename = path.basename(file);\r\n const matchedTheme = matchFileSuffix(filename, suffixToTheme);\r\n\r\n if (matchedTheme) {\r\n // File matches a non-default theme\r\n const files = themeFilesMap.get(matchedTheme);\r\n if (files) {\r\n files.push(file);\r\n } else if (!themesConfig.autoDetect) {\r\n // Theme not defined and autoDetect is off\r\n orphanFiles.push(file);\r\n }\r\n } else if (defaultThemeName) {\r\n // File has no theme suffix - belongs to default theme\r\n themeFilesMap.get(defaultThemeName)?.push(file);\r\n } else {\r\n // No default theme defined\r\n orphanFiles.push(file);\r\n }\r\n }\r\n\r\n // Build result Maps\r\n const themesMap = new Map<string, string[]>();\r\n const definitionsMap = new Map<string, ResolvedThemeDefinition>();\r\n const themeResults: ThemeFilesResult[] = [];\r\n\r\n for (const [themeName, files] of themeFilesMap.entries()) {\r\n // Safe access using Map lookup since we control the keys\r\n const definition = definitions[themeName as keyof typeof definitions] as\r\n | ResolvedThemeDefinition\r\n | undefined;\r\n\r\n if (!definition) {\r\n continue;\r\n }\r\n\r\n const fullPaths = files.map((f) => path.join(sourceDir, f));\r\n\r\n if (files.length === 0) {\r\n emptyThemes.push(themeName);\r\n }\r\n\r\n // Add to Maps\r\n themesMap.set(themeName, fullPaths);\r\n definitionsMap.set(themeName, definition);\r\n\r\n // Also keep array format for sorting/iteration\r\n themeResults.push({\r\n theme: themeName,\r\n definition,\r\n files: fullPaths,\r\n });\r\n }\r\n\r\n // Sort themes: default first, then alphabetically\r\n themeResults.sort((a, b) => {\r\n if (a.definition.isDefault) {\r\n return -1;\r\n }\r\n if (b.definition.isDefault) {\r\n return 1;\r\n }\r\n return a.theme.localeCompare(b.theme);\r\n });\r\n\r\n const totalFiles = themeResults.reduce((sum, t) => sum + t.files.length, 0);\r\n\r\n if (verbose) {\r\n for (const { theme, files, definition } of themeResults) {\r\n const suffix = definition.suffix ?? '(no suffix)';\r\n console.warn(` 🎨 ${theme} [${suffix}]: ${files.length} files`);\r\n }\r\n if (orphanFiles.length > 0) {\r\n console.warn(` ⚠️ ${orphanFiles.length} orphan files (no matching theme)`);\r\n }\r\n if (emptyThemes.length > 0) {\r\n console.warn(` ⚠️ Empty themes: ${emptyThemes.join(', ')}`);\r\n }\r\n }\r\n\r\n return {\r\n themes: themesMap,\r\n definitions: definitionsMap,\r\n orphanFiles,\r\n emptyThemes,\r\n totalFiles,\r\n };\r\n}\r\n\r\n/**\r\n * Get files for a specific theme\r\n *\r\n * For the default theme, this returns all files EXCEPT those\r\n * matching other theme suffixes.\r\n *\r\n * For non-default themes, this returns only files with the\r\n * matching suffix.\r\n *\r\n * @param themeName - Name of the theme to get files for\r\n * @param themesConfig - Resolved themes configuration\r\n * @param options - Discovery options\r\n * @returns Array of file paths for the theme\r\n */\r\nexport function getThemeFiles(\r\n themeName: string,\r\n themesConfig: ResolvedThemesConfig,\r\n options: DiscoveryOptions\r\n): string[] {\r\n const { sourceDir, pattern = '**/*.json' } = options;\r\n\r\n // Use Map for safe access\r\n const definitionsMap = new Map(Object.entries(themesConfig.definitions));\r\n const definition = definitionsMap.get(themeName);\r\n\r\n if (!definition) {\r\n throw new Error(`Unknown theme: ${themeName}`);\r\n }\r\n\r\n if (definition.isDefault) {\r\n // Default theme: all files EXCEPT those with theme suffixes\r\n const ignorePatterns = generateIgnorePatterns(sourceDir, themesConfig.definitions);\r\n\r\n return fg.sync(path.join(sourceDir, pattern), {\r\n ignore: ignorePatterns,\r\n absolute: true,\r\n });\r\n }\r\n\r\n // Non-default theme: files with specific suffix\r\n if (!definition.suffix) {\r\n return [];\r\n }\r\n\r\n const suffixPattern = pattern.replace(/\\.json$/i, `${definition.suffix}.json`);\r\n\r\n return fg.sync(path.join(sourceDir, suffixPattern), {\r\n absolute: true,\r\n });\r\n}\r\n\r\n/**\r\n * Auto-detect themes from file suffixes\r\n *\r\n * Scans files in the source directory and extracts unique\r\n * theme suffixes to build a dynamic theme list.\r\n *\r\n * @param sourceDir - Directory to scan\r\n * @param pattern - Glob pattern for files\r\n * @param selectorPattern - Pattern for generating selectors\r\n * @returns Map of theme names to their suffixes\r\n */\r\nexport function autoDetectThemes(\r\n sourceDir: string,\r\n pattern: string = '**/*.json',\r\n selectorPattern: string = '[data-dsai-theme=\"{mode}\"]'\r\n): Map<string, { suffix: string | null; selector: string }> {\r\n const themes = new Map<string, { suffix: string | null; selector: string }>();\r\n\r\n // Get all files\r\n const files = fg.sync(pattern, { cwd: sourceDir });\r\n\r\n // Extract unique suffixes\r\n const suffixRegex = /-([a-z0-9]+)\\.json$/i;\r\n const foundSuffixes = new Set<string>();\r\n\r\n for (const file of files) {\r\n const match = suffixRegex.exec(file);\r\n if (match?.[1]) {\r\n foundSuffixes.add(match[1].toLowerCase());\r\n }\r\n }\r\n\r\n // Add default theme (light)\r\n themes.set('light', {\r\n suffix: null,\r\n selector: ':root',\r\n });\r\n\r\n // Add detected themes\r\n for (const suffix of foundSuffixes) {\r\n themes.set(suffix, {\r\n suffix: `-${suffix}`,\r\n selector: selectorPattern.replace('{mode}', suffix),\r\n });\r\n }\r\n\r\n return themes;\r\n}\r\n","/**\r\n * @file Token Build Module\r\n * @description Orchestrates the complete token build pipeline\r\n *\r\n * Runs all token build steps in sequence with clear logging:\r\n * 1. Validate tokens\r\n * 2. Transform Figma tokens\r\n * 3. Build Style Dictionary outputs (CSS, JS, TS, SCSS, JSON)\r\n * 4. Sync tokens-flat.ts\r\n * 5. Compile Bootstrap theme SCSS → CSS\r\n * 6. Post-process theme CSS (data-bs-theme → data-dsai-theme)\r\n * 7. Compile DSAi utilities SCSS → CSS\r\n * 8. Bundle with tsup (ESM + CJS)\r\n *\r\n * The pipeline is configurable via dsai.config.mjs tokens.pipeline section.\r\n * Packages can specify which steps to run and customize paths.\r\n *\r\n * @module @dsai-io/tools/tokens/build\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { execSync } from 'node:child_process';\r\nimport { existsSync, readdirSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\nimport { CacheService } from './cache.js';\r\nimport {\r\n analyzeChanges,\r\n generateIncrementalReport,\r\n updateCacheAfterBuild,\r\n type IncrementalOptions,\r\n} from './incremental.js';\r\nimport { preprocessTokenFiles, type FilePreprocessingResult } from './mode-preprocessor.js';\r\nimport { postprocessCssFiles } from './postprocess.js';\r\nimport { SnapshotService } from './snapshot.js';\r\nimport { syncTokensCLI } from './sync.js';\r\nimport { buildAllThemes } from './theme-builder.js';\r\nimport { discoverThemeFiles } from './theme-discovery.js';\r\nimport { transformTokens } from './transform.js';\r\nimport { validateTokens } from './validate.js';\r\n\r\nimport type {\r\n BuildPipelinePaths,\r\n BuildPipelineStep,\r\n OutputFormat,\r\n TokensBuildPipeline,\r\n} from '../config/types.js';\r\nimport type { BuildOptions, BuildResult, BuildStep } from './types';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/** Global cleanup function for preprocessed files */\r\nlet preprocessCleanup: (() => void) | null = null;\r\n\r\n/** Default SASS deprecation silencing flags */\r\nconst SASS_FLAGS = [\r\n '--quiet-deps',\r\n '--silence-deprecation=import',\r\n '--silence-deprecation=global-builtin',\r\n '--silence-deprecation=color-functions',\r\n].join(' ');\r\n\r\n/** Minimal SASS flags (no color functions deprecation) */\r\nconst SASS_FLAGS_MINIMAL = ['--quiet-deps', '--silence-deprecation=import'].join(' ');\r\n\r\n/** Default build pipeline steps (full @dsai-io/tokens build) */\r\nconst DEFAULT_PIPELINE_STEPS: BuildPipelineStep[] = [\r\n 'validate',\r\n 'snapshot', // Create backup before transform\r\n 'preprocess', // Extract modes from nested Figma structure\r\n 'transform',\r\n 'style-dictionary',\r\n 'sync',\r\n 'sass-theme',\r\n 'sass-theme-minified',\r\n 'postprocess',\r\n 'sass-utilities',\r\n 'sass-utilities-minified',\r\n 'bundle',\r\n];\r\n\r\n/** Default pipeline paths */\r\nconst DEFAULT_PIPELINE_PATHS: Required<BuildPipelinePaths> = {\r\n syncSource: 'dist/js/tokens.js',\r\n syncTarget: 'src/tokens-flat.ts',\r\n sassThemeInput: 'src/scss/dsai-theme-bs.scss',\r\n sassThemeOutput: 'dist/css/dsai-theme-bs.css',\r\n sassThemeMinifiedOutput: 'dist/css/dsai-theme-bs.min.css',\r\n sassUtilitiesInput: 'src/scss/dsai-utilities.scss',\r\n sassUtilitiesOutput: 'dist/css/dsai.css',\r\n sassUtilitiesMinifiedOutput: 'dist/css/dsai.min.css',\r\n};\r\n\r\n// ============================================================================\r\n// Build Step Runner\r\n// ============================================================================\r\n\r\n/**\r\n * Run a single build step\r\n */\r\nasync function runStep(\r\n step: BuildStep,\r\n index: number,\r\n total: number,\r\n verbose: boolean\r\n): Promise<boolean> {\r\n const stepNum = `[${index + 1}/${total}]`;\r\n\r\n if (step.skip) {\r\n if (verbose) {\r\n console.info(`${stepNum} ⏭️ ${step.name} (skipped)`);\r\n }\r\n return true;\r\n }\r\n\r\n if (verbose) {\r\n console.info(`\\n${stepNum} 🔧 ${step.name}`);\r\n }\r\n\r\n // If step has a function, run it\r\n if (step.fn) {\r\n try {\r\n // Run function and await if it returns a promise\r\n const result = await step.fn();\r\n // Check if function returned false (failure)\r\n if (result === false) {\r\n console.error(` ❌ Failed: Step returned false`);\r\n return false;\r\n }\r\n if (verbose) {\r\n console.info(' ✅ Done');\r\n }\r\n return true;\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n console.error(` ❌ Failed: ${errorMsg}`);\r\n return false;\r\n }\r\n }\r\n\r\n // Otherwise run command\r\n if (step.command) {\r\n if (verbose) {\r\n const shortCmd = step.command.split(' ').slice(0, 4).join(' ');\r\n console.info(` $ ${shortCmd}...`);\r\n }\r\n\r\n try {\r\n execSync(step.command, {\r\n cwd: step.cwd ?? process.cwd(),\r\n stdio: verbose ? 'inherit' : 'pipe',\r\n env: { ...process.env, FORCE_COLOR: '1' },\r\n });\r\n if (verbose) {\r\n console.info(' ✅ Done');\r\n }\r\n return true;\r\n } catch (error) {\r\n console.error(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n return false;\r\n }\r\n }\r\n\r\n console.warn(` ⚠️ Step ${step.name} has no command or function`);\r\n return true;\r\n}\r\n\r\n// ============================================================================\r\n// Build Steps Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Get merged pipeline paths with defaults\r\n */\r\nfunction getPipelinePaths(customPaths?: BuildPipelinePaths): Required<BuildPipelinePaths> {\r\n return {\r\n ...DEFAULT_PIPELINE_PATHS,\r\n ...customPaths,\r\n };\r\n}\r\n\r\n/**\r\n * Map of step names to human-readable names\r\n * Using Map for safe access (avoids Object Injection Sink)\r\n */\r\nconst STEP_DISPLAY_NAMES = new Map<BuildPipelineStep, string>([\r\n ['validate', 'Validate Tokens'],\r\n ['snapshot', 'Create Snapshot Backup'],\r\n ['preprocess', 'Preprocess Mode Files'],\r\n ['transform', 'Transform Figma Tokens'],\r\n ['style-dictionary', 'Build Style Dictionary'],\r\n ['multi-theme', 'Build Multi-Theme Tokens'],\r\n ['sync', 'Sync tokens-flat.ts'],\r\n ['sass-theme', 'Compile Bootstrap Theme (unminified)'],\r\n ['sass-theme-minified', 'Compile Bootstrap Theme (minified)'],\r\n ['postprocess', 'Post-process Theme CSS'],\r\n ['sass-utilities', 'Compile DSAi Utilities (unminified)'],\r\n ['sass-utilities-minified', 'Compile DSAi Utilities (minified)'],\r\n ['bundle', 'Bundle with tsup'],\r\n]);\r\n\r\n/**\r\n * Create a single build step from step name\r\n */\r\nfunction createStepFromName(\r\n stepName: BuildPipelineStep,\r\n tokensPackageDir: string,\r\n figmaExportsDir: string,\r\n tokensDir: string,\r\n paths: Required<BuildPipelinePaths>,\r\n sdConfigFile: string,\r\n strict: boolean,\r\n snapshotService?: SnapshotService,\r\n themesConfig?: BuildOptions['themesConfig'],\r\n outputDir?: string,\r\n formats: OutputFormat[] = ['css', 'scss', 'json'],\r\n cssOutputDir?: string,\r\n postprocessConfig?: BuildOptions['postprocessConfig'],\r\n prefix?: string\r\n): BuildStep {\r\n const displayName = STEP_DISPLAY_NAMES.get(stepName) ?? `Unknown: ${stepName}`;\r\n\r\n switch (stepName) {\r\n case 'validate':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n // Create minimal config for validation\r\n const config = {\r\n tokens: {\r\n collectionsDir: tokensDir,\r\n sourceDir: figmaExportsDir,\r\n },\r\n } as Parameters<typeof validateTokens>[0];\r\n\r\n const result = await validateTokens(config, {\r\n verbose: true,\r\n strict,\r\n });\r\n\r\n if (!result.valid) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error.message}`);\r\n }\r\n }\r\n return result.valid;\r\n },\r\n };\r\n\r\n case 'snapshot':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n if (!snapshotService) {\r\n console.warn(' ⚠️ Snapshot service not available, skipping');\r\n return true;\r\n }\r\n try {\r\n // tokensDir is collectionsDir from config (e.g., ./src)\r\n // actual collections are in tokensDir/collections\r\n const collectionsPath = join(tokensDir, 'collections');\r\n console.info(` 📂 Snapshot path: ${collectionsPath}`);\r\n const result = snapshotService.createSnapshot(\r\n collectionsPath,\r\n `Pre-transform backup - ${new Date().toISOString()}`\r\n );\r\n\r\n if (!result.success || !result.snapshot) {\r\n console.error(` ❌ Snapshot failed: ${result.error || 'Unknown error'}`);\r\n return false;\r\n }\r\n\r\n console.info(` 📸 Snapshot created: ${result.snapshot.id}`);\r\n console.info(` Files: ${result.snapshot.files.length}`);\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Snapshot failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'preprocess':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n try {\r\n const outputDir = join(figmaExportsDir, '.preprocessed');\r\n console.info(` 📂 Source: ${figmaExportsDir}`);\r\n console.info(` 📂 Output: ${outputDir}`);\r\n\r\n // Get all JSON files from the source directory\r\n const jsonFiles = readdirSync(figmaExportsDir).filter((f) => f.endsWith('.json'));\r\n\r\n if (jsonFiles.length === 0) {\r\n console.warn(` ⚠️ No JSON files found in ${figmaExportsDir}`);\r\n return true; // Not a failure, just skip\r\n }\r\n\r\n const result = preprocessTokenFiles({\r\n sourceDir: figmaExportsDir,\r\n outputDir,\r\n files: jsonFiles,\r\n modesPath: ['Foundation', 'modes'],\r\n verbose: true,\r\n });\r\n\r\n // Only fail if actual processing errors occurred (not \"no modes detected\")\r\n const failedFiles = result.files.filter(\r\n (f) => !f.success && f.error !== 'No modes detected'\r\n );\r\n if (failedFiles.length > 0) {\r\n console.error(` ❌ Preprocessing failed for ${failedFiles.length} file(s)`);\r\n for (const failed of failedFiles) {\r\n console.error(` - ${failed.sourceFile}: ${failed.error ?? 'Unknown error'}`);\r\n }\r\n return false;\r\n }\r\n\r\n const successFiles = result.files.filter((f) => f.success);\r\n const skippedFiles = result.files.filter((f) => f.error === 'No modes detected');\r\n\r\n console.info(` ✅ Preprocessed ${successFiles.length} file(s)`);\r\n if (skippedFiles.length > 0) {\r\n console.info(` ⏭️ Skipped ${skippedFiles.length} file(s) (no modes)`);\r\n }\r\n\r\n const totalModes = result.files.reduce(\r\n (sum: number, file: FilePreprocessingResult) => sum + file.modes.length,\r\n 0\r\n );\r\n console.info(` 📊 Total modes extracted: ${totalModes}`);\r\n\r\n // Store cleanup function for later\r\n preprocessCleanup = result.cleanup;\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Preprocessing failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'transform':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n // Check if preprocessed directory exists and use it instead\r\n const preprocessedDir = join(figmaExportsDir, '.preprocessed');\r\n const sourceDir = existsSync(preprocessedDir) ? preprocessedDir : figmaExportsDir;\r\n\r\n if (sourceDir === preprocessedDir) {\r\n console.info(` 📂 Using preprocessed directory: ${preprocessedDir}`);\r\n }\r\n\r\n const result = transformTokens({\r\n sourceDir,\r\n collectionsDir: tokensDir,\r\n verbose: true,\r\n strict,\r\n });\r\n if (!result.success) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n return result.success;\r\n },\r\n };\r\n\r\n case 'style-dictionary':\r\n return {\r\n name: displayName,\r\n command: `style-dictionary build --config ${sdConfigFile}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'multi-theme':\r\n return {\r\n name: displayName,\r\n fn: async () => {\r\n // Check if themes config is provided and enabled\r\n if (!themesConfig?.enabled || !themesConfig?.definitions) {\r\n console.warn(' ⚠️ Multi-theme build requires themes config with enabled: true');\r\n console.warn(' ℹ️ Falling back to single-theme build via style-dictionary');\r\n return true; // Skip but don't fail\r\n }\r\n\r\n try {\r\n // Build minimal resolved config for theme builder\r\n const definitions = new Map(Object.entries(themesConfig.definitions));\r\n\r\n // Discover theme files\r\n const discoveryResult = discoverThemeFiles(\r\n {\r\n enabled: true,\r\n default: 'light',\r\n autoDetect: true,\r\n ignoreModes: [],\r\n selectorPattern: {\r\n default: ':root',\r\n others: '[data-dsai-theme=\"{mode}\"]',\r\n },\r\n definitions: Object.fromEntries(\r\n Array.from(definitions.entries()).map(([name, def]) => [\r\n name,\r\n {\r\n isDefault: def.isDefault ?? name === 'light',\r\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\r\n selector: def.selector,\r\n mediaQuery: def.mediaQuery,\r\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\r\n outputFiles: {\r\n css:\r\n def.outputFiles?.['css'] ??\r\n (def.isDefault ? 'tokens.css' : `tokens-${name}.css`),\r\n scss:\r\n def.outputFiles?.['scss'] ??\r\n (def.isDefault ? '_variables.scss' : `_variables-${name}.scss`),\r\n js:\r\n def.outputFiles?.['js'] ??\r\n (def.isDefault ? 'tokens.js' : `tokens-${name}.js`),\r\n ts:\r\n def.outputFiles?.['ts'] ??\r\n (def.isDefault ? 'tokens.d.ts' : `tokens-${name}.d.ts`),\r\n json:\r\n def.outputFiles?.['json'] ??\r\n (def.isDefault ? 'tokens.json' : `tokens-${name}.json`),\r\n android:\r\n def.outputFiles?.['android'] ??\r\n (def.isDefault ? 'tokens.xml' : `tokens-${name}.xml`),\r\n ios:\r\n def.outputFiles?.['ios'] ??\r\n (def.isDefault ? 'tokens.h' : `tokens-${name}.h`),\r\n },\r\n },\r\n ])\r\n ),\r\n },\r\n { sourceDir: join(tokensDir, 'collections'), verbose: true }\r\n );\r\n\r\n if (discoveryResult.emptyThemes.length > 0) {\r\n console.warn(\r\n ` ⚠️ Empty themes (no files): ${discoveryResult.emptyThemes.join(', ')}`\r\n );\r\n }\r\n\r\n console.info(\r\n ` 📂 Found ${discoveryResult.totalFiles} files across ${discoveryResult.themes.size} themes`\r\n );\r\n\r\n // Build all themes\r\n const themeFiles = discoveryResult.themes;\r\n\r\n // Convert definitions to the format buildAllThemes expects\r\n const themeDefinitions = Object.fromEntries(\r\n Array.from(definitions.entries()).map(([name, def]) => [\r\n name,\r\n {\r\n isDefault: def.isDefault ?? name === 'light',\r\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\r\n selector: def.selector,\r\n mediaQuery: def.mediaQuery,\r\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\r\n outputFiles: def.outputFiles,\r\n },\r\n ])\r\n );\r\n\r\n const result = await buildAllThemes({\r\n config: {\r\n formats: formats,\r\n prefix: prefix,\r\n themes: {\r\n definitions: themeDefinitions,\r\n },\r\n },\r\n themeFiles,\r\n outputDir: outputDir ?? `${tokensPackageDir}/dist`,\r\n verbose: true,\r\n });\r\n\r\n if (!result.success) {\r\n console.error(` ❌ Multi-theme build failed: ${result.failCount} theme(s) failed`);\r\n for (const themeResult of result.results.filter((r) => !r.success)) {\r\n console.error(` - ${themeResult.themeName}: ${themeResult.error}`);\r\n }\r\n return false;\r\n }\r\n\r\n console.info(` ✅ Built ${result.successCount} themes in ${result.duration}ms`);\r\n return true;\r\n } catch (error) {\r\n console.error(\r\n ` ❌ Multi-theme build error: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n return false;\r\n }\r\n },\r\n };\r\n\r\n case 'sync':\r\n return {\r\n name: displayName,\r\n fn: () =>\r\n syncTokensCLI(tokensPackageDir, {\r\n syncSource: paths.syncSource,\r\n syncTarget: paths.syncTarget,\r\n }),\r\n };\r\n\r\n case 'sass-theme':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeOutput}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'sass-theme-minified':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeMinifiedOutput} --style=compressed`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'postprocess':\r\n return {\r\n name: displayName,\r\n fn: () => {\r\n // Use cssOutputDir or postprocessConfig.cssDir if provided (now absolute paths from CLI)\r\n // Fall back to tokensPackageDir + 'dist/css' if neither is set\r\n const cssDir =\r\n cssOutputDir ?? postprocessConfig?.cssDir ?? join(tokensPackageDir, 'dist/css');\r\n\r\n const result = postprocessCssFiles({\r\n cssDir,\r\n files: postprocessConfig?.files,\r\n replacements: postprocessConfig?.replacements,\r\n verbose: true,\r\n });\r\n return result.success;\r\n },\r\n };\r\n\r\n case 'sass-utilities':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesOutput}`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'sass-utilities-minified':\r\n return {\r\n name: displayName,\r\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesMinifiedOutput} --style=compressed`,\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n case 'bundle':\r\n return {\r\n name: displayName,\r\n command: 'tsup',\r\n cwd: tokensPackageDir,\r\n };\r\n\r\n default:\r\n return {\r\n name: `Unknown step: ${stepName}`,\r\n fn: () => {\r\n console.warn(`⚠️ Unknown pipeline step: ${stepName}`);\r\n return true;\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Create build steps based on options and pipeline configuration\r\n */\r\nfunction createBuildSteps(\r\n tokensDir: string,\r\n _toolsDir: string,\r\n options: BuildOptions,\r\n pipeline?: TokensBuildPipeline\r\n): BuildStep[] {\r\n const { skipValidate, skipTransform, onlyTheme, strict = false } = options;\r\n\r\n // Get the tokens package root directory\r\n // tokensDir is typically the collections dir (e.g., packages/@dsai-io/tokens/collections)\r\n // We need the package root for running commands\r\n const tokensPackageDir = tokensDir.endsWith('/collections')\r\n ? dirname(tokensDir)\r\n : dirname(tokensDir);\r\n\r\n // Path to figma-exports source directory\r\n // Use sourceDir from options if provided, otherwise use sibling directory\r\n const figmaExportsDir = options.sourceDir ?? `${tokensPackageDir}/figma-exports`;\r\n\r\n // Initialize snapshot service for backup/rollback\r\n const snapshotService = new SnapshotService({\r\n snapshotDir: `${tokensPackageDir}/.snapshots`,\r\n maxSnapshots: 10,\r\n include: ['**/*.json'],\r\n });\r\n\r\n // Get pipeline configuration\r\n const pipelineSteps = pipeline?.steps ?? DEFAULT_PIPELINE_STEPS;\r\n const paths = getPipelinePaths(pipeline?.paths);\r\n const sdConfigFile = pipeline?.styleDictionaryConfig ?? 'sd.config.mjs';\r\n\r\n // Get formats from options (default: css, scss, json - no js/ts by default to avoid numeric identifier issues)\r\n const formats = (options.formats ?? ['css', 'scss', 'json']) as OutputFormat[];\r\n\r\n // Build steps based on pipeline configuration\r\n const steps: BuildStep[] = [];\r\n\r\n for (const stepName of pipelineSteps) {\r\n const step = createStepFromName(\r\n stepName,\r\n tokensPackageDir,\r\n figmaExportsDir,\r\n tokensDir,\r\n paths,\r\n sdConfigFile,\r\n strict,\r\n snapshotService,\r\n options.themesConfig,\r\n options.outputDir,\r\n formats,\r\n options.cssOutputDir,\r\n options.postprocessConfig,\r\n options.prefix\r\n );\r\n\r\n // Apply skip flags based on legacy options\r\n if (stepName === 'validate' && skipValidate) {\r\n step.skip = true;\r\n }\r\n if (stepName === 'transform' && (skipTransform || onlyTheme)) {\r\n step.skip = true;\r\n }\r\n if (onlyTheme && !['sass-theme', 'sass-theme-minified', 'postprocess'].includes(stepName)) {\r\n // Only run theme-related steps when onlyTheme is true\r\n if (!['validate'].includes(stepName)) {\r\n step.skip = true;\r\n }\r\n }\r\n\r\n steps.push(step);\r\n }\r\n\r\n return steps;\r\n}\r\n\r\n// ============================================================================\r\n// Main Build Function\r\n// ============================================================================\r\n\r\n/**\r\n * Run the complete token build pipeline\r\n *\r\n * @example\r\n * ```typescript\r\n * // Full build\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * });\r\n *\r\n * // Skip validation\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * skipValidate: true,\r\n * });\r\n *\r\n * // Only build theme CSS\r\n * const result = buildTokens({\r\n * tokensDir: './packages/@dsai-io/tokens',\r\n * toolsDir: './tools/scripts/tokens',\r\n * onlyTheme: true,\r\n * });\r\n * ```\r\n */\r\nexport async function buildTokens(\r\n tokensDir: string,\r\n toolsDir: string,\r\n options: BuildOptions = {}\r\n): Promise<BuildResult> {\r\n const {\r\n skipValidate,\r\n onlyTheme,\r\n verbose = true,\r\n quiet = false,\r\n incremental = false,\r\n force = false,\r\n cacheDir,\r\n } = options;\r\n\r\n // Use config values from options (already passed from CLI)\r\n // No need to reload config here - CLI already loaded it\r\n const cssOutputDir = options.cssOutputDir;\r\n const postprocessConfig = options.postprocessConfig;\r\n\r\n // Pass config to options so createBuildSteps can access it\r\n const optionsWithConfig: BuildOptions = {\r\n ...options,\r\n cssOutputDir,\r\n postprocessConfig,\r\n };\r\n\r\n const startTime = Date.now();\r\n const stepsCompleted: string[] = [];\r\n const stepsFailed: string[] = [];\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Verify directories exist\r\n try {\r\n if (!existsSync(tokensDir)) {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Tokens directory not found: ${tokensDir}`],\r\n warnings,\r\n };\r\n }\r\n } catch {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Failed to check tokens directory: ${tokensDir}`],\r\n warnings,\r\n };\r\n }\r\n\r\n try {\r\n if (!existsSync(toolsDir)) {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Tools directory not found: ${toolsDir}`],\r\n warnings,\r\n };\r\n }\r\n } catch {\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed: ['Directory Check'],\r\n duration: Date.now() - startTime,\r\n errors: [`Failed to check tools directory: ${toolsDir}`],\r\n warnings,\r\n };\r\n }\r\n\r\n // Print header\r\n if (verbose && !quiet) {\r\n console.info('╔════════════════════════════════════════════════════════════╗');\r\n console.info('║ DSAi Tokens - Complete Build ║');\r\n console.info('╚════════════════════════════════════════════════════════════╝');\r\n\r\n if (skipValidate) {\r\n console.info('⚠️ Skipping validation (--skip-validate)');\r\n }\r\n if (onlyTheme) {\r\n console.info('⚠️ Building only theme CSS (--only-theme)');\r\n }\r\n if (incremental) {\r\n console.info('🔄 Incremental build enabled');\r\n if (force) {\r\n console.info('⚡ Force rebuild - ignoring cache');\r\n }\r\n }\r\n }\r\n\r\n // Initialize cache service for incremental builds\r\n let cacheService: CacheService | undefined;\r\n let incrementalAnalysis: Awaited<ReturnType<typeof analyzeChanges>> | undefined;\r\n\r\n if (incremental) {\r\n cacheService = new CacheService({\r\n cacheDir: cacheDir || `${tokensDir}/.dsai-cache`,\r\n enabled: true,\r\n });\r\n\r\n // Analyze what needs to be rebuilt\r\n const figmaExportsDir = `${tokensDir}/figma-exports`;\r\n const incrementalOptions: IncrementalOptions = {\r\n enabled: true,\r\n force,\r\n cacheService,\r\n verbose: verbose && !quiet,\r\n };\r\n\r\n incrementalAnalysis = await analyzeChanges(figmaExportsDir, incrementalOptions);\r\n\r\n // If no changes detected, skip build\r\n if (!incrementalAnalysis.needsFullBuild && incrementalAnalysis.changedFiles.length === 0) {\r\n const duration = Date.now() - startTime;\r\n\r\n if (verbose && !quiet) {\r\n console.info(generateIncrementalReport(incrementalAnalysis, startTime, 0, 0));\r\n }\r\n\r\n return {\r\n success: true,\r\n stepsCompleted: ['Cache Check'],\r\n stepsFailed: [],\r\n duration,\r\n errors: [],\r\n warnings: ['No changes detected - build skipped'],\r\n };\r\n }\r\n }\r\n\r\n // Create and run build steps\r\n const steps = createBuildSteps(\r\n tokensDir,\r\n toolsDir,\r\n optionsWithConfig,\r\n optionsWithConfig.pipeline\r\n );\r\n\r\n for (const step of steps) {\r\n const stepIndex = steps.indexOf(step);\r\n const success = await runStep(step, stepIndex, steps.length, verbose && !quiet);\r\n\r\n if (success) {\r\n if (!step.skip) {\r\n stepsCompleted.push(step.name);\r\n }\r\n } else {\r\n stepsFailed.push(step.name);\r\n errors.push(`Build failed at step: ${step.name}`);\r\n\r\n // Stop on first failure\r\n const failDuration = Date.now() - startTime;\r\n\r\n if (verbose && !quiet) {\r\n console.error(`\\n💥 Build failed at step: ${step.name}`);\r\n }\r\n\r\n return {\r\n success: false,\r\n stepsCompleted,\r\n stepsFailed,\r\n duration: failDuration,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n }\r\n\r\n const duration = Date.now() - startTime;\r\n const durationSec = (duration / 1000).toFixed(2);\r\n\r\n // Update cache after successful build\r\n if (incremental && cacheService && incrementalAnalysis) {\r\n const figmaExportsDir = `${tokensDir}/figma-exports`;\r\n const collectionsDir = `${tokensDir}/collections`;\r\n\r\n await updateCacheAfterBuild(\r\n cacheService,\r\n incrementalAnalysis.changedFiles,\r\n [], // Output files - would need to track from transform step\r\n figmaExportsDir,\r\n collectionsDir,\r\n verbose && !quiet\r\n );\r\n\r\n // Show incremental build report\r\n if (verbose && !quiet) {\r\n console.info(\r\n generateIncrementalReport(\r\n incrementalAnalysis,\r\n startTime,\r\n stepsCompleted.length,\r\n steps.length\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Cleanup preprocessed files if they exist\r\n if (preprocessCleanup) {\r\n try {\r\n preprocessCleanup();\r\n if (verbose && !quiet) {\r\n console.info('🧹 Cleaned up preprocessed files');\r\n }\r\n } catch (error) {\r\n if (verbose && !quiet) {\r\n console.warn(\r\n `⚠️ Failed to cleanup preprocessed files: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n );\r\n }\r\n } finally {\r\n preprocessCleanup = null;\r\n }\r\n }\r\n\r\n // Print footer\r\n if (verbose && !quiet) {\r\n console.info('\\n╔════════════════════════════════════════════════════════════╗');\r\n console.info('║ ✅ Build Complete ║');\r\n console.info(\r\n `║ 📊 ${stepsCompleted.length} steps passed in ${durationSec}s ║`\r\n );\r\n console.info('╚════════════════════════════════════════════════════════════╝');\r\n }\r\n\r\n return {\r\n success: true,\r\n stepsCompleted,\r\n stepsFailed,\r\n duration,\r\n errors,\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for token build\r\n */\r\nexport async function buildTokensCLI(\r\n tokensDir: string,\r\n toolsDir: string,\r\n args: string[] = []\r\n): Promise<boolean> {\r\n const skipValidate = args.includes('--skip-validate');\r\n const skipTransform = args.includes('--skip-transform');\r\n const onlyTheme = args.includes('--only-theme');\r\n const quiet = args.includes('--quiet') || args.includes('-q');\r\n const strict = args.includes('--strict');\r\n const incremental = args.includes('--incremental') || args.includes('--cache');\r\n const force = args.includes('--force');\r\n\r\n // Extract --cache-dir argument\r\n const cacheDirIndex = args.findIndex((arg) => arg.startsWith('--cache-dir='));\r\n const cacheDirArg = cacheDirIndex >= 0 ? args.at(cacheDirIndex) : undefined;\r\n const cacheDir = cacheDirArg?.split('=')[1];\r\n\r\n const result = await buildTokens(tokensDir, toolsDir, {\r\n skipValidate,\r\n skipTransform,\r\n onlyTheme,\r\n verbose: !quiet,\r\n quiet,\r\n strict,\r\n incremental,\r\n force,\r\n cacheDir,\r\n });\r\n\r\n return result.success;\r\n}\r\n\r\n/**\r\n * Parse CLI arguments and run build\r\n * Used as the main entry point when called directly\r\n */\r\nexport async function runBuildCLI(tokensDir: string, toolsDir: string): Promise<void> {\r\n const args = process.argv.slice(2);\r\n const success = await buildTokensCLI(tokensDir, toolsDir, args);\r\n process.exit(success ? 0 : 1);\r\n}\r\n","/**\r\n * @file Token Clean Module\r\n * @description Provides functionality to clean token output directories before builds.\r\n *\r\n * This module supports:\r\n * - Cleaning individual output directories (dist/css, dist/js, etc.)\r\n * - Cleaning all build outputs\r\n * - Dry-run mode to preview what would be deleted\r\n * - Safe deletion with directory validation\r\n *\r\n * @module @dsai-io/tools/tokens/clean\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\r\nimport { basename, join, resolve } from 'node:path';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Clean operation options\r\n */\r\nexport interface CleanOptions {\r\n /**\r\n * Base directory for cleaning (typically the package root)\r\n * @default process.cwd()\r\n */\r\n baseDir?: string;\r\n\r\n /**\r\n * Directories to clean relative to baseDir\r\n * @default ['dist']\r\n */\r\n directories?: string[];\r\n\r\n /**\r\n * Show what would be deleted without actually deleting\r\n * @default false\r\n */\r\n dryRun?: boolean;\r\n\r\n /**\r\n * Enable verbose logging\r\n * @default false\r\n */\r\n verbose?: boolean;\r\n\r\n /**\r\n * File patterns to preserve (glob patterns)\r\n * Files matching these patterns will not be deleted\r\n * @example ['.gitkeep', 'README.md']\r\n */\r\n preserve?: string[];\r\n}\r\n\r\n/**\r\n * Information about a cleaned directory\r\n */\r\nexport interface CleanedDirectory {\r\n /** Path to the cleaned directory */\r\n path: string;\r\n\r\n /** Number of files removed */\r\n filesRemoved: number;\r\n\r\n /** Number of directories removed */\r\n directoriesRemoved: number;\r\n\r\n /** Whether the directory existed before cleaning */\r\n existed: boolean;\r\n}\r\n\r\n/**\r\n * Result of a clean operation\r\n */\r\nexport interface CleanResult {\r\n /** Whether the clean operation completed successfully */\r\n success: boolean;\r\n\r\n /** List of cleaned directories with details */\r\n cleaned: CleanedDirectory[];\r\n\r\n /** Total number of files removed */\r\n totalFilesRemoved: number;\r\n\r\n /** Total number of directories removed */\r\n totalDirectoriesRemoved: number;\r\n\r\n /** Any errors encountered */\r\n errors: string[];\r\n\r\n /** Any warnings (non-blocking issues) */\r\n warnings: string[];\r\n\r\n /** Whether this was a dry run */\r\n dryRun: boolean;\r\n\r\n /** Duration of the operation in milliseconds */\r\n duration: number;\r\n}\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default directories to clean for token builds\r\n */\r\nexport const DEFAULT_CLEAN_DIRECTORIES = ['dist'] as const;\r\n\r\n/**\r\n * Files to always preserve\r\n */\r\nconst ALWAYS_PRESERVE = ['.gitkeep', '.gitignore'] as const;\r\n\r\n/**\r\n * Directories that should never be cleaned (safety check)\r\n */\r\nconst PROTECTED_DIRECTORIES = [\r\n 'src',\r\n 'node_modules',\r\n '.git',\r\n '.github',\r\n 'test',\r\n 'tests',\r\n '__tests__',\r\n 'docs',\r\n 'config',\r\n] as const;\r\n\r\n// ============================================================================\r\n// Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate that a directory is safe to clean\r\n *\r\n * @param dirPath - Absolute path to the directory\r\n * @param baseDir - Base directory for relative validation\r\n * @returns Validation result with error message if invalid\r\n */\r\nfunction validateCleanTarget(dirPath: string, baseDir: string): { valid: boolean; error?: string } {\r\n // Ensure path is within baseDir (prevent directory traversal)\r\n const resolvedDir = resolve(dirPath);\r\n const resolvedBase = resolve(baseDir);\r\n\r\n if (!resolvedDir.startsWith(resolvedBase)) {\r\n return {\r\n valid: false,\r\n error: `Directory \"${dirPath}\" is outside base directory \"${baseDir}\"`,\r\n };\r\n }\r\n\r\n // Check for protected directories\r\n const dirName = basename(resolvedDir);\r\n if (PROTECTED_DIRECTORIES.includes(dirName as (typeof PROTECTED_DIRECTORIES)[number])) {\r\n return {\r\n valid: false,\r\n error: `Directory \"${dirName}\" is protected and cannot be cleaned`,\r\n };\r\n }\r\n\r\n // Don't allow cleaning the base directory itself\r\n if (resolvedDir === resolvedBase) {\r\n return {\r\n valid: false,\r\n error: 'Cannot clean the base directory itself',\r\n };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Match a string against a glob pattern using dynamic programming\r\n * Safely handles * (any chars) and ? (single char) without regex\r\n *\r\n * @param str - String to match\r\n * @param pattern - Glob pattern\r\n * @returns Whether the string matches the pattern\r\n */\r\nfunction matchGlobDP(str: string, pattern: string): boolean {\r\n const m = str.length;\r\n const n = pattern.length;\r\n\r\n // Use a Map for type-safe access instead of 2D array\r\n const dp = new Map<string, boolean>();\r\n const key = (i: number, j: number): string => `${i},${j}`;\r\n const get = (i: number, j: number): boolean => dp.get(key(i, j)) ?? false;\r\n const set = (i: number, j: number, val: boolean): void => {\r\n dp.set(key(i, j), val);\r\n };\r\n\r\n // Initialize all to false (Map returns undefined -> false via get helper)\r\n // Empty pattern matches empty string\r\n set(0, 0, true);\r\n\r\n // Handle patterns starting with *\r\n for (let j = 1; j <= n; j++) {\r\n if (pattern[j - 1] === '*') {\r\n set(0, j, get(0, j - 1));\r\n }\r\n }\r\n\r\n // Fill the DP table\r\n for (let i = 1; i <= m; i++) {\r\n for (let j = 1; j <= n; j++) {\r\n const pChar = pattern[j - 1];\r\n\r\n if (pChar === '*') {\r\n // * can match zero chars (dp[i][j-1]) or one+ chars (dp[i-1][j])\r\n set(i, j, get(i, j - 1) || get(i - 1, j));\r\n } else if (pChar === '?' || pChar === str[i - 1]) {\r\n // ? matches any single char, or exact character match\r\n set(i, j, get(i - 1, j - 1));\r\n }\r\n // else remains false (not set in Map)\r\n }\r\n }\r\n\r\n return get(m, n);\r\n}\r\n\r\n/**\r\n * Match a filename against a glob pattern safely\r\n * Uses optimized string methods for simple patterns, DP algorithm for complex ones\r\n *\r\n * @param fileName - Name of the file to match\r\n * @param pattern - Glob pattern (supports * and ? wildcards)\r\n * @returns Whether the filename matches the pattern\r\n */\r\nfunction matchGlobPattern(fileName: string, pattern: string): boolean {\r\n // For patterns without wildcards, use exact match\r\n if (!pattern.includes('*') && !pattern.includes('?')) {\r\n return fileName === pattern;\r\n }\r\n\r\n // For simple extension patterns like \"*.json\", use endsWith for safety\r\n if (pattern.startsWith('*.') && !pattern.slice(2).includes('*') && !pattern.includes('?')) {\r\n const extension = pattern.slice(1); // \".json\"\r\n return fileName.endsWith(extension);\r\n }\r\n\r\n // For simple prefix patterns like \"file*\", use startsWith for safety\r\n if (pattern.endsWith('*') && !pattern.slice(0, -1).includes('*') && !pattern.includes('?')) {\r\n const prefix = pattern.slice(0, -1);\r\n return fileName.startsWith(prefix);\r\n }\r\n\r\n // For complex patterns, use safe DP-based glob matching (no regex)\r\n return matchGlobDP(fileName, pattern);\r\n}\r\n\r\n/**\r\n * Check if a file should be preserved\r\n *\r\n * @param fileName - Name of the file\r\n * @param preservePatterns - Additional patterns to preserve\r\n * @returns Whether the file should be preserved\r\n */\r\nfunction shouldPreserve(fileName: string, preservePatterns: string[]): boolean {\r\n const allPatterns = [...ALWAYS_PRESERVE, ...preservePatterns];\r\n return allPatterns.some((pattern) => matchGlobPattern(fileName, pattern));\r\n}\r\n\r\n// ============================================================================\r\n// Directory Cleaning\r\n// ============================================================================\r\n\r\n/**\r\n * Count files and directories in a path recursively\r\n *\r\n * @param dirPath - Path to count\r\n * @returns Object with file and directory counts\r\n */\r\nfunction countContents(dirPath: string): { files: number; dirs: number } {\r\n if (!existsSync(dirPath)) {\r\n return { files: 0, dirs: 0 };\r\n }\r\n\r\n let files = 0;\r\n let dirs = 0;\r\n\r\n const entries = readdirSync(dirPath, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n dirs++;\r\n const subCounts = countContents(join(dirPath, entry.name));\r\n files += subCounts.files;\r\n dirs += subCounts.dirs;\r\n } else {\r\n files++;\r\n }\r\n }\r\n\r\n return { files, dirs };\r\n}\r\n\r\n/**\r\n * Clean a single directory\r\n *\r\n * @param dirPath - Absolute path to the directory to clean\r\n * @param options - Clean options\r\n * @returns Cleaned directory info\r\n */\r\nfunction cleanDirectory(\r\n dirPath: string,\r\n options: Required<Pick<CleanOptions, 'dryRun' | 'verbose' | 'preserve'>>\r\n): CleanedDirectory {\r\n const existed = existsSync(dirPath);\r\n\r\n if (!existed) {\r\n if (options.verbose) {\r\n console.info(` ℹ️ Directory does not exist: ${dirPath}`);\r\n }\r\n return {\r\n path: dirPath,\r\n filesRemoved: 0,\r\n directoriesRemoved: 0,\r\n existed: false,\r\n };\r\n }\r\n\r\n // Count contents before deletion\r\n const counts = countContents(dirPath);\r\n\r\n if (options.dryRun) {\r\n if (options.verbose) {\r\n console.info(\r\n ` 🔍 Would remove: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`\r\n );\r\n }\r\n return {\r\n path: dirPath,\r\n filesRemoved: counts.files,\r\n directoriesRemoved: counts.dirs,\r\n existed: true,\r\n };\r\n }\r\n\r\n // Check for files to preserve\r\n const entries = readdirSync(dirPath, { withFileTypes: true });\r\n const toPreserve = entries.filter((e) => shouldPreserve(e.name, options.preserve));\r\n\r\n if (toPreserve.length > 0) {\r\n // Delete contents except preserved files\r\n for (const entry of entries) {\r\n if (shouldPreserve(entry.name, options.preserve)) {\r\n if (options.verbose) {\r\n console.info(` 📌 Preserving: ${entry.name}`);\r\n }\r\n continue;\r\n }\r\n\r\n const entryPath = join(dirPath, entry.name);\r\n rmSync(entryPath, { recursive: true, force: true });\r\n }\r\n } else {\r\n // Delete entire directory\r\n rmSync(dirPath, { recursive: true, force: true });\r\n }\r\n\r\n if (options.verbose) {\r\n console.info(` ✅ Cleaned: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`);\r\n }\r\n\r\n return {\r\n path: dirPath,\r\n filesRemoved: counts.files,\r\n directoriesRemoved: counts.dirs,\r\n existed: true,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n\r\n/**\r\n * Clean token output directories\r\n *\r\n * Removes build artifacts from output directories to ensure a fresh build.\r\n * Supports dry-run mode, preserve patterns, and safety validation.\r\n *\r\n * @param options - Clean operation options\r\n * @returns Clean operation result\r\n *\r\n * @example\r\n * // Clean default dist directory\r\n * const result = cleanTokenOutputs();\r\n *\r\n * @example\r\n * // Clean specific directories with dry-run\r\n * const result = cleanTokenOutputs({\r\n * directories: ['dist/css', 'dist/js'],\r\n * dryRun: true,\r\n * verbose: true,\r\n * });\r\n *\r\n * @example\r\n * // Clean with preserved files\r\n * const result = cleanTokenOutputs({\r\n * preserve: ['README.md', '*.d.ts'],\r\n * });\r\n */\r\nexport function cleanTokenOutputs(options: CleanOptions = {}): CleanResult {\r\n const startTime = Date.now();\r\n\r\n // Normalize options with defaults\r\n const normalizedOptions = {\r\n baseDir: options.baseDir ?? process.cwd(),\r\n directories: options.directories ?? [...DEFAULT_CLEAN_DIRECTORIES],\r\n dryRun: options.dryRun ?? false,\r\n verbose: options.verbose ?? false,\r\n preserve: options.preserve ?? [],\r\n };\r\n\r\n const result: CleanResult = {\r\n success: true,\r\n cleaned: [],\r\n totalFilesRemoved: 0,\r\n totalDirectoriesRemoved: 0,\r\n errors: [],\r\n warnings: [],\r\n dryRun: normalizedOptions.dryRun,\r\n duration: 0,\r\n };\r\n\r\n if (normalizedOptions.verbose) {\r\n const modeStr = normalizedOptions.dryRun ? '(dry-run)' : '';\r\n console.info(`\\n🧹 Cleaning token outputs ${modeStr}`);\r\n console.info(` Base: ${normalizedOptions.baseDir}`);\r\n }\r\n\r\n // Validate and clean each directory\r\n for (const dir of normalizedOptions.directories) {\r\n const absolutePath = resolve(normalizedOptions.baseDir, dir);\r\n\r\n // Validate target\r\n const validation = validateCleanTarget(absolutePath, normalizedOptions.baseDir);\r\n if (!validation.valid && validation.error) {\r\n result.errors.push(validation.error);\r\n result.success = false;\r\n continue;\r\n }\r\n\r\n // Clean directory\r\n try {\r\n const cleaned = cleanDirectory(absolutePath, {\r\n dryRun: normalizedOptions.dryRun,\r\n verbose: normalizedOptions.verbose,\r\n preserve: normalizedOptions.preserve,\r\n });\r\n\r\n result.cleaned.push(cleaned);\r\n result.totalFilesRemoved += cleaned.filesRemoved;\r\n result.totalDirectoriesRemoved += cleaned.directoriesRemoved;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n result.errors.push(`Failed to clean \"${dir}\": ${errorMessage}`);\r\n result.success = false;\r\n }\r\n }\r\n\r\n result.duration = Date.now() - startTime;\r\n\r\n if (normalizedOptions.verbose) {\r\n console.info('');\r\n if (result.success) {\r\n const actionStr = normalizedOptions.dryRun ? 'Would remove' : 'Removed';\r\n console.info(\r\n `✅ ${actionStr} ${result.totalFilesRemoved} files, ` +\r\n `${result.totalDirectoriesRemoved} directories in ${result.duration}ms`\r\n );\r\n } else {\r\n console.error('❌ Clean failed with errors:');\r\n for (const error of result.errors) {\r\n console.error(` - ${error}`);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * CLI wrapper for cleanTokenOutputs\r\n *\r\n * Provides formatted output suitable for CLI usage.\r\n *\r\n * @param baseDir - Base directory for the clean operation\r\n * @param options - Clean options\r\n * @returns Whether the clean was successful\r\n */\r\nexport function cleanTokensCLI(\r\n baseDir: string,\r\n options: Omit<CleanOptions, 'baseDir'> = {}\r\n): boolean {\r\n const result = cleanTokenOutputs({\r\n ...options,\r\n baseDir,\r\n verbose: options.verbose ?? true,\r\n });\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * @file Token Collections Merge Module\r\n * @description Merge multiple Figma Tokens Studio collection files into one unified collection\r\n *\r\n * Features:\r\n * - Intelligently merges nested token structures\r\n * - Preserves all metadata ($codeSyntax, $scopes, $type, etc.)\r\n * - Maintains token references and aliases\r\n * - Handles mode-based tokens (Light Mode, Dark Mode)\r\n * - Deep merges sections without overwriting\r\n * - Normalizes reference format to lowercase {colors.path}\r\n * - Adds $libraryName and $collectionName to aliased tokens\r\n * - Sorts properties alphabetically for consistency\r\n * - Removes duplicate sections (like \"hue\" that duplicates \"brand\")\r\n *\r\n * @module @dsai-io/tools/tokens/merge\r\n */\r\n\r\n/* eslint-disable no-console */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\n\r\nimport type { MergeOptions, MergeResult } from './types';\r\n\r\n// ============================================================================\r\n// Type Definitions\r\n// ============================================================================\r\n\r\ntype TokenValue = string | number | boolean | null | TokenObject | TokenValue[];\r\n\r\ninterface TokenObject {\r\n [key: string]: TokenValue;\r\n}\r\n\r\ntype CollectionData = TokenObject[];\r\n\r\n// ============================================================================\r\n// Token Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if an object is a token (has $type or $value)\r\n */\r\nfunction isToken(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n const record = obj as Record<string, unknown>;\r\n return '$type' in record || '$value' in record;\r\n}\r\n\r\n/**\r\n * Check if an object has child tokens\r\n */\r\nfunction hasChildTokens(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n const record = obj as Record<string, unknown>;\r\n for (const key of Object.keys(record)) {\r\n if (!key.startsWith('$') && typeof record[key] === 'object') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n// ============================================================================\r\n// Deep Merge\r\n// ============================================================================\r\n\r\n/**\r\n * Deep merge two objects, preserving all properties\r\n * Special handling: If target has child tokens and source is a token,\r\n * or vice versa, prioritize the structure with children\r\n */\r\nfunction deepMerge(\r\n target: TokenObject | undefined,\r\n source: TokenObject,\r\n verbose = false\r\n): TokenObject {\r\n const result: TokenObject = target ? { ...target } : {};\r\n\r\n // Check for conflict: one is a token, the other has child tokens\r\n const targetIsToken = isToken(target);\r\n const sourceIsToken = isToken(source);\r\n const targetHasChildren = hasChildTokens(target);\r\n const sourceHasChildren = hasChildTokens(source);\r\n\r\n if (targetHasChildren && sourceIsToken) {\r\n if (verbose) {\r\n console.info(' ⚠️ Skipping single token in favor of children structure');\r\n }\r\n return result;\r\n }\r\n\r\n if (sourceHasChildren && targetIsToken) {\r\n if (verbose) {\r\n console.info(' ⚠️ Replacing single token with children structure');\r\n }\r\n return { ...source };\r\n }\r\n\r\n for (const key of Object.keys(source)) {\r\n const sourceValue = source[key];\r\n const targetValue = result[key];\r\n\r\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\r\n // Recursively merge nested objects\r\n result[key] = deepMerge(\r\n targetValue as TokenObject | undefined,\r\n sourceValue as TokenObject,\r\n verbose\r\n );\r\n } else if (Array.isArray(sourceValue)) {\r\n // Concatenate arrays\r\n const existingArray = Array.isArray(targetValue) ? targetValue : [];\r\n result[key] = [...existingArray, ...sourceValue];\r\n } else if (sourceValue !== undefined) {\r\n // Overwrite primitive values (source takes precedence)\r\n result[key] = sourceValue;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Token Counting\r\n// ============================================================================\r\n\r\n/**\r\n * Count tokens recursively in a nested structure\r\n */\r\nfunction countTokens(obj: unknown): number {\r\n if (!obj || typeof obj !== 'object') {\r\n return 0;\r\n }\r\n\r\n let count = 0;\r\n const record = obj as Record<string, unknown>;\r\n\r\n for (const key of Object.keys(record)) {\r\n const value = record[key];\r\n\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n const valueRecord = value as Record<string, unknown>;\r\n // Check if this is a token\r\n if ('$type' in valueRecord || '$value' in valueRecord) {\r\n count++;\r\n } else {\r\n // Recursively count nested tokens\r\n count += countTokens(value);\r\n }\r\n }\r\n }\r\n\r\n return count;\r\n}\r\n\r\n// ============================================================================\r\n// Reference Normalization\r\n// ============================================================================\r\n\r\n/**\r\n * Update token references to match new collection name\r\n * Normalizes to lowercase format: {colors.path} instead of {Colors.path}\r\n */\r\nfunction updateReferences(\r\n obj: TokenObject,\r\n oldName: string,\r\n newName: string,\r\n collectionName: string\r\n): void {\r\n const normalizedOld = oldName.toLowerCase().replace(/\\s+/g, '');\r\n const normalizedNew = newName.toLowerCase().replace(/\\s+/g, '');\r\n\r\n // Build patterns to match (case-insensitive)\r\n const patternsLower = [`{${oldName.toLowerCase()}.`, `{${normalizedOld}.`];\r\n\r\n for (const key of Object.keys(obj)) {\r\n const value = obj[key];\r\n\r\n if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) {\r\n // This is a token reference - normalize to lowercase\r\n let newValue = value;\r\n const valueLower = value.toLowerCase();\r\n\r\n for (const pattern of patternsLower) {\r\n if (valueLower.startsWith(pattern)) {\r\n // Replace the prefix with the normalized version\r\n const suffix = value.slice(pattern.length);\r\n newValue = `{${normalizedNew}.${suffix}`;\r\n break;\r\n }\r\n }\r\n obj[key] = newValue;\r\n\r\n // Add metadata for aliased tokens\r\n if ((obj[key] as string).startsWith('{')) {\r\n if (!('$libraryName' in obj)) {\r\n obj['$libraryName'] = '';\r\n }\r\n if (!('$collectionName' in obj)) {\r\n obj['$collectionName'] = collectionName;\r\n }\r\n }\r\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n updateReferences(value as TokenObject, oldName, newName, collectionName);\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Property Sorting\r\n// ============================================================================\r\n\r\n/**\r\n * Sort object properties alphabetically, with $ properties first\r\n */\r\nfunction sortProperties(obj: unknown): unknown {\r\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\r\n return obj;\r\n }\r\n\r\n const record = obj as Record<string, unknown>;\r\n const sorted: Record<string, unknown> = {};\r\n const keys = Object.keys(record).sort((a, b) => {\r\n // $ properties first, then alphabetically\r\n const aIsMeta = a.startsWith('$');\r\n const bIsMeta = b.startsWith('$');\r\n if (aIsMeta && !bIsMeta) {\r\n return -1;\r\n }\r\n if (!aIsMeta && bIsMeta) {\r\n return 1;\r\n }\r\n return a.localeCompare(b);\r\n });\r\n\r\n for (const key of keys) {\r\n sorted[key] = sortProperties(record[key]);\r\n }\r\n\r\n return sorted;\r\n}\r\n\r\n// ============================================================================\r\n// Duplicate Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a section is a duplicate/alias section\r\n * (e.g., \"hue\" that just references \"brand\")\r\n */\r\nfunction isDuplicateSection(obj: unknown): boolean {\r\n if (!obj || typeof obj !== 'object') {\r\n return false;\r\n }\r\n\r\n let hasOnlyReferences = true;\r\n let referenceCount = 0;\r\n\r\n function checkReferences(item: Record<string, unknown>): void {\r\n for (const key of Object.keys(item)) {\r\n if (key.startsWith('$')) {\r\n continue;\r\n }\r\n\r\n const value = item[key];\r\n if (value && typeof value === 'object' && !Array.isArray(value)) {\r\n const valueRecord = value as Record<string, unknown>;\r\n if ('$value' in valueRecord) {\r\n referenceCount++;\r\n if (\r\n typeof valueRecord['$value'] === 'string' &&\r\n (valueRecord['$value'] as string).startsWith('{')\r\n ) {\r\n continue;\r\n } else {\r\n hasOnlyReferences = false;\r\n return;\r\n }\r\n }\r\n checkReferences(valueRecord);\r\n }\r\n }\r\n }\r\n\r\n checkReferences(obj as Record<string, unknown>);\r\n return hasOnlyReferences && referenceCount > 10;\r\n}\r\n\r\n/**\r\n * Get collection name from file structure\r\n */\r\nfunction getCollectionName(data: CollectionData): string | null {\r\n if (Array.isArray(data) && data[0]) {\r\n const keys = Object.keys(data[0]);\r\n return keys[0] ?? null;\r\n }\r\n return null;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Load and parse JSON file\r\n */\r\nfunction loadJSON(filePath: string, verbose: boolean): CollectionData | null {\r\n try {\r\n const fullPath = resolve(filePath);\r\n if (verbose) {\r\n console.info(`📖 Reading: ${fullPath}`);\r\n }\r\n const content = readFileSync(fullPath, 'utf-8');\r\n return JSON.parse(content) as CollectionData;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Save JSON to file with pretty formatting\r\n */\r\nfunction saveJSON(filePath: string, data: unknown, verbose: boolean): boolean {\r\n try {\r\n const fullPath = resolve(filePath);\r\n const content = JSON.stringify(data, null, 2);\r\n writeFileSync(fullPath, content, 'utf-8');\r\n if (verbose) {\r\n console.info(`✅ Saved: ${fullPath}`);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Merge multiple collection files into one\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = mergeCollections({\r\n * sourceFiles: ['colors-scales.json', 'colors.json'],\r\n * outputFile: 'merged-colors.json',\r\n * });\r\n * ```\r\n */\r\nexport function mergeCollections(options: MergeOptions): MergeResult {\r\n const { sourceFiles, outputFile, strategy = 'last', dryRun = false, verbose = false } = options;\r\n\r\n const errors: string[] = [];\r\n const conflicts: string[] = [];\r\n\r\n if (sourceFiles.length < 2) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: ['At least two source files are required'],\r\n };\r\n }\r\n\r\n // Validate files exist\r\n for (const file of sourceFiles) {\r\n if (!existsSync(file)) {\r\n errors.push(`Source file not found: ${file}`);\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors,\r\n };\r\n }\r\n\r\n if (verbose) {\r\n console.info('🔄 Starting merge process...\\n');\r\n }\r\n\r\n // Load all source files\r\n const collections: { name: string | null; data: TokenObject; tokenCount: number }[] = [];\r\n\r\n for (const file of sourceFiles) {\r\n const data = loadJSON(file, verbose);\r\n if (!data || !Array.isArray(data) || !data[0]) {\r\n errors.push(`Invalid collection structure in: ${file}`);\r\n continue;\r\n }\r\n\r\n const name = getCollectionName(data);\r\n const collectionData = name\r\n ? (data[0][name] as TokenObject)\r\n : (data[0] as unknown as TokenObject);\r\n const tokenCount = countTokens(collectionData);\r\n\r\n if (verbose) {\r\n console.info(`📦 Collection: \"${name ?? 'unknown'}\" (${tokenCount} tokens)`);\r\n }\r\n\r\n collections.push({ name, data: collectionData, tokenCount });\r\n }\r\n\r\n if (collections.length < 2) {\r\n return {\r\n success: false,\r\n collectionsCount: collections.length,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: errors.length > 0 ? errors : ['Not enough valid collections to merge'],\r\n };\r\n }\r\n\r\n // Determine unified collection name\r\n const collectionNames = collections.map((c) => c.name).filter((n): n is string => n !== null);\r\n const defaultName = collectionNames[0] ?? 'Tokens';\r\n const unifiedName = collectionNames.includes('Colors')\r\n ? 'Colors'\r\n : collectionNames.reduce((a, b) => (a.length <= b.length ? a : b), defaultName);\r\n\r\n if (verbose) {\r\n console.info(`\\n🎯 Unified collection name: \"${unifiedName}\"`);\r\n console.info('\\n🔀 Merging structures...');\r\n }\r\n\r\n // Merge collections based on strategy\r\n const firstCollection = collections[0];\r\n if (!firstCollection) {\r\n return {\r\n success: false,\r\n collectionsCount: 0,\r\n tokensCount: 0,\r\n outputFile,\r\n errors: ['No collections to merge'],\r\n };\r\n }\r\n\r\n let merged: TokenObject = firstCollection.data;\r\n for (let i = 1; i < collections.length; i++) {\r\n const source = collections[i];\r\n if (!source) {\r\n continue;\r\n }\r\n if (strategy === 'first') {\r\n // First wins - merge source into target but target takes precedence\r\n merged = deepMerge(source.data, merged, verbose);\r\n } else {\r\n // Last wins (default) - source overwrites target\r\n merged = deepMerge(merged, source.data, verbose);\r\n }\r\n }\r\n\r\n // Remove duplicate sections\r\n if (verbose) {\r\n console.info('🗑️ Checking for duplicate sections...');\r\n }\r\n const modes = merged['modes'] as TokenObject | undefined;\r\n if (modes) {\r\n for (const modeName of Object.keys(modes)) {\r\n const mode = modes[modeName] as TokenObject | undefined;\r\n const colors = mode?.['colors'] as TokenObject | undefined;\r\n\r\n if (colors) {\r\n for (const sectionName of Object.keys(colors)) {\r\n if (isDuplicateSection(colors[sectionName])) {\r\n if (verbose) {\r\n console.info(` ⚠️ Removing duplicate section: ${sectionName}`);\r\n }\r\n delete colors[sectionName];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Normalize references\r\n if (verbose) {\r\n const normalized = unifiedName.toLowerCase().replace(/\\s+/g, '');\r\n console.info(`🔗 Normalizing references to lowercase \"{${normalized}.\" format...`);\r\n }\r\n for (const coll of collections) {\r\n if (coll.name) {\r\n updateReferences(merged, coll.name, unifiedName, unifiedName);\r\n }\r\n }\r\n\r\n // Sort properties\r\n if (verbose) {\r\n console.info('📋 Sorting properties alphabetically...');\r\n }\r\n const sorted = sortProperties(merged) as TokenObject;\r\n\r\n // Count final tokens\r\n const tokensCount = countTokens(sorted);\r\n\r\n if (verbose) {\r\n console.info(`✨ Merged collection: ${tokensCount} tokens\\n`);\r\n }\r\n\r\n // Create output structure\r\n const output = [{ [unifiedName]: sorted }];\r\n\r\n // Save if not dry run\r\n if (!dryRun) {\r\n if (!saveJSON(outputFile, output, verbose)) {\r\n errors.push(`Failed to write output file: ${outputFile}`);\r\n return {\r\n success: false,\r\n collectionsCount: collections.length,\r\n tokensCount,\r\n outputFile,\r\n errors,\r\n conflicts: conflicts.length > 0 ? conflicts : undefined,\r\n };\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.info('\\n✅ Merge complete!');\r\n console.info('📊 Summary:');\r\n for (const coll of collections) {\r\n console.info(` Source: ${coll.tokenCount} tokens`);\r\n }\r\n console.info(` Merged: ${tokensCount} tokens`);\r\n }\r\n\r\n return {\r\n success: true,\r\n collectionsCount: collections.length,\r\n tokensCount,\r\n outputFile,\r\n conflicts: conflicts.length > 0 ? conflicts : undefined,\r\n errors: errors.length > 0 ? errors : undefined,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for merging collections\r\n */\r\nexport function mergeCollectionsCLI(source1: string, source2: string, output: string): boolean {\r\n const result = mergeCollections({\r\n sourceFiles: [source1, source2],\r\n outputFile: output,\r\n verbose: true,\r\n });\r\n\r\n if (result.errors) {\r\n for (const error of result.errors) {\r\n console.error(`❌ ${error}`);\r\n }\r\n }\r\n\r\n return result.success;\r\n}\r\n","/**\r\n * Scanner for finding stylesheet files in directories\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-regexp */\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { StyleScannerOptions, StyleScannerResult, StyleScannedFile } from './types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default ignore patterns\r\n */\r\nconst DEFAULT_IGNORE_PATTERNS = [\r\n '**/node_modules/**',\r\n '**/.git/**',\r\n '**/_index.scss',\r\n '**/*.test.scss',\r\n '**/*.spec.scss',\r\n '**/test/**',\r\n '**/tests/**',\r\n];\r\n\r\n// ============================================================================\r\n// Utility Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Convert a glob pattern to a regular expression\r\n */\r\nfunction globToRegex(pattern: string): RegExp {\r\n const regex = pattern\r\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars (except * and ?)\r\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>') // Temporarily replace **\r\n .replace(/\\*/g, '[^/]*') // * matches anything except /\r\n .replace(/\\?/g, '.') // ? matches single char\r\n .replace(/<<<GLOBSTAR>>>/g, '.*'); // ** matches anything including /\r\n return new RegExp(`^${regex}$`);\r\n}\r\n\r\n/**\r\n * Check if a path matches any of the ignore patterns\r\n */\r\nfunction matchesIgnorePattern(relativePath: string, patterns: string[]): boolean {\r\n for (const pattern of patterns) {\r\n const regex = globToRegex(pattern);\r\n if (regex.test(relativePath)) {\r\n return true;\r\n }\r\n // Also check just the filename\r\n const fileName = path.basename(relativePath);\r\n if (regex.test(fileName)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Recursively scan a directory for files\r\n */\r\nasync function scanDirectory(\r\n dir: string,\r\n rootDir: string,\r\n extension: string,\r\n ignorePatterns: string[],\r\n maxDepth: number,\r\n currentDepth: number,\r\n followSymlinks: boolean\r\n): Promise<StyleScannedFile[]> {\r\n const files: StyleScannedFile[] = [];\r\n\r\n if (currentDepth > maxDepth) {\r\n return files;\r\n }\r\n\r\n try {\r\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const entryPath = path.join(dir, entry.name);\r\n const relativePath = path.relative(rootDir, entryPath);\r\n\r\n // Check ignore patterns\r\n if (matchesIgnorePattern(relativePath, ignorePatterns)) {\r\n continue;\r\n }\r\n\r\n if (entry.isDirectory() || (followSymlinks && entry.isSymbolicLink())) {\r\n // Recurse into directory\r\n const subFiles = await scanDirectory(\r\n entryPath,\r\n rootDir,\r\n extension,\r\n ignorePatterns,\r\n maxDepth,\r\n currentDepth + 1,\r\n followSymlinks\r\n );\r\n files.push(...subFiles);\r\n } else if (entry.isFile() && entry.name.endsWith(`.${extension}`)) {\r\n // Add file\r\n const stat = await fs.promises.stat(entryPath);\r\n files.push({\r\n absolutePath: entryPath,\r\n relativePath,\r\n name: path.basename(entry.name, `.${extension}`),\r\n extension: extension as 'scss' | 'css',\r\n size: stat.size,\r\n mtime: stat.mtime,\r\n depth: currentDepth,\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n // Directory read error - skip silently\r\n console.warn(`Warning: Could not read directory ${dir}: ${(error as Error).message}`);\r\n }\r\n\r\n return files;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Scan directories for stylesheet files\r\n *\r\n * @param options Scanner options\r\n * @returns Scanner result with found files\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await scanDirectories({\r\n * directories: ['src/styles/overrides', 'src/styles/custom'],\r\n * extension: 'scss',\r\n * });\r\n *\r\n * console.log(`Found ${result.totalFiles} files`);\r\n * ```\r\n */\r\nexport async function scanDirectories(options: StyleScannerOptions): Promise<StyleScannerResult> {\r\n const {\r\n directories,\r\n extension,\r\n ignorePatterns = DEFAULT_IGNORE_PATTERNS,\r\n followSymlinks = false,\r\n maxDepth = 10,\r\n } = options;\r\n\r\n const files: StyleScannedFile[] = [];\r\n const scannedDirs: string[] = [];\r\n const missingDirs: string[] = [];\r\n\r\n for (const dir of directories) {\r\n const absoluteDir = path.resolve(dir);\r\n\r\n // Check if directory exists\r\n try {\r\n const stat = await fs.promises.stat(absoluteDir);\r\n if (!stat.isDirectory()) {\r\n missingDirs.push(absoluteDir);\r\n continue;\r\n }\r\n } catch {\r\n missingDirs.push(absoluteDir);\r\n continue;\r\n }\r\n\r\n scannedDirs.push(absoluteDir);\r\n\r\n // Scan directory recursively\r\n const foundFiles = await scanDirectory(\r\n absoluteDir,\r\n absoluteDir,\r\n extension,\r\n ignorePatterns,\r\n maxDepth,\r\n 0,\r\n followSymlinks\r\n );\r\n\r\n files.push(...foundFiles);\r\n }\r\n\r\n // Calculate totals\r\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\r\n\r\n return {\r\n files,\r\n directories: scannedDirs,\r\n missingDirectories: missingDirs,\r\n totalFiles: files.length,\r\n totalSize,\r\n };\r\n}\r\n\r\n/**\r\n * Sort scanned files according to specified order\r\n *\r\n * @param files Files to sort\r\n * @param order Sort order\r\n * @returns Sorted files\r\n */\r\nexport function sortFiles(\r\n files: StyleScannedFile[],\r\n order: 'alphabetical' | 'directory-first' = 'alphabetical'\r\n): StyleScannedFile[] {\r\n const sorted = [...files];\r\n\r\n if (order === 'alphabetical') {\r\n sorted.sort((a, b) => a.name.localeCompare(b.name));\r\n } else if (order === 'directory-first') {\r\n sorted.sort((a, b) => {\r\n // First by directory\r\n const dirA = path.dirname(a.relativePath);\r\n const dirB = path.dirname(b.relativePath);\r\n if (dirA !== dirB) {\r\n return dirA.localeCompare(dirB);\r\n }\r\n // Then by name\r\n return a.name.localeCompare(b.name);\r\n });\r\n }\r\n\r\n return sorted;\r\n}\r\n\r\n/**\r\n * Filter files matching patterns\r\n *\r\n * @param files Files to filter\r\n * @param patterns Glob patterns to match\r\n * @param include If true, keep matching files; if false, exclude matching\r\n * @returns Filtered files\r\n */\r\nexport function filterFiles(\r\n files: StyleScannedFile[],\r\n patterns: string[],\r\n include = false\r\n): StyleScannedFile[] {\r\n return files.filter((file) => {\r\n const matches = matchesIgnorePattern(file.relativePath, patterns);\r\n return include ? matches : !matches;\r\n });\r\n}\r\n\r\n/**\r\n * Get default ignore patterns\r\n */\r\nexport function getDefaultIgnorePatterns(): string[] {\r\n return [...DEFAULT_IGNORE_PATTERNS];\r\n}\r\n","/**\r\n * Merge stylesheet content\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { MergeConfig, MergeContent, StyleMergeResult } from './types.js';\r\n\r\n// ============================================================================\r\n// Content Generation\r\n// ============================================================================\r\n\r\n/**\r\n * Generate header comment for merged file\r\n */\r\nfunction generateHeaderComment(_format: 'scss' | 'css'): string {\r\n const timestamp = new Date().toISOString();\r\n const comment = `/**\r\n * DSAi Design Tokens - Merged Bundle\r\n * Generated: ${timestamp}\r\n *\r\n * This file was automatically generated and includes:\r\n * - Generated design tokens\r\n * - Merged additional stylesheets\r\n *\r\n * DO NOT EDIT DIRECTLY - changes will be overwritten on rebuild\r\n */`;\r\n\r\n return comment;\r\n}\r\n\r\n/**\r\n * Generate source comment for section\r\n */\r\nfunction generateSourceComment(source: string, _format: 'scss' | 'css'): string {\r\n return `/* ========== Source: ${source} ========== */`;\r\n}\r\n\r\n// ============================================================================\r\n// Issue Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Detect potential issues in merged content\r\n */\r\nfunction detectMergeIssues(content: string, format: 'scss' | 'css'): string[] {\r\n const warnings: string[] = [];\r\n\r\n // Check for duplicate :root selectors\r\n const rootMatches = content.match(/:root\\s*\\{/g);\r\n const rootCount = rootMatches ? rootMatches.length : 0;\r\n if (rootCount > 1) {\r\n warnings.push(\r\n `Found ${rootCount} :root selectors. Consider consolidating for better performance.`\r\n );\r\n }\r\n\r\n // Check for duplicate CSS custom properties (simplified check)\r\n const customProps = content.match(/--[\\w-]+:/g) ?? [];\r\n const uniqueProps = new Set(customProps);\r\n if (customProps.length > uniqueProps.size) {\r\n warnings.push(\r\n `Found duplicate CSS custom properties. Later definitions will override earlier ones.`\r\n );\r\n }\r\n\r\n // SCSS-specific checks\r\n if (format === 'scss') {\r\n // Check for @import after content\r\n const importAfterContent = /@import\\s+['\"][^'\"]+['\"];?\\s*$/gm;\r\n if (importAfterContent.test(content)) {\r\n warnings.push(`Found @import statements that may not be at the top of the file.`);\r\n }\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Merge stylesheet content in specified order\r\n *\r\n * @param tokenContent Generated token content\r\n * @param userContent User stylesheet content\r\n * @param config Merge configuration\r\n * @returns Merged result\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await mergeContent(\r\n * { content: ':root { --color-primary: blue; }', format: 'css' },\r\n * [{ source: 'overrides.css', content: ':root { --color-bg: white; }' }],\r\n * { mergeOrder: 'after' }\r\n * );\r\n * ```\r\n */\r\nexport async function mergeContent(\r\n tokenContent: { content: string; format: 'scss' | 'css' },\r\n userContent: MergeContent[],\r\n config: Partial<MergeConfig> = {}\r\n): Promise<StyleMergeResult> {\r\n const { mergeOrder = 'after' } = config;\r\n\r\n const parts: string[] = [];\r\n const sources: string[] = ['<generated-tokens>'];\r\n const warnings: string[] = [];\r\n\r\n // Add header comment\r\n parts.push(generateHeaderComment(tokenContent.format));\r\n\r\n // Build content based on merge order\r\n if (mergeOrder === 'before') {\r\n // User styles first\r\n for (const content of userContent) {\r\n parts.push(generateSourceComment(content.source, tokenContent.format));\r\n parts.push(content.content);\r\n sources.push(content.source);\r\n }\r\n // Then token styles\r\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\r\n parts.push(tokenContent.content);\r\n } else {\r\n // Token styles first\r\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\r\n parts.push(tokenContent.content);\r\n // Then user styles\r\n for (const content of userContent) {\r\n parts.push(generateSourceComment(content.source, tokenContent.format));\r\n parts.push(content.content);\r\n sources.push(content.source);\r\n }\r\n }\r\n\r\n // Check for potential issues\r\n const mergedContent = parts.join('\\n\\n');\r\n warnings.push(...detectMergeIssues(mergedContent, tokenContent.format));\r\n\r\n return {\r\n content: mergedContent,\r\n sources,\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * Load content from files\r\n *\r\n * @param files File paths to load\r\n * @param type Content type (token or user)\r\n * @param format File format\r\n * @returns Loaded content\r\n */\r\nexport async function loadContent(\r\n files: string[],\r\n type: 'token' | 'user',\r\n format: 'scss' | 'css'\r\n): Promise<MergeContent[]> {\r\n const content: MergeContent[] = [];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const fileContent = await fs.promises.readFile(filePath, 'utf-8');\r\n content.push({\r\n source: filePath,\r\n content: fileContent,\r\n type,\r\n format,\r\n });\r\n } catch (error) {\r\n console.warn(`Failed to load file: ${filePath}`, error);\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\n/**\r\n * Process SCSS imports header\r\n *\r\n * @param importHeader Import header configuration\r\n * @param configDir Config directory for resolving relative paths\r\n * @returns Processed import statements\r\n */\r\nexport function processScssImportHeader(\r\n importHeader: string | string[] | undefined,\r\n configDir: string\r\n): string {\r\n if (!importHeader) {\r\n return '';\r\n }\r\n\r\n const imports = Array.isArray(importHeader) ? importHeader : [importHeader];\r\n const statements: string[] = [];\r\n\r\n for (const importPath of imports) {\r\n // Determine if it's a path or module import\r\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\r\n // Relative or absolute path\r\n const resolvedPath = path.resolve(configDir, importPath);\r\n statements.push(`@import '${resolvedPath}';`);\r\n } else {\r\n // Module import (e.g., 'normalize.css')\r\n statements.push(`@import '${importPath}';`);\r\n }\r\n }\r\n\r\n return `${statements.join('\\n')}\\n\\n`;\r\n}\r\n\r\n/**\r\n * Add SCSS import header to content\r\n *\r\n * @param content SCSS content\r\n * @param importHeader Import header to add\r\n * @param configDir Config directory for resolving paths\r\n * @returns Content with import header\r\n */\r\nexport function addScssImportHeader(\r\n content: string,\r\n importHeader: string | string[] | undefined,\r\n configDir: string\r\n): string {\r\n const header = processScssImportHeader(importHeader, configDir);\r\n if (!header) {\r\n return content;\r\n }\r\n\r\n return header + content;\r\n}\r\n","/**\r\n * Bundle generator for combined stylesheets\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-unsafe-regex */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport { loadContent, mergeContent } from './merger.js';\r\nimport { sortFiles } from './scanner.js';\r\n\r\nimport type { BundleConfig, BundleResult, StyleScannedFile, StyleMergeResult } from './types.js';\r\n\r\n// ============================================================================\r\n// Content Processing\r\n// ============================================================================\r\n\r\n/**\r\n * Remove source comments from content\r\n */\r\nfunction removeSourceComments(content: string): string {\r\n return content.replace(/\\/\\* ========== Source: .+ ========== \\*\\/\\n?/g, '');\r\n}\r\n\r\n/**\r\n * Simple CSS minification\r\n * Note: For production, consider using a proper minifier like cssnano\r\n */\r\nfunction minifyContent(content: string): string {\r\n return (\r\n content\r\n // Remove comments (but keep /*! ... */ license comments)\r\n .replace(/\\/\\*(?!!)[^*]*\\*+([^/*][^*]*\\*+)*\\//g, '')\r\n // Remove whitespace\r\n .replace(/\\s+/g, ' ')\r\n // Remove space around special characters\r\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\r\n // Remove trailing semicolons before closing braces\r\n .replace(/;}/g, '}')\r\n // Remove empty rules\r\n .replace(/[^{}]+\\{\\s*\\}/g, '')\r\n .trim()\r\n );\r\n}\r\n\r\n/**\r\n * Detect output extension based on content\r\n */\r\nfunction detectExtension(mergeResult: StyleMergeResult): string {\r\n const hasScssFeatures = mergeResult.content.match(/@mixin|@include|\\$[a-zA-Z]/);\r\n return hasScssFeatures ? '.scss' : '.css';\r\n}\r\n\r\n/**\r\n * Generate a basic sourcemap\r\n */\r\nfunction generateSourcemap(sources: string[], name: string, extension: string): string {\r\n const sourceMapV3 = {\r\n version: 3,\r\n file: `${name}${extension}`,\r\n sources,\r\n names: [],\r\n mappings: '',\r\n };\r\n\r\n return JSON.stringify(sourceMapV3, null, 2);\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Create a stylesheet bundle\r\n *\r\n * @param mergeResult Result from merge operation\r\n * @param config Bundle configuration\r\n * @returns Bundle result\r\n *\r\n * @example\r\n * ```typescript\r\n * const bundle = await createBundle(mergeResult, {\r\n * name: 'tokens-bundle',\r\n * outputDir: 'dist',\r\n * includeSourceComments: true,\r\n * sourcemaps: true,\r\n * minify: false,\r\n * });\r\n * ```\r\n */\r\nexport async function createBundle(\r\n mergeResult: StyleMergeResult,\r\n config: BundleConfig\r\n): Promise<BundleResult> {\r\n const { name, outputDir, includeSourceComments, sourcemaps, minify } = config;\r\n\r\n let content = mergeResult.content;\r\n\r\n // Optionally remove source comments\r\n if (!includeSourceComments) {\r\n content = removeSourceComments(content);\r\n }\r\n\r\n // Minify if requested\r\n let minifiedSize: number | undefined;\r\n if (minify) {\r\n const minified = minifyContent(content);\r\n minifiedSize = Buffer.byteLength(minified, 'utf-8');\r\n content = minified;\r\n }\r\n\r\n // Determine output path\r\n const extension = detectExtension(mergeResult);\r\n const outputPath = path.join(outputDir, `${name}${extension}`);\r\n\r\n // Ensure output directory exists\r\n await fs.promises.mkdir(outputDir, { recursive: true });\r\n\r\n // Write bundle\r\n await fs.promises.writeFile(outputPath, content, 'utf-8');\r\n\r\n // Write sourcemap if requested\r\n let sourcemap: string | undefined;\r\n if (sourcemaps) {\r\n sourcemap = generateSourcemap(mergeResult.sources, name, extension);\r\n const mapPath = `${outputPath}.map`;\r\n await fs.promises.writeFile(mapPath, sourcemap, 'utf-8');\r\n\r\n // Add sourcemap reference to content\r\n const mapRef = `\\n/*# sourceMappingURL=${name}${extension}.map */`;\r\n content += mapRef;\r\n await fs.promises.writeFile(outputPath, content, 'utf-8');\r\n }\r\n\r\n return {\r\n content,\r\n sourcemap,\r\n outputPath,\r\n files: mergeResult.sources,\r\n size: Buffer.byteLength(content, 'utf-8'),\r\n minifiedSize,\r\n };\r\n}\r\n\r\n/**\r\n * Create both CSS and SCSS bundles\r\n *\r\n * @param tokenCss Generated CSS tokens\r\n * @param tokenScss Generated SCSS tokens\r\n * @param cssFiles User CSS files (StyleScannedFile objects)\r\n * @param scssFiles User SCSS files (StyleScannedFile objects)\r\n * @param config Bundle configuration\r\n * @returns Map of bundle type to result\r\n */\r\nexport async function createBundles(\r\n tokenCss: string,\r\n tokenScss: string,\r\n cssFiles: StyleScannedFile[],\r\n scssFiles: StyleScannedFile[],\r\n config: Omit<BundleConfig, 'name'> & { baseName?: string }\r\n): Promise<{ css?: BundleResult; scss?: BundleResult }> {\r\n const { baseName = 'tokens-bundle', ...bundleConfig } = config;\r\n const results: { css?: BundleResult; scss?: BundleResult } = {};\r\n\r\n // Create CSS bundle if we have CSS content\r\n const sortedCss = sortFiles(cssFiles);\r\n if (tokenCss || sortedCss.length > 0) {\r\n const userContent = await loadContent(\r\n sortedCss.map((f) => f.absolutePath),\r\n 'user',\r\n 'css'\r\n );\r\n const mergeResult = await mergeContent({ content: tokenCss, format: 'css' }, userContent);\r\n\r\n results.css = await createBundle(mergeResult, {\r\n ...bundleConfig,\r\n name: baseName,\r\n });\r\n }\r\n\r\n // Create SCSS bundle if we have SCSS content\r\n const sortedScss = sortFiles(scssFiles);\r\n if (tokenScss || sortedScss.length > 0) {\r\n const userContent = await loadContent(\r\n sortedScss.map((f) => f.absolutePath),\r\n 'user',\r\n 'scss'\r\n );\r\n const mergeResult = await mergeContent({ content: tokenScss, format: 'scss' }, userContent);\r\n\r\n results.scss = await createBundle(mergeResult, {\r\n ...bundleConfig,\r\n name: `_${baseName}`,\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Create a bundle from scanned files (no token content)\r\n *\r\n * @param files Scanned files to bundle\r\n * @param format Output format\r\n * @param config Bundle configuration\r\n * @returns Bundle result\r\n */\r\nexport async function createBundleFromFiles(\r\n files: StyleScannedFile[],\r\n format: 'css' | 'scss',\r\n config: BundleConfig\r\n): Promise<BundleResult> {\r\n const sorted = sortFiles(files);\r\n const userContent = await loadContent(\r\n sorted.map((f) => f.absolutePath),\r\n 'user',\r\n format\r\n );\r\n\r\n // Create merge result with empty token content\r\n const mergeResult = await mergeContent({ content: '', format }, userContent);\r\n\r\n return createBundle(mergeResult, config);\r\n}\r\n","/**\r\n * Output path resolver with placeholder support\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/* eslint-disable security/detect-non-literal-fs-filename */\r\n/* eslint-disable security/detect-object-injection */\r\n\r\nimport * as fs from 'node:fs';\r\nimport * as path from 'node:path';\r\n\r\nimport type { OutputFormat } from '../../config/types.js';\r\nimport type { OutputConfig, PlaceholderValues } from '../merge/types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default file names per format\r\n */\r\nexport const DEFAULT_FILE_NAMES: Record<OutputFormat, string> = {\r\n css: 'tokens.css',\r\n scss: '_tokens.scss',\r\n js: 'tokens.js',\r\n ts: 'tokens.ts',\r\n json: 'tokens.json',\r\n android: 'tokens.xml',\r\n ios: 'Tokens.swift',\r\n};\r\n\r\n// ============================================================================\r\n// Placeholder Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Replace placeholders in a string\r\n *\r\n * @param template Template string with placeholders\r\n * @param values Values to replace\r\n * @returns String with placeholders replaced\r\n */\r\nexport function replacePlaceholders(template: string, values: PlaceholderValues): string {\r\n const now = new Date();\r\n\r\n const allValues: Record<string, string> = {\r\n theme: values.theme ?? 'default',\r\n name: values.name ?? 'tokens',\r\n format: values.format ?? '',\r\n date: values.date ?? now.toISOString().split('T')[0] ?? '',\r\n timestamp: values.timestamp ?? now.toISOString(),\r\n };\r\n\r\n let result = template;\r\n for (const [key, value] of Object.entries(allValues)) {\r\n result = result.replaceAll(`{${key}}`, value);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ============================================================================\r\n// Path Resolution\r\n// ============================================================================\r\n\r\n/**\r\n * Resolve output path for a specific format\r\n *\r\n * @param format Output format\r\n * @param config Output configuration\r\n * @param values Placeholder values\r\n * @returns Resolved output path\r\n *\r\n * @example\r\n * ```typescript\r\n * const outputPath = resolveOutputPath('css', {\r\n * baseDir: 'dist',\r\n * formatDirs: { css: 'dist/css' },\r\n * fileNames: { css: 'design-tokens-{theme}.css' },\r\n * }, { theme: 'light' });\r\n *\r\n * // Returns: 'dist/css/design-tokens-light.css'\r\n * ```\r\n */\r\nexport function resolveOutputPath(\r\n format: OutputFormat,\r\n config: OutputConfig,\r\n values: PlaceholderValues = {}\r\n): string {\r\n // Determine directory\r\n const dir = config.formatDirs[format] ?? config.baseDir;\r\n\r\n // Determine file name\r\n let fileName = config.fileNames[format] ?? DEFAULT_FILE_NAMES[format];\r\n\r\n // Replace placeholders\r\n fileName = replacePlaceholders(fileName, values);\r\n\r\n return path.join(dir, fileName);\r\n}\r\n\r\n/**\r\n * Resolve all output paths for all formats\r\n *\r\n * @param formats Formats to generate\r\n * @param config Output configuration\r\n * @param values Placeholder values\r\n * @returns Map of format to output path\r\n */\r\nexport function resolveAllOutputPaths(\r\n formats: OutputFormat[],\r\n config: OutputConfig,\r\n values: PlaceholderValues = {}\r\n): Record<OutputFormat, string> {\r\n const result: Partial<Record<OutputFormat, string>> = {};\r\n\r\n for (const format of formats) {\r\n result[format] = resolveOutputPath(format, config, values);\r\n }\r\n\r\n return result as Record<OutputFormat, string>;\r\n}\r\n\r\n// ============================================================================\r\n// Validation\r\n// ============================================================================\r\n\r\n/**\r\n * Validate output paths don't conflict\r\n *\r\n * @param paths Output paths to validate\r\n * @returns Validation result with any conflicts found\r\n */\r\nexport function validateOutputPaths(paths: Record<string, string>): {\r\n valid: boolean;\r\n conflicts: [string, string][];\r\n} {\r\n const conflicts: [string, string][] = [];\r\n const pathToFormat: Record<string, string> = {};\r\n\r\n for (const [format, outputPath] of Object.entries(paths)) {\r\n const normalized = path.normalize(outputPath);\r\n const existingFormat = pathToFormat[normalized];\r\n\r\n if (existingFormat !== undefined) {\r\n conflicts.push([existingFormat, format]);\r\n } else {\r\n pathToFormat[normalized] = format;\r\n }\r\n }\r\n\r\n return {\r\n valid: conflicts.length === 0,\r\n conflicts,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Directory Management\r\n// ============================================================================\r\n\r\n/**\r\n * Ensure all output directories exist\r\n *\r\n * @param paths Output paths\r\n * @returns Created directories\r\n */\r\nexport async function ensureOutputDirs(paths: Record<string, string>): Promise<string[]> {\r\n const directories = new Set<string>();\r\n for (const outputPath of Object.values(paths)) {\r\n directories.add(path.dirname(outputPath));\r\n }\r\n\r\n const created: string[] = [];\r\n for (const dir of directories) {\r\n await fs.promises.mkdir(dir, { recursive: true });\r\n created.push(dir);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Create output configuration from token config\r\n *\r\n * @param tokenConfig Token configuration\r\n * @returns Output configuration\r\n */\r\nexport function createOutputConfig(tokenConfig: {\r\n outputDir?: string;\r\n outputDirs?: Partial<Record<OutputFormat, string>>;\r\n outputFileNames?: Partial<Record<OutputFormat, string>>;\r\n}): OutputConfig {\r\n return {\r\n baseDir: tokenConfig.outputDir ?? 'dist',\r\n formatDirs: tokenConfig.outputDirs ?? {},\r\n fileNames: tokenConfig.outputFileNames ?? {},\r\n createDirs: true,\r\n };\r\n}\r\n","/**\r\n * Style Dictionary Type Definitions\r\n *\r\n * Types for Style Dictionary integration including tokens, transforms,\r\n * formats, preprocessors, and configuration.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/types\r\n */\r\n\r\n// ============================================================================\r\n// Token Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary token (runtime representation)\r\n */\r\nexport interface SDToken {\r\n /** Token name (after name transforms) */\r\n name: string;\r\n\r\n /** Resolved value (after value transforms) */\r\n value: unknown;\r\n\r\n /** Original value (may contain references) */\r\n original: {\r\n value: unknown;\r\n $value?: unknown;\r\n };\r\n\r\n /** Token path segments */\r\n path: string[];\r\n\r\n /** DTCG $value property */\r\n $value?: unknown;\r\n\r\n /** Token type */\r\n type?: string;\r\n\r\n /** DTCG $type property */\r\n $type?: string;\r\n\r\n /** Token description */\r\n description?: string;\r\n\r\n /** DTCG $description property */\r\n $description?: string;\r\n\r\n /** Comment for documentation */\r\n comment?: string;\r\n\r\n /** DTCG $extensions */\r\n $extensions?: Record<string, unknown>;\r\n\r\n /** DTCG $scopes (from Figma Variables) */\r\n $scopes?: string[];\r\n\r\n /** CTI (Category/Type/Item) attributes */\r\n attributes?: {\r\n category?: string;\r\n type?: string;\r\n item?: string;\r\n subitem?: string;\r\n state?: string;\r\n };\r\n\r\n /** File path where token was defined */\r\n filePath?: string;\r\n\r\n /** Whether token is a reference to another token */\r\n isSource?: boolean;\r\n}\r\n\r\n/**\r\n * Style Dictionary dictionary containing all tokens\r\n */\r\nexport interface SDDictionary {\r\n /** Flat array of all tokens */\r\n allTokens: SDToken[];\r\n\r\n /** Nested token structure */\r\n tokens: Record<string, unknown>;\r\n\r\n /** Unfiltered tokens (before platform filtering) */\r\n unfilteredTokens: Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Transform Types\r\n// ============================================================================\r\n\r\n/**\r\n * Transform type - what aspect of the token is being transformed\r\n */\r\nexport type TransformType = 'name' | 'value' | 'attribute';\r\n\r\n/**\r\n * Options passed to transform functions\r\n */\r\nexport interface SDTransformOptions {\r\n /** Base font size for rem conversion (default: 16) */\r\n basePxFontSize?: number;\r\n\r\n /** CSS variable prefix */\r\n prefix?: string;\r\n\r\n /** Additional options */\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Transform definition for Style Dictionary\r\n */\r\nexport interface TransformDefinition {\r\n /** Unique transform name (e.g., 'fontWeight/unitless') */\r\n name: string;\r\n\r\n /** Transform type */\r\n type: TransformType;\r\n\r\n /**\r\n * Filter function - return true to apply transform\r\n * If omitted, transform applies to all tokens\r\n */\r\n filter?: (token: SDToken) => boolean;\r\n\r\n /**\r\n * Transform function\r\n * @param token - The token being transformed\r\n * @param options - Transform options from platform config\r\n * @returns Transformed value\r\n */\r\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\r\n}\r\n\r\n/**\r\n * Transform group definition\r\n */\r\nexport interface TransformGroupDefinition {\r\n /** Unique group name (e.g., 'custom/css') */\r\n name: string;\r\n\r\n /** Ordered list of transform names to apply */\r\n transforms: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Format Types\r\n// ============================================================================\r\n\r\n/**\r\n * Platform configuration passed to formats\r\n */\r\nexport interface SDPlatform {\r\n /** Transform group to use */\r\n transformGroup?: string;\r\n\r\n /** Individual transforms (alternative to transformGroup) */\r\n transforms?: string[];\r\n\r\n /** Output path prefix */\r\n buildPath?: string;\r\n\r\n /** Files to generate */\r\n files?: SDFile[];\r\n\r\n /** Platform-specific options */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * File configuration for platform output\r\n */\r\nexport interface SDFile {\r\n /** Output file name */\r\n destination: string;\r\n\r\n /** Format to use for generating content */\r\n format: string;\r\n\r\n /**\r\n * Filter tokens to include in this file\r\n * Can be a string (filter name) or function\r\n */\r\n filter?: string | ((token: SDToken) => boolean);\r\n\r\n /** File-specific options passed to format */\r\n options?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Arguments passed to format functions\r\n */\r\nexport interface SDFormatArgs {\r\n /** Dictionary containing all tokens */\r\n dictionary: SDDictionary;\r\n\r\n /** Options from file config */\r\n options: Record<string, unknown>;\r\n\r\n /** Platform configuration */\r\n platform: SDPlatform;\r\n\r\n /** File configuration */\r\n file: SDFile;\r\n}\r\n\r\n/**\r\n * Format definition for Style Dictionary\r\n */\r\nexport interface FormatDefinition {\r\n /** Unique format name (e.g., 'css/variables-with-comments') */\r\n name: string;\r\n\r\n /**\r\n * Format function - generates file content\r\n * @param args - Format arguments\r\n * @returns File content as string\r\n */\r\n format: (args: SDFormatArgs) => string;\r\n}\r\n\r\n// ============================================================================\r\n// Preprocessor Types\r\n// ============================================================================\r\n\r\n/**\r\n * Preprocessor definition for Style Dictionary\r\n */\r\nexport interface PreprocessorDefinition {\r\n /** Unique preprocessor name */\r\n name: string;\r\n\r\n /**\r\n * Preprocessor function - modifies token dictionary before processing\r\n * @param dictionary - Raw token dictionary\r\n * @returns Modified dictionary\r\n */\r\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\r\n}\r\n\r\n// ============================================================================\r\n// Configuration Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary log configuration\r\n */\r\nexport interface SDLogConfig {\r\n /** Logging verbosity */\r\n verbosity?: 'default' | 'silent' | 'verbose';\r\n\r\n /** How to handle warnings */\r\n warnings?: 'warn' | 'error' | 'disabled';\r\n\r\n /** How to handle errors */\r\n errors?: 'error' | 'throw';\r\n}\r\n\r\n/**\r\n * Expand configuration for composite tokens\r\n */\r\nexport interface SDExpandConfig {\r\n /** Optional type mapping for composite token properties */\r\n typesMap?: Record<string, string | string[] | Record<string, string | string[]>>;\r\n /** Include specific token types */\r\n include?: string[] | ((token: SDToken, config: SDConfig) => boolean);\r\n /** Exclude specific token types */\r\n exclude?: string[] | ((token: SDToken, config: SDConfig) => boolean);\r\n}\r\n\r\n/**\r\n * Full Style Dictionary configuration\r\n */\r\nexport interface SDConfig {\r\n /** Logging configuration */\r\n log?: SDLogConfig;\r\n\r\n /** Preprocessors to run on source tokens */\r\n preprocessors?: string[];\r\n\r\n /** Configures whether and how composite tokens will be expanded */\r\n expand?: boolean | SDExpandConfig | ((token: SDToken, config: SDConfig) => boolean);\r\n\r\n /** Source token file patterns */\r\n source?: string[];\r\n\r\n /** Additional files to include */\r\n include?: string[];\r\n\r\n /** Platform configurations */\r\n platforms?: Record<string, SDPlatform>;\r\n}\r\n\r\n/**\r\n * Options for creating Style Dictionary configuration\r\n */\r\nexport interface CreateSDConfigOptions {\r\n /** Token source files (glob patterns) */\r\n source?: string[];\r\n\r\n /** CSS variable prefix (default: '--dsai-') */\r\n prefix?: string;\r\n\r\n /** Output directory base path */\r\n buildPath?: string;\r\n\r\n /** Base font size for rem conversion (default: 16) */\r\n baseFontSize?: number;\r\n\r\n /** Whether to output references in generated files */\r\n outputReferences?: boolean;\r\n\r\n /** Additional transforms to register */\r\n customTransforms?: TransformDefinition[];\r\n\r\n /** Additional formats to register */\r\n customFormats?: FormatDefinition[];\r\n\r\n /** Additional preprocessors to register */\r\n customPreprocessors?: PreprocessorDefinition[];\r\n\r\n /** Platforms to include (default: all) */\r\n platforms?: SDPlatformType[];\r\n\r\n /** Enable verbose logging */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Available platform types\r\n */\r\nexport type SDPlatformType = 'css' | 'js' | 'ts' | 'scss' | 'scss-dist' | 'json';\r\n\r\n// ============================================================================\r\n// Registration Types\r\n// ============================================================================\r\n\r\n/**\r\n * Style Dictionary instance type (for registration functions)\r\n * This is a minimal interface - actual SD has more methods\r\n */\r\nexport interface StyleDictionaryInstance {\r\n registerTransform: (transform: {\r\n name: string;\r\n type: TransformType;\r\n filter?: (token: SDToken) => boolean;\r\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\r\n }) => void;\r\n\r\n registerTransformGroup: (group: { name: string; transforms: string[] }) => void;\r\n\r\n registerFormat: (format: { name: string; format: (args: SDFormatArgs) => string }) => void;\r\n\r\n registerPreprocessor: (preprocessor: {\r\n name: string;\r\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\r\n }) => void;\r\n}\r\n\r\n// ============================================================================\r\n// Type Guards\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a value is an SD token\r\n */\r\nexport function isSDToken(obj: unknown): obj is SDToken {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return false;\r\n }\r\n\r\n const token = obj as Record<string, unknown>;\r\n\r\n // Must have name and path\r\n if (typeof token['name'] !== 'string') {\r\n return false;\r\n }\r\n\r\n if (!Array.isArray(token['path'])) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Check if token has a DTCG $value\r\n */\r\nexport function hasDTCGValue(token: SDToken): boolean {\r\n return token.$value !== undefined;\r\n}\r\n\r\n/**\r\n * Get token value (DTCG or legacy format)\r\n */\r\nexport function getSDTokenValue(token: SDToken): unknown {\r\n return token.$value ?? token.value;\r\n}\r\n\r\n/**\r\n * Get token type (DTCG or legacy format)\r\n */\r\nexport function getSDTokenType(token: SDToken): string | undefined {\r\n return token.$type ?? token.type;\r\n}\r\n","/**\r\n * Style Dictionary Configuration Generator\r\n *\r\n * Creates Style Dictionary configuration from DSAi config.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary/config\r\n */\r\n\r\nimport { registerFormats } from './formats/index.js';\r\nimport { registerTransformGroups } from './groups/index.js';\r\nimport { registerPreprocessors } from './preprocessors/index.js';\r\nimport { registerTransforms } from './transforms/index.js';\r\n\r\nimport type {\r\n CreateSDConfigOptions,\r\n SDConfig,\r\n SDPlatformType,\r\n StyleDictionaryInstance,\r\n} from './types.js';\r\nimport type { ResolvedConfig } from '../../config/types.js';\r\n\r\n/**\r\n * Default source patterns for token files\r\n */\r\nconst DEFAULT_SOURCE_PATTERNS = [\r\n 'collections/color/*.json',\r\n 'collections/typography/*.json',\r\n 'collections/spacing/*.json',\r\n 'collections/border/*.json',\r\n 'collections/shadow/*.json',\r\n 'collections/layout/*.json',\r\n];\r\n\r\n/**\r\n * Default platforms to generate\r\n */\r\nconst DEFAULT_PLATFORMS: SDPlatformType[] = ['css', 'js', 'ts', 'scss', 'scss-dist', 'json'];\r\n\r\n/**\r\n * Create Style Dictionary configuration from DSAi config\r\n *\r\n * Generates a complete Style Dictionary configuration based on\r\n * the resolved DSAi configuration, with sensible defaults.\r\n *\r\n * @param dsaiConfig - Resolved DSAi configuration\r\n * @param options - Additional options to override defaults\r\n * @returns Style Dictionary configuration object\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import { createStyleDictionaryConfig, registerAll } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * const { config } = await loadConfig();\r\n * const sdConfig = createStyleDictionaryConfig(config);\r\n *\r\n * registerAll(StyleDictionary);\r\n *\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\nexport function createStyleDictionaryConfig(\r\n dsaiConfig: ResolvedConfig,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): SDConfig {\r\n const {\r\n source = DEFAULT_SOURCE_PATTERNS,\r\n prefix = dsaiConfig.tokens.prefix,\r\n buildPath = dsaiConfig.tokens.outputDir,\r\n baseFontSize = dsaiConfig.tokens.baseFontSize ?? 16,\r\n outputReferences = dsaiConfig.tokens.outputReferences ?? true,\r\n platforms = DEFAULT_PLATFORMS,\r\n verbose = dsaiConfig.global.debug ?? false,\r\n } = options;\r\n\r\n const config: SDConfig = {\r\n log: {\r\n verbosity: verbose ? 'verbose' : 'default',\r\n warnings: 'warn',\r\n errors: 'error',\r\n },\r\n preprocessors: ['fix-references'],\r\n expand: {\r\n typesMap: {\r\n sizing: 'dimension',\r\n spacing: 'dimension',\r\n borderRadius: 'dimension',\r\n borderWidth: 'dimension',\r\n },\r\n },\r\n source,\r\n platforms: {},\r\n };\r\n\r\n // Ensure buildPath ends with /\r\n const normalizedBuildPath = buildPath.endsWith('/') ? buildPath : `${buildPath}/`;\r\n\r\n const platformConfigs = config.platforms ?? {};\r\n\r\n // CSS Platform\r\n if (platforms.includes('css')) {\r\n platformConfigs['css'] = {\r\n transformGroup: 'custom/css',\r\n buildPath: `${normalizedBuildPath}css/`,\r\n files: [\r\n {\r\n destination: 'variables.css',\r\n format: 'css/variables-with-comments',\r\n options: {\r\n prefix,\r\n // For CSS, we need resolved values, not references\r\n // CSS custom properties cannot reference other tokens using {token.path} syntax\r\n // They need actual values or var(--other-token) syntax\r\n outputReferences: false,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // JavaScript Platform\r\n if (platforms.includes('js')) {\r\n platformConfigs['js'] = {\r\n transformGroup: 'js-custom',\r\n buildPath: `${normalizedBuildPath}js/`,\r\n files: [\r\n {\r\n destination: 'tokens.js',\r\n format: 'javascript/es6',\r\n options: { outputReferences },\r\n },\r\n {\r\n destination: 'tokens.cjs',\r\n format: 'javascript/module',\r\n options: { outputReferences },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // TypeScript Platform\r\n if (platforms.includes('ts')) {\r\n platformConfigs['ts'] = {\r\n transformGroup: 'js-custom',\r\n buildPath: `${normalizedBuildPath}ts/`,\r\n files: [\r\n {\r\n destination: 'tokens.ts',\r\n format: 'javascript/es6',\r\n options: { outputReferences },\r\n },\r\n {\r\n destination: 'tokens.d.ts',\r\n format: 'typescript/declarations',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // SCSS Platform (source - for Bootstrap & DSAi builds)\r\n if (platforms.includes('scss')) {\r\n platformConfigs['scss'] = {\r\n transformGroup: 'custom/scss',\r\n buildPath: 'src/scss/',\r\n files: [\r\n {\r\n destination: '_variables.scss',\r\n format: 'scss/variables',\r\n options: {\r\n outputReferences,\r\n basePxFontSize: baseFontSize,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // SCSS Platform (dist - for npm package consumers)\r\n if (platforms.includes('scss-dist')) {\r\n platformConfigs['scss-dist'] = {\r\n transformGroup: 'custom/scss',\r\n buildPath: `${normalizedBuildPath}scss/`,\r\n files: [\r\n {\r\n destination: '_variables.scss',\r\n format: 'scss/variables',\r\n options: {\r\n outputReferences,\r\n basePxFontSize: baseFontSize,\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // JSON Platform (for documentation)\r\n if (platforms.includes('json')) {\r\n platformConfigs['json'] = {\r\n transformGroup: 'js',\r\n buildPath: `${normalizedBuildPath}json/`,\r\n files: [\r\n { destination: 'tokens.json', format: 'json/flat' },\r\n { destination: 'tokens-nested.json', format: 'json/nested' },\r\n ],\r\n };\r\n }\r\n\r\n config.platforms = platformConfigs;\r\n return config;\r\n}\r\n\r\n/**\r\n * Register all custom transforms, formats, preprocessors, and groups\r\n *\r\n * Must be called before creating a Style Dictionary instance with\r\n * a config generated by createStyleDictionaryConfig.\r\n *\r\n * @param sd - Style Dictionary instance (the imported module)\r\n * @param options - Custom extensions to register\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { registerAll } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * registerAll(StyleDictionary, {\r\n * customTransforms: [myCustomTransform],\r\n * customFormats: [myCustomFormat],\r\n * });\r\n * ```\r\n */\r\nexport function registerAll(\r\n sd: StyleDictionaryInstance,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): void {\r\n const { customTransforms = [], customFormats = [], customPreprocessors = [] } = options;\r\n\r\n // Order matters: transforms first, then groups (which reference transforms)\r\n registerTransforms(sd, customTransforms);\r\n registerTransformGroups(sd);\r\n registerFormats(sd, customFormats);\r\n registerPreprocessors(sd, customPreprocessors);\r\n}\r\n\r\n/**\r\n * Create and register a complete Style Dictionary setup\r\n *\r\n * Convenience function that combines registerAll and createStyleDictionaryConfig.\r\n *\r\n * @param sd - Style Dictionary instance\r\n * @param dsaiConfig - Resolved DSAi configuration\r\n * @param options - Additional options\r\n * @returns Style Dictionary configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import { setupStyleDictionary } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * const { config } = await loadConfig();\r\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\r\n *\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\nexport function setupStyleDictionary(\r\n sd: StyleDictionaryInstance,\r\n dsaiConfig: ResolvedConfig,\r\n options: Partial<CreateSDConfigOptions> = {}\r\n): SDConfig {\r\n registerAll(sd, options);\r\n return createStyleDictionaryConfig(dsaiConfig, options);\r\n}\r\n","/**\r\n * Style Dictionary Integration Module\r\n *\r\n * Provides reusable transforms, formats, preprocessors, and configuration\r\n * generation for Style Dictionary token builds.\r\n *\r\n * @packageDocumentation\r\n * @module @dsai-io/tools/tokens/style-dictionary\r\n *\r\n * @example\r\n * ```typescript\r\n * import StyleDictionary from 'style-dictionary';\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import {\r\n * setupStyleDictionary,\r\n * registerAll,\r\n * createStyleDictionaryConfig,\r\n * } from '@dsai-io/tools/tokens/style-dictionary';\r\n *\r\n * // Option 1: All-in-one setup\r\n * const { config } = await loadConfig();\r\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n *\r\n * // Option 2: Manual registration\r\n * registerAll(StyleDictionary);\r\n * const sdConfig = createStyleDictionaryConfig(config);\r\n * const sd = new StyleDictionary(sdConfig);\r\n * await sd.buildAllPlatforms();\r\n * ```\r\n */\r\n\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n // Token types\r\n SDToken,\r\n SDDictionary,\r\n // Transform types\r\n TransformType,\r\n SDTransformOptions,\r\n TransformDefinition,\r\n TransformGroupDefinition,\r\n // Format types\r\n SDPlatform,\r\n SDFile,\r\n SDFormatArgs,\r\n FormatDefinition,\r\n // Preprocessor types\r\n PreprocessorDefinition,\r\n // Config types\r\n SDLogConfig,\r\n SDConfig,\r\n CreateSDConfigOptions,\r\n SDPlatformType,\r\n // Registration types\r\n StyleDictionaryInstance,\r\n} from './types.js';\r\n\r\n// Type guards\r\nexport { isSDToken, hasDTCGValue, getSDTokenValue, getSDTokenType } from './types.js';\r\n\r\n// ============================================================================\r\n// Config Generation\r\n// ============================================================================\r\n\r\nexport { createStyleDictionaryConfig, registerAll, setupStyleDictionary } from './config.js';\r\n\r\n// ============================================================================\r\n// Transforms\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInTransforms,\r\n // Registration\r\n registerTransforms,\r\n // Individual transforms\r\n fontWeightUnitless,\r\n lineHeightUnitless,\r\n dimensionRem,\r\n nameKebab,\r\n} from './transforms/index.js';\r\n\r\n// ============================================================================\r\n// Formats\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInFormats,\r\n // Registration\r\n registerFormats,\r\n // Individual formats\r\n cssVariablesWithComments,\r\n typescriptDeclarations,\r\n} from './formats/index.js';\r\n\r\n// ============================================================================\r\n// Preprocessors\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n builtInPreprocessors,\r\n // Registration\r\n registerPreprocessors,\r\n // Individual preprocessors\r\n fixReferences,\r\n createFixReferencesPreprocessor,\r\n} from './preprocessors/index.js';\r\n\r\n// ============================================================================\r\n// Transform Groups\r\n// ============================================================================\r\n\r\nexport {\r\n // Collections\r\n transformGroups,\r\n // Registration\r\n registerTransformGroups,\r\n // Individual groups\r\n cssTransformGroup,\r\n jsTransformGroup,\r\n scssTransformGroup,\r\n} from './groups/index.js';\r\n","/**\r\n * Framework Mappers\r\n *\r\n * Maps Figma/DTCG token names to framework-specific variable names.\r\n * Supports Bootstrap, shadcn/ui, Tailwind, MUI, and custom mappings.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nexport {\r\n bootstrapMapper,\r\n BOOTSTRAP_MAPPINGS,\r\n BOOTSTRAP_PATTERNS,\r\n mapToBootstrapName,\r\n} from './bootstrap.js';\r\nexport { shadcnMapper, SHADCN_MAPPINGS, mapToShadcnName } from './shadcn.js';\r\nexport {\r\n createFrameworkMapper,\r\n getFrameworkMapper,\r\n applyNameMapping,\r\n type FrameworkMapper,\r\n type FrameworkMapperWithConfig,\r\n} from './mapper.js';\r\nexport type {\r\n FrameworkTarget,\r\n FrameworkMappingConfig,\r\n FrameworkMappingPattern,\r\n} from '../../config/types.js';\r\n","/**\r\n * Token Changelog Generator\r\n *\r\n * Generates human-readable changelogs from token diffs in Markdown format.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { writeFile, readFile } from 'node:fs/promises';\r\n\r\nimport type { TokenDiff, TokenChange } from './diff.js';\r\nimport type { TokenCollection } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for changelog generation\r\n */\r\nexport interface ChangelogOptions {\r\n /** Version number (e.g., '1.2.0') */\r\n version?: string;\r\n /** Release date (defaults to today) */\r\n date?: Date;\r\n /** Custom header for the changelog entry */\r\n header?: string;\r\n /** Whether to include descriptions */\r\n includeDescriptions?: boolean;\r\n /** Whether to include value changes (before/after) */\r\n includeValues?: boolean;\r\n /** Maximum value length to display (truncates longer values) */\r\n maxValueLength?: number;\r\n /** Whether to group by change type */\r\n groupByType?: boolean;\r\n}\r\n\r\n/**\r\n * Result of changelog generation\r\n */\r\nexport interface ChangelogResult {\r\n /** Generated Markdown content */\r\n content: string;\r\n /** Number of entries in the changelog */\r\n entryCount: number;\r\n /** Whether there are breaking changes */\r\n hasBreaking: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Format a date as YYYY-MM-DD\r\n */\r\nfunction formatDate(date: Date): string {\r\n const year = date.getUTCFullYear();\r\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\r\n const day = String(date.getUTCDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n/**\r\n * Format a value for display (truncate if too long)\r\n */\r\nfunction formatValue(value: unknown, maxLength = 100): string {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n\r\n if (str.length <= maxLength) {\r\n return str;\r\n }\r\n\r\n return `${str.slice(0, maxLength)}...`;\r\n}\r\n\r\n/**\r\n * Escape Markdown special characters\r\n */\r\nfunction escapeMarkdown(text: string): string {\r\n return text.replace(/[*_`[\\]]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Generate Markdown for a single token change\r\n */\r\nfunction formatChange(change: TokenChange, options: ChangelogOptions): string {\r\n const lines: string[] = [];\r\n\r\n // Token path with breaking indicator\r\n const breaking = change.breaking ? ' ⚠️ **BREAKING**' : '';\r\n lines.push(`- \\`${escapeMarkdown(change.path)}\\`${breaking}`);\r\n\r\n // Description\r\n if (options.includeDescriptions && change.description) {\r\n lines.push(` - ${change.description}`);\r\n }\r\n\r\n // Value change details\r\n if (options.includeValues && change.valueChange) {\r\n const { oldValue, newValue, oldType, newType } = change.valueChange;\r\n\r\n if (change.type === 'type-changed') {\r\n lines.push(` - Type: \\`${oldType}\\` → \\`${newType}\\``);\r\n }\r\n\r\n const oldFormatted = formatValue(oldValue, options.maxValueLength);\r\n const newFormatted = formatValue(newValue, options.maxValueLength);\r\n\r\n if (change.type === 'modified' || change.type === 'type-changed') {\r\n lines.push(` - Before: \\`${escapeMarkdown(oldFormatted)}\\``);\r\n lines.push(` - After: \\`${escapeMarkdown(newFormatted)}\\``);\r\n }\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Generate a section for a specific change type\r\n */\r\nfunction formatSection(title: string, changes: TokenChange[], options: ChangelogOptions): string {\r\n if (changes.length === 0) {\r\n return '';\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push(`### ${title}`);\r\n lines.push('');\r\n\r\n for (const change of changes) {\r\n lines.push(formatChange(change, options));\r\n }\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Generate a changelog entry from a token diff\r\n *\r\n * @param diff - Token diff to generate changelog from\r\n * @param options - Changelog options\r\n * @returns Generated changelog content\r\n */\r\nexport function generateChangelog(\r\n diff: TokenDiff,\r\n options: ChangelogOptions = {}\r\n): ChangelogResult {\r\n const {\r\n version = 'Unreleased',\r\n date = new Date(),\r\n header,\r\n includeDescriptions = true,\r\n includeValues = true,\r\n maxValueLength = 100,\r\n groupByType = true,\r\n } = options;\r\n\r\n const lines: string[] = [];\r\n\r\n // Header\r\n if (header) {\r\n lines.push(header);\r\n } else {\r\n const dateStr = formatDate(date);\r\n lines.push(`## [${version}] - ${dateStr}`);\r\n }\r\n\r\n lines.push('');\r\n\r\n // Summary\r\n if (diff.totalChanges === 0) {\r\n lines.push('No changes.');\r\n lines.push('');\r\n return {\r\n content: lines.join('\\n'),\r\n entryCount: 0,\r\n hasBreaking: false,\r\n };\r\n }\r\n\r\n if (diff.hasBreaking) {\r\n lines.push('⚠️ **This release contains breaking changes**');\r\n lines.push('');\r\n }\r\n\r\n lines.push(`**Total changes:** ${diff.totalChanges}`);\r\n lines.push('');\r\n\r\n // Group changes by type\r\n if (groupByType) {\r\n // Breaking changes first\r\n if (diff.removed.length > 0 || diff.typeChanged.length > 0) {\r\n lines.push(\r\n formatSection('Breaking Changes', [...diff.removed, ...diff.typeChanged], {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Added tokens\r\n if (diff.added.length > 0) {\r\n lines.push(\r\n formatSection('Added', diff.added, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues: false, // No before/after for additions\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Modified tokens\r\n if (diff.modified.length > 0) {\r\n lines.push(\r\n formatSection('Changed', diff.modified, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n\r\n // Deprecated tokens\r\n if (diff.deprecated.length > 0) {\r\n lines.push(\r\n formatSection('Deprecated', diff.deprecated, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues: false,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n } else {\r\n // Flat list of all changes\r\n const allChanges = [\r\n ...diff.removed,\r\n ...diff.typeChanged,\r\n ...diff.added,\r\n ...diff.modified,\r\n ...diff.deprecated,\r\n ];\r\n\r\n for (const change of allChanges) {\r\n lines.push(\r\n formatChange(change, {\r\n ...options,\r\n includeDescriptions,\r\n includeValues,\r\n maxValueLength,\r\n })\r\n );\r\n }\r\n lines.push('');\r\n }\r\n\r\n return {\r\n content: lines.join('\\n'),\r\n entryCount: diff.totalChanges,\r\n hasBreaking: diff.hasBreaking,\r\n };\r\n}\r\n\r\n/**\r\n * Write changelog to file (append mode)\r\n *\r\n * @param content - Changelog content to write\r\n * @param filePath - Path to changelog file\r\n * @returns Whether the write was successful\r\n */\r\nexport async function writeChangelog(content: string, filePath: string): Promise<boolean> {\r\n try {\r\n let finalContent = content;\r\n\r\n // If file exists, prepend new content\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (existsSync(filePath)) {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n const existingContent = await readFile(filePath, 'utf-8');\r\n\r\n // Check if there's a header (# Changelog)\r\n const hasHeader = existingContent.trim().startsWith('#');\r\n\r\n if (hasHeader) {\r\n // Insert after first line\r\n const lines = existingContent.split('\\n');\r\n const header = lines[0];\r\n const rest = lines.slice(1).join('\\n');\r\n finalContent = `${header}\\n\\n${content}${rest}`;\r\n } else {\r\n // Prepend\r\n finalContent = `${content}\\n${existingContent}`;\r\n }\r\n } else {\r\n // Create new file with header\r\n finalContent = `# Changelog\\n\\nAll notable changes to design tokens will be documented in this file.\\n\\n${content}`;\r\n }\r\n\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n await writeFile(filePath, finalContent, 'utf-8');\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to write changelog:', error);\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Generate and write changelog in one step\r\n *\r\n * @param diff - Token diff to generate changelog from\r\n * @param filePath - Path to changelog file\r\n * @param options - Changelog options\r\n * @returns Result of changelog generation\r\n */\r\nexport async function generateAndWriteChangelog(\r\n diff: TokenDiff,\r\n filePath: string,\r\n options: ChangelogOptions = {}\r\n): Promise<ChangelogResult & { written: boolean }> {\r\n const result = generateChangelog(diff, options);\r\n const written = await writeChangelog(result.content, filePath);\r\n\r\n return {\r\n ...result,\r\n written,\r\n };\r\n}\r\n\r\n/**\r\n * CLI entry point for generating changelog from two token files\r\n *\r\n * @param oldTokensPath - Path to old/previous tokens file\r\n * @param newTokensPath - Path to new/current tokens file\r\n * @param outputPath - Path to changelog file (default: 'TOKENS-CHANGELOG.md')\r\n * @param version - Version number for the changelog entry\r\n * @returns Whether the operation was successful\r\n */\r\nexport async function generateChangelogCLI(\r\n oldTokensPath: string,\r\n newTokensPath: string,\r\n outputPath = 'TOKENS-CHANGELOG.md',\r\n version?: string\r\n): Promise<boolean> {\r\n /* eslint-disable no-console */\r\n try {\r\n console.log('📝 Generating token changelog...\\n');\r\n\r\n // Import required modules dynamically\r\n const { readFile: fsReadFile } = await import('node:fs/promises');\r\n const { diffTokens: diffFn } = await import('./diff.js');\r\n\r\n // Load token files\r\n console.log(`📖 Reading old tokens: ${oldTokensPath}`);\r\n const oldContent = await fsReadFile(oldTokensPath, 'utf-8');\r\n const oldTokens = JSON.parse(oldContent) as TokenCollection;\r\n\r\n console.log(`📖 Reading new tokens: ${newTokensPath}`);\r\n const newContent = await fsReadFile(newTokensPath, 'utf-8');\r\n const newTokens = JSON.parse(newContent) as TokenCollection;\r\n\r\n // Compute diff\r\n console.log('🔍 Computing differences...');\r\n const diff = diffFn(oldTokens, newTokens);\r\n\r\n if (diff.totalChanges === 0) {\r\n console.log('✨ No changes detected.');\r\n return true;\r\n }\r\n\r\n console.log(`\\n📊 Summary:`);\r\n console.log(` • Total changes: ${diff.totalChanges}`);\r\n if (diff.added.length > 0) {\r\n console.log(` • Added: ${diff.added.length}`);\r\n }\r\n if (diff.removed.length > 0) {\r\n console.log(` • Removed: ${diff.removed.length} ⚠️`);\r\n }\r\n if (diff.modified.length > 0) {\r\n console.log(` • Modified: ${diff.modified.length}`);\r\n }\r\n if (diff.typeChanged.length > 0) {\r\n console.log(` • Type changed: ${diff.typeChanged.length} ⚠️`);\r\n }\r\n if (diff.deprecated.length > 0) {\r\n console.log(` • Deprecated: ${diff.deprecated.length}`);\r\n }\r\n\r\n if (diff.hasBreaking) {\r\n console.log('\\n⚠️ Warning: This release contains breaking changes!');\r\n }\r\n\r\n // Generate and write changelog\r\n console.log(`\\n📄 Writing changelog to: ${outputPath}`);\r\n const result = await generateAndWriteChangelog(diff, outputPath, {\r\n version,\r\n includeDescriptions: true,\r\n includeValues: true,\r\n });\r\n\r\n if (result.written) {\r\n console.log('✅ Changelog generated successfully!');\r\n return true;\r\n } else {\r\n console.error('❌ Failed to write changelog file');\r\n return false;\r\n }\r\n } catch (error) {\r\n console.error('❌ Error generating changelog:', error);\r\n return false;\r\n }\r\n /* eslint-enable no-console */\r\n}\r\n","/**\r\n * @file Token Tooling Module\r\n * @description Provides utilities for token validation, transformation,\r\n * and build orchestration using Style Dictionary.\r\n *\r\n * @module @dsai-io/tools/tokens\r\n */\r\n\r\n// ============================================================================\r\n// Type Exports\r\n// ============================================================================\r\n\r\nexport type {\r\n // Core token types\r\n DTCGToken,\r\n LegacyToken,\r\n Token,\r\n TokenType,\r\n TokenCollection,\r\n // Figma types\r\n FigmaCollection,\r\n FigmaExport,\r\n // Validation types\r\n ValidationSeverity,\r\n ValidationIssue,\r\n ValidateOptions,\r\n // Build types\r\n BuildOptions,\r\n BuildResult,\r\n BuildStep,\r\n // Sync types\r\n SyncOptions,\r\n SyncResult,\r\n // Postprocess types\r\n PostprocessOptions,\r\n PostprocessResult,\r\n ReplacementRule,\r\n // Merge types\r\n MergeOptions,\r\n MergeResult,\r\n} from './types.js';\r\n\r\n// Re-export with prefixed names to avoid conflicts with config module\r\nexport type {\r\n ValidationResult as TokenValidationResult,\r\n TransformOptions as TokenTransformOptions,\r\n TransformResult as TokenTransformResult,\r\n} from './types.js';\r\n\r\n// Mode extraction and preprocessing types\r\nexport type {\r\n ModeExtractionOptions,\r\n ModeExtractionResult,\r\n} from './mode-extractor.js';\r\n\r\nexport type {\r\n PreprocessorConfig,\r\n FilePreprocessingResult,\r\n PreprocessingResult,\r\n} from './mode-preprocessor.js';\r\n\r\n// ============================================================================\r\n// Type Guards and Utility Functions\r\n// ============================================================================\r\n\r\nexport {\r\n // Type guards\r\n isDTCGToken,\r\n isLegacyToken,\r\n isToken,\r\n isValidTokenType,\r\n isTokenReference,\r\n // Token utilities\r\n getTokenValue,\r\n getTokenType,\r\n getTokenDescription,\r\n toDTCGToken,\r\n parseTokenReference,\r\n // Constants\r\n VALID_TOKEN_TYPES,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Validation Module\r\n// ============================================================================\r\n\r\nexport { validateTokens, validateTokensCLI } from './validate.js';\r\n\r\n// ============================================================================\r\n// Schema Validation Module\r\n// ============================================================================\r\n\r\nexport {\r\n // DTCG schemas\r\n dtcgFileSchema,\r\n dtcgTokenCollectionSchema,\r\n dtcgTokenSchema,\r\n // Figma schemas\r\n figmaExportSchema,\r\n figmaExportWithMetadataSchema,\r\n figmaVariablesResponseSchema,\r\n // Style Dictionary schemas\r\n styleDictionaryInputSchema,\r\n styleDictionaryTokenSchema,\r\n // Validation functions\r\n validateDTCGFile,\r\n validateDTCGTokens,\r\n validateFigmaExport,\r\n validateFigmaExportWithMetadata,\r\n validateFigmaVariablesResponse,\r\n validateStyleDictionaryInput,\r\n validateStyleDictionaryTokens,\r\n} from './schemas/index.js';\r\n\r\nexport type {\r\n // Schema types\r\n DTCGFile,\r\n DTCGTokenCollection,\r\n FigmaExportWithMetadata,\r\n FigmaVariablesResponse,\r\n // Validation types\r\n ValidationError as SchemaValidationError,\r\n ValidationOptions as SchemaValidationOptions,\r\n ValidationResult as SchemaValidationResult,\r\n} from './schemas/index.js';\r\n\r\n// ============================================================================\r\n// Figma Validation Module\r\n// ============================================================================\r\n\r\nexport {\r\n validateFigmaExports,\r\n validateFigmaFile,\r\n validateFigmaCLI,\r\n detectModes as detectFigmaModes,\r\n} from './validate-figma.js';\r\n\r\n// ============================================================================\r\n// Transform Module\r\n// ============================================================================\r\n\r\nexport {\r\n transformTokens,\r\n transformTokensCLI,\r\n transformToken,\r\n transformTokenTree,\r\n transformType,\r\n transformValue,\r\n detectModes as detectTransformModes,\r\n} from './transform.js';\r\n\r\n// ============================================================================\r\n// Sync Module\r\n// ============================================================================\r\n\r\nexport { syncTokens, syncTokensCLI, getDefaultSyncPaths } from './sync.js';\r\n\r\n// ============================================================================\r\n// Build Module\r\n// ============================================================================\r\n\r\nexport { buildTokens, buildTokensCLI, runBuildCLI } from './build.js';\r\n\r\n// ============================================================================\r\n// Theme Discovery Module\r\n// ============================================================================\r\n\r\nexport {\r\n discoverThemeFiles,\r\n getThemeFiles,\r\n autoDetectThemes,\r\n} from './theme-discovery.js';\r\n\r\nexport type {\r\n ThemeFilesResult,\r\n DiscoveryResult,\r\n DiscoveryOptions,\r\n} from './theme-discovery.js';\r\n\r\n// ============================================================================\r\n// Mode Extraction and Preprocessing Module\r\n// ============================================================================\r\n\r\nexport {\r\n extractMode,\r\n extractModes,\r\n detectModes,\r\n flattenModeStructure,\r\n} from './mode-extractor.js';\r\n\r\nexport {\r\n preprocessFile,\r\n preprocessTokenFiles,\r\n getPreprocessedFilesForMode,\r\n} from './mode-preprocessor.js';\r\n\r\n// ============================================================================\r\n// Theme Builder Module\r\n// ============================================================================\r\n\r\nexport {\r\n buildTheme,\r\n buildAllThemes,\r\n generateThemeBuildConfig,\r\n getCssFormat,\r\n getThemeSelector,\r\n validateThemeDefinitions,\r\n} from './theme-builder.js';\r\n\r\nexport type {\r\n ThemeBuildConfig,\r\n ThemeBuildOptions,\r\n ThemeBuildResult,\r\n MultiThemeBuildOptions,\r\n MultiThemeBuildResult,\r\n ThemeStyleDictionaryConfig,\r\n StyleDictionaryPlatformConfig,\r\n StyleDictionaryFileConfig,\r\n} from './theme-builder.js';\r\n\r\n// ============================================================================\r\n// Clean Module\r\n// ============================================================================\r\n\r\nexport {\r\n cleanTokenOutputs,\r\n cleanTokensCLI,\r\n DEFAULT_CLEAN_DIRECTORIES,\r\n} from './clean.js';\r\n\r\nexport type {\r\n CleanOptions,\r\n CleanResult,\r\n CleanedDirectory,\r\n} from './clean.js';\r\n\r\n// ============================================================================\r\n// Postprocess Module\r\n// ============================================================================\r\n\r\nexport {\r\n postprocessCss,\r\n postprocessCssFiles,\r\n postprocessCLI,\r\n getDefaultCssDir,\r\n getDefaultFiles,\r\n getDefaultTransformations,\r\n} from './postprocess.js';\r\n\r\n// ============================================================================\r\n// Merge Module (Token Collections)\r\n// ============================================================================\r\n\r\nexport { mergeCollections, mergeCollectionsCLI } from './merge.js';\r\n\r\n// ============================================================================\r\n// Style Merge Module (CSS/SCSS Bundling)\r\n// ============================================================================\r\n\r\nexport * from './merge/index.js';\r\n\r\n// ============================================================================\r\n// Output Path Resolution\r\n// ============================================================================\r\n\r\nexport * from './output/index.js';\r\n\r\n// ============================================================================\r\n// Style Dictionary Integration\r\n// ============================================================================\r\n\r\n// Re-export all Style Dictionary types and utilities\r\nexport * from './style-dictionary/index.js';\r\n\r\n// ============================================================================\r\n// Framework Mappers\r\n// ============================================================================\r\n\r\n// Re-export framework mapping utilities\r\nexport * from './framework-mappers/index.js';\r\n\r\n// ============================================================================\r\n// Changelog Generation\r\n// ============================================================================\r\n\r\nexport {\r\n generateChangelog,\r\n writeChangelog,\r\n generateAndWriteChangelog,\r\n generateChangelogCLI,\r\n} from './changelog.js';\r\n\r\nexport type {\r\n ChangelogOptions,\r\n ChangelogResult,\r\n} from './changelog.js';\r\n\r\nexport {\r\n diffTokens,\r\n summarizeDiff,\r\n filterDiff,\r\n getBreakingChanges,\r\n} from './diff.js';\r\n\r\nexport type {\r\n TokenChangeType,\r\n TokenValueChange,\r\n TokenChange,\r\n TokenDiff,\r\n} from './diff.js';\r\n"]}
|