@dsai-io/tools 1.0.7 → 1.2.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.
@@ -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.ts","../src/tokens/style-dictionary/transforms/name-js-identifier.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/icons/core/optimizer.ts","../src/version.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/config/resolver.ts","../src/config/loader.ts","../src/config/env.ts","../src/config/migrate.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","../src/icons/core/scanner.ts","../src/icons/utils/naming.ts","../src/icons/core/parser.ts","../src/icons/core/index.ts","../src/icons/generators/react.ts","../src/icons/generators/svg-sprite.ts","../src/icons/index.ts","../src/utils/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","defaultSVGOConfig","z","version","cosmiconfig","cosmiconfigSync","readFileSync","existsSync","readdirSync","join","statSync","relative","basename","extname","countTokens","DEFAULT_COLLECTIONS","dirname","mkdirSync","detectModes","writeFileSync","createHash","fs","getNestedValue","parse","rmSync","resolve","registerTransformGroups","fg","execSync","outputDir","duration","path4","fs2","path5","path6","fs3","path7","fs4","readFile","writeFile","skipOptimization","fileURLToPath","pc","deepMerge"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * CSS Dark Mode Variables Format\n *\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\n * following Bootstrap 5.3+ color mode pattern.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-dark-mode\n * @see https://getbootstrap.com/docs/5.3/customize/color-modes/\n */\n\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\n\n/**\n * css/variables-dark-mode format\n *\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\n * for Bootstrap-compatible dark mode theming.\n *\n * @example\n * Output:\n * ```css\n * [data-bs-theme=\"dark\"] {\n * --dsai-body-bg: #212529;\n * --dsai-body-color: #dee2e6;\n * }\n * ```\n */\nexport const cssDarkModeVariables: FormatDefinition = {\n name: 'css/variables-dark-mode',\n format: ({ dictionary, options }: SDFormatArgs): string => {\n const prefix = (options['prefix'] as string) ?? '--';\n const selector = (options['selector'] as string) ?? '[data-bs-theme=\"dark\"]';\n\n const variables = dictionary.allTokens.map((token) => {\n const lines: string[] = [];\n\n // Add comment if present\n if (token.comment) {\n lines.push(` /* ${token.comment} */`);\n }\n\n // Add description if present (DTCG $description or legacy description)\n const description = token.$description ?? token.description;\n if (description && description !== token.comment) {\n lines.push(` /* ${description} */`);\n }\n\n // Get value (DTCG $value or legacy value)\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\n\n // Add variable\n lines.push(` ${prefix}${token.name}: ${value};`);\n\n return lines.join('\\n');\n });\n\n return `${selector} {\\n${variables.join('\\n')}\\n}\\n`;\n },\n};\n","/**\n * CSS Variables Format\n *\n * Generates CSS custom properties with descriptive comments.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-variables\n */\n\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\n\n/**\n * css/variables-with-comments format\n *\n * Generates CSS custom properties with descriptive comments.\n * Supports configurable prefix via options.\n *\n * @example\n * Output:\n * ```css\n * :root {\n * /* Primary brand color *\\/\n * --dsai-color-primary: #007bff;\n * --dsai-spacing-md: 1rem;\n * }\n * ```\n */\nexport const cssVariablesWithComments: FormatDefinition = {\n name: 'css/variables-with-comments',\n format: ({ dictionary, options }: SDFormatArgs): string => {\n const prefix = (options['prefix'] as string) ?? '--';\n\n const variables = dictionary.allTokens.map((token) => {\n const lines: string[] = [];\n\n // Add comment if present\n if (token.comment) {\n lines.push(` /* ${token.comment} */`);\n }\n\n // Add description if present (DTCG $description or legacy description)\n const description = token.$description ?? token.description;\n if (description && description !== token.comment) {\n lines.push(` /* ${description} */`);\n }\n\n // Get value (DTCG $value or legacy value)\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\n\n // Add variable\n lines.push(` ${prefix}${token.name}: ${value};`);\n\n return lines.join('\\n');\n });\n\n return `:root {\\n${variables.join('\\n')}\\n}\\n`;\n },\n};\n","/**\n * JavaScript Format\n *\n * Custom JavaScript ES6 format that uses the transformed token.name\n * to ensure valid JavaScript identifiers.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/javascript\n */\n\nimport type { FormatDefinition } from '../types.js';\n\n/**\n * Convert a path segment to PascalCase, handling numeric segments\n */\nfunction toPascalCaseSegment(segment: string): string {\n const needsNumericPrefix = /^\\d/.test(segment);\n\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\n const pascal = segment\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n\n // Prefix numeric identifiers with underscore to make them valid\n return needsNumericPrefix ? `_${pascal}` : pascal;\n}\n\n/**\n * Convert token path to valid JavaScript identifier\n */\nfunction toJsIdentifier(path: string[]): string {\n return path.map(toPascalCaseSegment).join('');\n}\n\n/**\n * JavaScript ES6 format with valid identifiers\n *\n * Manually applies the name transformation to ensure valid JS variable names.\n */\nexport const javascriptEsm: FormatDefinition = {\n name: 'javascript/esm-safe',\n format: ({ dictionary, file, options }) => {\n const tokens = dictionary.allTokens;\n // Check if tokens are in DTCG format (auto-detected by Style Dictionary)\n const usesDtcg = options?.['usesDtcg'] ?? false;\n\n let output = `/**\\n * ${file.destination}\\n * Design Tokens - Generated\\n * DO NOT EDIT\\n */\\n\\n`;\n\n for (const token of tokens) {\n // Use the transformed name or generate it from path\n const name = toJsIdentifier(token.path);\n\n // For DTCG tokens, use $value; for regular tokens, use value\n const tokenValue = usesDtcg ? token.$value : token.value;\n const value = JSON.stringify(tokenValue);\n\n // Handle DTCG $description or regular description/comment\n const comment = token.comment || token.$description || token.description || '';\n\n if (comment) {\n output += `// ${comment}\\n`;\n }\n output += `export const ${name} = ${value};\\n`;\n }\n\n return output;\n },\n};\n","/**\n * Bootstrap Framework Mapper\n *\n * Maps Figma/DTCG token names to Bootstrap 5.x variable names.\n * This is the complete mapping list extracted from the playground's\n * _variables.scss compatibility layer.\n *\n * @packageDocumentation\n */\n\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\n\n// ============================================================================\n// Bootstrap Name Mappings\n// ============================================================================\n\n/**\n * Complete token name → Bootstrap variable name mappings\n *\n * These mappings handle cases where Figma/DTCG token naming conventions\n * differ from Bootstrap 5.x variable naming conventions.\n *\n * The mappings are extracted from the playground's manual _variables.scss\n * compatibility layer to ensure complete parity.\n *\n * CATEGORIES:\n * - Typography: Font sizes, weights, headings, display, line heights, letter spacing\n * - Colors: Pass through (no mapping needed - names match)\n * - Spacing: Pass through (no mapping needed - names match)\n * - Layout: Pass through (no mapping needed - names match)\n * - Shadows: Custom mappings to Bootstrap shadow variable names\n * - Border Radius: Custom mappings to Bootstrap radius variable names\n */\nexport const BOOTSTRAP_MAPPINGS: Record<string, string> = {\n // ==========================================================================\n // TYPOGRAPHY - Font Sizes\n // ==========================================================================\n // Figma uses \"text\" prefix, Bootstrap uses \"font-size\" prefix\n 'typography-text-base': 'font-size-base',\n 'typography-text-sm': 'font-size-sm',\n 'typography-text-lead': 'font-size-lg',\n\n // ==========================================================================\n // TYPOGRAPHY - Font Weights\n // ==========================================================================\n // Figma uses descriptive names, Bootstrap uses semantic names\n 'typography-font-weight-thin': 'font-weight-lighter',\n 'typography-font-weight-extra-light': 'font-weight-lighter',\n 'typography-font-weight-light': 'font-weight-light',\n 'typography-font-weight-regular': 'font-weight-normal',\n 'typography-font-weight-medium': 'font-weight-medium',\n 'typography-font-weight-semi-bold': 'font-weight-semibold',\n 'typography-font-weight-bold': 'font-weight-bold',\n 'typography-font-weight-extra-bold': 'font-weight-bold',\n 'typography-font-weight-black': 'font-weight-bolder',\n\n // ==========================================================================\n // TYPOGRAPHY - Font Families\n // ==========================================================================\n 'typography-font-family-base': 'font-family-base',\n 'typography-font-family-monospace': 'font-family-monospace',\n\n // ==========================================================================\n // TYPOGRAPHY - Headings (h1-h6)\n // ==========================================================================\n // Figma: heading-h1 → Bootstrap: h1-font-size\n 'typography-heading-h1': 'h1-font-size',\n 'typography-heading-h2': 'h2-font-size',\n 'typography-heading-h3': 'h3-font-size',\n 'typography-heading-h4': 'h4-font-size',\n 'typography-heading-h5': 'h5-font-size',\n 'typography-heading-h6': 'h6-font-size',\n\n // ==========================================================================\n // TYPOGRAPHY - Display Headings (d1-d6)\n // ==========================================================================\n // Figma: display-d1 → Bootstrap: display1-size (part of $display-font-sizes map)\n 'typography-display-d1': 'display1-size',\n 'typography-display-d2': 'display2-size',\n 'typography-display-d3': 'display3-size',\n 'typography-display-d4': 'display4-size',\n 'typography-display-d5': 'display5-size',\n 'typography-display-d6': 'display6-size',\n // Alternative naming: display-h1 → display1-size\n 'typography-display-h1': 'display1-size',\n 'typography-display-h2': 'display2-size',\n 'typography-display-h3': 'display3-size',\n 'typography-display-h4': 'display4-size',\n 'typography-display-h5': 'display5-size',\n 'typography-display-h6': 'display6-size',\n\n // ==========================================================================\n // TYPOGRAPHY - Line Heights\n // ==========================================================================\n 'typography-line-height-xs': 'line-height-xs',\n 'typography-line-height-sm': 'line-height-sm',\n 'typography-line-height-tight': 'headings-line-height',\n 'typography-line-height-base': 'line-height-base',\n 'typography-line-height-relaxed': 'line-height-relaxed',\n 'typography-line-height-lg': 'line-height-lg',\n 'typography-line-height-display-sm': 'display-line-height',\n 'typography-line-height-display-md': 'display-line-height-md',\n 'typography-line-height-display-lg': 'display-line-height-lg',\n\n // ==========================================================================\n // TYPOGRAPHY - Letter Spacing\n // ==========================================================================\n 'typography-letter-spacing-tighter': 'letter-spacing-tighter',\n 'typography-letter-spacing-tightest': 'letter-spacing-tighter',\n 'typography-letter-spacing-tight': 'letter-spacing-tight',\n 'typography-letter-spacing-normal': 'letter-spacing-normal',\n 'typography-letter-spacing-wide': 'letter-spacing-wide',\n 'typography-letter-spacing-wider': 'letter-spacing-wider',\n 'typography-letter-spacing-widest': 'letter-spacing-widest',\n\n // ==========================================================================\n // TYPOGRAPHY - Lead\n // ==========================================================================\n 'typography-lead-font-size': 'lead-font-size',\n\n // ==========================================================================\n // SHADOWS\n // ==========================================================================\n // Figma: shadow-default → Bootstrap: box-shadow\n 'shadow-default': 'box-shadow',\n 'shadow-sm': 'box-shadow-sm',\n 'shadow-lg': 'box-shadow-lg',\n 'shadow-inset': 'box-shadow-inset',\n\n // ==========================================================================\n // BORDER WIDTH\n // ==========================================================================\n // Figma: border-width-0 → Bootstrap: border-width-0\n 'border-width-0': 'border-width-0',\n 'border-width-1': 'border-width-1',\n 'border-width-2': 'border-width-2',\n 'border-width-3': 'border-width-3',\n 'border-width-4': 'border-width-4',\n 'border-width-5': 'border-width-5',\n\n // ==========================================================================\n // BORDER RADIUS\n // ==========================================================================\n // Figma: border-radius-default → Bootstrap: border-radius\n 'border-radius-0': 'border-radius-0',\n 'border-radius-default': 'border-radius',\n 'border-radius-sm': 'border-radius-sm',\n 'border-radius-lg': 'border-radius-lg',\n 'border-radius-xl': 'border-radius-xl',\n 'border-radius-xxl': 'border-radius-xxl',\n 'border-radius-pill': 'border-radius-pill',\n 'border-radius-circle': 'border-radius-circle',\n\n // ==========================================================================\n // SEMANTIC / THEME COLORS\n // ==========================================================================\n // Figma: theme-primary → Bootstrap uses these directly\n 'theme-primary': 'primary',\n 'theme-secondary': 'secondary',\n 'theme-success': 'success',\n 'theme-danger': 'danger',\n 'theme-warning': 'warning',\n 'theme-info': 'info',\n 'theme-light': 'light',\n 'theme-dark': 'dark',\n\n // ==========================================================================\n // LAYOUT - Grid\n // ==========================================================================\n 'layout-grid-columns': 'grid-columns',\n 'layout-grid-gutter-width': 'grid-gutter-width',\n 'layout-grid-row-columns': 'grid-row-columns',\n\n // ==========================================================================\n // LAYOUT - Container\n // ==========================================================================\n 'layout-container-padding-x': 'container-padding-x',\n 'layout-container-max-width-sm': 'container-max-width-sm',\n 'layout-container-max-width-md': 'container-max-width-md',\n 'layout-container-max-width-lg': 'container-max-width-lg',\n 'layout-container-max-width-xl': 'container-max-width-xl',\n 'layout-container-max-width-xxl': 'container-max-width-xxl',\n\n // ==========================================================================\n // LAYOUT - Breakpoints (for reference, typically used in maps)\n // ==========================================================================\n 'layout-breakpoints-xs': 'breakpoint-xs',\n 'layout-breakpoints-sm': 'breakpoint-sm',\n 'layout-breakpoints-md': 'breakpoint-md',\n 'layout-breakpoints-lg': 'breakpoint-lg',\n 'layout-breakpoints-xl': 'breakpoint-xl',\n 'layout-breakpoints-xxl': 'breakpoint-xxl',\n\n // ==========================================================================\n // LAYOUT - Gutters\n // ==========================================================================\n 'layout-gutters-0': 'gutters-0',\n 'layout-gutters-1': 'gutters-1',\n 'layout-gutters-2': 'gutters-2',\n 'layout-gutters-3': 'gutters-3',\n 'layout-gutters-4': 'gutters-4',\n 'layout-gutters-5': 'gutters-5',\n};\n\n/**\n * Pattern-based mappings for Bootstrap\n *\n * Applied after explicit mappings for tokens that follow\n * predictable naming patterns. These handle bulk transformations\n * for categories with consistent naming.\n */\nexport const BOOTSTRAP_PATTERNS: FrameworkMappingPattern[] = [\n // ==========================================================================\n // COLOR SCALES - Pass through unchanged\n // ==========================================================================\n // color-blue-500 → color-blue-500 (no transformation needed)\n // These tokens keep their original names as Bootstrap color scales\n // match the DSAi/Figma naming convention.\n // ==========================================================================\n // SPACING SCALE - Strip \"spacing-\" prefix for Bootstrap $spacer map\n // ==========================================================================\n // spacing-1 → spacer-1 (Bootstrap uses $spacers map)\n // Note: Not applied by default since playground keeps spacing- prefix\n // ==========================================================================\n // LAYOUT BREAKPOINTS - Already handled in explicit mappings\n // ==========================================================================\n];\n\n/**\n * Bootstrap framework mapping configuration\n */\nexport const bootstrapMapper: FrameworkMappingConfig = {\n framework: 'bootstrap',\n mappings: BOOTSTRAP_MAPPINGS,\n patterns: BOOTSTRAP_PATTERNS,\n variablePrefix: '$',\n header: `// ============================================================================\n// DSAi Design Tokens for Bootstrap 5.x\n// ============================================================================\n// Auto-generated from Figma design tokens via @dsai-io/tools\n// DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\n//\n// These variables are mapped to Bootstrap 5.x naming conventions.\n// Use with Bootstrap's SCSS customization workflow:\n//\n// @use './_variables' as dsai;\n// @use 'bootstrap/scss/bootstrap' with (\n// $primary: dsai.$primary,\n// $font-size-base: dsai.$font-size-base,\n// );\n//\n// @see https://getbootstrap.com/docs/5.3/customize/sass/\n// ============================================================================\n\n`,\n};\n\n/**\n * Apply Bootstrap-specific name mapping to a token name\n *\n * @param tokenName - Original token name (e.g., 'typography-heading-h1')\n * @returns Mapped name (e.g., 'h1-font-size')\n *\n * @example\n * ```typescript\n * mapToBootstrapName('typography-text-base')\n * // Returns: 'font-size-base'\n *\n * mapToBootstrapName('typography-heading-h1')\n * // Returns: 'h1-font-size'\n *\n * mapToBootstrapName('color-blue-500')\n * // Returns: 'color-blue-500' (pass through)\n * ```\n */\nexport function mapToBootstrapName(tokenName: string): string {\n // Check explicit mappings first using Map for safe access\n const mappingsMap = new Map(Object.entries(BOOTSTRAP_MAPPINGS));\n if (mappingsMap.has(tokenName)) {\n return mappingsMap.get(tokenName) ?? tokenName;\n }\n\n // Apply pattern-based mappings\n for (const pattern of BOOTSTRAP_PATTERNS) {\n // Pre-compiled regex patterns only - no dynamic construction from untrusted input\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\n return tokenName.replace(pattern.pattern, pattern.replacement);\n }\n }\n\n // No mapping found - return original name\n return tokenName;\n}\n","/**\n * shadcn/ui Framework Mapper\n *\n * Maps Figma/DTCG token names to shadcn/ui CSS variable names.\n *\n * @packageDocumentation\n */\n\nimport type { FrameworkMappingConfig, FrameworkMappingPattern } from '../../config/types.js';\n\n// ============================================================================\n// shadcn/ui Name Mappings\n// ============================================================================\n\n/**\n * Explicit token name → shadcn/ui variable name mappings\n *\n * shadcn/ui uses a simplified naming convention with CSS custom properties.\n * @see https://ui.shadcn.com/docs/theming\n */\nexport const SHADCN_MAPPINGS: Record<string, string> = {\n // Semantic Colors → shadcn theme colors\n 'semantic-primary': 'primary',\n 'semantic-secondary': 'secondary',\n 'semantic-success': 'success',\n 'semantic-danger': 'destructive',\n 'semantic-warning': 'warning',\n 'semantic-info': 'info',\n 'semantic-body-bg': 'background',\n 'semantic-body-color': 'foreground',\n 'theme-primary': 'primary',\n 'theme-secondary': 'secondary',\n\n // Neutral colors\n 'neutral-white': 'background',\n 'neutral-black': 'foreground',\n 'color-gray-100': 'muted',\n 'color-gray-600': 'muted-foreground',\n\n // Card colors\n 'semantic-light': 'card',\n 'color-gray-900': 'card-foreground',\n\n // Border\n 'semantic-border-color': 'border',\n 'color-gray-200': 'input',\n\n // Focus ring\n 'color-blue-500': 'ring',\n\n // Border radius\n 'border-radius': 'radius',\n 'border-radius-sm': 'radius-sm',\n 'border-radius-lg': 'radius-lg',\n\n // Typography\n 'typography-font-family-base': 'font-sans',\n 'typography-font-family-monospace': 'font-mono',\n};\n\n/**\n * Pattern-based mappings for shadcn/ui\n */\nexport const SHADCN_PATTERNS: FrameworkMappingPattern[] = [\n // Accent colors from color scales\n {\n pattern: /^color-blue-500$/,\n replacement: 'accent',\n description: 'Primary accent color',\n },\n {\n pattern: /^color-blue-100$/,\n replacement: 'accent-foreground',\n description: 'Accent foreground color',\n },\n];\n\n/**\n * shadcn/ui framework mapping configuration\n */\nexport const shadcnMapper: FrameworkMappingConfig = {\n framework: 'shadcn',\n mappings: SHADCN_MAPPINGS,\n patterns: SHADCN_PATTERNS,\n variablePrefix: '--',\n header: `/* ============================================================================\n * DSAi Design Tokens for shadcn/ui\n * ============================================================================\n * Auto-generated from Figma design tokens via @dsai-io/tools\n * DO NOT EDIT DIRECTLY - Regenerate with: pnpm tokens:build\n *\n * Usage in CSS:\n * background-color: hsl(var(--background));\n * color: hsl(var(--foreground));\n *\n * @see https://ui.shadcn.com/docs/theming\n * ============================================================================ */\n`,\n};\n\n/**\n * Apply shadcn-specific name mapping to a token name\n *\n * @param tokenName - Original token name (e.g., 'semantic-primary')\n * @returns Mapped name (e.g., 'primary')\n */\nexport function mapToShadcnName(tokenName: string): string {\n // Check explicit mappings first using Map for safe access\n const mappingsMap = new Map(Object.entries(SHADCN_MAPPINGS));\n if (mappingsMap.has(tokenName)) {\n return mappingsMap.get(tokenName) ?? tokenName;\n }\n\n // Apply pattern-based mappings\n for (const pattern of SHADCN_PATTERNS) {\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\n return tokenName.replace(pattern.pattern, pattern.replacement);\n }\n }\n\n // No mapping found - return original name\n return tokenName;\n}\n","/**\n * Framework Mapper Utilities\n *\n * Core utilities for applying framework-specific name mappings to tokens.\n *\n * @packageDocumentation\n */\n\nimport { bootstrapMapper, mapToBootstrapName } from './bootstrap.js';\nimport { mapToShadcnName, shadcnMapper } from './shadcn.js';\n\nimport type {\n FrameworkMappingConfig,\n FrameworkMappingPattern,\n FrameworkTarget,\n} from '../../config/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Framework mapper function type\n */\nexport type FrameworkMapper = (tokenName: string) => string;\n\n/**\n * Framework mapper with configuration\n */\nexport interface FrameworkMapperWithConfig {\n /** The mapping function */\n map: FrameworkMapper;\n /** The framework configuration */\n config: FrameworkMappingConfig;\n}\n\n// ============================================================================\n// Framework Registry\n// ============================================================================\n\n/**\n * Built-in framework mappers\n */\nconst FRAMEWORK_MAPPERS: Record<FrameworkTarget, FrameworkMapperWithConfig> = {\n bootstrap: {\n map: mapToBootstrapName,\n config: bootstrapMapper,\n },\n shadcn: {\n map: mapToShadcnName,\n config: shadcnMapper,\n },\n tailwind: {\n // Tailwind uses config.js format, not SCSS variables\n // Pass through names as-is for now\n map: (name) => name,\n config: {\n framework: 'tailwind',\n mappings: {},\n patterns: [],\n variablePrefix: '',\n header: '// Tailwind config - use tokens.js instead\\n',\n },\n },\n mui: {\n // MUI uses JavaScript theme objects\n // Pass through names as-is for now\n map: (name) => name,\n config: {\n framework: 'mui',\n mappings: {},\n patterns: [],\n variablePrefix: '',\n header: '// MUI theme - use tokens.js instead\\n',\n },\n },\n custom: {\n // Custom uses user-provided mappings only\n map: (name) => name,\n config: {\n framework: 'custom',\n mappings: {},\n patterns: [],\n variablePrefix: '$',\n header: '// Custom token mappings\\n',\n },\n },\n};\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Valid framework targets for safe lookup\n */\nconst VALID_FRAMEWORKS = new Set<FrameworkTarget>([\n 'bootstrap',\n 'shadcn',\n 'tailwind',\n 'mui',\n 'custom',\n]);\n\n/**\n * Get the framework mapper for a specific target\n *\n * @param framework - Target framework\n * @returns Framework mapper with config\n */\nexport function getFrameworkMapper(framework: FrameworkTarget): FrameworkMapperWithConfig {\n // Use safe lookup with validated key\n if (VALID_FRAMEWORKS.has(framework)) {\n switch (framework) {\n case 'bootstrap':\n return FRAMEWORK_MAPPERS.bootstrap;\n case 'shadcn':\n return FRAMEWORK_MAPPERS.shadcn;\n case 'tailwind':\n return FRAMEWORK_MAPPERS.tailwind;\n case 'mui':\n return FRAMEWORK_MAPPERS.mui;\n case 'custom':\n return FRAMEWORK_MAPPERS.custom;\n }\n }\n return FRAMEWORK_MAPPERS.custom;\n}\n\n/**\n * Create a custom framework mapper with user-provided mappings\n *\n * @param baseFramework - Base framework to extend (or 'custom' for empty)\n * @param customMappings - Additional name mappings\n * @param customPatterns - Additional pattern mappings\n * @returns Combined framework mapper\n */\nexport function createFrameworkMapper(\n baseFramework: FrameworkTarget,\n customMappings?: Record<string, string>,\n customPatterns?: FrameworkMappingPattern[]\n): FrameworkMapperWithConfig {\n const base = getFrameworkMapper(baseFramework);\n\n // Merge custom mappings (custom takes precedence)\n const mergedMappings = {\n ...base.config.mappings,\n ...customMappings,\n };\n\n // Merge patterns (custom patterns applied after base patterns)\n const mergedPatterns = [...(base.config.patterns ?? []), ...(customPatterns ?? [])];\n\n // Create the combined mapper function\n const map: FrameworkMapper = (tokenName: string) => {\n // Check custom mappings first\n const mappingsMap = new Map(Object.entries(mergedMappings));\n if (mappingsMap.has(tokenName)) {\n return mappingsMap.get(tokenName) ?? tokenName;\n }\n\n // Apply pattern-based mappings\n for (const pattern of mergedPatterns) {\n if (pattern.pattern instanceof RegExp && pattern.pattern.test(tokenName)) {\n return tokenName.replace(pattern.pattern, pattern.replacement);\n }\n }\n\n // No mapping found - return original name\n return tokenName;\n };\n\n return {\n map,\n config: {\n ...base.config,\n mappings: mergedMappings,\n patterns: mergedPatterns,\n },\n };\n}\n\n/**\n * Apply name mapping to a token name using specified framework\n *\n * @param tokenName - Original token name\n * @param framework - Target framework\n * @param customMappings - Optional custom mappings to merge\n * @returns Mapped token name\n */\nexport function applyNameMapping(\n tokenName: string,\n framework: FrameworkTarget = 'bootstrap',\n customMappings?: Record<string, string>\n): string {\n if (customMappings) {\n const mapper = createFrameworkMapper(framework, customMappings);\n return mapper.map(tokenName);\n }\n\n const mapper = getFrameworkMapper(framework);\n return mapper.map(tokenName);\n}\n\n/**\n * Apply name mappings to all tokens in a collection\n *\n * @param tokens - Map of token names to values\n * @param framework - Target framework\n * @param customMappings - Optional custom mappings\n * @returns New map with mapped token names\n */\nexport function applyNameMappingsToTokens<T>(\n tokens: Map<string, T>,\n framework: FrameworkTarget = 'bootstrap',\n customMappings?: Record<string, string>\n): Map<string, T> {\n const mapper = customMappings\n ? createFrameworkMapper(framework, customMappings)\n : getFrameworkMapper(framework);\n\n const result = new Map<string, T>();\n\n for (const [name, value] of tokens) {\n const mappedName = mapper.map(name);\n result.set(mappedName, value);\n }\n\n return result;\n}\n","/**\n * SCSS Framework Variables Format\n *\n * Generates SCSS variables with framework-specific name mappings.\n * Transforms Figma token names to match target framework conventions.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/scss-framework\n */\n\nimport { getFrameworkMapper, applyNameMapping } from '../../framework-mappers/mapper.js';\n\nimport type { FrameworkTarget } from '../../../config/types.js';\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\n\n/**\n * Format options for scss/framework-variables\n */\nexport interface ScssFrameworkOptions {\n /**\n * Target framework for name mapping\n * @default 'bootstrap'\n */\n framework?: FrameworkTarget;\n\n /**\n * Custom name mappings to apply in addition to framework defaults\n * Key: original token name pattern, Value: mapped name\n */\n customMappings?: Record<string, string>;\n\n /**\n * Whether to output references for alias tokens\n * @default true\n */\n outputReferences?: boolean;\n\n /**\n * Variable prefix (without $)\n * @default ''\n */\n variablePrefix?: string;\n\n /**\n * Include header comment in output\n * @default true\n */\n includeHeader?: boolean;\n\n /**\n * Custom header comment\n */\n customHeader?: string;\n}\n\n/**\n * scss/framework-variables format\n *\n * Generates SCSS variables with framework-specific name mappings.\n * Supports Bootstrap, shadcn, and custom frameworks.\n *\n * @example\n * ```typescript\n * // In Style Dictionary config\n * {\n * format: 'scss/framework-variables',\n * options: {\n * framework: 'bootstrap',\n * customMappings: {\n * 'my-custom-token': 'bs-custom-var'\n * }\n * }\n * }\n * ```\n *\n * @example\n * Output for Bootstrap:\n * ```scss\n * // Generated by DSAi - Bootstrap 5.x compatible variables\n * // Do not edit manually - regenerate with: pnpm tokens:build\n *\n * $font-size-base: 1rem;\n * $headings-font-weight: 600;\n * $primary: #007bff;\n * ```\n */\nexport const scssFrameworkVariables: FormatDefinition = {\n name: 'scss/framework-variables',\n format: ({ dictionary, options }: SDFormatArgs): string => {\n const framework = (options['framework'] as FrameworkTarget) ?? 'bootstrap';\n const customMappings = (options['customMappings'] as Record<string, string>) ?? {};\n const variablePrefix = (options['variablePrefix'] as string) ?? '';\n const includeHeader = (options['includeHeader'] as boolean) ?? true;\n const customHeader = options['customHeader'] as string | undefined;\n\n // Get framework mapper\n const mapper = getFrameworkMapper(framework);\n\n // Build header\n const lines: string[] = [];\n\n if (includeHeader) {\n if (customHeader) {\n lines.push(customHeader);\n } else {\n lines.push(mapper.config.header || `// ${framework} variables generated by DSAi`);\n lines.push('// Do not edit manually - regenerate with: pnpm tokens:build');\n lines.push('');\n }\n }\n\n // Process each token\n for (const token of dictionary.allTokens) {\n // Apply framework name mapping\n const mappedName = applyNameMapping(token.name, framework, customMappings);\n\n // Format the mapped name: remove dashes and apply prefix\n const scssVarName = `$${variablePrefix}${mappedName}`;\n\n // Get token value (DTCG format uses $value)\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\n\n // Add description comment if present\n const description = token.$description ?? token.description;\n if (description) {\n lines.push(`// ${description}`);\n }\n\n // Add the variable\n lines.push(`${scssVarName}: ${value};`);\n }\n\n return lines.join('\\n') + '\\n';\n },\n};\n\n/**\n * scss/bootstrap-variables format\n *\n * Convenience format that uses Bootstrap mappings by default.\n *\n * @example\n * ```typescript\n * {\n * format: 'scss/bootstrap-variables'\n * }\n * ```\n */\nexport const scssBootstrapVariables: FormatDefinition = {\n name: 'scss/bootstrap-variables',\n format: (args: SDFormatArgs): string => {\n const optionsWithBootstrap = {\n ...args.options,\n framework: 'bootstrap' as FrameworkTarget,\n };\n return scssFrameworkVariables.format({ ...args, options: optionsWithBootstrap });\n },\n};\n\n/**\n * scss/shadcn-variables format\n *\n * Convenience format that uses shadcn/ui mappings by default.\n * Outputs CSS custom properties in SCSS for compatibility.\n *\n * @example\n * ```typescript\n * {\n * format: 'scss/shadcn-variables'\n * }\n * ```\n */\nexport const scssShadcnVariables: FormatDefinition = {\n name: 'scss/shadcn-variables',\n format: (args: SDFormatArgs): string => {\n const optionsWithShadcn = {\n ...args.options,\n framework: 'shadcn' as FrameworkTarget,\n };\n return scssFrameworkVariables.format({ ...args, options: optionsWithShadcn });\n },\n};\n","/**\n * TypeScript Declarations Format\n *\n * Generates TypeScript type declarations for design tokens.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/typescript\n */\n\n/* eslint-disable security/detect-object-injection */\n\nimport type { SDFormatArgs, FormatDefinition, SDToken } from '../types.js';\n\n/**\n * Convert a path segment to PascalCase, handling numeric segments\n */\nfunction toPascalCaseSegment(segment: string): string {\n const needsNumericPrefix = /^\\d/.test(segment);\n\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\n const pascal = segment\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n\n // Prefix numeric identifiers with underscore to make them valid\n return needsNumericPrefix ? `_${pascal}` : pascal;\n}\n\n/**\n * Convert token path to valid JavaScript identifier\n */\nfunction toJsIdentifier(path: string[]): string {\n return path.map(toPascalCaseSegment).join('');\n}\n\n/**\n * Get TypeScript type from token value\n */\nfunction getTypeScriptType(token: SDToken): string {\n const value = token.value;\n if (typeof value === 'number') {\n return 'number';\n }\n if (typeof value === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\n/**\n * Token tree node for building interfaces\n */\ninterface TokenTreeNode {\n _isToken?: boolean;\n _type?: string;\n [key: string]: TokenTreeNode | boolean | string | undefined;\n}\n\n/**\n * Build nested interface structure\n */\nfunction buildTokenInterface(obj: TokenTreeNode, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let output = '{\\n';\n\n for (const key of Object.keys(obj)) {\n // Skip internal markers\n if (key.startsWith('_')) {\n continue;\n }\n\n const value = obj[key];\n if (!value || typeof value !== 'object') {\n continue;\n }\n\n // Quote keys that need it (contain hyphens or start with numbers)\n const quotedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `\"${key}\"`;\n\n const typedValue = value as TokenTreeNode;\n\n // Check if this is a leaf token (has _isToken marker)\n if (typedValue._isToken) {\n output += `${spaces} ${quotedKey}: ${typedValue._type};\\n`;\n } else {\n // Nested object\n output += `${spaces} ${quotedKey}: ${buildTokenInterface(typedValue, indent + 1)}\\n`;\n }\n }\n\n output += `${spaces}}`;\n return output;\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * typescript/declarations format\n *\n * Generates TypeScript declarations with:\n * - DesignTokens interface with nested structure\n * - String literal types for each token category\n * - Flat token exports with proper types\n *\n * @example\n * Output:\n * ```typescript\n * export type ColorTokenName =\n * | 'color.primary'\n * | 'color.secondary';\n *\n * export interface DesignTokens {\n * color: {\n * primary: string;\n * secondary: string;\n * };\n * }\n *\n * export declare const colorPrimary: string;\n * export declare const tokens: DesignTokens;\n * ```\n */\nexport const typescriptDeclarations: FormatDefinition = {\n name: 'typescript/declarations',\n format: ({ dictionary }: SDFormatArgs): string => {\n // Build nested structure with type markers\n const tokenTree: TokenTreeNode = {};\n\n const hasOwn = Object.prototype.hasOwnProperty;\n\n for (const token of dictionary.allTokens) {\n let current: TokenTreeNode = tokenTree;\n for (let i = 0; i < token.path.length - 1; i++) {\n const key = token.path[i] as string;\n // Guard against prototype pollution\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n if (!hasOwn.call(current, key) || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as TokenTreeNode;\n }\n\n const lastKey = token.path[token.path.length - 1];\n if (lastKey) {\n current[lastKey] = {\n _isToken: true,\n _type: getTypeScriptType(token),\n };\n }\n }\n\n // Group tokens by category for string literal types\n const categories: Record<string, string[]> = {};\n for (const token of dictionary.allTokens) {\n const category = token.path[0];\n if (category) {\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(token.path.join('.'));\n }\n }\n\n // Generate category types\n let literalTypes = '';\n for (const category of Object.keys(categories).sort()) {\n const categoryTokens = categories[category];\n if (!categoryTokens) {\n continue;\n }\n const typeName = `${capitalize(category)}TokenName`;\n literalTypes += `/**\\n * All ${category} token names as string literals\\n */\\n`;\n literalTypes += `export type ${typeName} =\\n`;\n literalTypes += categoryTokens.map((t) => ` | '${t}'`).join('\\n');\n literalTypes += ';\\n\\n';\n }\n\n // Generate all token names type\n const allTokenNames = dictionary.allTokens.map((t) => t.path.join('.'));\n literalTypes += `/**\\n * All token names as string literals\\n */\\n`;\n literalTypes += `export type TokenName =\\n`;\n literalTypes += allTokenNames.map((t) => ` | '${t}'`).join('\\n');\n literalTypes += ';\\n\\n';\n\n // Generate flat token exports\n let flatExports = '/**\\n * Flat token exports (camelCase names)\\n */\\n';\n for (const token of dictionary.allTokens) {\n const type = getTypeScriptType(token);\n const name = toJsIdentifier(token.path); // Generate valid identifier from path\n flatExports += `export declare const ${name}: ${type};\\n`;\n }\n\n return `/**\n * Design Tokens - TypeScript Declarations\n * Auto-generated by @dsai-io/tools\n * DO NOT EDIT DIRECTLY\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// String Literal Types (for type-safe token access)\n// ============================================================================\n\n${literalTypes}\n// ============================================================================\n// Nested Token Interface\n// ============================================================================\n\n/**\n * Design tokens organized by category\n */\nexport interface DesignTokens ${buildTokenInterface(tokenTree)}\n\n// ============================================================================\n// Flat Token Exports\n// ============================================================================\n\n${flatExports}\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport declare const tokens: DesignTokens;\nexport default tokens;\n`;\n },\n};\n","/**\n * Style Dictionary Formats\n *\n * Exports all built-in formats and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats\n */\n\nimport { cssDarkModeVariables } from './css-dark-mode.js';\nimport { cssVariablesWithComments } from './css-variables.js';\nimport { javascriptEsm } from './javascript.js';\nimport {\n scssBootstrapVariables,\n scssFrameworkVariables,\n scssShadcnVariables,\n} from './scss-framework.js';\nimport { typescriptDeclarations } from './typescript.js';\n\nimport type { FormatDefinition, StyleDictionaryInstance } from '../types.js';\n\n/**\n * All built-in formats\n */\nexport const builtInFormats: FormatDefinition[] = [\n cssDarkModeVariables,\n cssVariablesWithComments,\n javascriptEsm,\n typescriptDeclarations,\n scssFrameworkVariables,\n scssBootstrapVariables,\n scssShadcnVariables,\n];\n\n/**\n * Register all formats with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customFormats - Additional custom formats to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerFormats } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerFormats(StyleDictionary);\n * ```\n */\nexport function registerFormats(\n sd: StyleDictionaryInstance,\n customFormats: FormatDefinition[] = []\n): void {\n const allFormats = [...builtInFormats, ...customFormats];\n\n for (const format of allFormats) {\n sd.registerFormat({\n name: format.name,\n format: format.format,\n });\n }\n}\n\n// Re-export individual formats\nexport { cssDarkModeVariables } from './css-dark-mode.js';\nexport { cssVariablesWithComments } from './css-variables.js';\nexport { javascriptEsm } from './javascript.js';\nexport {\n scssBootstrapVariables,\n scssFrameworkVariables,\n scssShadcnVariables,\n} from './scss-framework.js';\nexport type { ScssFrameworkOptions } from './scss-framework.js';\nexport { typescriptDeclarations } from './typescript.js';\n","/**\n * Dimension Transform\n *\n * Converts dimension values to rem units.\n * Handles raw numbers and pixel strings.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/dimension\n */\n\nimport type { SDToken, SDTransformOptions, TransformDefinition } from '../types.js';\n\n/** Default base font size for rem conversion */\nconst DEFAULT_BASE_FONT_SIZE = 16;\n\n/**\n * Check if token is a dimension (but not font-weight or line-height)\n */\nfunction isDimension(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Exclude font-weights\n if (tokenType === 'fontWeight') {\n return false;\n }\n const pathHasFontWeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower.includes('fontweight') || lower.includes('font-weight');\n });\n if (pathHasFontWeight) {\n return false;\n }\n\n // Exclude line-heights\n if (tokenType === 'lineHeight') {\n return false;\n }\n const pathHasLineHeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower.includes('lineheight') || lower.includes('line-height');\n });\n if (pathHasLineHeight) {\n return false;\n }\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\n if (scopeHasLineHeight) {\n return false;\n }\n\n // Exclude grid config (unitless counts)\n const pathHasGridConfig = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'columns' || lower === 'row-columns';\n });\n if (pathHasGridConfig) {\n return false;\n }\n\n // Include dimension, spacing, sizing types\n return tokenType === 'dimension' || tokenType === 'spacing' || tokenType === 'sizing';\n}\n\n/**\n * dimension/rem transform\n *\n * Converts dimension values to rem.\n * Uses basePxFontSize from options (default: 16).\n *\n * @example\n * // Numeric input\n * Input: { $value: 16, $type: \"dimension\" }\n * Output: \"1rem\"\n *\n * @example\n * // Pixel string\n * Input: { $value: \"24px\", $type: \"dimension\" }\n * Output: \"1.5rem\"\n *\n * @example\n * // Zero value\n * Input: { $value: 0, $type: \"dimension\" }\n * Output: \"0\"\n */\nexport const dimensionRem: TransformDefinition = {\n name: 'dimension/rem',\n type: 'value',\n filter: isDimension,\n transform: (token, options?: SDTransformOptions) => {\n const value = token.$value ?? token.value;\n const baseFontSize = options?.basePxFontSize ?? DEFAULT_BASE_FONT_SIZE;\n\n // Handle raw numbers\n if (typeof value === 'number') {\n if (value === 0) {\n return '0';\n }\n return `${value / baseFontSize}rem`;\n }\n\n // Handle px strings\n if (typeof value === 'string' && value.endsWith('px')) {\n const numValue = Number.parseFloat(value);\n if (numValue === 0) {\n return '0';\n }\n return `${numValue / baseFontSize}rem`;\n }\n\n // Return as-is if not convertible\n return value;\n },\n};\n","/**\n * Font Weight Transform\n *\n * Keeps font-weight values as unitless numbers (300, 400, 700, etc.)\n * CSS font-weight must be unitless for proper inheritance.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/font-weight\n */\n\nimport type { SDToken, TransformDefinition } from '../types.js';\n\n/**\n * Named font weight values mapped to numeric values\n */\nconst NAMED_WEIGHTS: Record<string, number> = {\n thin: 100,\n hairline: 100,\n extralight: 200,\n ultralight: 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n demibold: 600,\n bold: 700,\n extrabold: 800,\n ultrabold: 800,\n black: 900,\n heavy: 900,\n};\n\n/**\n * Check if token is a font weight\n */\nfunction isFontWeight(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Direct type match\n if (tokenType === 'fontWeight' || tokenType === 'number') {\n return true;\n }\n\n // Path-based detection\n const pathHasFontWeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'fontweight' || lower.includes('font-weight') || lower.includes('fontweight');\n });\n\n return pathHasFontWeight ?? false;\n}\n\n/**\n * fontWeight/unitless transform\n *\n * Ensures font-weight values are unitless numbers.\n * Handles numeric values, string values, and named weights.\n *\n * @example\n * // Numeric input\n * Input: { $value: 700, $type: \"fontWeight\" }\n * Output: 700\n *\n * @example\n * // String input\n * Input: { $value: \"700\", $type: \"fontWeight\" }\n * Output: 700\n *\n * @example\n * // Named weight\n * Input: { $value: \"bold\", $type: \"fontWeight\" }\n * Output: 700\n */\nexport const fontWeightUnitless: TransformDefinition = {\n name: 'fontWeight/unitless',\n type: 'value',\n filter: isFontWeight,\n transform: (token) => {\n const value = token.$value ?? token.value;\n\n // Already a number - return as-is\n if (typeof value === 'number') {\n return value;\n }\n\n // String value\n if (typeof value === 'string') {\n // Try to parse as number\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n\n // Handle named weights\n const normalized = value.toLowerCase().replace(/[^a-z]/g, '');\n if (Object.hasOwn(NAMED_WEIGHTS, normalized)) {\n // eslint-disable-next-line security/detect-object-injection\n const namedWeight = NAMED_WEIGHTS[normalized];\n if (namedWeight !== undefined) {\n return namedWeight;\n }\n }\n }\n\n // Fallback - return as-is\n return value;\n },\n};\n","/**\n * Line Height Transform\n *\n * Keeps line-height values as unitless ratios (1, 1.5, 2, etc.)\n * CSS line-height should be unitless for proper inheritance.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/line-height\n */\n\nimport type { SDToken, TransformDefinition } from '../types.js';\n\n/** Default base font size for conversion */\nconst DEFAULT_BASE_FONT_SIZE = 16;\n\n/**\n * Check if token is a line height\n */\nfunction isLineHeight(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Direct type match\n if (tokenType === 'lineHeight') {\n return true;\n }\n\n // Path-based detection\n const pathHasLineHeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'lineheight' || lower.includes('line-height') || lower.includes('lineheight');\n });\n\n // Scope-based detection (from Figma Variables)\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\n\n return (pathHasLineHeight ?? false) || (scopeHasLineHeight ?? false);\n}\n\n/**\n * lineHeight/unitless transform\n *\n * Converts line-height values to unitless ratios.\n * Handles numbers, percentages, and pixel values.\n *\n * @example\n * // Percentage input\n * Input: { $value: \"150%\", $type: \"lineHeight\" }\n * Output: 1.5\n *\n * @example\n * // Already unitless\n * Input: { $value: 1.5, $type: \"lineHeight\" }\n * Output: 1.5\n *\n * @example\n * // Pixel value from Figma\n * Input: { $value: 24, $type: \"lineHeight\" }\n * Output: 1.5 (assuming 16px base)\n */\nexport const lineHeightUnitless: TransformDefinition = {\n name: 'lineHeight/unitless',\n type: 'value',\n filter: isLineHeight,\n transform: (token) => {\n const value = token.$value ?? token.value;\n\n // Already a number\n if (typeof value === 'number') {\n // If <= 3, already a multiplier (1, 1.5, 2)\n if (value <= 3) {\n return value;\n }\n // If > 3, likely px from Figma - convert to unitless\n return value / DEFAULT_BASE_FONT_SIZE;\n }\n\n // Handle percentage strings (e.g., \"150%\" -> 1.5)\n if (typeof value === 'string' && value.endsWith('%')) {\n return Number.parseFloat(value) / 100;\n }\n\n // Handle strings with units\n if (typeof value === 'string') {\n const numValue = Number.parseFloat(value);\n if (!Number.isNaN(numValue)) {\n if (numValue <= 3) {\n return numValue;\n }\n return numValue / DEFAULT_BASE_FONT_SIZE;\n }\n }\n\n // Fallback - return as-is\n return value;\n },\n};\n","/**\n * Name Transform\n *\n * Converts token paths to kebab-case names.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name\n */\n\nimport type { TransformDefinition } from '../types.js';\n\n/**\n * name/kebab transform\n *\n * Converts token path to kebab-case CSS variable name.\n * Replaces underscores with hyphens and lowercases.\n *\n * @example\n * Input: path = ['color', 'blue', '500']\n * Output: \"color-blue-500\"\n *\n * @example\n * Input: path = ['typography', 'fontWeight', 'bold']\n * Output: \"typography-fontweight-bold\"\n */\nexport const nameKebab: TransformDefinition = {\n name: 'name/kebab',\n type: 'name',\n transform: (token) => {\n return token.path.join('-').replace(/_/g, '-').toLowerCase();\n },\n};\n","/**\n * Name transform for JavaScript/TypeScript that ensures valid identifiers\n *\n * Converts token paths to PascalCase, prefixing numeric-only segments\n * to ensure valid JavaScript identifiers.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name-js-identifier\n */\n\nimport type { TransformDefinition } from '../types.js';\n\n/**\n * Convert a path segment to PascalCase, handling numeric segments\n */\nfunction toPascalCaseSegment(segment: string): string {\n const needsNumericPrefix = /^\\d/.test(segment);\n\n // Convert to PascalCase: split by non-alphanumeric, capitalize each part\n const pascal = segment\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n\n // Preserve underscore prefix for numeric identifiers so they stay valid\n return needsNumericPrefix ? `_${pascal}` : pascal;\n}\n\n/**\n * name/js-identifier transform\n *\n * Converts token path to a valid JavaScript identifier in PascalCase.\n * Handles numeric segments by prefixing with underscore.\n *\n * @example\n * ```\n * colors.neutral.gray.100 → ColorsNeutralGray_100\n * spacing.0 → Spacing_0\n * typography.fontSize.base → TypographyFontSizeBase\n * ```\n */\nexport const nameJsIdentifier: TransformDefinition = {\n name: 'name/js-identifier',\n type: 'name',\n transform: ({ path }) => {\n return path.map(toPascalCaseSegment).join('');\n },\n};\n","/**\n * Style Dictionary Transforms\n *\n * Exports all built-in transforms and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms\n */\n\nimport { dimensionRem } from './dimension.js';\nimport { fontWeightUnitless } from './font-weight.js';\nimport { lineHeightUnitless } from './line-height.js';\nimport { nameKebab } from './name.js';\nimport { nameJsIdentifier } from './name-js-identifier.js';\n\nimport type { StyleDictionaryInstance, TransformDefinition } from '../types.js';\n\n/**\n * All built-in transforms\n */\nexport const builtInTransforms: TransformDefinition[] = [\n fontWeightUnitless,\n lineHeightUnitless,\n dimensionRem,\n nameKebab,\n nameJsIdentifier,\n];\n\n/**\n * Register all transforms with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customTransforms - Additional custom transforms to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerTransforms } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerTransforms(StyleDictionary);\n * ```\n */\nexport function registerTransforms(\n sd: StyleDictionaryInstance,\n customTransforms: TransformDefinition[] = []\n): void {\n const allTransforms = [...builtInTransforms, ...customTransforms];\n\n for (const transform of allTransforms) {\n sd.registerTransform({\n name: transform.name,\n type: transform.type,\n filter: transform.filter,\n transform: transform.transform,\n });\n }\n}\n\n// Re-export individual transforms\nexport { fontWeightUnitless } from './font-weight.js';\nexport { lineHeightUnitless } from './line-height.js';\nexport { dimensionRem } from './dimension.js';\nexport { nameKebab } from './name.js';\nexport { nameJsIdentifier } from './name-js-identifier.js';\n","/**\n * CSS Transform Group\n *\n * Transform group for generating CSS output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/css\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * custom/css transform group\n *\n * Transforms for generating CSS custom properties:\n * - attribute/cti: Add CTI attributes\n * - name/kebab: kebab-case names\n * - time/seconds: Convert time to seconds\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n */\nexport const cssTransformGroup: TransformGroupDefinition = {\n name: 'custom/css',\n transforms: [\n 'attribute/cti',\n 'name/kebab',\n 'time/seconds',\n 'fontWeight/unitless', // Must run before dimension/rem\n 'lineHeight/unitless', // Must run before dimension/rem\n 'dimension/rem',\n 'color/css',\n ],\n};\n","/**\n * JavaScript Transform Group\n *\n * Transform group for generating JavaScript output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/js\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * js-custom transform group\n *\n * Transforms for generating JavaScript/TypeScript exports:\n * - attribute/cti: Add CTI attributes\n * - name/js-identifier: PascalCase names with numeric segment handling\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n */\nexport const jsTransformGroup: TransformGroupDefinition = {\n name: 'js-custom',\n transforms: [\n 'attribute/cti',\n 'name/js-identifier', // Use custom transform for valid JS identifiers\n 'fontWeight/unitless', // Must run before dimension/rem\n 'lineHeight/unitless', // Must run before dimension/rem\n 'dimension/rem',\n 'color/css',\n ],\n};\n","/**\n * SCSS Transform Group\n *\n * Transform group for generating SCSS output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/scss\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * custom/scss transform group\n *\n * Transforms for generating SCSS variables:\n * - attribute/cti: Add CTI attributes\n * - name/kebab: kebab-case names\n * - time/seconds: Convert time to seconds\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n *\n * This follows Style Dictionary v5 best practices:\n * - Source tokens are raw numbers\n * - Transforms add appropriate units (or keep unitless for font-weight/line-height)\n */\nexport const scssTransformGroup: TransformGroupDefinition = {\n name: 'custom/scss',\n transforms: [\n 'attribute/cti', // Add CTI attributes\n 'name/kebab', // kebab-case names\n 'time/seconds', // Convert time to seconds\n 'fontWeight/unitless', // Font weights stay unitless (MUST run before dimension/rem)\n 'lineHeight/unitless', // Line heights stay unitless (MUST run before dimension/rem)\n 'dimension/rem', // Convert dimensions to rem\n 'color/css', // Convert colors to CSS format\n ],\n};\n","/**\n * Style Dictionary Transform Groups\n *\n * Exports all built-in transform groups and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups\n */\n\nimport { cssTransformGroup } from './css.js';\nimport { jsTransformGroup } from './js.js';\nimport { scssTransformGroup } from './scss.js';\n\nimport type { StyleDictionaryInstance, TransformGroupDefinition } from '../types.js';\n\n/**\n * All built-in transform groups\n */\nexport const transformGroups: TransformGroupDefinition[] = [\n cssTransformGroup,\n jsTransformGroup,\n scssTransformGroup,\n];\n\n/**\n * Register all transform groups with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customGroups - Additional custom transform groups to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerTransformGroups } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerTransformGroups(StyleDictionary);\n * ```\n */\nexport function registerTransformGroups(\n sd: StyleDictionaryInstance,\n customGroups: TransformGroupDefinition[] = []\n): void {\n const allGroups = [...transformGroups, ...customGroups];\n\n for (const group of allGroups) {\n sd.registerTransformGroup({\n name: group.name,\n transforms: group.transforms,\n });\n }\n}\n\n// Re-export individual transform groups\nexport { cssTransformGroup } from './css.js';\nexport { jsTransformGroup } from './js.js';\nexport { scssTransformGroup } from './scss.js';\n","/**\n * Token Diff Utility\n *\n * Compares token collections to detect changes for changelog generation.\n * Identifies added, removed, modified, and type-changed tokens.\n *\n * @packageDocumentation\n */\n\nimport type { TokenCollection } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Types of changes that can occur to tokens\n */\nexport type TokenChangeType = 'added' | 'removed' | 'modified' | 'type-changed' | 'deprecated';\n\n/**\n * Details about a token value change\n */\nexport interface TokenValueChange {\n /** Previous value */\n oldValue: unknown;\n /** New value */\n newValue: unknown;\n /** Previous type */\n oldType?: string;\n /** New type */\n newType?: string;\n}\n\n/**\n * Information about a single token change\n */\nexport interface TokenChange {\n /** Full token path (e.g., 'color.brand.primary') */\n path: string;\n /** Type of change */\n type: TokenChangeType;\n /** Value change details (for modified/type-changed) */\n valueChange?: TokenValueChange;\n /** Token description */\n description?: string;\n /** Whether this is a breaking change */\n breaking: boolean;\n}\n\n/**\n * Result of comparing two token collections\n */\nexport interface TokenDiff {\n /** Tokens that were added */\n added: TokenChange[];\n /** Tokens that were removed */\n removed: TokenChange[];\n /** Tokens whose values changed */\n modified: TokenChange[];\n /** Tokens whose types changed (breaking) */\n typeChanged: TokenChange[];\n /** Tokens marked as deprecated */\n deprecated: TokenChange[];\n /** Total number of changes */\n totalChanges: number;\n /** Whether there are breaking changes */\n hasBreaking: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if a value is a token (has $value or value property)\n */\nfunction isToken(\n obj: unknown\n): obj is { $value?: unknown; value?: unknown; $type?: string; type?: string } {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const token = obj as Record<string, unknown>;\n return '$value' in token || 'value' in token;\n}\n\n/**\n * Get token value (supports both DTCG and legacy formats)\n */\nfunction getTokenValue(token: unknown): unknown {\n if (!isToken(token)) {\n return undefined;\n }\n\n return token.$value ?? token.value;\n}\n\n/**\n * Get token type (supports both DTCG and legacy formats)\n */\nfunction getTokenType(token: unknown): string | undefined {\n if (!isToken(token)) {\n return undefined;\n }\n\n return token.$type ?? token.type;\n}\n\n/**\n * Get token description\n */\nfunction getTokenDescription(token: unknown): string | undefined {\n if (!isToken(token)) {\n return undefined;\n }\n\n const t = token as { $description?: string; description?: string; comment?: string };\n return t.$description ?? t.description ?? t.comment;\n}\n\n/**\n * Flatten nested token collection into path-value pairs\n */\nfunction flattenTokens(\n collection: TokenCollection,\n prefix = ''\n): Map<string, { value: unknown; type?: string; description?: string; token: unknown }> {\n const result = new Map<\n string,\n { value: unknown; type?: string; description?: string; token: unknown }\n >();\n\n for (const [key, value] of Object.entries(collection)) {\n const path = prefix ? `${prefix}.${key}` : key;\n\n if (isToken(value)) {\n result.set(path, {\n value: getTokenValue(value),\n type: getTokenType(value),\n description: getTokenDescription(value),\n token: value,\n });\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Recurse into nested objects\n const nested = flattenTokens(value as TokenCollection, path);\n for (const [nestedPath, nestedValue] of nested) {\n result.set(nestedPath, nestedValue);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if a token is deprecated\n */\nfunction isDeprecated(token: unknown): boolean {\n if (!isToken(token)) {\n return false;\n }\n\n const t = token as {\n $deprecated?: boolean;\n deprecated?: boolean;\n $extensions?: { deprecated?: boolean };\n };\n return t.$deprecated === true || t.deprecated === true || t.$extensions?.deprecated === true;\n}\n\n/**\n * Deep equality check for values\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n const aKeys = Object.keys(a as object);\n const bKeys = Object.keys(b as object);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n return aKeys.every((key) => {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n // eslint-disable-next-line security/detect-object-injection\n const aValue = aObj[key];\n // eslint-disable-next-line security/detect-object-injection\n const bValue = bObj[key];\n return isEqual(aValue, bValue);\n });\n }\n\n return false;\n}\n\n// ============================================================================\n// Main Diff Function\n// ============================================================================\n\n/**\n * Compare two token collections and return the differences\n *\n * @param oldTokens - Previous version of tokens\n * @param newTokens - New version of tokens\n * @returns Detailed diff of all changes\n */\nexport function diffTokens(oldTokens: TokenCollection, newTokens: TokenCollection): TokenDiff {\n const oldFlat = flattenTokens(oldTokens);\n const newFlat = flattenTokens(newTokens);\n\n const added: TokenChange[] = [];\n const removed: TokenChange[] = [];\n const modified: TokenChange[] = [];\n const typeChanged: TokenChange[] = [];\n const deprecated: TokenChange[] = [];\n\n // Find added and modified tokens\n for (const [path, newData] of newFlat) {\n const oldData = oldFlat.get(path);\n\n if (!oldData) {\n // Token was added\n added.push({\n path,\n type: 'added',\n description: newData.description,\n breaking: false,\n });\n } else {\n // Check for type change (breaking)\n if (oldData.type && newData.type && oldData.type !== newData.type) {\n typeChanged.push({\n path,\n type: 'type-changed',\n valueChange: {\n oldValue: oldData.value,\n newValue: newData.value,\n oldType: oldData.type,\n newType: newData.type,\n },\n description: newData.description,\n breaking: true,\n });\n }\n // Check for value change\n else if (!isEqual(oldData.value, newData.value)) {\n modified.push({\n path,\n type: 'modified',\n valueChange: {\n oldValue: oldData.value,\n newValue: newData.value,\n oldType: oldData.type,\n newType: newData.type,\n },\n description: newData.description,\n breaking: false,\n });\n }\n // Check for deprecation\n else if (isDeprecated(newData.token) && !isDeprecated(oldData.token)) {\n deprecated.push({\n path,\n type: 'deprecated',\n description: newData.description,\n breaking: false,\n });\n }\n }\n }\n\n // Find removed tokens (breaking)\n for (const [path, oldData] of oldFlat) {\n if (!newFlat.has(path)) {\n removed.push({\n path,\n type: 'removed',\n description: oldData.description,\n breaking: true,\n });\n }\n }\n\n const totalChanges =\n added.length + removed.length + modified.length + typeChanged.length + deprecated.length;\n const hasBreaking = removed.length > 0 || typeChanged.length > 0;\n\n return {\n added,\n removed,\n modified,\n typeChanged,\n deprecated,\n totalChanges,\n hasBreaking,\n };\n}\n\n/**\n * Get a summary of changes as a plain text description\n */\nexport function summarizeDiff(diff: TokenDiff): string {\n const lines: string[] = [];\n\n lines.push(`Total changes: ${diff.totalChanges}`);\n\n if (diff.hasBreaking) {\n lines.push('⚠️ Contains breaking changes');\n }\n\n if (diff.added.length > 0) {\n lines.push(`Added: ${diff.added.length}`);\n }\n\n if (diff.removed.length > 0) {\n lines.push(`Removed: ${diff.removed.length} (breaking)`);\n }\n\n if (diff.modified.length > 0) {\n lines.push(`Modified: ${diff.modified.length}`);\n }\n\n if (diff.typeChanged.length > 0) {\n lines.push(`Type changed: ${diff.typeChanged.length} (breaking)`);\n }\n\n if (diff.deprecated.length > 0) {\n lines.push(`Deprecated: ${diff.deprecated.length}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Filter diff by change type\n */\nexport function filterDiff(diff: TokenDiff, types: TokenChangeType[]): TokenChange[] {\n const changes: TokenChange[] = [];\n\n if (types.includes('added')) {\n changes.push(...diff.added);\n }\n if (types.includes('removed')) {\n changes.push(...diff.removed);\n }\n if (types.includes('modified')) {\n changes.push(...diff.modified);\n }\n if (types.includes('type-changed')) {\n changes.push(...diff.typeChanged);\n }\n if (types.includes('deprecated')) {\n changes.push(...diff.deprecated);\n }\n\n return changes;\n}\n\n/**\n * Get only breaking changes\n */\nexport function getBreakingChanges(diff: TokenDiff): TokenChange[] {\n return [...diff.removed, ...diff.typeChanged];\n}\n","/**\n * SVG optimizer (SVGO integration)\n *\n * Optimizes SVG files using SVGO for smaller file sizes.\n *\n * @packageDocumentation\n */\n\nimport type { OptimizedSVG, ParsedSVG, RawSVGData, SVGOConfig } from '../types.js';\n\n/**\n * Default SVGO configuration\n *\n * Provides sensible defaults for icon optimization.\n */\nexport const defaultSVGOConfig: SVGOConfig = {\n multipass: true,\n plugins: [\n { name: 'preset-default' },\n { name: 'removeXMLNS' },\n { name: 'removeDimensions' },\n { name: 'removeStyleElement' },\n { name: 'removeScriptElement' },\n {\n name: 'removeAttrs',\n params: {\n attrs: ['class', 'style', 'data-name', 'xmlns:xlink'],\n },\n },\n {\n name: 'addAttributesToSVGElement',\n params: {\n attributes: [{ 'aria-hidden': 'true' }, { focusable: 'false' }],\n },\n },\n {\n name: 'sortAttrs',\n params: {\n xmlnsOrder: 'alphabetical',\n },\n },\n ],\n};\n\n/**\n * Optimize a single SVG\n *\n * @param parsed - Parsed SVG data\n * @param raw - Raw SVG data (for size comparison)\n * @param config - SVGO configuration\n * @returns Optimized SVG data\n */\nexport async function optimizeSVG(\n parsed: ParsedSVG,\n raw: RawSVGData,\n config: SVGOConfig = defaultSVGOConfig\n): Promise<OptimizedSVG> {\n // Dynamic import of SVGO\n const svgo = await import('svgo');\n\n // Merge plugins with defaults if provided\n const plugins = config.plugins ?? defaultSVGOConfig.plugins ?? [];\n\n // Convert our plugin format to SVGO's expected format\n const svgoPlugins = plugins.map((p) => ({\n name: p.name,\n ...(p.params ? { params: p.params } : {}),\n }));\n\n // Run SVGO optimization\n const result = svgo.optimize(raw.content, {\n multipass: config.multipass ?? true,\n plugins: svgoPlugins as NonNullable<Parameters<typeof svgo.optimize>[1]>['plugins'],\n });\n\n const optimizedContent = result.data;\n const optimizedSize = Buffer.byteLength(optimizedContent, 'utf-8');\n const sizeReduction =\n raw.originalSize > 0 ? ((raw.originalSize - optimizedSize) / raw.originalSize) * 100 : 0;\n\n // Re-parse optimized content to get updated inner content\n const innerContentMatch = optimizedContent.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\n const innerContent = innerContentMatch?.[1]?.trim() ?? parsed.innerContent;\n\n // Extract updated viewBox\n const viewBoxMatch = optimizedContent.match(/viewBox=[\"']([^\"']*)[\"']/i);\n const viewBox = viewBoxMatch?.[1] ?? parsed.viewBox;\n\n return {\n ...parsed,\n innerContent,\n fullContent: optimizedContent,\n viewBox,\n optimizedSize,\n sizeReduction,\n };\n}\n\n/**\n * Optimize multiple SVGs\n *\n * @param parsedFiles - Array of parsed SVG data\n * @param rawFiles - Array of raw SVG data\n * @param config - SVGO configuration\n * @returns Array of optimized SVG data\n */\nexport async function optimizeSVGFiles(\n parsedFiles: ParsedSVG[],\n rawFiles: RawSVGData[],\n config: SVGOConfig = defaultSVGOConfig\n): Promise<OptimizedSVG[]> {\n const results: OptimizedSVG[] = [];\n\n for (const parsed of parsedFiles) {\n const raw = rawFiles.find((r) => r.fileName === parsed.fileName);\n if (!raw) {\n throw new Error(`Raw file not found for ${parsed.fileName}`);\n }\n const optimized = await optimizeSVG(parsed, raw, config);\n results.push(optimized);\n }\n\n return results;\n}\n\n/**\n * Skip optimization and just add size metadata\n *\n * Useful when SVGO is not needed but the type structure is required.\n *\n * @param parsed - Parsed SVG data\n * @param raw - Raw SVG data\n * @returns Optimized SVG data (without actual optimization)\n */\nexport function skipOptimization(parsed: ParsedSVG, raw: RawSVGData): OptimizedSVG {\n return {\n ...parsed,\n optimizedSize: raw.originalSize,\n sizeReduction: 0,\n };\n}\n","/**\n * Package version\n */\nexport const version = '0.0.1';\n","/**\n * @fileoverview Zod schemas for DSAI Tools configuration validation\n *\n * Provides comprehensive runtime validation for all configuration options.\n * Schemas mirror the TypeScript types in types.ts for type safety.\n *\n * @module @dsai-io/tools/config/schema\n * @see {@link ./types.ts} for TypeScript type definitions\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Primitive Schemas\n// ============================================================================\n\n/**\n * Log level for CLI output verbosity\n */\nexport const logLevelSchema = z.enum(['silent', 'error', 'warn', 'info', 'debug', 'verbose']);\n\n/**\n * Output format for token/build outputs\n */\nexport const outputFormatSchema = z.enum(['css', 'scss', 'less', 'json', 'js', 'ts', 'esm', 'cjs']);\n\n/**\n * Supported frontend frameworks for generated code\n */\nexport const frameworkSchema = z.enum(['react', 'vue', 'angular', 'svelte', 'vanilla']);\n\n/**\n * File hash type for cache busting\n */\nexport const hashTypeSchema = z.enum(['content', 'timestamp', 'version', 'none']);\n\n// ============================================================================\n// Utility Schemas\n// ============================================================================\n\n/**\n * Glob pattern for file matching\n * Must be a non-empty string\n */\nexport const globPatternSchema = z.string().min(1, 'Glob pattern cannot be empty');\n\n/**\n * File path validation\n * Allows relative or absolute paths\n */\nexport const filePathSchema = z.string().min(1, 'File path cannot be empty');\n\n/**\n * Semantic version validation (loose)\n * Matches x.y.z format with optional pre-release\n */\nexport const versionSchema = z.string().refine(\n (val) => {\n const parts = val.split('-');\n const version = parts[0] ?? '';\n const preRelease = parts[1];\n const versionParts = version.split('.');\n if (versionParts.length !== 3) {\n return false;\n }\n for (const part of versionParts) {\n const num = Number(part);\n if (!Number.isInteger(num) || num < 0) {\n return false;\n }\n }\n if (preRelease !== undefined && preRelease.length === 0) {\n return false;\n }\n return true;\n },\n { message: 'Invalid semantic version format' }\n);\n\n// ============================================================================\n// Transform and Format Schemas\n// ============================================================================\n\n/**\n * Custom transform function schema\n * For token value transformations\n */\nexport const customTransformSchema = z.object({\n name: z.string().min(1, 'Transform name is required'),\n description: z.string().optional(),\n type: z.enum(['value', 'attribute', 'name']).optional().default('value'),\n transform: z.function().optional(),\n filter: z.function().optional(),\n matcher: z.function().optional(),\n});\n\n/**\n * Custom format schema for output generation\n */\nexport const customFormatSchema = z.object({\n name: z.string().min(1, 'Format name is required'),\n description: z.string().optional(),\n formatter: z.function().optional(),\n extension: z.string().min(1).optional(),\n});\n\n// ============================================================================\n// Theme Configuration Schemas\n// ============================================================================\n\n/**\n * Output format enum for validation\n */\nconst outputFormatEnum = z.enum(['css', 'scss', 'js', 'ts', 'json', 'android', 'ios']);\n\n/**\n * Theme definition schema\n * Defines how a single theme is discovered and built\n */\nexport const themeDefinitionSchema = z.object({\n isDefault: z.boolean().optional().default(false),\n suffix: z.string().nullable().optional(),\n selector: z.string().min(1, 'Theme selector is required'),\n mediaQuery: z.string().optional(),\n dataAttribute: z.string().optional(),\n outputFiles: z.record(outputFormatEnum, z.string()).optional(),\n});\n\n/**\n * Theme selector pattern schema\n */\nexport const themeSelectorPatternSchema = z.object({\n default: z.string().optional().default(':root'),\n others: z.string().optional().default('[data-dsai-theme=\"{mode}\"]'),\n});\n\n/**\n * Themes configuration section\n * Supports both legacy mode-based config and new definitions-based config\n */\nexport const themesConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n autoDetect: z.boolean().optional().default(true),\n default: z.string().optional().default('light'),\n ignoreModes: z.array(z.string()).optional().default([]),\n selectorPattern: themeSelectorPatternSchema.optional(),\n definitions: z.record(z.string(), themeDefinitionSchema).optional(),\n\n // Legacy fields (for backward compatibility)\n defaultMode: z.enum(['light', 'dark', 'system']).optional(),\n modes: z\n .record(\n z.string(),\n z.object({\n selector: z.string().min(1),\n mediaQuery: z.string().optional(),\n dataAttribute: z.string().optional(),\n cssVariables: z.boolean().optional(),\n generateSeparateFiles: z.boolean().optional(),\n prefix: z.string().optional(),\n })\n )\n .optional(),\n outputFileName: z.string().optional(),\n colorScheme: z\n .object({\n light: z.string().optional(),\n dark: z.string().optional(),\n })\n .optional(),\n});\n\n// ============================================================================\n// Icon Configuration Schemas\n// ============================================================================\n\n/**\n * Icon optimization settings\n */\nexport const iconOptimizationSchema = z.object({\n enabled: z.boolean().optional().default(true),\n removeComments: z.boolean().optional().default(true),\n removeDimensions: z.boolean().optional().default(false),\n removeViewBox: z.boolean().optional().default(false),\n removeXMLNS: z.boolean().optional().default(true),\n cleanupIds: z.boolean().optional().default(true),\n minify: z.boolean().optional().default(true),\n});\n\n/**\n * Icon sprite generation settings\n */\nexport const iconSpriteSchema = z.object({\n enabled: z.boolean().optional().default(true),\n fileName: z.string().optional().default('icons'),\n format: z.enum(['symbol', 'stack', 'css']).optional().default('symbol'),\n prefix: z.string().optional().default('icon-'),\n});\n\n/**\n * Icons configuration section\n */\nexport const iconsConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n sourceDir: z.string().optional().default('assets/icons'),\n outputDir: z.string().optional().default('dist/icons'),\n formats: z\n .array(z.enum(['svg', 'react', 'vue', 'sprite', 'font']))\n .optional()\n .default(['svg']),\n optimization: iconOptimizationSchema.optional(),\n sprite: iconSpriteSchema.optional(),\n componentPrefix: z.string().optional().default('Icon'),\n componentSuffix: z.string().optional().default(''),\n generateIndex: z.boolean().optional().default(true),\n generateTypes: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Token Configuration Schemas\n// ============================================================================\n\n/**\n * Token build configuration schema\n */\nexport const tokenBuildConfigSchema = z.object({\n format: outputFormatSchema,\n outputDir: z.string().optional(),\n outputFileName: z.string().optional(),\n fileExtension: z.string().optional(),\n prefix: z.string().optional(),\n useVariables: z.boolean().optional(),\n selector: z.string().optional(),\n transforms: z.array(z.string()).optional(),\n customTransforms: z.array(customTransformSchema).optional(),\n filter: z.function().optional(),\n header: z.string().optional(),\n footer: z.string().optional(),\n});\n\n/**\n * Postprocess configuration for CSS files\n */\nexport const postprocessConfigSchema = z.object({\n enabled: z.boolean().optional(),\n cssDir: z.string().optional(),\n files: z.array(z.string()).optional(),\n replacements: z\n .array(\n z.object({\n description: z.string().optional(),\n from: z.union([z.string(), z.instanceof(RegExp)]),\n to: z.string(),\n })\n )\n .optional(),\n});\n\n/**\n * SCSS/CSS output configuration for token builds\n */\nexport const scssConfigSchema = z.object({\n /** Output styles to generate: 'expanded' (readable) or 'compressed' (minified) */\n outputStyles: z.array(z.enum(['expanded', 'compressed'])).optional(),\n /** Generate source maps for SCSS compilation */\n generateSourceMaps: z.boolean().optional(),\n /** Suffix for minified files (e.g., '.min') */\n minifiedSuffix: z.string().optional(),\n /** Theme entry point SCSS file */\n themeEntry: z.string().optional(),\n /** Utilities entry point SCSS file */\n utilitiesEntry: z.string().optional(),\n /** Output directory for compiled CSS files */\n cssOutputDir: z.string().optional(),\n /** Additional Sass load paths */\n loadPaths: z.array(z.string()).optional(),\n /** Target CSS framework for variable name mapping */\n framework: z.enum(['bootstrap', 'tailwind', 'material', 'custom']).optional(),\n /** Custom token to variable name mappings */\n nameMapping: z.record(z.string(), z.string()).optional(),\n /** Output path for Bootstrap-compatible SCSS variables */\n variablesOutput: z.string().optional(),\n});\n\n/**\n * Token cache configuration\n */\nexport const tokenCacheConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n directory: z.string().optional().default('.cache'),\n hashType: hashTypeSchema.optional().default('content'),\n maxAge: z.number().optional().default(86400000),\n});\n\n/**\n * Token watch mode configuration\n */\nexport const tokenWatchConfigSchema = z.object({\n enabled: z.boolean().optional().default(false),\n debounce: z.number().optional().default(300),\n clearScreen: z.boolean().optional().default(true),\n ignorePatterns: z.array(z.string()).optional().default([]),\n});\n\n/**\n * Token processing hooks\n */\nexport const tokensHooksSchema = z.object({\n onBuildStart: z.function().optional(),\n onFormatComplete: z.function().optional(),\n onAllFormatsComplete: z.function().optional(),\n onBuildComplete: z.function().optional(),\n onError: z.function().optional(),\n});\n\n/**\n * Build pipeline step names\n */\nexport const buildPipelineStepSchema = z.enum([\n 'validate',\n 'snapshot',\n 'preprocess',\n 'transform',\n 'style-dictionary',\n 'sync',\n 'sass-theme',\n 'sass-theme-minified',\n 'postprocess',\n 'sass-utilities',\n 'sass-utilities-minified',\n 'bundle',\n]);\n\n/**\n * Build pipeline configuration\n * Controls which steps run and their paths\n */\nexport const tokensBuildPipelineSchema = z.object({\n /**\n * Steps to include in the build.\n * Order matters - steps run in sequence.\n * Default includes all steps for full @dsai-io/tokens build.\n * Simpler packages can use subset like ['validate', 'transform', 'style-dictionary']\n */\n steps: z.array(buildPipelineStepSchema).optional(),\n\n /**\n * Paths configuration for build steps\n */\n paths: z\n .object({\n /** Source file for sync step (Style Dictionary JS output) */\n syncSource: z.string().optional(),\n /** Target file for sync step */\n syncTarget: z.string().optional(),\n /** SCSS theme input file */\n sassThemeInput: z.string().optional(),\n /** CSS theme output file */\n sassThemeOutput: z.string().optional(),\n /** CSS theme minified output file */\n sassThemeMinifiedOutput: z.string().optional(),\n /** SCSS utilities input file */\n sassUtilitiesInput: z.string().optional(),\n /** CSS utilities output file */\n sassUtilitiesOutput: z.string().optional(),\n /** CSS utilities minified output file */\n sassUtilitiesMinifiedOutput: z.string().optional(),\n })\n .optional(),\n\n /** Style Dictionary config file name */\n styleDictionaryConfig: z.string().optional(),\n});\n\n/**\n * Tokens configuration section\n */\nexport const tokensConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n sourcePatterns: z\n .array(z.string())\n .optional()\n .default(['src/tokens/**/*.json', 'src/tokens/**/*.yaml']),\n outputDirs: z\n .object({\n css: z.string().optional().default('dist/css'),\n scss: z.string().optional().default('dist/scss'),\n less: z.string().optional().default('dist/less'),\n js: z.string().optional().default('dist/js'),\n ts: z.string().optional().default('dist/ts'),\n json: z.string().optional().default('dist/json'),\n })\n .optional(),\n additionalScssDirectories: z.array(z.string()).optional().default([]),\n outputFileNames: z\n .object({\n variables: z.string().optional().default('variables'),\n utilities: z.string().optional().default('utilities'),\n mixins: z.string().optional().default('mixins'),\n tokens: z.string().optional().default('tokens'),\n })\n .optional(),\n prefix: z.string().optional().default('dsai'),\n mergeOrder: z.array(z.string()).optional().default(['base', 'semantic', 'component']),\n createBundle: z.boolean().optional().default(true),\n bundleFileName: z.string().optional().default('bundle'),\n formats: z.array(outputFormatSchema).optional().default(['css', 'scss', 'json']),\n platforms: z.record(z.string(), tokenBuildConfigSchema).optional(),\n transforms: z.array(z.string()).optional().default([]),\n customTransforms: z.array(customTransformSchema).optional().default([]),\n customFormats: z.array(customFormatSchema).optional().default([]),\n hooks: tokensHooksSchema.optional(),\n cache: tokenCacheConfigSchema.optional(),\n watch: tokenWatchConfigSchema.optional(),\n verbose: z.boolean().optional().default(false),\n /** SCSS/CSS output configuration */\n scss: scssConfigSchema.optional(),\n /** Build pipeline configuration */\n pipeline: tokensBuildPipelineSchema.optional(),\n /** Postprocess configuration */\n postprocess: postprocessConfigSchema.optional(),\n});\n\n// ============================================================================\n// Global Configuration Schemas\n// ============================================================================\n\n/**\n * Global build configuration\n */\nexport const buildConfigSchema = z.object({\n outDir: z.string().optional().default('dist'),\n clean: z.boolean().optional().default(true),\n sourcemap: z.boolean().optional().default(false),\n minify: z.boolean().optional().default(true),\n parallel: z.boolean().optional().default(true),\n maxConcurrency: z.number().optional().default(4),\n});\n\n/**\n * Global configuration section\n */\nexport const globalConfigSchema = z.object({\n logLevel: logLevelSchema.optional().default('info'),\n colors: z.boolean().optional().default(true),\n ci: z.boolean().optional().default(false),\n dryRun: z.boolean().optional().default(false),\n cwd: z.string().optional(),\n configPath: z.string().optional(),\n framework: frameworkSchema.optional(),\n build: buildConfigSchema.optional(),\n});\n\n// ============================================================================\n// Root Configuration Schema\n// ============================================================================\n\n/**\n * DSAI Tools configuration root schema\n *\n * This is the primary schema used for validating configuration files.\n * It combines all section schemas into a complete configuration object.\n */\nexport const dsaiConfigSchema = z.object({\n $schema: z.string().optional(),\n extends: z.union([z.string(), z.array(z.string())]).optional(),\n global: globalConfigSchema.optional(),\n tokens: tokensConfigSchema.optional(),\n themes: themesConfigSchema.optional(),\n icons: iconsConfigSchema.optional(),\n});\n\n// ============================================================================\n// Inferred Types from Schemas\n// ============================================================================\n\n/** Inferred LogLevel type from schema */\nexport type LogLevelFromSchema = z.infer<typeof logLevelSchema>;\n\n/** Inferred OutputFormat type from schema */\nexport type OutputFormatFromSchema = z.infer<typeof outputFormatSchema>;\n\n/** Inferred Framework type from schema */\nexport type FrameworkFromSchema = z.infer<typeof frameworkSchema>;\n\n/** Inferred DsaiConfig type from schema */\nexport type DsaiConfigFromSchema = z.infer<typeof dsaiConfigSchema>;\n\n/** Inferred TokensConfig type from schema */\nexport type TokensConfigFromSchema = z.infer<typeof tokensConfigSchema>;\n\n/** Inferred ThemesConfig type from schema */\nexport type ThemesConfigFromSchema = z.infer<typeof themesConfigSchema>;\n\n/** Inferred IconsConfig type from schema */\nexport type IconsConfigFromSchema = z.infer<typeof iconsConfigSchema>;\n\n/** Inferred GlobalConfig type from schema */\nexport type GlobalConfigFromSchema = z.infer<typeof globalConfigSchema>;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validation result with typed data\n */\nexport interface ValidationResult<T> {\n success: boolean;\n data?: T;\n errors?: ValidationError[];\n}\n\n/**\n * Structured validation error\n */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n expected?: string;\n received?: string;\n}\n\n/**\n * Format Zod errors into user-friendly validation errors\n *\n * @param zodError - Zod error object\n * @returns Array of formatted validation errors\n */\nexport function formatValidationErrors(zodError: z.ZodError): ValidationError[] {\n return zodError.issues.map((err: z.ZodIssue) => ({\n path: err.path.join('.') || 'root',\n message: err.message,\n code: err.code,\n expected: 'expected' in err ? String(err.expected) : undefined,\n received: 'received' in err ? String(err.received) : undefined,\n }));\n}\n\n/**\n * Validate configuration object against schema\n *\n * @param config - Configuration object to validate\n * @returns Validation result with typed data or errors\n *\n * @example\n * ```typescript\n * const result = validateConfig({\n * tokens: { enabled: true },\n * themes: { defaultMode: 'dark' }\n * });\n *\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * result.errors?.forEach(err => console.error(err.message));\n * }\n * ```\n */\nexport function validateConfig(config: unknown): ValidationResult<DsaiConfigFromSchema> {\n const result = dsaiConfigSchema.safeParse(config);\n\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: formatValidationErrors(result.error),\n };\n}\n\n/**\n * Validate configuration and throw on errors\n *\n * @param config - Configuration object to validate\n * @returns Validated configuration\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * try {\n * const validConfig = validateConfigOrThrow(rawConfig);\n * // Use validConfig safely\n * } catch (error) {\n * console.error('Invalid configuration:', error.message);\n * }\n * ```\n */\nexport function validateConfigOrThrow(config: unknown): DsaiConfigFromSchema {\n const result = validateConfig(config);\n\n if (!result.success) {\n const errorMessages = result.errors?.map((e) => ` - ${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Configuration validation failed:\\n${errorMessages}`);\n }\n\n return result.data as DsaiConfigFromSchema;\n}\n\n/**\n * Validate a specific section of the configuration\n *\n * @param section - Section name to validate\n * @param config - Section configuration object\n * @returns Validation result for the section\n */\nexport function validateConfigSection<T extends keyof DsaiConfigFromSchema>(\n section: T,\n config: unknown\n): ValidationResult<NonNullable<DsaiConfigFromSchema[T]>> {\n const sectionSchemas = {\n global: globalConfigSchema,\n tokens: tokensConfigSchema,\n themes: themesConfigSchema,\n icons: iconsConfigSchema,\n } as const;\n\n const schema = sectionSchemas[section as keyof typeof sectionSchemas];\n\n if (!schema) {\n return {\n success: false,\n errors: [\n {\n path: section,\n message: `Unknown configuration section: ${section}`,\n code: 'unknown_section',\n },\n ],\n };\n }\n\n const result = schema.safeParse(config);\n\n if (result.success) {\n return {\n success: true,\n data: result.data as NonNullable<DsaiConfigFromSchema[T]>,\n };\n }\n\n return {\n success: false,\n errors: formatValidationErrors(result.error),\n };\n}\n\n/**\n * Create a pretty-printed error message from validation errors\n *\n * @param errors - Array of validation errors\n * @returns Formatted error message string\n */\nexport function formatErrorMessage(errors: ValidationError[]): string {\n const lines = ['Configuration validation failed:', ''];\n\n for (const error of errors) {\n lines.push(` ✗ ${error.path}`);\n lines.push(` ${error.message}`);\n\n if (error.expected && error.received) {\n lines.push(` Expected: ${error.expected}`);\n lines.push(` Received: ${error.received}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * @fileoverview Default configuration values for DSAI Tools\n *\n * Provides comprehensive default values for all configuration options.\n * These defaults are merged with user configuration during resolution.\n *\n * @module @dsai-io/tools/config/defaults\n */\n\nimport type {\n IconFramework,\n LogLevel,\n OutputFormat,\n ResolvedConfig,\n ResolvedGlobalConfig,\n ResolvedIconsConfig,\n ResolvedThemeDefinition,\n ResolvedThemesConfig,\n ResolvedTokensConfig,\n ThemeSelectorPattern,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default prefix for CSS custom properties\n */\nexport const DEFAULT_PREFIX = '--dsai-';\n\n/**\n * Default log level for CLI output\n */\nexport const DEFAULT_LOG_LEVEL: LogLevel = 'info';\n\n/**\n * Default output directory\n */\nexport const DEFAULT_OUTPUT_DIR = 'dist';\n\n/**\n * Default source directory for tokens (Figma exports)\n */\nexport const DEFAULT_SOURCE_DIR = 'figma-exports';\n\n/**\n * Default collections directory\n */\nexport const DEFAULT_COLLECTIONS_DIR = 'collections';\n\n/**\n * Default icons source directory\n */\nexport const DEFAULT_ICONS_SOURCE_DIR = 'icons';\n\n/**\n * Default icons output directory\n */\nexport const DEFAULT_ICONS_OUTPUT_DIR = 'dist/icons';\n\n// ============================================================================\n// Default Output Configuration\n// ============================================================================\n\n/**\n * Default source patterns for finding Figma exports\n */\nexport const defaultSourcePatterns = ['theme.json', 'tokens.json', '*.tokens.json'];\n\n/**\n * Default output formats for tokens\n */\nexport const defaultFormats: OutputFormat[] = ['css', 'scss', 'js', 'ts', 'json'];\n\n/**\n * Default output file names for each format\n */\nexport const defaultOutputFileNames: Record<OutputFormat, string> = {\n css: 'tokens.css',\n scss: '_tokens.scss',\n js: 'tokens.js',\n ts: 'tokens.ts',\n json: 'tokens.json',\n android: 'tokens.xml',\n ios: 'tokens.h',\n};\n\n// ============================================================================\n// Theme Defaults\n// ============================================================================\n\n/**\n * Default theme selector pattern\n */\nexport const defaultSelectorPattern: Required<ThemeSelectorPattern> = {\n default: ':root',\n others: '[data-dsai-theme=\"{mode}\"]',\n};\n\n/**\n * Default theme definitions\n * Provides light and dark themes out of the box\n */\nexport const defaultThemeDefinitions: Record<string, ResolvedThemeDefinition> = {\n light: {\n isDefault: true,\n suffix: null,\n selector: ':root',\n outputFiles: {\n css: 'tokens.css',\n scss: '_tokens.scss',\n js: 'tokens.js',\n ts: 'tokens.ts',\n json: 'tokens.json',\n android: 'tokens.xml',\n ios: 'tokens.h',\n },\n },\n dark: {\n isDefault: false,\n suffix: '-dark',\n selector: '[data-dsai-theme=\"dark\"]',\n mediaQuery: '(prefers-color-scheme: dark)',\n outputFiles: {\n css: 'tokens-dark.css',\n scss: '_tokens-dark.scss',\n js: 'tokens-dark.js',\n ts: 'tokens-dark.ts',\n json: 'tokens-dark.json',\n android: 'tokens-dark.xml',\n ios: 'tokens-dark.h',\n },\n },\n};\n\n/**\n * Default resolved themes configuration\n */\nexport const defaultThemesConfig: ResolvedThemesConfig = {\n enabled: true,\n autoDetect: true,\n default: 'light',\n ignoreModes: [],\n selectorPattern: defaultSelectorPattern,\n definitions: defaultThemeDefinitions,\n};\n\n// ============================================================================\n// Icon Defaults\n// ============================================================================\n\n/**\n * Default icon framework\n */\nexport const defaultIconFramework: IconFramework = 'react';\n\n/**\n * Default resolved icons configuration\n */\nexport const defaultIconsConfig: ResolvedIconsConfig = {\n sourceDir: DEFAULT_ICONS_SOURCE_DIR,\n outputDir: DEFAULT_ICONS_OUTPUT_DIR,\n framework: defaultIconFramework,\n typescript: true,\n optimize: true,\n prefix: 'Icon',\n};\n\n// ============================================================================\n// Token Defaults\n// ============================================================================\n\n/**\n * Default resolved tokens configuration\n */\nexport const defaultTokensConfig: ResolvedTokensConfig = {\n source: 'theme',\n sourceDir: DEFAULT_SOURCE_DIR,\n collectionsDir: DEFAULT_COLLECTIONS_DIR,\n sourcePatterns: defaultSourcePatterns,\n collectionMapping: {},\n outputDir: DEFAULT_OUTPUT_DIR,\n outputDirs: {},\n outputFileNames: defaultOutputFileNames,\n prefix: DEFAULT_PREFIX,\n formats: defaultFormats,\n additionalScssDirectories: [],\n additionalCssDirectories: [],\n mergeOrder: 'after',\n createBundle: false,\n themes: defaultThemesConfig,\n transforms: [],\n customFormats: [],\n preprocessors: [],\n filters: [],\n outputReferences: true,\n baseFontSize: 16,\n separateThemeFiles: false,\n watch: false,\n watchDirectories: [],\n};\n\n// ============================================================================\n// Global Defaults\n// ============================================================================\n\n/**\n * Default resolved global configuration\n */\nexport const defaultGlobalConfig: ResolvedGlobalConfig = {\n cwd: process.cwd(),\n debug: false,\n logLevel: DEFAULT_LOG_LEVEL,\n};\n\n// ============================================================================\n// Complete Default Configuration\n// ============================================================================\n\n/**\n * Complete default resolved configuration\n *\n * This is used as the base for merging user configurations.\n * All values have sensible defaults that work for most projects.\n */\nexport const defaultConfig: ResolvedConfig = {\n tokens: defaultTokensConfig,\n icons: defaultIconsConfig,\n global: defaultGlobalConfig,\n configDir: process.cwd(),\n};\n\n// ============================================================================\n// Environment Variable Mappings\n// ============================================================================\n\n/**\n * Mapping of environment variables to configuration paths\n *\n * Format: { ENV_VAR_NAME: 'config.path.to.value' }\n *\n * @example\n * DSAI_LOG_LEVEL=debug → { global: { logLevel: 'debug' } }\n * DSAI_PREFIX=myapp → { tokens: { prefix: 'myapp' } }\n */\nexport const envMappings: Record<string, string> = {\n // Global settings\n DSAI_LOG_LEVEL: 'global.logLevel',\n DSAI_DEBUG: 'global.debug',\n DSAI_CWD: 'global.cwd',\n\n // Token settings\n DSAI_PREFIX: 'tokens.prefix',\n DSAI_SOURCE_DIR: 'tokens.sourceDir',\n DSAI_OUTPUT_DIR: 'tokens.outputDir',\n DSAI_WATCH: 'tokens.watch',\n DSAI_CREATE_BUNDLE: 'tokens.createBundle',\n DSAI_BASE_FONT_SIZE: 'tokens.baseFontSize',\n\n // Theme settings\n DSAI_DEFAULT_THEME: 'tokens.themes.default',\n DSAI_AUTO_DETECT_THEMES: 'tokens.themes.autoDetect',\n\n // Icon settings\n DSAI_ICONS_SOURCE_DIR: 'icons.sourceDir',\n DSAI_ICONS_OUTPUT_DIR: 'icons.outputDir',\n DSAI_ICONS_FRAMEWORK: 'icons.framework',\n DSAI_ICONS_TYPESCRIPT: 'icons.typescript',\n DSAI_ICONS_OPTIMIZE: 'icons.optimize',\n DSAI_ICONS_PREFIX: 'icons.prefix',\n};\n\n/**\n * Environment variables that should be parsed as booleans\n */\nexport const envBooleanKeys: Set<string> = new Set([\n 'DSAI_DEBUG',\n 'DSAI_WATCH',\n 'DSAI_CREATE_BUNDLE',\n 'DSAI_AUTO_DETECT_THEMES',\n 'DSAI_ICONS_TYPESCRIPT',\n 'DSAI_ICONS_OPTIMIZE',\n]);\n\n/**\n * Environment variables that should be parsed as numbers\n */\nexport const envNumberKeys: Set<string> = new Set(['DSAI_BASE_FONT_SIZE']);\n\n/**\n * Environment variables that should be parsed as arrays (comma-separated)\n */\nexport const envArrayKeys: Set<string> = new Set(['DSAI_FORMATS', 'DSAI_IGNORE_MODES']);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get the output file name for a format with optional theme\n *\n * @param format - Output format\n * @param theme - Optional theme name\n * @returns Output file name\n */\nexport function getOutputFileName(format: OutputFormat, theme?: string): string {\n let baseName: string;\n\n switch (format) {\n case 'css':\n baseName = 'tokens.css';\n break;\n case 'scss':\n baseName = '_tokens.scss';\n break;\n case 'js':\n baseName = 'tokens.js';\n break;\n case 'ts':\n baseName = 'tokens.ts';\n break;\n case 'json':\n baseName = 'tokens.json';\n break;\n case 'android':\n baseName = 'tokens.xml';\n break;\n case 'ios':\n baseName = 'tokens.h';\n break;\n default:\n baseName = 'tokens.txt';\n }\n\n if (!theme) {\n return baseName;\n }\n\n // Insert theme before extension\n const dotIndex = baseName.lastIndexOf('.');\n if (dotIndex === -1) {\n return `${baseName}-${theme}`;\n }\n\n const name = baseName.slice(0, dotIndex);\n const ext = baseName.slice(dotIndex);\n return `${name}-${theme}${ext}`;\n}\n\n/**\n * Get the default output directory for a format\n *\n * @param format - Output format\n * @returns Output directory path\n */\nexport function getDefaultOutputDir(format: OutputFormat): string {\n switch (format) {\n case 'css':\n return `${DEFAULT_OUTPUT_DIR}/css`;\n case 'scss':\n return `${DEFAULT_OUTPUT_DIR}/scss`;\n case 'js':\n case 'ts':\n return `${DEFAULT_OUTPUT_DIR}/js`;\n case 'json':\n return `${DEFAULT_OUTPUT_DIR}/json`;\n case 'android':\n return `${DEFAULT_OUTPUT_DIR}/android`;\n case 'ios':\n return `${DEFAULT_OUTPUT_DIR}/ios`;\n default:\n return DEFAULT_OUTPUT_DIR;\n }\n}\n\n/**\n * Get default extension for a format\n *\n * @param format - Output format\n * @returns File extension including the dot\n */\nexport function getDefaultExtension(format: OutputFormat): string {\n switch (format) {\n case 'css':\n return '.css';\n case 'scss':\n return '.scss';\n case 'js':\n return '.js';\n case 'ts':\n return '.ts';\n case 'json':\n return '.json';\n case 'android':\n return '.xml';\n case 'ios':\n return '.h';\n default:\n return '.txt';\n }\n}\n","/**\n * @fileoverview Configuration resolver for DSAI Tools\n *\n * Merges user configuration with defaults and resolves relative paths.\n * Handles configuration inheritance and validation.\n *\n * @module @dsai-io/tools/config/resolver\n */\n\nimport path from 'node:path';\n\nimport {\n defaultConfig,\n defaultGlobalConfig,\n defaultIconsConfig,\n defaultOutputFileNames,\n defaultThemeDefinitions,\n defaultThemesConfig,\n defaultTokensConfig,\n} from './defaults.js';\n\nimport type {\n DsaiConfig,\n GlobalConfig,\n IconsConfig,\n OutputFormat,\n ResolvedConfig,\n ResolvedGlobalConfig,\n ResolvedIconsConfig,\n ResolvedThemeDefinition,\n ResolvedThemesConfig,\n ResolvedTokensConfig,\n ThemeDefinition,\n ThemesConfig,\n TokensConfig,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for resolving configuration\n */\nexport interface ResolveOptions {\n /** Working directory */\n cwd?: string;\n\n /** Directory containing config file (for relative path resolution) */\n configDir?: string;\n\n /** Override values (highest priority) */\n overrides?: Partial<DsaiConfig>;\n}\n\n// ============================================================================\n// Section Resolvers\n// ============================================================================\n\n/**\n * Resolve global configuration section\n */\nfunction resolveGlobalConfig(\n config: GlobalConfig | undefined,\n options: ResolveOptions\n): ResolvedGlobalConfig {\n const base = defaultGlobalConfig;\n const cwd = options.cwd ?? process.cwd();\n\n return {\n cwd: config?.cwd ? path.resolve(cwd, config.cwd) : cwd,\n debug: config?.debug ?? base.debug,\n logLevel: config?.logLevel ?? base.logLevel,\n };\n}\n\n/**\n * Resolve a single theme definition\n */\nfunction resolveThemeDefinition(\n themeName: string,\n definition: ThemeDefinition | undefined,\n selectorPattern: { default: string; others: string },\n _outputFileNames: Record<OutputFormat, string>,\n isDefaultTheme: boolean\n): ResolvedThemeDefinition {\n // Generate default output files based on theme name\n const generateOutputFiles = (): Record<OutputFormat, string> => {\n const suffix = isDefaultTheme ? '' : `-${themeName}`;\n return {\n css: `tokens${suffix}.css`,\n scss: `_tokens${suffix}.scss`,\n js: `tokens${suffix}.js`,\n ts: `tokens${suffix}.ts`,\n json: `tokens${suffix}.json`,\n android: `tokens${suffix}.xml`,\n ios: `tokens${suffix}.h`,\n };\n };\n\n // Generate default selector based on pattern\n const generateSelector = (): string => {\n if (isDefaultTheme) {\n return selectorPattern.default;\n }\n return selectorPattern.others.replace('{mode}', themeName);\n };\n\n const defaultOutputFiles = generateOutputFiles();\n\n return {\n isDefault: definition?.isDefault ?? isDefaultTheme,\n suffix: definition?.suffix ?? (isDefaultTheme ? null : `-${themeName}`),\n selector: definition?.selector ?? generateSelector(),\n mediaQuery: definition?.mediaQuery,\n dataAttribute: definition?.dataAttribute,\n outputFiles: {\n ...defaultOutputFiles,\n ...definition?.outputFiles,\n },\n };\n}\n\n/**\n * Resolve themes configuration section\n */\nfunction resolveThemesConfig(config: ThemesConfig | undefined): ResolvedThemesConfig {\n const base = defaultThemesConfig;\n\n const selectorPattern = {\n default: config?.selectorPattern?.default ?? base.selectorPattern.default,\n others: config?.selectorPattern?.others ?? base.selectorPattern.others,\n };\n\n // Determine the default theme name\n const defaultThemeName = config?.default?.toLowerCase() ?? base.default;\n\n // Resolve definitions\n let definitions: Record<string, ResolvedThemeDefinition>;\n\n if (config?.definitions && Object.keys(config.definitions).length > 0) {\n // User provided explicit definitions\n definitions = {};\n for (const [themeName, definition] of Object.entries(config.definitions)) {\n const normalizedName = themeName.toLowerCase();\n const isDefaultTheme = definition.isDefault ?? normalizedName === defaultThemeName;\n const resolvedDef = resolveThemeDefinition(\n normalizedName,\n definition,\n selectorPattern,\n defaultOutputFileNames,\n isDefaultTheme\n );\n Object.defineProperty(definitions, normalizedName, {\n value: resolvedDef,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n } else {\n // Use default definitions (light & dark)\n definitions = { ...defaultThemeDefinitions };\n }\n\n return {\n enabled: config?.enabled ?? base.enabled,\n autoDetect: config?.autoDetect ?? base.autoDetect,\n default: defaultThemeName,\n ignoreModes: config?.ignoreModes ?? [...base.ignoreModes],\n selectorPattern,\n definitions,\n };\n}\n\n/**\n * Resolve icons configuration section\n */\nfunction resolveIconsConfig(\n config: IconsConfig | undefined,\n options: ResolveOptions\n): ResolvedIconsConfig {\n const base = defaultIconsConfig;\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n return {\n sourceDir: config?.sourceDir ? path.resolve(configDir, config.sourceDir) : base.sourceDir,\n outputDir: config?.outputDir ? path.resolve(configDir, config.outputDir) : base.outputDir,\n framework: config?.framework ?? base.framework,\n typescript: config?.typescript ?? base.typescript,\n optimize: config?.optimize ?? base.optimize,\n prefix: config?.prefix ?? base.prefix,\n };\n}\n\n/**\n * Resolve tokens configuration section\n */\nfunction resolveTokensConfig(\n config: TokensConfig | undefined,\n options: ResolveOptions\n): ResolvedTokensConfig {\n const base = defaultTokensConfig;\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n // Resolve paths relative to config directory\n const resolveDir = (dir: string): string => path.resolve(configDir, dir);\n\n // Resolve output directories using Map to avoid object injection\n const outputDirsMap = new Map(Object.entries(base.outputDirs));\n if (config?.outputDirs) {\n for (const [format, dir] of Object.entries(config.outputDirs)) {\n if (dir !== undefined) {\n outputDirsMap.set(format, resolveDir(dir));\n }\n }\n }\n const outputDirs = Object.fromEntries(outputDirsMap) as ResolvedTokensConfig['outputDirs'];\n\n // Merge collection mapping with resolved paths using Map\n const collectionMappingMap = new Map<string, string>();\n if (config?.collectionMapping) {\n for (const [name, filePath] of Object.entries(config.collectionMapping)) {\n collectionMappingMap.set(name, resolveDir(filePath));\n }\n }\n const collectionMapping = Object.fromEntries(collectionMappingMap);\n\n // Resolve additional directories\n const additionalScssDirectories = (config?.additionalScssDirectories ?? []).map(resolveDir);\n const additionalCssDirectories = (config?.additionalCssDirectories ?? []).map(resolveDir);\n const watchDirectories = (config?.watchDirectories ?? []).map(resolveDir);\n\n return {\n source: config?.source ?? base.source,\n sourceDir: config?.sourceDir ? resolveDir(config.sourceDir) : base.sourceDir,\n collectionsDir: config?.collectionsDir\n ? resolveDir(config.collectionsDir)\n : base.collectionsDir,\n sourcePatterns: config?.sourcePatterns ?? [...base.sourcePatterns],\n collectionMapping,\n outputDir: config?.outputDir ? resolveDir(config.outputDir) : base.outputDir,\n outputDirs,\n outputFileNames: { ...base.outputFileNames, ...config?.outputFileNames },\n prefix: config?.prefix ?? base.prefix,\n formats: config?.formats ?? [...base.formats],\n additionalScssDirectories,\n additionalCssDirectories,\n mergeOrder: config?.mergeOrder ?? base.mergeOrder,\n createBundle: config?.createBundle ?? base.createBundle,\n scssImportHeader: config?.scssImportHeader,\n themes: resolveThemesConfig(config?.themes),\n transforms: config?.transforms ?? [],\n customFormats: config?.customFormats ?? [],\n preprocessors: config?.preprocessors ?? [],\n filters: config?.filters ?? [],\n onBuildStart: config?.onBuildStart,\n onFormatComplete: config?.onFormatComplete,\n onAllFormatsComplete: config?.onAllFormatsComplete,\n onBuildComplete: config?.onBuildComplete,\n outputReferences: config?.outputReferences ?? base.outputReferences,\n baseFontSize: config?.baseFontSize ?? base.baseFontSize,\n separateThemeFiles: config?.separateThemeFiles ?? base.separateThemeFiles,\n watch: config?.watch ?? base.watch,\n watchDirectories,\n pipeline: config?.pipeline,\n scss: config?.scss,\n postprocess: config?.postprocess,\n };\n}\n\n// ============================================================================\n// Main Resolver\n// ============================================================================\n\n/**\n * Merge config with overrides (simple shallow merge for top-level)\n */\nfunction applyOverrides(config: DsaiConfig, overrides: Partial<DsaiConfig>): DsaiConfig {\n return {\n tokens: overrides.tokens ? { ...config.tokens, ...overrides.tokens } : config.tokens,\n icons: overrides.icons ? { ...config.icons, ...overrides.icons } : config.icons,\n global: overrides.global ? { ...config.global, ...overrides.global } : config.global,\n };\n}\n\n/**\n * Resolve user configuration with defaults\n *\n * Merges user configuration with defaults, resolves relative paths,\n * and applies overrides.\n *\n * Resolution order (later overrides earlier):\n * 1. Default configuration\n * 2. User configuration (from file)\n * 3. Override configuration (from CLI or programmatic)\n *\n * @param config - User configuration object\n * @param options - Resolution options\n * @returns Fully resolved configuration\n *\n * @example\n * ```typescript\n * const resolved = resolveConfig(\n * { tokens: { prefix: '--custom-' } },\n * { cwd: '/path/to/project' }\n * );\n * ```\n */\nexport function resolveConfig(\n config: DsaiConfig = {},\n options: ResolveOptions = {}\n): ResolvedConfig {\n // Merge overrides into config\n const mergedConfig = options.overrides ? applyOverrides(config, options.overrides) : config;\n\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n return {\n global: resolveGlobalConfig(mergedConfig.global, options),\n tokens: resolveTokensConfig(mergedConfig.tokens, options),\n icons: resolveIconsConfig(mergedConfig.icons, options),\n configDir,\n };\n}\n\n/**\n * Merge multiple configurations\n *\n * Useful for extending base configurations.\n *\n * @param configs - Array of configurations to merge (later overrides earlier)\n * @returns Merged configuration\n *\n * @example\n * ```typescript\n * const merged = mergeConfigs(\n * baseConfig,\n * teamConfig,\n * projectConfig\n * );\n * ```\n */\nexport function mergeConfigs(...configs: DsaiConfig[]): DsaiConfig {\n let result: DsaiConfig = {};\n\n for (const config of configs) {\n result = applyOverrides(result, config);\n }\n\n return result;\n}\n\n/**\n * Create a partial resolved config for testing\n *\n * @param partial - Partial configuration to fill\n * @returns Full resolved configuration with defaults\n */\nexport function createResolvedConfig(partial: Partial<ResolvedConfig> = {}): ResolvedConfig {\n return {\n global: partial.global ?? defaultConfig.global,\n tokens: partial.tokens ?? defaultConfig.tokens,\n icons: partial.icons ?? defaultConfig.icons,\n configDir: partial.configDir ?? process.cwd(),\n configPath: partial.configPath,\n };\n}\n","/**\n * @fileoverview Configuration file loader for DSAI Tools\n *\n * Uses cosmiconfig to load configuration from multiple file formats\n * and locations following standard conventions.\n *\n * @module @dsai-io/tools/config/loader\n */\n\nimport path from 'node:path';\n\nimport { cosmiconfig, cosmiconfigSync } from 'cosmiconfig';\n\nimport { resolveConfig } from './resolver.js';\n\nimport type { DsaiConfig, LoadConfigOptions, LoadConfigResult } from './types.js';\nimport type { CosmiconfigResult, PublicExplorer, PublicExplorerSync } from 'cosmiconfig';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Module name for cosmiconfig search\n * This determines the config file naming conventions:\n * - dsai.config.{js,mjs,cjs,ts}\n * - .dsairc\n * - .dsairc.{json,yaml,yml,js,mjs,cjs}\n * - package.json \"dsai\" key\n */\nconst MODULE_NAME = 'dsai';\n\n/**\n * Supported configuration file names (in search order)\n */\nexport const CONFIG_FILE_NAMES = [\n 'dsai.config.ts',\n 'dsai.config.mjs',\n 'dsai.config.js',\n 'dsai.config.cjs',\n '.dsairc.ts',\n '.dsairc.mjs',\n '.dsairc.js',\n '.dsairc.cjs',\n '.dsairc.json',\n '.dsairc.yaml',\n '.dsairc.yml',\n '.dsairc',\n 'package.json',\n];\n\n// ============================================================================\n// Loader Instance\n// ============================================================================\n\n/**\n * Create a cosmiconfig explorer instance\n *\n * @param options - Optional loader options\n * @returns Cosmiconfig explorer\n */\nfunction createExplorer(options?: { stopDir?: string }): PublicExplorer {\n return cosmiconfig(MODULE_NAME, {\n searchPlaces: CONFIG_FILE_NAMES,\n stopDir: options?.stopDir,\n packageProp: MODULE_NAME,\n });\n}\n\n/**\n * Create a synchronous cosmiconfig explorer instance\n *\n * @param options - Optional loader options\n * @returns Cosmiconfig sync explorer\n */\nfunction createExplorerSync(options?: { stopDir?: string }): PublicExplorerSync {\n return cosmiconfigSync(MODULE_NAME, {\n searchPlaces: CONFIG_FILE_NAMES,\n stopDir: options?.stopDir,\n packageProp: MODULE_NAME,\n });\n}\n\n// ============================================================================\n// Loading Functions\n// ============================================================================\n\n/**\n * Load configuration from file and merge with defaults\n *\n * This is the main entry point for loading configuration.\n * It searches for config files, loads them, validates,\n * and resolves with defaults.\n *\n * @param options - Load options\n * @returns Resolved configuration with metadata\n *\n * @example\n * ```typescript\n * // Load from current directory\n * const result = await loadConfig();\n *\n * // Load from specific path\n * const result = await loadConfig({\n * configPath: './my-config.js'\n * });\n *\n * // Load with overrides\n * const result = await loadConfig({\n * overrides: { global: { debug: true } }\n * });\n * ```\n */\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult> {\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\n const warnings: string[] = [];\n\n let fileConfig: DsaiConfig = {};\n let resolvedConfigPath: string | undefined;\n\n // Load configuration from file unless skipped\n if (!skipFile) {\n const explorer = createExplorer({ stopDir: path.dirname(cwd) });\n let cosmicResult: CosmiconfigResult;\n\n try {\n if (configPath) {\n // Load from explicit path\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(cwd, configPath);\n cosmicResult = await explorer.load(absolutePath);\n } else {\n // Search for config file\n cosmicResult = await explorer.search(cwd);\n }\n\n if (cosmicResult && !cosmicResult.isEmpty) {\n fileConfig = cosmicResult.config as DsaiConfig;\n resolvedConfigPath = cosmicResult.filepath;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`Failed to load configuration: ${message}`);\n }\n }\n\n // Resolve configuration with defaults\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\n\n const resolvedConfig = resolveConfig(fileConfig, {\n cwd,\n configDir,\n overrides,\n });\n\n return {\n config: resolvedConfig,\n configPath: resolvedConfigPath,\n warnings,\n };\n}\n\n/**\n * Search for configuration file without loading\n *\n * Useful for checking if a config file exists before operations.\n *\n * @param cwd - Directory to search from\n * @returns Path to config file if found, undefined otherwise\n */\nexport async function searchConfigFile(cwd: string = process.cwd()): Promise<string | undefined> {\n const explorer = createExplorer();\n\n try {\n const result = await explorer.search(cwd);\n return result?.filepath;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Clear the configuration cache\n *\n * Useful when files have changed and need to be reloaded.\n */\nexport function clearConfigCache(): void {\n const explorer = createExplorer();\n explorer.clearCaches();\n}\n\n/**\n * Load configuration synchronously (limited format support)\n *\n * Note: This only works with JSON and synchronous JS/CJS configs.\n * For full format support including ESM and TypeScript, use loadConfig().\n *\n * @param options - Load options\n * @returns Resolved configuration with metadata\n */\nexport function loadConfigSync(options: LoadConfigOptions = {}): LoadConfigResult {\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\n const warnings: string[] = [];\n\n let fileConfig: DsaiConfig = {};\n let resolvedConfigPath: string | undefined;\n\n // Load configuration from file unless skipped\n if (!skipFile) {\n const explorer = createExplorerSync({ stopDir: path.dirname(cwd) });\n\n try {\n if (configPath) {\n // Load from explicit path\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(cwd, configPath);\n const result = explorer.load(absolutePath);\n\n if (result && !result.isEmpty) {\n fileConfig = result.config as DsaiConfig;\n resolvedConfigPath = result.filepath;\n }\n } else {\n // Search for config file\n const result = explorer.search(cwd);\n\n if (result && !result.isEmpty) {\n fileConfig = result.config as DsaiConfig;\n resolvedConfigPath = result.filepath;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`Failed to load configuration: ${message}`);\n }\n }\n\n // Resolve configuration with defaults\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\n\n const resolvedConfig = resolveConfig(fileConfig, {\n cwd,\n configDir,\n overrides,\n });\n\n return {\n config: resolvedConfig,\n configPath: resolvedConfigPath,\n warnings,\n };\n}\n\n// ============================================================================\n// Config Helper\n// ============================================================================\n\n/**\n * Define configuration with type checking\n *\n * A helper function that provides TypeScript type checking for config files.\n * Use this in your dsai.config.ts or dsai.config.mjs files.\n *\n * @param config - Configuration object\n * @returns The same configuration object with type checking applied\n *\n * @example\n * ```typescript\n * // dsai.config.ts\n * import { defineConfig } from '@dsai-io/tools';\n *\n * export default defineConfig({\n * tokens: {\n * prefix: '--myapp-',\n * formats: ['css', 'scss', 'ts'],\n * },\n * icons: {\n * framework: 'react',\n * },\n * });\n * ```\n */\nexport function defineConfig(config: DsaiConfig): DsaiConfig {\n return config;\n}\n\n/**\n * Define configuration with async function\n *\n * Allows async operations during configuration creation.\n *\n * @param configFn - Async function returning configuration\n * @returns Promise resolving to the configuration\n *\n * @example\n * ```typescript\n * // dsai.config.ts\n * import { defineConfigAsync } from '@dsai-io/tools';\n *\n * export default defineConfigAsync(async () => {\n * const baseConfig = await loadExternalConfig();\n * return {\n * ...baseConfig,\n * tokens: {\n * prefix: '--custom-',\n * },\n * };\n * });\n * ```\n */\nexport function defineConfigAsync(configFn: () => Promise<DsaiConfig>): Promise<DsaiConfig> {\n return configFn();\n}\n","/**\n * @fileoverview Environment variable parsing for DSAI Tools configuration\n *\n * Reads configuration values from environment variables and converts\n * them to the appropriate types.\n *\n * @module @dsai-io/tools/config/env\n */\n\nimport { envArrayKeys, envBooleanKeys, envMappings, envNumberKeys } from './defaults.js';\n\nimport type { DsaiConfig } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for parsing environment variables\n */\nexport interface EnvParseOptions {\n /** Environment object to read from (default: process.env) */\n env?: NodeJS.ProcessEnv;\n\n /** Prefix filter for environment variables */\n prefix?: string;\n}\n\n// ============================================================================\n// Parsing Functions\n// ============================================================================\n\n/**\n * Parse a boolean from environment variable value\n *\n * @param value - Environment variable value\n * @returns Parsed boolean or undefined\n */\nfunction parseBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value.toLowerCase().trim();\n\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\n return true;\n }\n\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\n return false;\n }\n\n return undefined;\n}\n\n/**\n * Parse a number from environment variable value\n *\n * @param value - Environment variable value\n * @returns Parsed number or undefined\n */\nfunction parseNumber(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const num = Number(value);\n return Number.isNaN(num) ? undefined : num;\n}\n\n/**\n * Parse an array from environment variable value (comma-separated)\n *\n * @param value - Environment variable value\n * @returns Parsed array or undefined\n */\nfunction parseArray(value: string | undefined): string[] | undefined {\n if (value === undefined || value.trim() === '') {\n return undefined;\n }\n\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\n/**\n * Set a nested value in an object using dot notation path\n *\n * @param obj - Object to modify\n * @param path - Dot notation path (e.g., 'global.logLevel')\n * @param value - Value to set\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n\n if (parts.length === 1) {\n const key = parts[0];\n if (key !== undefined) {\n Object.defineProperty(obj, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return;\n }\n\n if (parts.length === 2) {\n const [first, second] = parts;\n if (first !== undefined && second !== undefined) {\n if (!(first in obj)) {\n Object.defineProperty(obj, first, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested = Reflect.get(obj, first) as Record<string, unknown>;\n Object.defineProperty(nested, second, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return;\n }\n\n if (parts.length === 3) {\n const [first, second, third] = parts;\n if (first !== undefined && second !== undefined && third !== undefined) {\n if (!(first in obj)) {\n Object.defineProperty(obj, first, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested1 = Reflect.get(obj, first) as Record<string, unknown>;\n if (!(second in nested1)) {\n Object.defineProperty(nested1, second, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested2 = Reflect.get(nested1, second) as Record<string, unknown>;\n Object.defineProperty(nested2, third, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n // For paths deeper than 3 levels, we don't support them in config\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Read configuration values from environment variables\n *\n * Parses environment variables according to the mappings defined in defaults.ts.\n * Supports string, boolean, number, and array types.\n *\n * @param options - Parse options\n * @returns Partial configuration object from environment\n *\n * @example\n * ```typescript\n * // Read from process.env\n * const envConfig = getConfigFromEnv();\n *\n * // Read from custom env object\n * const envConfig = getConfigFromEnv({\n * env: { DSAI_LOG_LEVEL: 'debug' }\n * });\n * ```\n */\nexport function getConfigFromEnv(options: EnvParseOptions = {}): Partial<DsaiConfig> {\n const env = options.env ?? process.env;\n const prefix = options.prefix ?? 'DSAI_';\n\n const config: Record<string, unknown> = {};\n\n for (const [envKey, configPath] of Object.entries(envMappings)) {\n // Check prefix filter\n if (!envKey.startsWith(prefix)) {\n continue;\n }\n\n const envValue = Reflect.get(env, envKey) as string | undefined;\n if (envValue === undefined) {\n continue;\n }\n\n let parsedValue: unknown;\n\n // Parse based on expected type\n if (envBooleanKeys.has(envKey)) {\n parsedValue = parseBoolean(envValue);\n } else if (envNumberKeys.has(envKey)) {\n parsedValue = parseNumber(envValue);\n } else if (envArrayKeys.has(envKey)) {\n parsedValue = parseArray(envValue);\n } else {\n // Default to string\n parsedValue = envValue;\n }\n\n // Only set if we got a valid value\n if (parsedValue !== undefined) {\n setNestedValue(config, configPath, parsedValue);\n }\n }\n\n return config as Partial<DsaiConfig>;\n}\n\n/**\n * Check if running in CI environment\n *\n * Checks common CI environment variables.\n *\n * @param env - Environment object to check\n * @returns True if CI environment detected\n */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return (\n env['CI'] === 'true' ||\n env['CONTINUOUS_INTEGRATION'] === 'true' ||\n env['GITHUB_ACTIONS'] === 'true' ||\n env['GITLAB_CI'] === 'true' ||\n env['CIRCLECI'] === 'true' ||\n env['TRAVIS'] === 'true' ||\n env['BUILDKITE'] === 'true' ||\n env['JENKINS_URL'] !== undefined ||\n env['TF_BUILD'] === 'True'\n );\n}\n\n/**\n * Check if colors should be disabled based on environment\n *\n * @param env - Environment object to check\n * @returns True if colors should be disabled\n */\nexport function shouldDisableColors(env: NodeJS.ProcessEnv = process.env): boolean {\n return env['NO_COLOR'] !== undefined || env['FORCE_COLOR'] === '0' || env['TERM'] === 'dumb';\n}\n\n/**\n * Get the effective log level from environment\n *\n * Checks DSAI_LOG_LEVEL, DEBUG, and VERBOSE env vars.\n *\n * @param env - Environment object to check\n * @returns Log level string or undefined\n */\nexport function getLogLevelFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {\n const dsaiLogLevel = env['DSAI_LOG_LEVEL'];\n const dsaiDebug = env['DSAI_DEBUG'];\n const debug = env['DEBUG'];\n const verbose = env['VERBOSE'];\n\n // Explicit DSAI log level takes precedence\n if (dsaiLogLevel) {\n return dsaiLogLevel;\n }\n\n // Check for debug mode\n if (dsaiDebug === 'true' || debug?.includes('dsai')) {\n return 'debug';\n }\n\n // Check for verbose mode\n if (verbose === 'true') {\n return 'verbose';\n }\n\n return undefined;\n}\n\n/**\n * Get environment-based overrides for configuration\n *\n * This combines all environment-based settings into a single override object.\n *\n * @param env - Environment object to check\n * @returns Configuration overrides from environment\n */\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): Partial<DsaiConfig> {\n const config = getConfigFromEnv({ env });\n\n // Apply CI detection\n if (isCI(env) && !config.global) {\n config.global = { debug: false };\n }\n\n // Apply log level from various sources\n const logLevel = getLogLevelFromEnv(env);\n if (logLevel) {\n config.global = {\n ...config.global,\n logLevel: logLevel as 'silent' | 'error' | 'warn' | 'info' | 'debug',\n };\n }\n\n return config;\n}\n","/**\n * Legacy configuration migration utilities\n *\n * Provides migration support for older config formats and helps users\n * upgrade to the latest configuration schema.\n *\n * @packageDocumentation\n */\n\nimport type { DsaiConfig, TokensConfig } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy tokens.config.json format (v0.x)\n */\ninterface LegacyTokensConfig {\n /** Source directory for tokens */\n source?: string;\n /** Output directory */\n output?: string;\n /** CSS prefix */\n prefix?: string;\n /** Output formats */\n formats?: string[];\n /** Theme configuration */\n themes?: {\n default?: string;\n modes?: string[];\n };\n}\n\n/**\n * Result of migration check\n */\nexport interface MigrationCheck {\n /** Whether migration is needed */\n needsMigration: boolean;\n /** Detected config version or format */\n detectedFormat: ConfigFormat;\n /** Warnings about deprecated options */\n warnings: string[];\n /** Suggested migration steps */\n suggestions: string[];\n}\n\n/**\n * Supported configuration formats\n */\nexport type ConfigFormat =\n | 'current' // dsai.config.mjs/js/ts\n | 'legacy-tokens' // tokens.config.json (v0.x)\n | 'unknown';\n\n// ============================================================================\n// Migration Detection\n// ============================================================================\n\n/**\n * Check if a configuration needs migration\n *\n * @param config - Raw configuration object\n * @param filename - Optional filename for format detection\n * @returns Migration check result\n *\n * @example\n * ```typescript\n * const check = checkMigrationNeeded(oldConfig, 'tokens.config.json');\n * if (check.needsMigration) {\n * console.log('Migration needed:', check.suggestions);\n * }\n * ```\n */\nexport function checkMigrationNeeded(config: unknown, filename?: string): MigrationCheck {\n const warnings: string[] = [];\n const suggestions: string[] = [];\n\n // Check filename for legacy format\n if (filename?.includes('tokens.config.json')) {\n warnings.push('tokens.config.json is deprecated. Please migrate to dsai.config.mjs.');\n suggestions.push('Run: npx @dsai-io/tools migrate to automatically migrate your config.');\n\n return {\n needsMigration: true,\n detectedFormat: 'legacy-tokens',\n warnings,\n suggestions,\n };\n }\n\n // Check for legacy structure\n if (isLegacyTokensConfig(config)) {\n warnings.push('Legacy configuration format detected. Some options may be deprecated.');\n suggestions.push('Consider updating to the new configuration format.');\n\n return {\n needsMigration: true,\n detectedFormat: 'legacy-tokens',\n warnings,\n suggestions,\n };\n }\n\n return {\n needsMigration: false,\n detectedFormat: 'current',\n warnings,\n suggestions,\n };\n}\n\n/**\n * Type guard for legacy tokens config\n */\nfunction isLegacyTokensConfig(config: unknown): config is LegacyTokensConfig {\n if (typeof config !== 'object' || config === null) {\n return false;\n }\n\n const obj = config as Record<string, unknown>;\n\n // Legacy format has 'output' instead of 'outputDir'\n // and 'source' as a string path instead of structured source config\n return (\n typeof obj['output'] === 'string' ||\n (typeof obj['source'] === 'string' && !('sourceDir' in obj))\n );\n}\n\n// ============================================================================\n// Migration Functions\n// ============================================================================\n\n/**\n * Migrate legacy tokens.config.json to new format\n *\n * @param legacy - Legacy configuration object\n * @returns Migrated configuration\n *\n * @example\n * ```typescript\n * const oldConfig = require('./tokens.config.json');\n * const newConfig = migrateLegacyTokensConfig(oldConfig);\n * ```\n */\nexport function migrateLegacyTokensConfig(legacy: LegacyTokensConfig): DsaiConfig {\n const tokens: TokensConfig = {};\n\n // Migrate source → sourceDir\n if (legacy.source !== undefined && legacy.source !== null) {\n tokens.sourceDir = legacy.source;\n }\n\n // Migrate output → outputDir\n if (legacy.output !== undefined && legacy.output !== null) {\n tokens.outputDir = legacy.output;\n }\n\n // Direct migrations\n if (legacy.prefix !== undefined && legacy.prefix !== null) {\n tokens.prefix = legacy.prefix;\n }\n\n if (Array.isArray(legacy.formats)) {\n // Filter to only valid formats\n const validFormats = ['css', 'scss', 'js', 'ts', 'json', 'android', 'ios'] as const;\n tokens.formats = legacy.formats.filter((f): f is (typeof validFormats)[number] =>\n validFormats.includes(f as (typeof validFormats)[number])\n );\n }\n\n // Migrate themes\n if (legacy.themes !== undefined && legacy.themes !== null) {\n tokens.themes = {\n default: legacy.themes.default ?? 'Light',\n // ignoreModes can be derived from modes if needed\n };\n }\n\n return { tokens };\n}\n\n/**\n * Migrate any legacy configuration to current format\n *\n * @param config - Raw configuration (any format)\n * @param filename - Optional filename for format detection\n * @returns Migrated configuration and warnings\n *\n * @example\n * ```typescript\n * const { config, warnings } = migrateConfig(rawConfig, 'tokens.config.json');\n * if (warnings.length > 0) {\n * warnings.forEach(w => console.warn(w));\n * }\n * ```\n */\nexport function migrateConfig(\n config: unknown,\n filename?: string\n): { config: DsaiConfig; warnings: string[] } {\n const check = checkMigrationNeeded(config, filename);\n\n if (!check.needsMigration) {\n return {\n config: config as DsaiConfig,\n warnings: check.warnings,\n };\n }\n\n switch (check.detectedFormat) {\n case 'legacy-tokens':\n return {\n config: migrateLegacyTokensConfig(config as LegacyTokensConfig),\n warnings: check.warnings,\n };\n\n default:\n return {\n config: config as DsaiConfig,\n warnings: [...check.warnings, 'Unknown config format - using as-is.'],\n };\n }\n}\n\n// ============================================================================\n// Deprecation Warnings\n// ============================================================================\n\n/**\n * Check for deprecated options in a configuration\n *\n * @param config - Configuration to check\n * @returns Array of deprecation warnings\n */\nexport function checkDeprecatedOptions(config: DsaiConfig): string[] {\n const warnings: string[] = [];\n\n // Check tokens.output (legacy)\n const configAny = config as Record<string, unknown>;\n const tokens = configAny['tokens'] as Record<string, unknown> | undefined;\n\n if (tokens !== undefined) {\n if ('output' in tokens) {\n warnings.push(\n `Deprecated: Use 'tokens.outputDir' instead of 'tokens.output' (tokens.outputDir)`\n );\n }\n if ('source' in tokens && typeof tokens['source'] === 'string') {\n warnings.push(\n `Deprecated: Use 'tokens.sourceDir' instead of 'tokens.source' for directory paths (tokens.sourceDir)`\n );\n }\n }\n\n return warnings;\n}\n\n/**\n * Generate migration script content\n *\n * @param _oldConfig - Old configuration (unused, reserved for future use)\n * @param newConfig - Migrated configuration\n * @returns String content for new config file\n */\nexport function generateMigrationScript(_oldConfig: unknown, newConfig: DsaiConfig): string {\n const configJson = JSON.stringify(newConfig, null, '\\t');\n\n return `// @ts-check\n/**\n * DSAI Configuration\n *\n * Migrated from legacy format.\n * Please review and adjust as needed.\n *\n * @type {import('@dsai-io/tools').DsaiConfig}\n */\nimport { defineConfig } from '@dsai-io/tools';\n\nexport default defineConfig(${configJson.replace(/\"([^\"]+)\":/g, '$1:')});\n`;\n}\n","/**\n * Token-specific type definitions\n *\n * Defines types for DTCG-compliant tokens, validation, transformation,\n * and build processes.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// DTCG Token Types\n// ============================================================================\n\n/**\n * DTCG-compliant token value\n * @see https://www.designtokens.org/\n */\nexport interface DTCGToken {\n /** The resolved value of the token */\n $value: unknown;\n\n /** Token type (color, dimension, etc.) */\n $type?: TokenType;\n\n /** Human-readable description */\n $description?: string;\n\n /** Extension data */\n $extensions?: Record<string, unknown>;\n}\n\n/**\n * Legacy Style Dictionary token format\n */\nexport interface LegacyToken {\n /** The resolved value of the token */\n value: unknown;\n\n /** Token type */\n type?: string;\n\n /** Human-readable description */\n description?: string;\n\n /** Comment (older format) */\n comment?: string;\n}\n\n/**\n * Combined token type supporting both DTCG and legacy formats\n */\nexport type Token = DTCGToken | LegacyToken;\n\n/**\n * Token collection (nested structure of tokens or groups)\n */\nexport interface TokenCollection {\n [key: string]: Token | TokenCollection | unknown;\n}\n\n/**\n * Figma export format (from Tokens Studio)\n */\nexport interface FigmaExport {\n [collectionName: string]: FigmaCollection;\n}\n\n/**\n * Single Figma collection with optional modes\n */\nexport interface FigmaCollection {\n /** Mode-specific token values */\n modes?: Record<string, TokenCollection>;\n\n /** Direct tokens if no modes */\n [key: string]: unknown;\n}\n\n// ============================================================================\n// Token Type Constants\n// ============================================================================\n\n/**\n * Valid token types per DTCG specification\n */\nexport const VALID_TOKEN_TYPES = [\n 'color',\n 'dimension',\n 'fontFamily',\n 'fontWeight',\n 'fontStyle',\n 'shadow',\n 'number',\n 'string',\n 'duration',\n 'cubicBezier',\n 'strokeStyle',\n 'border',\n 'transition',\n 'gradient',\n 'typography',\n 'letterSpacing',\n 'lineHeight',\n 'paragraphSpacing',\n 'textDecoration',\n 'textCase',\n] as const;\n\n/**\n * Token type (DTCG specification)\n */\nexport type TokenType = (typeof VALID_TOKEN_TYPES)[number];\n\n// ============================================================================\n// Validation Types\n// ============================================================================\n\n/**\n * Severity level for validation issues\n */\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\n/**\n * A single validation issue\n */\nexport interface ValidationIssue {\n /** Token path (e.g., \"color.brand.primary\") */\n path: string;\n\n /** Human-readable message */\n message: string;\n\n /** Issue severity */\n severity: ValidationSeverity;\n\n /** The problematic value (if applicable) */\n value?: unknown;\n\n /** Suggested fix (if applicable) */\n suggestion?: string;\n}\n\n/**\n * Result of token validation\n */\nexport interface ValidationResult {\n /** Whether validation passed (no errors) */\n valid: boolean;\n\n /** Validation errors (blocking issues) */\n errors: ValidationIssue[];\n\n /** Validation warnings (non-blocking) */\n warnings: ValidationIssue[];\n\n /** Total number of tokens validated */\n tokenCount: number;\n\n /** Number of files validated */\n fileCount: number;\n\n /** Validation duration in milliseconds */\n duration?: number;\n}\n\n/**\n * Options for validation\n */\nexport interface ValidateOptions {\n /** Directory containing token files */\n collectionsDir?: string;\n\n /** File patterns to validate */\n patterns?: string[];\n\n /** Enable verbose output */\n verbose?: boolean;\n\n /** Suppress output */\n quiet?: boolean;\n\n /** Treat warnings as errors */\n strict?: boolean;\n}\n\n// ============================================================================\n// Transform Types\n// ============================================================================\n\n/**\n * Options for Figma token transformation\n */\nexport interface TransformOptions {\n /** Source directory with Figma exports */\n sourceDir: string;\n\n /** Output directory for collections */\n collectionsDir: string;\n\n /**\n * Glob patterns for finding source files\n * @example ['theme.json', '*.tokens.json', 'figma-variables-*.json']\n */\n sourcePatterns?: string[];\n\n /**\n * Map of collection names to specific file paths\n * @example { 'primitives': './colors.json', 'semantic': './semantic.json' }\n */\n collectionMapping?: Record<string, string>;\n\n /** Preserve $codeSyntax references from Figma */\n preserveCodeSyntax?: boolean;\n\n /** Modes to ignore during transformation */\n ignoreModes?: string[];\n\n /** Default mode name */\n defaultMode?: string;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n\n /** Enable strict schema validation */\n strict?: boolean;\n\n /** Enable incremental build (only process changed files) */\n incremental?: boolean;\n\n /** Force full rebuild (ignore cache) */\n force?: boolean;\n\n /** Cache directory for incremental builds */\n cacheDir?: string;\n}\n\n/**\n * Result of token transformation\n */\nexport interface TransformResult {\n /** Whether transformation succeeded */\n success: boolean;\n\n /** Files written during transformation */\n filesWritten: string[];\n\n /** Number of tokens processed */\n tokensProcessed: number;\n\n /** Modes detected in Figma export */\n modesDetected: string[];\n\n /** Errors encountered */\n errors: string[];\n\n /** Warnings generated */\n warnings: string[];\n\n /** Duration in milliseconds */\n duration?: number;\n}\n\n// ============================================================================\n// Build Types\n// ============================================================================\n\n/**\n * A single build step\n */\nexport interface BuildStep {\n /** Step name for display */\n name: string;\n\n /** Shell command to run (if external) */\n command?: string;\n\n /** Function to execute (if internal). Returns boolean for success/failure, or undefined */\n fn?: () => boolean | undefined | Promise<boolean | undefined>;\n\n /** Whether to skip this step */\n skip?: boolean;\n\n /** Working directory for command */\n cwd?: string;\n}\n\n/**\n * Options for token build\n */\nexport interface BuildOptions {\n /** Skip validation step */\n skipValidate?: boolean;\n\n /** Skip transformation step */\n skipTransform?: boolean;\n\n /** Only build theme CSS */\n onlyTheme?: boolean;\n\n /** Source directory for Figma exports */\n sourceDir?: string;\n\n /** Enable watch mode */\n watch?: boolean;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n\n /** Suppress output */\n quiet?: boolean;\n\n /** Enable strict schema validation */\n strict?: boolean;\n\n /** Enable incremental build (only process changed files) */\n incremental?: boolean;\n\n /** Force full rebuild (ignore cache) */\n force?: boolean;\n\n /** Cache directory for incremental builds */\n cacheDir?: string;\n\n /** Output directory for all formats */\n outputDir?: string;\n\n /** Output formats to generate (default: ['css', 'scss', 'json']) */\n formats?: Array<'css' | 'scss' | 'js' | 'ts' | 'json' | 'android' | 'ios'>;\n\n /** Per-format output directories */\n outputDirs?: Partial<Record<string, string>>;\n\n /** Per-format output file names */\n outputFileNames?: Partial<Record<string, string>>;\n\n /** Additional SCSS directories to merge */\n additionalScssDirectories?: string[];\n\n /** Additional CSS directories to merge */\n additionalCssDirectories?: string[];\n\n /** Merge order for additional styles */\n mergeOrder?: 'before' | 'after';\n\n /** Create combined bundle files */\n createBundle?: boolean;\n\n /** Custom SCSS import header */\n scssImportHeader?: string;\n\n /** Additional directories to watch */\n watchDirectories?: string[];\n\n /** Build pipeline configuration */\n pipeline?: {\n /** Steps to include in the build */\n steps?: Array<\n | 'validate'\n | 'transform'\n | 'style-dictionary'\n | 'sync'\n | 'sass-theme'\n | 'sass-theme-minified'\n | 'postprocess'\n | 'sass-utilities'\n | 'sass-utilities-minified'\n | 'bundle'\n >;\n /** Paths configuration for build steps */\n paths?: {\n syncSource?: string;\n syncTarget?: string;\n sassThemeInput?: string;\n sassThemeOutput?: string;\n sassThemeMinifiedOutput?: string;\n sassUtilitiesInput?: string;\n sassUtilitiesOutput?: string;\n sassUtilitiesMinifiedOutput?: string;\n };\n /** Style Dictionary config file name */\n styleDictionaryConfig?: string;\n };\n\n /**\n * Themes configuration for multi-theme builds.\n * When provided with enabled: true, the 'multi-theme' step will\n * use config-driven theme definitions instead of hardcoded themes.\n */\n themesConfig?: {\n /** Whether theme building is enabled */\n enabled?: boolean;\n /** Theme definitions by name */\n definitions?: Record<\n string,\n {\n isDefault?: boolean;\n suffix?: string | null;\n selector: string;\n mediaQuery?: string;\n dataAttribute?: string;\n outputFiles?: Partial<Record<string, string>>;\n }\n >;\n };\n\n /**\n * Post-process configuration for CSS files\n */\n postprocessConfig?: {\n /** Whether postprocessing is enabled */\n enabled?: boolean;\n /** CSS output directory */\n cssDir?: string;\n /** CSS files to process */\n files?: string[];\n /** Text replacements to apply */\n replacements?: Array<{\n description?: string;\n from: string | RegExp;\n to: string;\n }>;\n };\n\n /**\n * CSS output directory (from SCSS config)\n */\n cssOutputDir?: string;\n}\n\n/**\n * Result of token build\n */\nexport interface BuildResult {\n /** Whether build succeeded */\n success: boolean;\n\n /** Steps that completed successfully */\n stepsCompleted: string[];\n\n /** Steps that failed */\n stepsFailed: string[];\n\n /** Total duration in milliseconds */\n duration: number;\n\n /** Errors encountered */\n errors: string[];\n\n /** Warnings generated */\n warnings: string[];\n\n /** Generated output files */\n outputFiles?: string[];\n}\n\n// ============================================================================\n// Sync Types\n// ============================================================================\n\n/**\n * Options for token sync\n */\nexport interface SyncOptions {\n /** Source file (Style Dictionary output) */\n sourceFile: string;\n\n /** Target file (TypeScript source) */\n targetFile: string;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of token sync\n */\nexport interface SyncResult {\n /** Whether sync succeeded */\n success: boolean;\n\n /** Number of tokens synced */\n tokensCount: number;\n\n /** Whether file was changed */\n changed: boolean;\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Postprocess Types\n// ============================================================================\n\n/**\n * A text replacement rule\n */\nexport interface ReplacementRule {\n /** Pattern to search for (string or regex) */\n from: string | RegExp;\n\n /** Replacement string */\n to: string;\n\n /** Optional description */\n description?: string;\n}\n\n/**\n * Options for CSS post-processing\n */\nexport interface PostprocessOptions {\n /** Input CSS file */\n inputFile: string;\n\n /** Output CSS file (defaults to input) */\n outputFile?: string;\n\n /** Replacements to make */\n replacements?: ReplacementRule[];\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of post-processing\n */\nexport interface PostprocessResult {\n /** Whether post-processing succeeded */\n success: boolean;\n\n /** Number of replacements made */\n replacementsMade: number;\n\n /** Output file path */\n outputFile: string;\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Merge Types\n// ============================================================================\n\n/**\n * Options for merging collections\n */\nexport interface MergeOptions {\n /** Source files to merge */\n sourceFiles: string[];\n\n /** Output file path */\n outputFile: string;\n\n /** Merge strategy for conflicts */\n strategy?: 'first' | 'last' | 'error';\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of collection merge\n */\nexport interface MergeResult {\n /** Whether merge succeeded */\n success: boolean;\n\n /** Number of collections merged */\n collectionsCount: number;\n\n /** Number of tokens in result */\n tokensCount: number;\n\n /** Output file path */\n outputFile: string;\n\n /** Conflicts detected */\n conflicts?: string[];\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if an object is a DTCG token\n */\nexport function isDTCGToken(obj: unknown): obj is DTCGToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return '$value' in obj;\n}\n\n/**\n * Check if an object is a legacy token\n */\nexport function isLegacyToken(obj: unknown): obj is LegacyToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return 'value' in obj && !('$value' in obj);\n}\n\n/**\n * Check if an object is any token type\n */\nexport function isToken(obj: unknown): obj is Token {\n return isDTCGToken(obj) || isLegacyToken(obj);\n}\n\n/**\n * Check if a string is a valid token type\n */\nexport function isValidTokenType(type: string): type is TokenType {\n return VALID_TOKEN_TYPES.includes(type as TokenType);\n}\n\n/**\n * Check if a value is a token reference\n */\nexport function isTokenReference(value: unknown): boolean {\n return typeof value === 'string' && value.startsWith('{') && value.endsWith('}');\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the value from a token regardless of format\n */\nexport function getTokenValue(token: Token): unknown {\n return isDTCGToken(token) ? token.$value : token.value;\n}\n\n/**\n * Get the type from a token regardless of format\n */\nexport function getTokenType(token: Token): string | undefined {\n if (isDTCGToken(token)) {\n return token.$type;\n }\n return (token as LegacyToken).type;\n}\n\n/**\n * Get the description from a token regardless of format\n */\nexport function getTokenDescription(token: Token): string | undefined {\n if (isDTCGToken(token)) {\n return token.$description;\n }\n const legacy = token as LegacyToken;\n return legacy.description ?? legacy.comment;\n}\n\n/**\n * Convert a legacy token to DTCG format\n */\nexport function toDTCGToken(token: LegacyToken): DTCGToken {\n const dtcg: DTCGToken = {\n $value: token.value,\n };\n\n if (token.type && isValidTokenType(token.type)) {\n dtcg.$type = token.type;\n }\n\n const desc = token.description ?? token.comment;\n if (desc) {\n dtcg.$description = desc;\n }\n\n return dtcg;\n}\n\n/**\n * Parse a token reference string\n * @param ref - Reference string like \"{color.brand.primary}\"\n * @returns Path segments like [\"color\", \"brand\", \"primary\"]\n */\nexport function parseTokenReference(ref: string): string[] | null {\n if (!isTokenReference(ref)) {\n return null;\n }\n const inner = ref.slice(1, -1);\n return inner.split('.');\n}\n","/**\n * Token validation module\n *\n * Validates design tokens for DTCG compliance and structural integrity.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nimport {\n getTokenType,\n getTokenValue,\n isDTCGToken,\n isToken,\n isTokenReference,\n isValidTokenType,\n VALID_TOKEN_TYPES,\n} from './types.js';\n\nimport type {\n Token,\n TokenCollection,\n TokenType,\n ValidateOptions,\n ValidationIssue,\n ValidationResult,\n} from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n// ============================================================================\n// Color Validation\n// ============================================================================\n\n/** Hex color pattern */\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/** RGB/RGBA pattern */\nconst RGB_PATTERN = /^rgba?\\s*\\(/i;\n\n/** HSL/HSLA pattern */\nconst HSL_PATTERN = /^hsla?\\s*\\(/i;\n\n/** Named colors (common subset) */\nconst NAMED_COLORS = new Set([\n 'transparent',\n 'currentcolor',\n 'inherit',\n 'initial',\n 'unset',\n 'black',\n 'white',\n 'red',\n 'green',\n 'blue',\n 'yellow',\n 'orange',\n 'purple',\n 'pink',\n 'gray',\n 'grey',\n]);\n\n/**\n * Check if a value is a valid color\n */\nfunction isValidColor(value: string): boolean {\n // Hex colors\n if (HEX_COLOR_PATTERN.test(value)) {\n return true;\n }\n // RGB/RGBA\n if (RGB_PATTERN.test(value)) {\n return true;\n }\n // HSL/HSLA\n if (HSL_PATTERN.test(value)) {\n return true;\n }\n // Token references\n if (isTokenReference(value)) {\n return true;\n }\n // Named colors\n if (NAMED_COLORS.has(value.toLowerCase())) {\n return true;\n }\n return false;\n}\n\n// ============================================================================\n// Dimension Validation\n// ============================================================================\n\n/** Valid dimension units */\nconst VALID_UNITS = new Set([\n 'px',\n 'rem',\n 'em',\n '%',\n 'vh',\n 'vw',\n 'vmin',\n 'vmax',\n 'pt',\n 'cm',\n 'mm',\n 'in',\n 'ch',\n 'ex',\n]);\n\n/**\n * Check if a value is a valid dimension\n */\nfunction isValidDimension(value: string): boolean {\n // Zero without unit\n if (value === '0') {\n return true;\n }\n // Token reference\n if (isTokenReference(value)) {\n return true;\n }\n // Parse numeric value and unit manually (safer than regex)\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return false;\n }\n // Find where the numeric part ends\n let i = 0;\n const firstChar = trimmed.charAt(0);\n if (firstChar === '-' || firstChar === '+') {\n i = 1;\n }\n let hasDigits = false;\n let hasDot = false;\n while (i < trimmed.length) {\n const char = trimmed.charAt(i);\n if (char >= '0' && char <= '9') {\n hasDigits = true;\n i++;\n } else if (char === '.' && !hasDot) {\n hasDot = true;\n i++;\n } else {\n break;\n }\n }\n if (!hasDigits) {\n return false;\n }\n // Extract unit part\n const unit = trimmed.slice(i).toLowerCase();\n // Pure number (for unitless values like line-height)\n if (unit === '') {\n return true;\n }\n // Check valid units\n return VALID_UNITS.has(unit);\n}\n\n// ============================================================================\n// Token Validation\n// ============================================================================\n\n/**\n * Validate a single token\n */\nfunction validateSingleToken(\n path: string,\n token: Token,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n const value = getTokenValue(token);\n const type = getTokenType(token);\n const isDtcg = isDTCGToken(token);\n\n // Warn if not using DTCG format\n if (!isDtcg) {\n warnings.push({\n path,\n message: 'Token uses legacy format. Consider migrating to DTCG ($value, $type).',\n severity: 'warning',\n suggestion: 'Use $value instead of value, $type instead of type',\n });\n }\n\n // Check for missing value\n if (value === undefined || value === null) {\n errors.push({\n path,\n message: 'Token has no value',\n severity: 'error',\n });\n return;\n }\n\n // Check for empty string value\n if (value === '') {\n warnings.push({\n path,\n message: 'Token has empty string value',\n severity: 'warning',\n value,\n });\n }\n\n // Check for missing type\n if (!type) {\n warnings.push({\n path,\n message: 'Token has no type specified',\n severity: 'warning',\n suggestion: `Add $type property with one of: ${VALID_TOKEN_TYPES.slice(0, 5).join(', ')}...`,\n });\n } else if (!isValidTokenType(type)) {\n warnings.push({\n path,\n message: `Unknown token type: \"${type}\"`,\n severity: 'warning',\n value: type,\n suggestion: `Valid types: ${VALID_TOKEN_TYPES.join(', ')}`,\n });\n }\n\n // Type-specific validation\n if (type && typeof value === 'string') {\n validateTypedValue(path, value, type as TokenType, errors);\n }\n}\n\n/**\n * Validate a typed value\n */\nfunction validateTypedValue(\n path: string,\n value: string,\n type: TokenType,\n errors: ValidationIssue[]\n): void {\n switch (type) {\n case 'color':\n if (!isValidColor(value)) {\n errors.push({\n path,\n message: `Invalid color value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use hex (#fff), rgb(), hsl(), or token reference',\n });\n }\n break;\n\n case 'dimension':\n if (!isValidDimension(value)) {\n errors.push({\n path,\n message: `Invalid dimension value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use value with unit (16px, 1rem) or token reference',\n });\n }\n break;\n\n case 'fontWeight':\n if (!isValidFontWeight(value)) {\n errors.push({\n path,\n message: `Invalid fontWeight value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use numeric (100-900) or keyword (normal, bold)',\n });\n }\n break;\n\n // Add more type-specific validations as needed\n default:\n // Other types pass through\n break;\n }\n}\n\n/**\n * Check if a value is a valid font weight\n */\nfunction isValidFontWeight(value: string): boolean {\n // Numeric weights\n const numeric = parseInt(value, 10);\n if (!Number.isNaN(numeric) && numeric >= 1 && numeric <= 1000) {\n return true;\n }\n // Keywords\n const keywords = ['normal', 'bold', 'lighter', 'bolder'];\n if (keywords.includes(value.toLowerCase())) {\n return true;\n }\n // Token reference\n if (isTokenReference(value)) {\n return true;\n }\n return false;\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\n/**\n * Recursively validate a token collection\n */\nfunction validateCollection(\n collection: TokenCollection,\n basePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[],\n tokenCount: { count: number }\n): void {\n for (const [key, value] of Object.entries(collection)) {\n // Skip metadata keys\n if (key.startsWith('$')) {\n continue;\n }\n\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (isToken(value)) {\n tokenCount.count += 1;\n validateSingleToken(path, value, errors, warnings);\n } else if (typeof value === 'object' && value !== null) {\n validateCollection(value as TokenCollection, path, errors, warnings, tokenCount);\n }\n }\n}\n\n/**\n * Validate a JSON token file\n */\nfunction validateFile(\n filePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): number {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content) as TokenCollection;\n const tokenCount = { count: 0 };\n\n validateCollection(data, '', errors, warnings, tokenCount);\n\n return tokenCount.count;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n errors.push({\n path: filePath,\n message: `Failed to parse file: ${errorMessage}`,\n severity: 'error',\n });\n return 0;\n }\n}\n\n/**\n * Find all JSON files recursively in a directory\n */\nfunction findJsonFiles(dir: string, files: string[] = []): string[] {\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n findJsonFiles(fullPath, files);\n } else if (entry.endsWith('.json')) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n// ============================================================================\n// Main Validation Function\n// ============================================================================\n\n/**\n * Validate all tokens in a directory\n *\n * @param config - Resolved configuration\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * import { validateTokens, loadConfig } from '@dsai-io/tools';\n *\n * const { config } = await loadConfig();\n * const result = await validateTokens(config);\n *\n * if (!result.valid) {\n * console.error('Validation failed:', result.errors);\n * }\n * ```\n */\nexport async function validateTokens(\n config: ResolvedConfig,\n options: ValidateOptions = {}\n): Promise<ValidationResult> {\n const startTime = Date.now();\n const { verbose = false, quiet = false, strict = false } = options;\n\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n let totalTokens = 0;\n let fileCount = 0;\n\n // Use provided directory or config\n const collectionsDir = options.collectionsDir ?? config.tokens.collectionsDir;\n\n if (!existsSync(collectionsDir)) {\n return {\n valid: false,\n errors: [\n {\n path: collectionsDir,\n message: 'Collections directory does not exist',\n severity: 'error',\n },\n ],\n warnings: [],\n tokenCount: 0,\n fileCount: 0,\n duration: Date.now() - startTime,\n };\n }\n\n // Find all JSON files\n const jsonFiles = findJsonFiles(collectionsDir);\n\n if (!quiet) {\n logInfo(`Validating ${jsonFiles.length} token files...`);\n }\n\n // Validate each file\n for (const file of jsonFiles) {\n fileCount += 1;\n const relativePath = relative(collectionsDir, file);\n\n if (verbose) {\n logDebug(`Validating: ${relativePath}`);\n }\n\n const tokenCount = validateFile(file, errors, warnings);\n totalTokens += tokenCount;\n }\n\n // Determine validity\n const valid = strict ? errors.length === 0 && warnings.length === 0 : errors.length === 0;\n\n // Report results\n if (!quiet) {\n if (valid) {\n logSuccess(`Validated ${totalTokens} tokens in ${fileCount} files`);\n if (warnings.length > 0) {\n logWarn(`${warnings.length} warnings found`);\n }\n } else {\n logError(`Validation failed with ${errors.length} errors`);\n }\n }\n\n return {\n valid,\n errors,\n warnings,\n tokenCount: totalTokens,\n fileCount,\n duration: Date.now() - startTime,\n };\n}\n\n/**\n * Validate tokens and exit with code (for CLI usage)\n *\n * @param config - Resolved configuration\n * @param options - Validation options\n */\nexport async function validateTokensCLI(\n config: ResolvedConfig,\n options: ValidateOptions = {}\n): Promise<void> {\n const result = await validateTokens(config, { ...options, verbose: true });\n\n if (!result.valid) {\n for (const error of result.errors) {\n console.error(`❌ ${error.path}: ${error.message}`);\n }\n process.exit(1);\n }\n\n for (const warning of result.warnings) {\n console.warn(`⚠️ ${warning.path}: ${warning.message}`);\n }\n}\n\n// ============================================================================\n// Simple Logging (will be replaced with proper logger in future)\n// ============================================================================\n\nfunction logInfo(message: string): void {\n console.info(`ℹ️ ${message}`);\n}\n\nfunction logDebug(message: string): void {\n console.info(`🔍 ${message}`);\n}\n\nfunction logSuccess(message: string): void {\n console.info(`✅ ${message}`);\n}\n\nfunction logWarn(message: string): void {\n console.warn(`⚠️ ${message}`);\n}\n\nfunction logError(message: string): void {\n console.error(`❌ ${message}`);\n}\n","/**\n * @fileoverview Zod schemas for DTCG (Design Tokens Community Group) token format\n * @see https://design-tokens.github.io/community-group/format/\n */\n\nimport { z } from 'zod';\n\n/**\n * DTCG token types as specified in the DTCG specification\n */\nexport const tokenTypeSchema = z.enum([\n 'color',\n 'dimension',\n 'fontFamily',\n 'fontWeight',\n 'duration',\n 'cubicBezier',\n 'number',\n 'string',\n 'shadow',\n 'typography',\n 'transition',\n 'strokeStyle',\n 'border',\n 'gradient',\n]);\n\nexport type TokenType = z.infer<typeof tokenTypeSchema>;\n\n/**\n * DTCG color value (can be hex string or object)\n */\nexport const colorValueSchema = z.union([\n z.string().regex(/^#[0-9A-Fa-f]{3,8}$/),\n z.string().regex(/^rgba?\\(/),\n z.string().regex(/^hsla?\\(/),\n z.object({\n r: z.number().min(0).max(1),\n g: z.number().min(0).max(1),\n b: z.number().min(0).max(1),\n a: z.number().min(0).max(1).optional(),\n }),\n]);\n\n/**\n * DTCG dimension value (number with unit)\n */\nexport const dimensionValueSchema = z.union([\n z.string().regex(/^-?\\d+\\.?\\d*px$/),\n z.string().regex(/^-?\\d+\\.?\\d*rem$/),\n z.string().regex(/^-?\\d+\\.?\\d*em$/),\n z.string().regex(/^-?\\d+\\.?\\d*%$/),\n z.string().regex(/^-?\\d+\\.?\\d*vh$/),\n z.string().regex(/^-?\\d+\\.?\\d*vw$/),\n z.string().regex(/^-?\\d+\\.?\\d*pt$/),\n z.number(),\n]);\n\n/**\n * DTCG duration value (time with unit)\n */\nexport const durationValueSchema = z.union([\n z.string().regex(/^\\d+\\.?\\d*ms$/),\n z.string().regex(/^\\d+\\.?\\d*s$/),\n]);\n\n/**\n * DTCG cubic bezier value\n */\nexport const cubicBezierValueSchema = z.tuple([\n z.number().min(0).max(1),\n z.number(),\n z.number().min(0).max(1),\n z.number(),\n]);\n\n/**\n * DTCG shadow value\n */\nexport const shadowValueSchema = z.object({\n color: colorValueSchema,\n offsetX: dimensionValueSchema,\n offsetY: dimensionValueSchema,\n blur: dimensionValueSchema,\n spread: dimensionValueSchema.optional(),\n inset: z.boolean().optional(),\n});\n\n/**\n * DTCG typography value\n */\nexport const typographyValueSchema = z.object({\n fontFamily: z.union([z.string(), z.array(z.string())]),\n fontSize: dimensionValueSchema,\n fontWeight: z.union([z.number().int().min(1).max(1000), z.string()]),\n lineHeight: z.union([dimensionValueSchema, z.number()]),\n letterSpacing: dimensionValueSchema.optional(),\n textTransform: z.enum(['none', 'uppercase', 'lowercase', 'capitalize']).optional(),\n textDecoration: z.enum(['none', 'underline', 'overline', 'line-through']).optional(),\n});\n\n/**\n * DTCG stroke style value\n */\nexport const strokeStyleValueSchema = z.union([\n z.enum(['solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset']),\n z.object({\n dashArray: z.array(dimensionValueSchema),\n lineCap: z.enum(['round', 'butt', 'square']).optional(),\n }),\n]);\n\n/**\n * DTCG border value\n */\nexport const borderValueSchema = z.object({\n color: colorValueSchema,\n width: dimensionValueSchema,\n style: strokeStyleValueSchema,\n});\n\n/**\n * DTCG gradient stop\n */\nexport const gradientStopSchema = z.object({\n color: colorValueSchema,\n position: z.number().min(0).max(1),\n});\n\n/**\n * DTCG gradient value\n */\nexport const gradientValueSchema = z.array(gradientStopSchema);\n\n/**\n * Token alias/reference (e.g., \"{colors.primary}\")\n */\nexport const tokenReferenceSchema = z.string().regex(/^\\{[^}]+\\}$/);\n\n/**\n * Base DTCG token structure\n */\nexport const dtcgTokenBaseSchema = z.object({\n $value: z.unknown(),\n $type: tokenTypeSchema.optional(),\n $description: z.string().optional(),\n $extensions: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type DTCGTokenBase = z.infer<typeof dtcgTokenBaseSchema>;\n\n/**\n * DTCG color token\n */\nexport const dtcgColorTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('color').optional(),\n $value: z.union([colorValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG dimension token\n */\nexport const dtcgDimensionTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('dimension').optional(),\n $value: z.union([dimensionValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG font family token\n */\nexport const dtcgFontFamilyTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('fontFamily').optional(),\n $value: z.union([z.string(), z.array(z.string()), tokenReferenceSchema]),\n});\n\n/**\n * DTCG font weight token\n */\nexport const dtcgFontWeightTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('fontWeight').optional(),\n $value: z.union([\n z.number().int().min(1).max(1000),\n z.enum(['thin', 'light', 'regular', 'medium', 'semibold', 'bold', 'extrabold', 'black']),\n tokenReferenceSchema,\n ]),\n});\n\n/**\n * DTCG duration token\n */\nexport const dtcgDurationTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('duration').optional(),\n $value: z.union([durationValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG cubic bezier token\n */\nexport const dtcgCubicBezierTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('cubicBezier').optional(),\n $value: z.union([cubicBezierValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG number token\n */\nexport const dtcgNumberTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('number').optional(),\n $value: z.union([z.number(), tokenReferenceSchema]),\n});\n\n/**\n * DTCG string token\n */\nexport const dtcgStringTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('string').optional(),\n $value: z.union([z.string(), tokenReferenceSchema]),\n});\n\n/**\n * DTCG shadow token\n */\nexport const dtcgShadowTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('shadow').optional(),\n $value: z.union([\n shadowValueSchema,\n z.array(shadowValueSchema), // Multiple shadows\n tokenReferenceSchema,\n ]),\n});\n\n/**\n * DTCG typography token\n */\nexport const dtcgTypographyTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('typography').optional(),\n $value: z.union([typographyValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG stroke style token\n */\nexport const dtcgStrokeStyleTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('strokeStyle').optional(),\n $value: z.union([strokeStyleValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG border token\n */\nexport const dtcgBorderTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('border').optional(),\n $value: z.union([borderValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * DTCG gradient token\n */\nexport const dtcgGradientTokenSchema = dtcgTokenBaseSchema.extend({\n $type: z.literal('gradient').optional(),\n $value: z.union([gradientValueSchema, tokenReferenceSchema]),\n});\n\n/**\n * Union of all specific DTCG token schemas\n */\nexport const dtcgTypedTokenSchema = z.union([\n dtcgColorTokenSchema,\n dtcgDimensionTokenSchema,\n dtcgFontFamilyTokenSchema,\n dtcgFontWeightTokenSchema,\n dtcgDurationTokenSchema,\n dtcgCubicBezierTokenSchema,\n dtcgNumberTokenSchema,\n dtcgStringTokenSchema,\n dtcgShadowTokenSchema,\n dtcgTypographyTokenSchema,\n dtcgStrokeStyleTokenSchema,\n dtcgBorderTokenSchema,\n dtcgGradientTokenSchema,\n]);\n\n/**\n * Generic DTCG token (allows any token or group)\n */\nexport const dtcgTokenSchema: z.ZodType<DTCGTokenOrGroup> = z.lazy(() =>\n z.union([dtcgTokenBaseSchema, z.record(z.string(), dtcgTokenSchema)])\n);\n\nexport type DTCGTokenOrGroup = DTCGTokenBase | { [key: string]: DTCGTokenOrGroup };\n\n/**\n * DTCG token collection (root level)\n */\nexport const dtcgTokenCollectionSchema = z.record(z.string(), dtcgTokenSchema);\n\nexport type DTCGTokenCollection = z.infer<typeof dtcgTokenCollectionSchema>;\n\n/**\n * DTCG file format with optional metadata\n */\nexport const dtcgFileSchema = z\n .object({\n $schema: z.string().optional(),\n $description: z.string().optional(),\n $extensions: z.record(z.string(), z.unknown()).optional(),\n })\n .catchall(dtcgTokenSchema);\n\nexport type DTCGFile = z.infer<typeof dtcgFileSchema>;\n","/**\n * @fileoverview Zod schemas for Figma token export format\n * Validates the structure of tokens exported from Figma Variables API\n */\n\nimport { z } from 'zod';\n\n/**\n * Figma color value (RGBA object)\n */\nexport const figmaColorSchema = z.object({\n r: z.number().min(0).max(1),\n g: z.number().min(0).max(1),\n b: z.number().min(0).max(1),\n a: z.number().min(0).max(1),\n});\n\n/**\n * Figma variable alias reference\n */\nexport const figmaAliasSchema = z.object({\n type: z.literal('VARIABLE_ALIAS'),\n id: z.string(),\n});\n\n/**\n * Figma variable value (can be primitive or alias)\n */\nexport const figmaVariableValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n figmaColorSchema,\n figmaAliasSchema,\n]);\n\n/**\n * Figma variable mode\n */\nexport const figmaModeSchema = z.object({\n modeId: z.string(),\n name: z.string(),\n});\n\n/**\n * Figma variable collection\n */\nexport const figmaCollectionSchema = z.object({\n id: z.string(),\n name: z.string(),\n modes: z.array(figmaModeSchema),\n defaultModeId: z.string(),\n remote: z.boolean(),\n hiddenFromPublishing: z.boolean(),\n variableIds: z.array(z.string()),\n});\n\n/**\n * Figma variable resolved type\n */\nexport const figmaResolvedTypeSchema = z.enum(['BOOLEAN', 'FLOAT', 'STRING', 'COLOR']);\n\n/**\n * Figma variable\n */\nexport const figmaVariableSchema = z.object({\n id: z.string(),\n name: z.string(),\n key: z.string().optional(),\n resolvedType: figmaResolvedTypeSchema,\n valuesByMode: z.record(z.string(), figmaVariableValueSchema),\n variableCollectionId: z.string(),\n remote: z.boolean(),\n description: z.string(),\n hiddenFromPublishing: z.boolean(),\n scopes: z.array(z.string()),\n codeSyntax: z.record(z.string(), z.string()),\n});\n\n/**\n * Figma style type\n */\nexport const figmaStyleTypeSchema = z.enum(['FILL', 'TEXT', 'EFFECT', 'GRID']);\n\n/**\n * Figma style\n */\nexport const figmaStyleSchema = z.object({\n key: z.string(),\n name: z.string(),\n styleType: figmaStyleTypeSchema,\n description: z.string().optional(),\n remote: z.boolean().optional(),\n node_id: z.string().optional(),\n});\n\n/**\n * Figma node document (simplified - contains style data)\n */\nexport const figmaNodeDocumentSchema = z\n .object({\n id: z.string(),\n name: z.string(),\n type: z.string(),\n fills: z.array(z.unknown()).optional(),\n effects: z.array(z.unknown()).optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * Figma node (as returned by getFileNodes)\n */\nexport const figmaNodeSchema = z.object({\n document: figmaNodeDocumentSchema,\n components: z.record(z.string(), z.unknown()).optional(),\n schemaVersion: z.number().optional(),\n styles: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Figma file response\n */\nexport const figmaFileSchema = z\n .object({\n name: z.string(),\n lastModified: z.string(),\n thumbnailUrl: z.string().optional(),\n version: z.string(),\n role: z.string().optional(),\n editorType: z.string().optional(),\n linkAccess: z.string().optional(),\n document: z.record(z.string(), z.unknown()),\n components: z.record(z.string(), z.unknown()).optional(),\n componentSets: z.record(z.string(), z.unknown()).optional(),\n schemaVersion: z.number().optional(),\n styles: z.record(z.string(), figmaStyleSchema).optional(),\n mainFileKey: z.string().optional(),\n branches: z.array(z.unknown()).optional(),\n })\n .passthrough();\n\n/**\n * Figma variables API response\n */\nexport const figmaVariablesResponseSchema = z.object({\n meta: z.object({\n variables: z.record(z.string(), figmaVariableSchema),\n variableCollections: z.record(z.string(), figmaCollectionSchema),\n }),\n});\n\n/**\n * Figma published variables response\n */\nexport const figmaPublishedVariablesResponseSchema = z.union([\n figmaVariablesResponseSchema,\n z.object({\n variables: z.record(z.string(), figmaVariableSchema),\n variableCollections: z.record(z.string(), figmaCollectionSchema),\n }),\n]);\n\n/**\n * Figma export format (as produced by @dsai-io/figma-tokens)\n * This is the format after exportTokens() processes the Figma API response\n */\nexport const figmaExportSchema = z.record(\n z.string(),\n z.union([\n z\n .object({\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\n })\n .passthrough(),\n z.record(z.string(), z.unknown()),\n ])\n);\n\n/**\n * Figma export with metadata\n */\nexport const figmaExportWithMetadataSchema = z\n .object({\n $schema: z.string().optional(),\n $description: z.string().optional(),\n $version: z.string().optional(),\n $source: z.string().optional(),\n $figmaFileKey: z.string().optional(),\n $exportedAt: z.string().optional(),\n })\n .catchall(\n z.union([\n z\n .object({\n modes: z.record(z.string(), z.record(z.string(), z.unknown())).optional(),\n })\n .passthrough(),\n z.record(z.string(), z.unknown()),\n ])\n );\n\nexport type FigmaColor = z.infer<typeof figmaColorSchema>;\nexport type FigmaAlias = z.infer<typeof figmaAliasSchema>;\nexport type FigmaVariableValue = z.infer<typeof figmaVariableValueSchema>;\nexport type FigmaMode = z.infer<typeof figmaModeSchema>;\nexport type FigmaCollection = z.infer<typeof figmaCollectionSchema>;\nexport type FigmaVariable = z.infer<typeof figmaVariableSchema>;\nexport type FigmaStyle = z.infer<typeof figmaStyleSchema>;\nexport type FigmaNode = z.infer<typeof figmaNodeSchema>;\nexport type FigmaFile = z.infer<typeof figmaFileSchema>;\nexport type FigmaVariablesResponse = z.infer<typeof figmaVariablesResponseSchema>;\nexport type FigmaExport = z.infer<typeof figmaExportSchema>;\nexport type FigmaExportWithMetadata = z.infer<typeof figmaExportWithMetadataSchema>;\n","/**\n * @fileoverview Zod schemas for Style Dictionary token format\n * @see https://amzn.github.io/style-dictionary/\n */\n\nimport { z } from 'zod';\n\n/**\n * Style Dictionary token attributes\n */\nexport const styleDictionaryAttributesSchema = z\n .object({\n category: z.string().optional(),\n type: z.string().optional(),\n item: z.string().optional(),\n subitem: z.string().optional(),\n state: z.string().optional(),\n })\n .passthrough();\n\n/**\n * Style Dictionary token (legacy format - uses \"value\" not \"$value\")\n */\nexport const styleDictionaryTokenSchema = z\n .object({\n value: z.unknown(),\n type: z.string().optional(),\n comment: z.string().optional(),\n themeable: z.boolean().optional(),\n attributes: styleDictionaryAttributesSchema.optional(),\n name: z.string().optional(),\n path: z.array(z.string()).optional(),\n original: z\n .object({\n value: z.unknown(),\n })\n .passthrough()\n .optional(),\n filePath: z.string().optional(),\n isSource: z.boolean().optional(),\n })\n .passthrough();\n\n/**\n * Style Dictionary token or group (recursive)\n */\nexport const styleDictionaryTokenOrGroupSchema: z.ZodType<StyleDictionaryTokenOrGroup> = z.lazy(\n () =>\n z.union([styleDictionaryTokenSchema, z.record(z.string(), styleDictionaryTokenOrGroupSchema)])\n);\n\nexport type StyleDictionaryTokenOrGroup =\n | z.infer<typeof styleDictionaryTokenSchema>\n | { [key: string]: StyleDictionaryTokenOrGroup };\n\n/**\n * Style Dictionary tokens collection\n */\nexport const styleDictionaryTokensSchema = z.record(z.string(), styleDictionaryTokenOrGroupSchema);\n\nexport type StyleDictionaryTokens = z.infer<typeof styleDictionaryTokensSchema>;\n\n/**\n * Style Dictionary config source\n */\nexport const styleDictionarySourceSchema = z.union([z.string(), z.array(z.string())]);\n\n/**\n * Style Dictionary platform config\n */\nexport const styleDictionaryPlatformSchema = z\n .object({\n transformGroup: z.string().optional(),\n transforms: z.array(z.string()).optional(),\n buildPath: z.string().optional(),\n files: z\n .array(\n z\n .object({\n destination: z.string(),\n format: z.string(),\n filter: z.function().optional(),\n options: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough()\n )\n .optional(),\n actions: z.array(z.string()).optional(),\n })\n .passthrough();\n\n/**\n * Style Dictionary config\n */\nexport const styleDictionaryConfigSchema = z\n .object({\n source: styleDictionarySourceSchema.optional(),\n include: styleDictionarySourceSchema.optional(),\n platforms: z.record(z.string(), styleDictionaryPlatformSchema).optional(),\n hooks: z\n .object({\n parsers: z.record(z.string(), z.function()).optional(),\n preprocessors: z.record(z.string(), z.function()).optional(),\n transformGroups: z.record(z.string(), z.array(z.string())).optional(),\n transforms: z.record(z.string(), z.function()).optional(),\n formats: z.record(z.string(), z.function()).optional(),\n filters: z.record(z.string(), z.function()).optional(),\n fileHeaders: z.record(z.string(), z.function()).optional(),\n actions: z.record(z.string(), z.function()).optional(),\n })\n .optional(),\n log: z\n .object({\n warnings: z.enum(['warn', 'error', 'disabled']).optional(),\n verbosity: z.enum(['default', 'silent', 'verbose']).optional(),\n errors: z\n .object({\n brokenReferences: z.enum(['throw', 'console']).optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .passthrough();\n\nexport type StyleDictionaryConfig = z.infer<typeof styleDictionaryConfigSchema>;\n\n/**\n * Style Dictionary input file format\n */\nexport const styleDictionaryInputSchema = styleDictionaryTokensSchema;\n\nexport type StyleDictionaryInput = z.infer<typeof styleDictionaryInputSchema>;\n","/**\n * @fileoverview Token schema validation\n * Exports Zod schemas and validation functions for token formats\n */\n\nexport * from './dtcg-token.schema.js';\nexport * from './figma-export.schema.js';\nexport * from './style-dictionary.schema.js';\n\nimport { z, type ZodError, type ZodIssue } from 'zod';\n\nimport {\n dtcgFileSchema,\n dtcgTokenCollectionSchema,\n type DTCGFile,\n type DTCGTokenCollection,\n} from './dtcg-token.schema.js';\nimport {\n figmaExportSchema,\n figmaExportWithMetadataSchema,\n figmaVariablesResponseSchema,\n type FigmaExport,\n type FigmaExportWithMetadata,\n type FigmaVariablesResponse,\n} from './figma-export.schema.js';\nimport {\n styleDictionaryInputSchema,\n styleDictionaryTokensSchema,\n type StyleDictionaryInput,\n type StyleDictionaryTokens,\n} from './style-dictionary.schema.js';\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n /** Path to the invalid token (e.g., \"colors.primary.$value\") */\n path: string;\n /** Error message */\n message: string;\n /** The invalid value */\n value?: unknown;\n /** Error code from Zod */\n code?: string;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult<T = unknown> {\n /** Whether validation passed */\n valid: boolean;\n /** Validated and typed data (only if valid) */\n data?: T;\n /** Validation errors (only if invalid) */\n errors?: ValidationError[];\n /** Original Zod error (for debugging) */\n zodError?: ZodError;\n}\n\n/**\n * Validation options\n */\nexport interface ValidationOptions {\n /** Strict mode - treat warnings as errors */\n strict?: boolean;\n /** Abort after first error */\n abortEarly?: boolean;\n}\n\n/**\n * Format Zod errors into readable validation errors\n */\nfunction formatZodErrors(zodError: ZodError): ValidationError[] {\n return zodError.issues.map((err: ZodIssue) => ({\n path: err.path.join('.'),\n message: err.message,\n value: undefined,\n code: err.code,\n }));\n}\n\n/**\n * Validate DTCG token collection\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n *\n * @example\n * ```ts\n * const result = validateDTCGTokens({\n * colors: {\n * primary: {\n * $value: '#0066ff',\n * $type: 'color',\n * },\n * },\n * });\n *\n * if (result.valid) {\n * console.log('Valid tokens:', result.data);\n * } else {\n * console.error('Validation errors:', result.errors);\n * }\n * ```\n */\nexport function validateDTCGTokens(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<DTCGTokenCollection> {\n try {\n const validated = dtcgTokenCollectionSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate DTCG file format\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n */\nexport function validateDTCGFile(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<DTCGFile> {\n try {\n const validated = dtcgFileSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate Figma export format\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n *\n * @example\n * ```ts\n * const result = validateFigmaExport(exportedData);\n * if (!result.valid) {\n * console.error('Invalid Figma export:', result.errors);\n * }\n * ```\n */\nexport function validateFigmaExport(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<FigmaExport> {\n try {\n const validated = figmaExportSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate Figma export with metadata\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n */\nexport function validateFigmaExportWithMetadata(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<FigmaExportWithMetadata> {\n try {\n const validated = figmaExportWithMetadataSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate Figma Variables API response\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n */\nexport function validateFigmaVariablesResponse(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<FigmaVariablesResponse> {\n try {\n const validated = figmaVariablesResponseSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate Style Dictionary input format\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n *\n * @example\n * ```ts\n * const result = validateStyleDictionaryInput(tokens);\n * if (!result.valid) {\n * throw new Error(`Invalid tokens: ${result.errors.map(e => e.message).join(', ')}`);\n * }\n * ```\n */\nexport function validateStyleDictionaryInput(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<StyleDictionaryInput> {\n try {\n const validated = styleDictionaryInputSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\n/**\n * Validate Style Dictionary tokens\n *\n * @param data - Data to validate\n * @param options - Validation options\n * @returns Validation result with typed data\n */\nexport function validateStyleDictionaryTokens(\n data: unknown,\n _options: ValidationOptions = {}\n): ValidationResult<StyleDictionaryTokens> {\n try {\n const validated = styleDictionaryTokensSchema.parse(data);\n return {\n valid: true,\n data: validated,\n };\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n valid: false,\n errors: formatZodErrors(error),\n zodError: error,\n };\n }\n return {\n valid: false,\n errors: [\n {\n path: '',\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n","/**\n * Figma Export Validation module\n *\n * Validates Figma token exports before transformation to ensure\n * they meet the expected structure and format requirements.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { basename, extname, join } from 'node:path';\n\nimport { isDTCGToken, isLegacyToken, isToken, isValidTokenType } from './types.js';\n\nimport type { FigmaCollection, FigmaExport, ValidationIssue, ValidationResult } from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Expected structure for a Figma collection\n */\ninterface ExpectedCollection {\n /** File name for this collection */\n input: string;\n /** Whether the collection has mode variants (Light/Dark) */\n modeAware: boolean;\n /** Expected mode names */\n modes?: string[];\n}\n\n/**\n * Expected collections configuration\n */\ninterface ExpectedCollections {\n [key: string]: ExpectedCollection;\n}\n\n/**\n * Figma validation options\n */\nexport interface ValidateFigmaOptions {\n /** Path to the figma-exports directory */\n exportsDir?: string;\n /** Expected collection definitions */\n collections?: ExpectedCollections;\n /** Strict mode - treat warnings as errors */\n strict?: boolean;\n /** Skip missing files */\n skipMissing?: boolean;\n /** Configuration object */\n config?: ResolvedConfig;\n}\n\n/**\n * Figma validation result\n */\nexport interface ValidateFigmaResult extends ValidationResult {\n /** Per-file validation results */\n files: Map<string, ValidationResult>;\n /** Detected modes across all files */\n detectedModes: Set<string>;\n /** Missing expected files */\n missingFiles: string[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default expected collections configuration\n */\nconst DEFAULT_COLLECTIONS: ExpectedCollections = {\n foundation: {\n input: 'foundation.json',\n modeAware: true,\n modes: ['Light', 'Dark'],\n },\n typography: {\n input: 'typography.json',\n modeAware: false,\n modes: ['Base'],\n },\n spacing: {\n input: 'spacing.json',\n modeAware: false,\n modes: ['Base'],\n },\n radius: {\n input: 'radius.json',\n modeAware: false,\n modes: ['Base'],\n },\n layout: {\n input: 'layout.json',\n modeAware: false,\n modes: ['Base'],\n },\n shadows: {\n input: 'shadows.json',\n modeAware: false,\n modes: ['Base'],\n },\n};\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Validate a single token from Figma export\n */\nfunction validateFigmaToken(\n path: string,\n token: unknown,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n if (!isToken(token)) {\n // Not a token object, might be a nested group\n return;\n }\n\n // Check for required $value\n if (isDTCGToken(token)) {\n if (token.$value === undefined || token.$value === null) {\n errors.push({\n path,\n message: 'Token has $value property but value is undefined or null',\n severity: 'error',\n });\n }\n\n // Validate token type if present\n if (token.$type !== undefined) {\n if (!isValidTokenType(token.$type)) {\n warnings.push({\n path,\n message: `Unknown token type: ${token.$type}`,\n severity: 'warning',\n });\n }\n }\n } else if (isLegacyToken(token)) {\n if (token.value === undefined || token.value === null) {\n errors.push({\n path,\n message: 'Token has value property but value is undefined or null',\n severity: 'error',\n });\n }\n\n // Suggest migrating to DTCG format\n warnings.push({\n path,\n message: 'Token uses legacy format (value instead of $value), consider migrating to DTCG',\n severity: 'warning',\n });\n }\n}\n\n/**\n * Recursively validate a token tree\n */\nfunction validateTokenTree(\n obj: unknown,\n basePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n if (obj === null || typeof obj !== 'object') {\n return;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const path = basePath ? `${basePath}.${key}` : key;\n\n // Check if this is a token\n if (isToken(value)) {\n validateFigmaToken(path, value, errors, warnings);\n } else if (typeof value === 'object' && value !== null) {\n // Recursively validate nested objects\n validateTokenTree(value, path, errors, warnings);\n }\n }\n}\n\n/**\n * Validate a Figma collection structure\n */\nfunction validateCollectionStructure(\n data: FigmaExport,\n collectionName: string,\n expectedCollection: ExpectedCollection,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): Set<string> {\n const detectedModes = new Set<string>();\n\n // Find the collection in the data\n const collection = Object.entries(data).find(\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\n )?.[1] as FigmaCollection | undefined;\n\n if (!collection) {\n errors.push({\n path: collectionName,\n message: `Expected collection \"${collectionName}\" not found in export`,\n severity: 'error',\n });\n return detectedModes;\n }\n\n // Validate modes structure\n if (collection.modes) {\n const modes = Object.keys(collection.modes);\n\n for (const mode of modes) {\n detectedModes.add(mode);\n }\n\n // Check if expected modes are present\n if (expectedCollection.modeAware && expectedCollection.modes) {\n for (const expectedMode of expectedCollection.modes) {\n if (!modes.includes(expectedMode)) {\n warnings.push({\n path: `${collectionName}.modes`,\n message: `Expected mode \"${expectedMode}\" not found, available modes: ${modes.join(', ')}`,\n severity: 'warning',\n });\n }\n }\n }\n\n // Validate tokens in each mode\n for (const [modeName, modeData] of Object.entries(collection.modes)) {\n if (modeData && typeof modeData === 'object') {\n validateTokenTree(modeData, `${collectionName}.modes.${modeName}`, errors, warnings);\n }\n }\n } else {\n // No modes structure, validate at collection level\n validateTokenTree(collection, collectionName, errors, warnings);\n }\n\n return detectedModes;\n}\n\n// ============================================================================\n// Main Validation Functions\n// ============================================================================\n\n/**\n * Validate a single Figma export file\n */\nexport function validateFigmaFile(\n filePath: string,\n expectedCollection?: ExpectedCollection\n): ValidationResult & { detectedModes: Set<string> } {\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const detectedModes = new Set<string>();\n let tokenCount = 0;\n\n // Check file exists\n if (!existsSync(filePath)) {\n errors.push({\n path: filePath,\n message: 'File not found',\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 0 };\n }\n\n // Parse JSON\n let data: FigmaExport;\n try {\n const content = readFileSync(filePath, 'utf-8');\n data = JSON.parse(content) as FigmaExport;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n errors.push({\n path: filePath,\n message: `Failed to parse JSON: ${message}`,\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\n }\n\n // Validate basic structure\n if (data === null || typeof data !== 'object' || Array.isArray(data)) {\n errors.push({\n path: filePath,\n message: 'Figma export must be a JSON object',\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\n }\n\n // Get collection name from filename\n const fileName = basename(filePath, extname(filePath));\n const collectionName = fileName.charAt(0).toUpperCase() + fileName.slice(1);\n\n // Count tokens helper\n const countTokens = (obj: unknown): number => {\n if (obj === null || typeof obj !== 'object') {\n return 0;\n }\n if (isToken(obj)) {\n return 1;\n }\n let count = 0;\n for (const value of Object.values(obj)) {\n count += countTokens(value);\n }\n return count;\n };\n\n // Validate collection structure if expected collection provided\n if (expectedCollection) {\n const modes = validateCollectionStructure(\n data,\n collectionName,\n expectedCollection,\n errors,\n warnings\n );\n for (const mode of modes) {\n detectedModes.add(mode);\n }\n } else {\n // General validation without expected structure\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as FigmaCollection;\n if (collection.modes) {\n for (const mode of Object.keys(collection.modes)) {\n detectedModes.add(mode);\n }\n }\n validateTokenTree(value, key, errors, warnings);\n }\n }\n }\n\n tokenCount = countTokens(data);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n detectedModes,\n tokenCount,\n fileCount: 1,\n };\n}\n\n/**\n * Validate all Figma exports in a directory\n */\nexport function validateFigmaExports(options: ValidateFigmaOptions = {}): ValidateFigmaResult {\n const {\n exportsDir,\n collections = DEFAULT_COLLECTIONS,\n strict = false,\n skipMissing = false,\n } = options;\n\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const files = new Map<string, ValidationResult>();\n const detectedModes = new Set<string>();\n const missingFiles: string[] = [];\n let totalTokenCount = 0;\n let totalFileCount = 0;\n\n // Resolve exports directory\n const targetDir = exportsDir ?? options.config?.tokens.sourceDir;\n\n if (!targetDir) {\n errors.push({\n path: 'config',\n message: 'Figma exports directory not specified',\n severity: 'error',\n });\n return {\n valid: false,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: 0,\n fileCount: 0,\n };\n }\n\n // Check directory exists\n if (!existsSync(targetDir)) {\n errors.push({\n path: targetDir,\n message: 'Figma exports directory not found',\n severity: 'error',\n });\n return {\n valid: false,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: 0,\n fileCount: 0,\n };\n }\n\n // Validate each expected collection\n for (const [_name, expectedCollection] of Object.entries(collections)) {\n const filePath = join(targetDir, expectedCollection.input);\n\n if (!existsSync(filePath)) {\n missingFiles.push(expectedCollection.input);\n if (!skipMissing) {\n errors.push({\n path: filePath,\n message: `Expected Figma export \"${expectedCollection.input}\" not found`,\n severity: 'error',\n });\n }\n continue;\n }\n\n const result = validateFigmaFile(filePath, expectedCollection);\n files.set(expectedCollection.input, {\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n tokenCount: result.tokenCount,\n fileCount: result.fileCount,\n });\n\n // Aggregate results\n errors.push(...result.errors);\n warnings.push(...result.warnings);\n totalTokenCount += result.tokenCount;\n totalFileCount += result.fileCount;\n for (const mode of result.detectedModes) {\n detectedModes.add(mode);\n }\n }\n\n // Check for unexpected files in the exports directory\n try {\n const existingFiles = readdirSync(targetDir).filter(\n (f) => f.endsWith('.json') && statSync(join(targetDir, f)).isFile()\n );\n const expectedFiles = new Set(Object.values(collections).map((c) => c.input));\n\n for (const file of existingFiles) {\n if (!expectedFiles.has(file)) {\n warnings.push({\n path: join(targetDir, file),\n message: `Unexpected file in exports directory: ${file}`,\n severity: 'warning',\n });\n }\n }\n } catch {\n // Ignore read errors\n }\n\n // In strict mode, treat warnings as errors\n const effectiveErrors = strict ? [...errors, ...warnings] : errors;\n\n return {\n valid: effectiveErrors.length === 0,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: totalTokenCount,\n fileCount: totalFileCount,\n };\n}\n\n/**\n * Detect modes from Figma export data\n */\nexport function detectModes(data: FigmaExport, collectionName?: string): string[] {\n if (!data || typeof data !== 'object') {\n return ['Base'];\n }\n\n // If collection name is specified, look for that collection\n if (collectionName) {\n const collection = Object.entries(data).find(\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\n )?.[1] as FigmaCollection | undefined;\n\n if (collection?.modes) {\n return Object.keys(collection.modes);\n }\n return ['Base'];\n }\n\n // Otherwise, look for modes in any collection\n for (const [, value] of Object.entries(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as FigmaCollection;\n if (collection.modes) {\n return Object.keys(collection.modes);\n }\n }\n }\n\n return ['Base'];\n}\n\n// ============================================================================\n// CLI Support\n// ============================================================================\n\n/**\n * CLI entry point for Figma validation\n */\nexport function validateFigmaCLI(\n exportsDir: string,\n options: Omit<ValidateFigmaOptions, 'exportsDir'> = {}\n): boolean {\n console.info(`\\n🔍 Validating Figma exports in: ${exportsDir}\\n`);\n\n const result = validateFigmaExports({ ...options, exportsDir });\n\n // Report results per file\n for (const [file, fileResult] of result.files) {\n if (fileResult.errors.length === 0 && fileResult.warnings.length === 0) {\n console.info(`✅ ${file}`);\n } else {\n console.info(`\\n📄 ${file}`);\n for (const error of fileResult.errors) {\n console.error(` ❌ ${error.path}: ${error.message}`);\n }\n for (const warning of fileResult.warnings) {\n console.warn(` ⚠️ ${warning.path}: ${warning.message}`);\n }\n }\n }\n\n // Report missing files\n if (result.missingFiles.length > 0) {\n console.warn(`\\n⚠️ Missing files: ${result.missingFiles.join(', ')}`);\n }\n\n // Report detected modes\n if (result.detectedModes.size > 0) {\n console.info(`\\n📊 Detected modes: ${[...result.detectedModes].join(', ')}`);\n }\n\n // Summary\n console.info(`\\n${'─'.repeat(50)}`);\n if (result.valid) {\n console.info('✅ All Figma exports are valid');\n } else {\n console.error(\n `❌ Validation failed: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`\n );\n }\n\n return result.valid;\n}\n","/**\n * Token Transformation module\n *\n * Transforms Figma token exports to Style Dictionary format with DTCG compliance.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\n\nimport { validateFigmaExport } from './schemas/index.js';\n\nimport type {\n DTCGToken,\n FigmaExport,\n TokenType,\n TransformOptions,\n TransformResult,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extractor function type\n */\ntype ExtractorFn = (data: FigmaExport, mode?: string) => Record<string, unknown>;\n\n/**\n * Collection output configuration\n */\ninterface CollectionOutput {\n /** Output file path relative to output directory */\n file: string;\n /** Extractor function for this output */\n extractor: ExtractorFn;\n}\n\n/**\n * Collection configuration\n */\ninterface CollectionConfig {\n /** Input filename */\n input: string;\n /** Whether collection has mode variants (Light/Dark) */\n modeAware: boolean;\n /** Output configurations */\n outputs: CollectionOutput[];\n}\n\n/**\n * Collections configuration map\n */\ninterface CollectionsConfig {\n [key: string]: CollectionConfig;\n}\n\n/**\n * Transform options specific to token values\n */\ninterface TokenTransformOptions {\n /** Font stack to prepend font name to */\n fontStack?: string;\n /** Token path for context-aware transformations */\n tokenPath?: string;\n /** Token scopes from Figma */\n scopes?: string[];\n /** Whether value represents a circle (50%) */\n isCircle?: boolean;\n /** Whether value represents a pill (9999px) */\n isPill?: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Keys that could cause prototype pollution */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Check if a key is safe from prototype pollution */\nfunction isSafeKey(key: string): boolean {\n return !UNSAFE_KEYS.has(key);\n}\n\n/**\n * Safe nested property access for objects with index signatures\n */\nfunction getNestedValue(obj: unknown, ...keys: string[]): unknown {\n const hasOwn = Object.prototype.hasOwnProperty;\n let current: unknown = obj;\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n if (!isSafeKey(key)) {\n return undefined;\n }\n // Only access own properties to prevent prototype pollution\n if (!hasOwn.call(current, key)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\n// ============================================================================\n// Value Transformation\n// ============================================================================\n\n/**\n * Check if a token should remain unitless\n */\nfunction shouldKeepUnitless(_type: string, scopes: string[] = [], tokenPath = ''): boolean {\n // Font weights must be unitless (300, 400, 700, etc.)\n if (scopes.includes('FONT_WEIGHT')) {\n return true;\n }\n\n // Line heights should be unitless for proper inheritance (1, 1.5, 2, etc.)\n if (scopes.includes('LINE_HEIGHT')) {\n return true;\n }\n\n // Opacity values must be unitless decimals (0, 0.5, 1, etc.)\n if (scopes.includes('OPACITY')) {\n return true;\n }\n\n // Grid configuration values should be unitless (12 columns, 6 row-columns, etc.)\n const pathLower = tokenPath.toLowerCase();\n if (pathLower.includes('columns') || pathLower.includes('row-columns')) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if px units should be added to a number value\n */\nfunction shouldAddUnit(type: string, scopes: string[] = [], tokenPath = ''): boolean {\n // Don't add units to font-weights, line-heights, or grid configuration\n if (shouldKeepUnitless(type, scopes, tokenPath)) {\n return false;\n }\n\n return type === 'number';\n}\n\n/**\n * Transform value based on type\n */\nexport function transformValue(\n value: unknown,\n type: string | undefined,\n options: TokenTransformOptions = {}\n): unknown {\n // Handle font family special case - prepend font name to font stack\n if (type === 'string' && options.fontStack && typeof value === 'string') {\n const fontName = value;\n const stack = options.fontStack;\n\n // Check if font name is already in the stack (avoid duplicates)\n if (stack.toLowerCase().includes(fontName.toLowerCase())) {\n return stack;\n }\n\n // Prepend font name to stack\n return `${fontName}, ${stack}`;\n }\n\n // Handle opacity: convert percentage (0-100) to decimal (0-1)\n if (typeof value === 'number' && options.scopes?.includes('OPACITY')) {\n // If value is > 1, it's a percentage that needs conversion\n if (value > 1) {\n return value / 100;\n }\n // Value is already a decimal (0-1)\n return value;\n }\n\n // Handle line-height and font-weight: keep as unitless number (CSS best practice)\n if (\n typeof value === 'number' &&\n shouldKeepUnitless(type ?? '', options.scopes, options.tokenPath)\n ) {\n return value;\n }\n\n // Handle numbers that should be dimensions\n if (typeof value === 'number' && shouldAddUnit(type ?? '', options.scopes, options.tokenPath)) {\n // Special case for circle radius (percentage)\n if (options.isCircle) {\n return '50%';\n }\n // Special case for pill radius\n if (options.isPill) {\n return '9999px';\n }\n return `${value}px`;\n }\n\n // Return value as-is for colors, strings, etc.\n return value;\n}\n\n/**\n * Transform type from Figma to DTCG standard\n * @param figmaType - The original Figma type\n * @param scopes - Token scopes to determine type-specific handling\n */\nexport function transformType(\n figmaType: string | undefined,\n scopes: string[] = []\n): TokenType | undefined {\n if (!figmaType) {\n return undefined;\n }\n\n // Keep 'number' type for unitless values (opacity, font-weight, line-height)\n if (figmaType === 'number') {\n const unitlessScopes = ['OPACITY', 'FONT_WEIGHT', 'LINE_HEIGHT'];\n if (scopes.some((scope) => unitlessScopes.includes(scope))) {\n return 'number' as TokenType;\n }\n // Default: convert number to dimension\n return 'dimension';\n }\n\n const typeMap = new Map<string, TokenType>([\n ['string', 'fontFamily'],\n ['color', 'color'],\n ]);\n\n return typeMap.get(figmaType) ?? (figmaType as TokenType);\n}\n\n/**\n * Transform a single token from Figma format to DTCG-compliant format\n */\nexport function transformToken(\n figmaToken: unknown,\n options: TokenTransformOptions = {}\n): DTCGToken | null {\n if (!figmaToken || typeof figmaToken !== 'object') {\n return null;\n }\n\n const tokenObj = figmaToken as Record<string, unknown>;\n const hasOwn = Object.prototype.hasOwnProperty;\n\n // Skip if this is not a leaf token (no $value property)\n if (!hasOwn.call(tokenObj, '$value')) {\n return null;\n }\n\n // Extract scopes for type-specific handling\n const scopes = (tokenObj['$scopes'] as string[] | undefined) ?? [];\n\n // Pass scopes to transformValue for type-specific handling\n const transformOptions: TokenTransformOptions = {\n ...options,\n scopes,\n };\n\n const rawType = tokenObj['$type'] as string | undefined;\n const transformedType = transformType(rawType, scopes);\n\n // DTCG Format: Keep $ prefix for all properties\n const token: DTCGToken = {\n $value: transformValue(tokenObj['$value'], rawType, transformOptions),\n $type: transformedType ?? 'string',\n };\n\n // Add description if present (DTCG property)\n if (tokenObj['$description'] && typeof tokenObj['$description'] === 'string') {\n token.$description = tokenObj['$description'];\n }\n\n // Preserve extensions (DTCG property) - keeps all metadata\n if (tokenObj['$extensions'] && typeof tokenObj['$extensions'] === 'object') {\n token.$extensions = tokenObj['$extensions'] as Record<string, unknown>;\n }\n\n return token;\n}\n\n/**\n * Recursively transform nested token objects\n */\nexport function transformTokenTree(\n obj: unknown,\n parentKey = '',\n options: Record<string, TokenTransformOptions> = {}\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const optionsMap = new Map(Object.entries(options));\n\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\n return result;\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // Build the full path for this token\n const currentPath = parentKey ? `${parentKey}.${key}` : key;\n\n // Try to transform as a token\n const keyOptions = optionsMap.get(key);\n const tokenOptions: TokenTransformOptions = {\n ...(keyOptions ?? {}),\n tokenPath: currentPath,\n };\n const transformed = transformToken(value, tokenOptions);\n\n if (transformed) {\n Object.defineProperty(result, key, {\n value: transformed,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n } else if (typeof value === 'object' && value !== null) {\n // Recursively process nested objects\n const nested = transformTokenTree(\n value,\n currentPath,\n (keyOptions as Record<string, TokenTransformOptions>) ?? {}\n );\n if (Object.keys(nested).length > 0) {\n Object.defineProperty(result, key, {\n value: nested,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Extractors\n// ============================================================================\n\n/**\n * Extract brand colors from foundation collection\n */\nfunction extractBrandColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const brandData = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'brand');\n\n if (!brandData) {\n console.warn(`No brand colors found in ${mode} mode`);\n return {};\n }\n\n return {\n color: transformTokenTree(brandData),\n };\n}\n\n/**\n * Extract semantic/component colors from foundation collection\n */\nfunction extractSemanticColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const semantic = getNestedValue(data, 'Foundation', 'modes', mode, 'semantic');\n\n if (!semantic) {\n console.warn(`No semantic colors found in ${mode} mode`);\n return {};\n }\n\n return {\n semantic: transformTokenTree(semantic),\n };\n}\n\n/**\n * Extract neutral colors (black, white, grays)\n */\nfunction extractNeutralColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const neutral = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'neutral');\n\n if (!neutral) {\n console.warn(`No neutral colors found in ${mode} mode`);\n return {};\n }\n\n return {\n neutral: transformTokenTree(neutral),\n };\n}\n\n/**\n * Extract opacity scale\n */\nfunction extractOpacityColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const opacity = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'opacity');\n\n if (!opacity) {\n console.warn(`No opacity tokens found in ${mode} mode`);\n return {};\n }\n\n return {\n opacity: transformTokenTree(opacity),\n };\n}\n\n/**\n * Extract typography tokens\n */\nfunction extractTypography(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Typography', 'modes', 'Base') as\n | Record<string, unknown>\n | undefined;\n\n if (!base) {\n console.warn('No typography tokens found');\n return {};\n }\n\n // Special handling for font families - use font stacks from extensions\n const optionsMap = new Map<string, TokenTransformOptions>();\n const fontFamily = Reflect.get(base, 'fontFamily') as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (fontFamily) {\n for (const key of Object.keys(fontFamily)) {\n const fontToken = Reflect.get(fontFamily, key) as Record<string, unknown> | undefined;\n const extensions = fontToken?.['$extensions'] as\n | Record<string, Record<string, string>>\n | undefined;\n const fontStack = extensions?.['platform']?.['fontStack'];\n if (fontStack) {\n optionsMap.set(key, { fontStack });\n }\n }\n }\n\n return {\n typography: transformTokenTree(base, '', {\n fontFamily: Object.fromEntries(optionsMap),\n } as Record<string, TokenTransformOptions>),\n };\n}\n\n/**\n * Extract spacing tokens\n */\nfunction extractSpacing(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Spacing', 'modes', 'Base', 'spacing');\n\n if (!base) {\n console.warn('No spacing tokens found');\n return {};\n }\n\n return {\n spacing: transformTokenTree(base),\n };\n}\n\n/**\n * Extract border radius tokens\n */\nfunction extractRadius(data: FigmaExport): Record<string, unknown> {\n // Support both 'border-radius' (Bootstrap naming) and 'radius' (legacy Figma naming)\n const base =\n getNestedValue(data, 'Radius', 'modes', 'Base', 'border-radius') ||\n getNestedValue(data, 'Radius', 'modes', 'Base', 'radius');\n\n if (!base) {\n console.warn('No radius tokens found');\n return {};\n }\n\n // Special handling for circle and pill\n const options: Record<string, TokenTransformOptions> = {\n circle: { isCircle: true },\n pill: { isPill: true },\n };\n\n return {\n border: {\n radius: transformTokenTree(base, '', options),\n },\n };\n}\n\n/**\n * Extract border widths from border.json file\n * Structure: Border.modes.Base.[0-5] → border.width.[0-5]\n */\nfunction extractBorderWidthsFromBorder(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Border', 'modes', 'Base');\n\n if (!base) {\n console.warn('No border width tokens found in border.json');\n return {};\n }\n\n // Transform numeric keys to proper width tokens\n // The tokens are numbers (0-5) representing pixel values\n const transformedWidths = new Map<string, DTCGToken>();\n for (const [key, value] of Object.entries(base as Record<string, unknown>)) {\n if (typeof value === 'object' && value !== null) {\n const token = value as Record<string, unknown>;\n const numValue = token['$value'];\n\n // Convert to dimension type with px unit for border widths\n transformedWidths.set(key, {\n $value: typeof numValue === 'number' ? `${numValue}px` : String(numValue),\n $type: 'dimension',\n $description: `Border width ${key} (${numValue}px). Bootstrap's $border-width-${key} variable.`,\n $extensions: {\n platform: {\n scssVariableName: `$border-width-${key}`,\n },\n },\n });\n }\n }\n\n return {\n border: {\n width: Object.fromEntries(transformedWidths),\n },\n };\n}\n\n/**\n * Extract breakpoint tokens\n */\nfunction extractBreakpoints(data: FigmaExport): Record<string, unknown> {\n const breakpoints = getNestedValue(data, 'Layout', 'modes', 'Base', 'breakpoints');\n\n if (!breakpoints) {\n console.warn('No breakpoint tokens found');\n return {};\n }\n\n return {\n layout: {\n breakpoints: transformTokenTree(breakpoints),\n },\n };\n}\n\n/**\n * Extract container tokens\n */\nfunction extractContainers(data: FigmaExport): Record<string, unknown> {\n const container = getNestedValue(data, 'Layout', 'modes', 'Base', 'container');\n\n if (!container) {\n console.warn('No container tokens found');\n return {};\n }\n\n return {\n layout: {\n container: transformTokenTree(container),\n },\n };\n}\n\n/**\n * Extract grid tokens\n */\nfunction extractGrid(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Layout', 'modes', 'Base') as\n | Record<string, unknown>\n | undefined;\n const grid = base?.['grid'];\n const gutters = base?.['gutters'];\n\n if (!grid) {\n console.warn('No grid tokens found');\n return {};\n }\n\n const result: { layout: { grid: Record<string, unknown>; gutters?: Record<string, unknown> } } = {\n layout: {\n grid: transformTokenTree(grid),\n },\n };\n\n if (gutters) {\n result.layout.gutters = transformTokenTree(gutters);\n }\n\n return result;\n}\n\n/**\n * Extract shadow tokens (use composite values)\n */\nfunction extractShadows(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Shadows', 'modes', 'Base', 'shadows') as\n | Record<string, Record<string, unknown>>\n | undefined;\n\n if (!base) {\n console.warn('No shadow tokens found');\n return {};\n }\n\n const shadowMap = new Map<string, DTCGToken>();\n\n for (const [key, value] of Object.entries(base)) {\n const composite = value?.['composite'] as Record<string, unknown> | undefined;\n if (composite) {\n const token: DTCGToken = {\n $value: composite['$value'],\n $type: 'shadow',\n };\n\n if (composite['$description'] && typeof composite['$description'] === 'string') {\n token.$description = composite['$description'];\n }\n\n if (composite['$extensions'] && typeof composite['$extensions'] === 'object') {\n token.$extensions = composite['$extensions'] as Record<string, unknown>;\n }\n\n shadowMap.set(key, token);\n }\n }\n\n return { shadow: Object.fromEntries(shadowMap) };\n}\n\n// ============================================================================\n// Default Collections Configuration\n// ============================================================================\n\n/**\n * Default collections configuration matching the original script\n */\nconst DEFAULT_COLLECTIONS: CollectionsConfig = {\n foundation: {\n input: 'foundation.json',\n modeAware: true,\n outputs: [\n { file: 'collections/color/primitive.json', extractor: extractBrandColors },\n { file: 'collections/color/neutral.json', extractor: extractNeutralColors },\n { file: 'collections/color/opacity.json', extractor: extractOpacityColors },\n { file: 'collections/color/component.json', extractor: extractSemanticColors },\n // Note: These paths don't exist in current Figma exports:\n // - colors.theme (extractThemeColors) - use semantic tokens instead\n // - colors.background (extractBackgroundColors) - backgrounds are in semantic\n // - borders.color (extractBorderColors) - border colors are in semantic.border-color\n ],\n },\n typography: {\n input: 'typography.json',\n modeAware: false,\n outputs: [{ file: 'collections/typography/base.json', extractor: extractTypography }],\n },\n spacing: {\n input: 'spacing.json',\n modeAware: false,\n outputs: [{ file: 'collections/spacing/base.json', extractor: extractSpacing }],\n },\n radius: {\n input: 'radius.json',\n modeAware: false,\n outputs: [{ file: 'collections/border/radius.json', extractor: extractRadius }],\n },\n border: {\n input: 'border.json',\n modeAware: false,\n outputs: [{ file: 'collections/border/width.json', extractor: extractBorderWidthsFromBorder }],\n },\n layout: {\n input: 'layout.json',\n modeAware: false,\n outputs: [\n { file: 'collections/layout/breakpoints.json', extractor: extractBreakpoints },\n { file: 'collections/layout/containers.json', extractor: extractContainers },\n { file: 'collections/layout/grid.json', extractor: extractGrid },\n ],\n },\n shadows: {\n input: 'shadows.json',\n modeAware: false,\n outputs: [{ file: 'collections/shadow/base.json', extractor: extractShadows }],\n },\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Ensure directory exists\n */\nfunction ensureDir(filePath: string): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Detect modes from Figma export data\n */\nexport function detectModes(data: FigmaExport, collectionPath?: string): string[] {\n if (!data || typeof data !== 'object') {\n return ['Base'];\n }\n\n // If collection path is specified, look for that collection\n if (collectionPath) {\n const collection = getNestedValue(data, collectionPath) as Record<string, unknown> | undefined;\n const modes = collection?.['modes'] as Record<string, unknown> | undefined;\n if (modes) {\n return Object.keys(modes);\n }\n return ['Base'];\n }\n\n // Otherwise, look for modes in any collection\n for (const value of Object.values(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as Record<string, unknown>;\n const modes = collection['modes'] as Record<string, unknown> | undefined;\n if (modes) {\n return Object.keys(modes);\n }\n }\n }\n\n return ['Base'];\n}\n\n/**\n * Get input source based on configuration with automatic fallback\n */\nfunction getInputSource(\n collectionConfig: CollectionConfig,\n exportsDir: string,\n buildSource: string\n): string {\n const themeFile = join(exportsDir, 'theme.json');\n const collectionFile = join(exportsDir, collectionConfig.input);\n\n if (buildSource === 'theme') {\n // Prefer theme.json, fallback to collection file\n if (existsSync(themeFile)) {\n return themeFile;\n }\n if (existsSync(collectionFile)) {\n console.warn(` ⚠️ theme.json not found, using ${collectionConfig.input}`);\n return collectionFile;\n }\n return themeFile;\n }\n\n // Prefer collection file, fallback to theme.json\n if (existsSync(collectionFile)) {\n return collectionFile;\n }\n if (existsSync(themeFile)) {\n console.warn(` ⚠️ ${collectionConfig.input} not found, using theme.json`);\n return themeFile;\n }\n return collectionFile;\n}\n\n// ============================================================================\n// Main Transformation\n// ============================================================================\n\n/**\n * Transform Figma tokens to Style Dictionary format\n */\nexport function transformTokens(options: TransformOptions): TransformResult {\n const {\n sourceDir,\n collectionsDir,\n ignoreModes = [],\n defaultMode = 'Light',\n dryRun = false,\n verbose = false,\n } = options;\n\n const startTime = Date.now();\n const errors: string[] = [];\n const warnings: string[] = [];\n const filesWritten: string[] = [];\n const allModesDetected: Set<string> = new Set();\n let tokensProcessed = 0;\n\n if (verbose) {\n console.info('🎨 Transforming Figma tokens to Style Dictionary format...\\n');\n console.info('📋 Configuration:');\n console.info(` Source directory: ${sourceDir}`);\n console.info(` Output directory: ${collectionsDir}`);\n console.info(` Default mode: ${defaultMode}`);\n if (ignoreModes.length > 0) {\n console.info(` Ignored modes: ${ignoreModes.join(', ')}`);\n }\n if (dryRun) {\n console.info(' DRY RUN - no files will be written');\n }\n console.info('');\n }\n\n // Detect modes from theme.json\n const detectedModesMap = new Map<string, string[]>();\n const themeFile = join(sourceDir, 'theme.json');\n if (existsSync(themeFile)) {\n try {\n const content = readFileSync(themeFile, 'utf-8');\n const themeData = JSON.parse(content) as FigmaExport;\n\n // Detect modes for each collection\n for (const [name, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\n const typedConfig = collectionConfig as CollectionConfig;\n if (typedConfig.modeAware) {\n const collectionPath = name.charAt(0).toUpperCase() + name.slice(1);\n const modes = detectModes(themeData, collectionPath);\n if (modes.length > 0) {\n detectedModesMap.set(collectionPath, modes);\n for (const mode of modes) {\n allModesDetected.add(mode);\n }\n }\n }\n }\n } catch (error) {\n warnings.push(\n `Failed to read theme.json for mode detection: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Process each collection\n for (const [collectionName, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\n const typedConfig = collectionConfig as CollectionConfig;\n if (verbose) {\n console.info(`Processing ${collectionName} collection...`);\n }\n\n // Get input path based on configuration\n const inputPath = getInputSource(typedConfig, sourceDir, 'theme');\n\n // Check if input file exists\n if (!existsSync(inputPath)) {\n warnings.push(`Input file not found: ${inputPath}`);\n continue;\n }\n\n // Read input file\n let data: FigmaExport;\n try {\n const content = readFileSync(inputPath, 'utf-8');\n data = JSON.parse(content) as FigmaExport;\n\n // Validate schema if strict mode is enabled\n if (options.strict) {\n const validation = validateFigmaExport(data);\n if (!validation.valid) {\n const errorMessages = validation.errors?.map((e) => `${e.path}: ${e.message}`) || [];\n errors.push(`Schema validation failed for ${inputPath}:\\n${errorMessages.join('\\n')}`);\n continue;\n }\n if (verbose) {\n console.info(` ✓ Schema validation passed`);\n }\n }\n } catch (error) {\n errors.push(\n `Failed to read ${inputPath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n continue;\n }\n\n // Determine which modes to process for this collection\n let modesToProcess = [defaultMode];\n if (typedConfig.modeAware) {\n const collectionPath = collectionName.charAt(0).toUpperCase() + collectionName.slice(1);\n const detectedForCollection = detectedModesMap.get(collectionPath);\n if (detectedForCollection) {\n modesToProcess = detectedForCollection.filter((m) => !ignoreModes.includes(m));\n } else {\n const modes = detectModes(data, collectionPath);\n if (modes.length > 1 || !modes.includes('Base')) {\n modesToProcess = modes.filter((m) => !ignoreModes.includes(m));\n }\n }\n }\n\n // Process each output\n for (const output of typedConfig.outputs) {\n for (const mode of modesToProcess) {\n // Generate the output file path\n let outputFile = output.file;\n if (typedConfig.modeAware && modesToProcess.length > 1) {\n const ext = extname(output.file);\n const base = basename(output.file, ext);\n const dir = dirname(output.file);\n\n if (mode !== defaultMode) {\n outputFile = join(dir, `${base}-${mode.toLowerCase()}${ext}`);\n }\n }\n\n const outputPath = join(collectionsDir, outputFile);\n\n try {\n // Extract and transform tokens\n const tokens = typedConfig.modeAware\n ? output.extractor(data, mode)\n : output.extractor(data);\n\n const tokenCount = Object.keys(tokens).length;\n if (tokenCount === 0) {\n warnings.push(`No tokens extracted for ${outputFile} (${mode} mode)`);\n continue;\n }\n\n tokensProcessed += tokenCount;\n\n if (!dryRun) {\n // Ensure output directory exists\n ensureDir(outputPath);\n\n // Write output file\n writeFileSync(outputPath, `${JSON.stringify(tokens, null, 2)}\\n`, 'utf-8');\n }\n\n filesWritten.push(outputFile);\n\n if (verbose) {\n const dryRunLabel = dryRun ? ' (dry run)' : '';\n console.info(\n ` ✅ Created ${outputFile}${modesToProcess.length > 1 ? ` (${mode})` : ''}${dryRunLabel}`\n );\n }\n } catch (error) {\n errors.push(\n `Error processing ${outputFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n }\n }\n\n const duration = Date.now() - startTime;\n\n if (verbose) {\n console.info('\\n✨ Transformation complete!');\n console.info(`\\n📁 Output directory: ${collectionsDir}`);\n console.info(`⏱️ Duration: ${duration}ms`);\n }\n\n return {\n success: errors.length === 0,\n filesWritten,\n tokensProcessed,\n modesDetected: Array.from(allModesDetected),\n errors,\n warnings,\n duration,\n };\n}\n\n/**\n * CLI entry point for token transformation\n */\nexport function transformTokensCLI(\n sourceDir: string,\n collectionsDir: string,\n options: Partial<Omit<TransformOptions, 'sourceDir' | 'collectionsDir'>> = {}\n): boolean {\n const result = transformTokens({\n sourceDir,\n collectionsDir,\n verbose: true,\n ...options,\n });\n\n // Report errors\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n\n // Report warnings\n for (const warning of result.warnings) {\n console.warn(`⚠️ ${warning}`);\n }\n\n return result.success;\n}\n","/**\n * @file Token Sync Module\n * @description Synchronizes generated tokens from Style Dictionary output to TypeScript source\n *\n * This module handles syncing the generated tokens from dist/js/tokens.js\n * to src/tokens-flat.ts so that tsup can bundle them correctly.\n *\n * This ensures that when font families or other tokens change in Figma,\n * the changes automatically propagate to the TypeScript source.\n *\n * @module @dsai-io/tools/tokens/sync\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport type { SyncOptions, SyncResult } from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default source file relative path from tokens package */\nconst DEFAULT_SOURCE_RELATIVE = 'dist/js/tokens.js';\n\n/** Default target file relative path from tokens package */\nconst DEFAULT_TARGET_RELATIVE = 'src/tokens-flat.ts';\n\n/** TypeScript header template for generated file */\nconst TS_HEADER = `/**\n * Do not edit directly, this file was auto-generated.\n * Generated from Style Dictionary output (dist/js/tokens.js)\n *\n * To update: run \\`pnpm tokens:build\\` which will:\n * 1. Transform Figma tokens\n * 2. Build with Style Dictionary\n * 3. Sync this file automatically\n */\n\n`;\n\n/** Font families to verify in output */\nconst EXPECTED_FONTS = ['Inter', 'Roboto Mono'] as const;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Verify that expected font families are present in the content\n */\nfunction verifyFontFamilies(content: string): { found: string[]; missing: string[] } {\n const found: string[] = [];\n const missing: string[] = [];\n\n for (const font of EXPECTED_FONTS) {\n // Check for font in various formats: \"'Inter,\" or \"Inter,\"\n const pattern = `'${font},`;\n if (content.includes(pattern) || content.includes(`\"${font},`)) {\n found.push(font);\n } else {\n missing.push(font);\n }\n }\n\n return { found, missing };\n}\n\n/**\n * Count token exports in content\n */\nfunction countTokenExports(content: string): number {\n // Count export const declarations\n const exportPattern = /export\\s+const\\s+\\w+/g;\n const matches = content.match(exportPattern);\n return matches ? matches.length : 0;\n}\n\n/**\n * Compute default file paths from tokens directory\n */\nexport function getDefaultSyncPaths(tokensDir: string): { sourceFile: string; targetFile: string } {\n return {\n sourceFile: join(tokensDir, DEFAULT_SOURCE_RELATIVE),\n targetFile: join(tokensDir, DEFAULT_TARGET_RELATIVE),\n };\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Sync tokens from Style Dictionary output to TypeScript source\n *\n * @example\n * ```typescript\n * // Sync with explicit paths\n * const result = syncTokens({\n * sourceFile: './packages/@dsai-io/tokens/dist/js/tokens.js',\n * targetFile: './packages/@dsai-io/tokens/src/tokens-flat.ts',\n * });\n *\n * // Sync with paths computed from tokens directory\n * const paths = getDefaultSyncPaths('./packages/@dsai-io/tokens');\n * const result = syncTokens(paths);\n * ```\n */\nexport function syncTokens(options: SyncOptions): SyncResult {\n const { sourceFile, targetFile, dryRun = false, verbose = false } = options;\n\n const errors: string[] = [];\n\n if (verbose) {\n console.info('🔄 Syncing tokens from Style Dictionary output...');\n console.info(` Source: ${sourceFile}`);\n console.info(` Target: ${targetFile}`);\n if (dryRun) {\n console.info(' DRY RUN - no files will be written');\n }\n }\n\n // Check if source file exists\n if (!existsSync(sourceFile)) {\n const error = `Source file not found: ${sourceFile}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount: 0,\n changed: false,\n errors: [error],\n };\n }\n\n // Read source content\n let sourceContent: string;\n try {\n sourceContent = readFileSync(sourceFile, 'utf-8');\n } catch (err) {\n const error = `Failed to read source file: ${err instanceof Error ? err.message : 'Unknown error'}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount: 0,\n changed: false,\n errors: [error],\n };\n }\n\n // Generate TypeScript content\n const tsContent = `${TS_HEADER}${sourceContent}`;\n\n // Verify font families\n const fontFamilies = verifyFontFamilies(sourceContent);\n if (fontFamilies.missing.length > 0) {\n for (const font of fontFamilies.missing) {\n errors.push(`Font family may be missing: ${font}`);\n }\n }\n\n // Count tokens\n const tokensCount = countTokenExports(sourceContent);\n\n // Check if target already exists and has same content\n let changed = true;\n if (existsSync(targetFile)) {\n try {\n const existingContent = readFileSync(targetFile, 'utf-8');\n if (existingContent === tsContent) {\n changed = false;\n if (verbose) {\n console.info('✅ Target file is already up to date');\n }\n }\n } catch {\n // Ignore read errors, will overwrite\n }\n }\n\n // Write target file if changed\n if (changed && !dryRun) {\n try {\n // Ensure target directory exists\n const targetDir = dirname(targetFile);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n writeFileSync(targetFile, tsContent, 'utf-8');\n } catch (err) {\n const error = `Failed to write target file: ${err instanceof Error ? err.message : 'Unknown error'}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount,\n changed: false,\n errors: [error],\n };\n }\n }\n\n if (verbose) {\n if (changed) {\n console.info('✅ Successfully synced tokens');\n }\n console.info(` Tokens exported: ${tokensCount}`);\n if (fontFamilies.found.length > 0) {\n console.info(` Font families found: ${fontFamilies.found.join(', ')}`);\n }\n if (fontFamilies.missing.length > 0) {\n console.warn(` ⚠️ Missing fonts: ${fontFamilies.missing.join(', ')}`);\n }\n }\n\n return {\n success: errors.length === 0 || errors.every((e) => e.includes('Font family')),\n tokensCount,\n changed,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * CLI entry point for token sync\n * @param tokensDir - The tokens package directory\n * @param customPaths - Optional custom paths for source and target files\n */\nexport function syncTokensCLI(\n tokensDir: string,\n customPaths?: { syncSource?: string; syncTarget?: string }\n): boolean {\n // Use custom paths if provided, otherwise use defaults\n const sourceFile = customPaths?.syncSource\n ? join(tokensDir, customPaths.syncSource)\n : join(tokensDir, DEFAULT_SOURCE_RELATIVE);\n const targetFile = customPaths?.syncTarget\n ? join(tokensDir, customPaths.syncTarget)\n : join(tokensDir, DEFAULT_TARGET_RELATIVE);\n\n const result = syncTokens({\n sourceFile,\n targetFile,\n verbose: true,\n });\n\n // Report errors (non-critical ones like missing fonts)\n if (result.errors) {\n for (const error of result.errors) {\n if (error.includes('Font family')) {\n console.warn(`⚠️ ${error}`);\n } else {\n console.error(`❌ ${error}`);\n }\n }\n }\n\n return result.success;\n}\n","/**\n * @fileoverview Token cache management for incremental builds\n * Provides hash-based change detection and cache storage\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n/**\n * Cache entry for a single token file\n */\nexport interface CacheEntry {\n /** SHA-256 hash of file content */\n hash: string;\n /** Last modification time */\n mtime: Date;\n /** Generated output files */\n outputs: string[];\n}\n\n/**\n * Token cache structure\n */\nexport interface TokenCache {\n /** Cache format version */\n version: string;\n /** Cache creation timestamp */\n timestamp: Date;\n /** Cached file entries */\n files: Record<string, CacheEntry>;\n}\n\n/**\n * Cache configuration\n */\nexport interface CacheConfig {\n /** Cache directory path */\n cacheDir?: string;\n /** Enable/disable caching */\n enabled?: boolean;\n /** Cache file name */\n cacheFile?: string;\n}\n\n/**\n * Cache storage service for token builds\n */\nexport class CacheService {\n private readonly cacheDir: string;\n private readonly cacheFile: string;\n private readonly enabled: boolean;\n private cache: TokenCache | null = null;\n\n constructor(config: CacheConfig = {}) {\n this.cacheDir = config.cacheDir ?? '.dsai-cache';\n this.cacheFile = config.cacheFile ?? 'tokens.json';\n this.enabled = config.enabled ?? true;\n }\n\n /**\n * Get full path to cache file\n */\n private getCachePath(): string {\n return join(this.cacheDir, this.cacheFile);\n }\n\n /**\n * Ensure cache directory exists\n */\n private ensureCacheDir(): void {\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n /**\n * Calculate SHA-256 hash of file content\n */\n static hashFile(filePath: string): string {\n const content = readFileSync(filePath, 'utf-8');\n return createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Calculate hash of string content\n */\n static hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Load cache from disk\n */\n loadCache(): TokenCache {\n if (!this.enabled) {\n return this.createEmptyCache();\n }\n\n if (this.cache) {\n return this.cache;\n }\n\n const cachePath = this.getCachePath();\n\n if (!existsSync(cachePath)) {\n this.cache = this.createEmptyCache();\n return this.cache;\n }\n\n try {\n const content = readFileSync(cachePath, 'utf-8');\n const parsed = JSON.parse(content) as TokenCache;\n\n // Convert date strings back to Date objects\n this.cache = {\n ...parsed,\n timestamp: new Date(parsed.timestamp),\n files: Object.fromEntries(\n Object.entries(parsed.files).map(([path, entry]) => [\n path,\n { ...entry, mtime: new Date(entry.mtime) },\n ])\n ),\n };\n\n return this.cache;\n } catch {\n // Invalid cache, start fresh\n this.cache = this.createEmptyCache();\n return this.cache;\n }\n }\n\n /**\n * Save cache to disk\n */\n saveCache(cache: TokenCache): void {\n if (!this.enabled) {\n return;\n }\n\n this.ensureCacheDir();\n const cachePath = this.getCachePath();\n\n try {\n const content = JSON.stringify(cache, null, 2);\n writeFileSync(cachePath, content, 'utf-8');\n this.cache = cache;\n } catch (error) {\n console.warn(\n `Failed to save cache: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Create empty cache structure\n */\n private createEmptyCache(): TokenCache {\n return {\n version: '1.0.0',\n timestamp: new Date(),\n files: {},\n };\n }\n\n /**\n * Check if a file has changed since last cache\n */\n hasFileChanged(filePath: string, baseDir: string): boolean {\n if (!this.enabled) {\n return true; // Always rebuild if caching disabled\n }\n\n const cache = this.loadCache();\n const relativePath = relative(baseDir, filePath);\n\n // File not in cache = changed\n const entry = Reflect.get(cache.files, relativePath) as CacheEntry | undefined;\n if (!entry) {\n return true;\n }\n\n // Check if file still exists\n if (!existsSync(filePath)) {\n return true;\n }\n\n const currentHash = CacheService.hashFile(filePath);\n\n // Hash mismatch = changed\n if (entry.hash !== currentHash) {\n return true;\n }\n\n // Check mtime as fast path (but hash is source of truth)\n const stats = statSync(filePath);\n const currentMtime = stats.mtime;\n\n return currentMtime.getTime() !== new Date(entry.mtime).getTime();\n }\n\n /**\n * Get list of changed files in a directory\n */\n getChangedFiles(directory: string, pattern = '**/*.json'): string[] {\n if (!this.enabled) {\n // Return all files if caching disabled\n return this.getAllFiles(directory, pattern);\n }\n\n const allFiles = this.getAllFiles(directory, pattern);\n const changedFiles: string[] = [];\n\n for (const file of allFiles) {\n if (this.hasFileChanged(file, directory)) {\n changedFiles.push(file);\n }\n }\n\n return changedFiles;\n }\n\n /**\n * Get all files matching pattern\n */\n private getAllFiles(directory: string, pattern: string): string[] {\n const files: string[] = [];\n\n const scan = (dir: string): void => {\n if (!existsSync(dir)) {\n return;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n scan(fullPath);\n } else if (entry.isFile()) {\n // Get relative path for pattern matching\n const relativePath = relative(directory, fullPath);\n if (this.matchesPattern(relativePath, pattern)) {\n files.push(fullPath);\n }\n }\n }\n };\n\n scan(directory);\n return files;\n }\n\n /**\n * Simple pattern matching for file globs\n * Supports: *.json, **\\/*.json, *.tokens.json\n */\n private matchesPattern(filename: string, pattern: string): boolean {\n // Simple cases\n if (pattern === '*' || pattern === '**/*') {\n return true;\n }\n\n if (pattern === '*.*') {\n return filename.includes('.');\n }\n\n // Handle **.ext patterns\n if (pattern.startsWith('**/*.')) {\n const ext = pattern.substring(4); // Remove **/*\n return filename.endsWith(ext);\n }\n\n // Handle *.ext patterns\n if (pattern.startsWith('*.')) {\n const ext = pattern.substring(1); // Remove *\n return filename.endsWith(ext);\n }\n\n // Convert glob pattern to regex for complex patterns\n /* eslint-disable security/detect-non-literal-regexp */\n const regexPattern = pattern\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\./g, '\\\\.');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(filename);\n /* eslint-enable security/detect-non-literal-regexp */\n }\n\n /**\n * Update cache entry for a file\n */\n updateCacheEntry(filePath: string, baseDir: string, outputs: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n const cache = this.loadCache();\n const relativePath = relative(baseDir, filePath);\n\n if (!existsSync(filePath)) {\n return;\n }\n\n const hash = CacheService.hashFile(filePath);\n const stats = statSync(filePath);\n\n Object.defineProperty(cache.files, relativePath, {\n value: {\n hash,\n mtime: stats.mtime,\n outputs,\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n\n cache.timestamp = new Date();\n this.saveCache(cache);\n }\n\n /**\n * Update multiple cache entries at once\n */\n updateCacheEntries(\n entries: Array<{ filePath: string; outputs?: string[] }>,\n baseDir: string\n ): void {\n if (!this.enabled) {\n return;\n }\n\n const cache = this.loadCache();\n\n for (const entry of entries) {\n const relativePath = relative(baseDir, entry.filePath);\n\n if (!existsSync(entry.filePath)) {\n continue;\n }\n\n const hash = CacheService.hashFile(entry.filePath);\n const stats = statSync(entry.filePath);\n\n Object.defineProperty(cache.files, relativePath, {\n value: {\n hash,\n mtime: stats.mtime,\n outputs: entry.outputs ?? [],\n },\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n\n cache.timestamp = new Date();\n this.saveCache(cache);\n }\n\n /**\n * Clear cache entry for a file\n */\n clearCacheEntry(filePath: string, baseDir: string): void {\n if (!this.enabled) {\n return;\n }\n\n const cache = this.loadCache();\n const relativePath = relative(baseDir, filePath);\n\n // Safe deletion using Map-like operation\n const { [relativePath]: _removed, ...remainingFiles } = cache.files;\n cache.files = remainingFiles;\n\n cache.timestamp = new Date();\n this.saveCache(cache);\n }\n\n /**\n * Clear entire cache\n */\n clearCache(): void {\n this.cache = this.createEmptyCache();\n\n if (this.enabled) {\n const cachePath = this.getCachePath();\n if (existsSync(cachePath)) {\n try {\n writeFileSync(cachePath, JSON.stringify(this.cache, null, 2), 'utf-8');\n } catch {\n // Ignore write errors during clear\n }\n }\n }\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): {\n enabled: boolean;\n fileCount: number;\n cacheSize: number;\n oldestEntry: Date | null;\n newestEntry: Date | null;\n } {\n const cache = this.loadCache();\n const entries = Object.values(cache.files);\n\n let oldestEntry: Date | null = null;\n let newestEntry: Date | null = null;\n\n for (const entry of entries) {\n const mtime = new Date(entry.mtime);\n if (!oldestEntry || mtime < oldestEntry) {\n oldestEntry = mtime;\n }\n if (!newestEntry || mtime > newestEntry) {\n newestEntry = mtime;\n }\n }\n\n let cacheSize = 0;\n const cachePath = this.getCachePath();\n if (existsSync(cachePath)) {\n cacheSize = statSync(cachePath).size;\n }\n\n return {\n enabled: this.enabled,\n fileCount: entries.length,\n cacheSize,\n oldestEntry,\n newestEntry,\n };\n }\n\n /**\n * Check if cache is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get cache directory path\n */\n getCacheDir(): string {\n return this.cacheDir;\n }\n}\n","/**\n * Incremental Build System\n *\n * Provides intelligent change detection and incremental processing for token builds.\n * Only transforms and processes tokens that have changed since the last build.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync } from 'node:fs';\nimport { basename, join, relative } from 'node:path';\n\nimport type { CacheService } from './cache.js';\nimport type { TransformOptions } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for incremental builds\n */\nexport interface IncrementalOptions {\n /** Whether incremental mode is enabled */\n enabled: boolean;\n /** Force full rebuild (ignores cache) */\n force?: boolean;\n /** Cache service instance */\n cacheService?: CacheService;\n /** Verbose logging */\n verbose?: boolean;\n}\n\n/**\n * Result of incremental analysis\n */\nexport interface IncrementalAnalysis {\n /** Whether a full build is required */\n needsFullBuild: boolean;\n /** Files that have changed since last build */\n changedFiles: string[];\n /** Files that can be skipped */\n unchangedFiles: string[];\n /** Reason for full build (if needed) */\n fullBuildReason?: string;\n /** Total files analyzed */\n totalFiles: number;\n}\n\n/**\n * Collection dependency information\n */\ninterface CollectionDependency {\n /** Collection name */\n name: string;\n /** Input file path */\n inputFile: string;\n /** Output file paths */\n outputFiles: string[];\n /** Collections that depend on this one */\n dependents: string[];\n /** Collections this one depends on */\n dependencies: string[];\n}\n\n/**\n * Dependency graph for collections\n */\ninterface DependencyGraph {\n /** Map of collection name to dependency info */\n collections: Map<string, CollectionDependency>;\n /** Collections in topological order */\n buildOrder: string[];\n}\n\n// ============================================================================\n// Incremental Analysis\n// ============================================================================\n\n/**\n * Analyze files to determine what needs to be rebuilt\n */\nexport async function analyzeChanges(\n sourceDir: string,\n options: IncrementalOptions\n): Promise<IncrementalAnalysis> {\n const { enabled, force, cacheService, verbose } = options;\n\n // If not enabled or force build, do full build\n if (!enabled || force) {\n return {\n needsFullBuild: true,\n changedFiles: [],\n unchangedFiles: [],\n fullBuildReason: force ? 'Force rebuild requested' : 'Incremental mode disabled',\n totalFiles: 0,\n };\n }\n\n // If no cache service, do full build\n if (!cacheService) {\n return {\n needsFullBuild: true,\n changedFiles: [],\n unchangedFiles: [],\n fullBuildReason: 'No cache service available',\n totalFiles: 0,\n };\n }\n\n // Load cache\n const cache = await cacheService.loadCache();\n\n // If no cache exists, do full build\n if (!cache || Object.keys(cache.files).length === 0) {\n if (verbose) {\n console.info(' ℹ️ No cache found, performing full build');\n }\n return {\n needsFullBuild: true,\n changedFiles: [],\n unchangedFiles: [],\n fullBuildReason: 'No cache available',\n totalFiles: 0,\n };\n }\n\n // Get all source files\n const sourceFiles = await getSourceFiles(sourceDir);\n\n if (sourceFiles.length === 0) {\n return {\n needsFullBuild: true,\n changedFiles: [],\n unchangedFiles: [],\n fullBuildReason: 'No source files found',\n totalFiles: 0,\n };\n }\n\n // Check which files have changed\n const changedFiles: string[] = [];\n const unchangedFiles: string[] = [];\n\n for (const file of sourceFiles) {\n const hasChanged = cacheService.hasFileChanged(file, sourceDir);\n\n if (hasChanged) {\n changedFiles.push(file);\n } else {\n unchangedFiles.push(file);\n }\n }\n\n const totalFiles = sourceFiles.length;\n const changePercentage = (changedFiles.length / totalFiles) * 100;\n\n if (verbose && changedFiles.length > 0) {\n console.info(\n ` 📊 Analysis: ${changedFiles.length}/${totalFiles} files changed (${changePercentage.toFixed(1)}%)`\n );\n }\n\n // If more than 50% of files changed, do full build\n // This is more efficient than selective processing\n if (changePercentage > 50) {\n if (verbose) {\n console.info(' ℹ️ >50% files changed, performing full build for efficiency');\n }\n return {\n needsFullBuild: true,\n changedFiles,\n unchangedFiles,\n fullBuildReason: 'Too many files changed (>50%)',\n totalFiles,\n };\n }\n\n // If no files changed, skip build entirely\n if (changedFiles.length === 0) {\n if (verbose) {\n console.info(' ✅ No changes detected, skipping build');\n }\n return {\n needsFullBuild: false,\n changedFiles: [],\n unchangedFiles,\n fullBuildReason: undefined,\n totalFiles,\n };\n }\n\n // Incremental build is possible\n return {\n needsFullBuild: false,\n changedFiles,\n unchangedFiles,\n totalFiles,\n };\n}\n\n/**\n * Get all source files in directory\n */\nasync function getSourceFiles(sourceDir: string): Promise<string[]> {\n if (!existsSync(sourceDir)) {\n return [];\n }\n\n const fs = await import('node:fs/promises');\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith('.json')) {\n files.push(join(sourceDir, entry.name));\n }\n }\n } catch (error) {\n console.error(\n `Error reading source directory: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n return files;\n}\n\n// ============================================================================\n// Dependency Graph\n// ============================================================================\n\n/**\n * Build dependency graph for collections\n *\n * Currently returns empty graph as collections are independent.\n * This can be extended to support collection dependencies in the future.\n */\nexport function buildDependencyGraph(\n collections: Array<{ name: string; inputFile: string; outputFiles: string[] }>\n): DependencyGraph {\n const graph: DependencyGraph = {\n collections: new Map(),\n buildOrder: [],\n };\n\n // Add all collections\n for (const collection of collections) {\n graph.collections.set(collection.name, {\n name: collection.name,\n inputFile: collection.inputFile,\n outputFiles: collection.outputFiles,\n dependents: [],\n dependencies: [],\n });\n graph.buildOrder.push(collection.name);\n }\n\n // TODO: Add dependency detection logic\n // For now, collections are processed independently in the order they're defined\n\n return graph;\n}\n\n/**\n * Get collections that need to be rebuilt based on changed files\n */\nexport function getAffectedCollections(\n changedFiles: string[],\n collections: Array<{ name: string; inputFile: string }>,\n dependencyGraph: DependencyGraph\n): string[] {\n const affected = new Set<string>();\n\n // Find directly affected collections\n for (const file of changedFiles) {\n const fileName = basename(file);\n\n for (const collection of collections) {\n const collectionFile = basename(collection.inputFile);\n\n if (collectionFile === fileName) {\n affected.add(collection.name);\n\n // Add dependent collections\n const deps = dependencyGraph.collections.get(collection.name);\n if (deps) {\n for (const dependent of deps.dependents) {\n affected.add(dependent);\n }\n }\n }\n }\n }\n\n return Array.from(affected);\n}\n\n// ============================================================================\n// Incremental Transform\n// ============================================================================\n\n/**\n * Filter transform options to only process changed collections\n * Returns both the options and list of affected collections\n */\nexport function filterTransformForIncremental(\n options: TransformOptions,\n analysis: IncrementalAnalysis,\n collections: Array<{ name: string; inputFile: string }>\n): { options: TransformOptions; affectedCollections: string[] } {\n // If full build needed, return original options\n if (analysis.needsFullBuild) {\n return { options, affectedCollections: [] };\n }\n\n // If no changes, return options that will skip processing\n if (analysis.changedFiles.length === 0) {\n return {\n options: {\n ...options,\n sourceDir: '',\n },\n affectedCollections: [],\n };\n }\n\n // Build dependency graph\n const graph = buildDependencyGraph(\n collections.map((c) => ({\n name: c.name,\n inputFile: c.inputFile,\n outputFiles: [], // Will be populated after transform\n }))\n );\n\n // Get affected collections\n const affectedCollections = getAffectedCollections(analysis.changedFiles, collections, graph);\n\n if (options.verbose) {\n console.info(\n ` 🎯 Incremental: processing ${affectedCollections.length}/${collections.length} collections`\n );\n for (const name of affectedCollections) {\n console.info(` - ${name}`);\n }\n }\n\n // Return original options and affected collections list\n return { options, affectedCollections };\n}\n\n/**\n * Check if a collection should be processed in incremental mode\n */\nexport function shouldProcessCollection(\n collectionName: string,\n affectedCollections?: string[]\n): boolean {\n // If no incremental filter, process all\n if (!affectedCollections || affectedCollections.length === 0) {\n return true;\n }\n\n // Check if in affected list\n return affectedCollections.includes(collectionName);\n}\n\n// ============================================================================\n// Cache Updates\n// ============================================================================\n\n/**\n * Update cache after successful incremental build\n */\nexport async function updateCacheAfterBuild(\n cacheService: CacheService | undefined,\n sourceFiles: string[],\n outputFiles: string[],\n sourceDir: string,\n collectionsDir: string,\n verbose: boolean\n): Promise<void> {\n if (!cacheService) {\n return;\n }\n\n const updates: Array<{ filePath: string; relativePath: string; outputs: string[] }> = [];\n\n // Update source file cache entries\n for (const sourceFile of sourceFiles) {\n const relativePath = relative(sourceDir, sourceFile);\n\n // Find corresponding output files\n const sourceBaseName = basename(sourceFile, '.json');\n const relatedOutputs = outputFiles.filter((f) => {\n const outputBaseName = basename(f, '.json');\n return outputBaseName.includes(sourceBaseName);\n });\n\n updates.push({\n filePath: sourceFile,\n relativePath,\n outputs: relatedOutputs.map((f) => relative(collectionsDir, f)),\n });\n }\n\n // Batch update cache\n await cacheService.updateCacheEntries(\n updates.map((u) => ({\n filePath: u.filePath,\n outputs: u.outputs,\n })),\n sourceDir\n );\n\n if (verbose) {\n console.info(` 💾 Cache updated: ${updates.length} entries`);\n }\n}\n\n/**\n * Generate incremental build report\n */\nexport function generateIncrementalReport(\n analysis: IncrementalAnalysis,\n startTime: number,\n collectionsProcessed: number,\n totalCollections: number\n): string {\n const duration = Date.now() - startTime;\n const lines: string[] = [];\n\n lines.push('\\n📊 Incremental Build Report');\n lines.push('─'.repeat(50));\n\n if (analysis.needsFullBuild) {\n lines.push(`Reason: ${analysis.fullBuildReason}`);\n lines.push(`Duration: ${duration}ms`);\n } else if (analysis.changedFiles.length === 0) {\n lines.push('Result: No changes detected');\n lines.push(`Duration: ${duration}ms`);\n lines.push(`Time saved: ~${duration}ms (100%)`);\n } else {\n const savedCollections = totalCollections - collectionsProcessed;\n const savedPercentage = ((savedCollections / totalCollections) * 100).toFixed(1);\n\n lines.push(`Files analyzed: ${analysis.totalFiles}`);\n lines.push(`Files changed: ${analysis.changedFiles.length}`);\n lines.push(`Files unchanged: ${analysis.unchangedFiles.length}`);\n lines.push(`Collections processed: ${collectionsProcessed}/${totalCollections}`);\n lines.push(`Collections skipped: ${savedCollections} (${savedPercentage}%)`);\n lines.push(`Duration: ${duration}ms`);\n }\n\n lines.push('─'.repeat(50));\n\n return lines.join('\\n');\n}\n","/**\n * Mode Extractor Module\n *\n * Extracts specific modes from nested Figma token structures.\n * Handles the conversion from Figma's nested mode structure to flat token files.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/mode-extractor\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Mode extraction options\n */\nexport interface ModeExtractionOptions {\n /** Mode name to extract (e.g., 'Light', 'Dark') */\n modeName: string;\n /** Path to the modes in the token structure (e.g., ['Foundation', 'modes']) */\n modesPath?: string[];\n /** Whether to preserve non-mode tokens */\n preserveNonModeTokens?: boolean;\n}\n\n/**\n * Mode extraction result\n */\nexport interface ModeExtractionResult {\n /** Extracted tokens for the specified mode */\n tokens: Record<string, unknown>;\n /** Mode name that was extracted */\n modeName: string;\n /** Whether any tokens were found */\n hasTokens: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Deep clone an object\n */\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Get nested value from object using path array\n * Uses hasOwn.call() to prevent prototype pollution attacks\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string[]): unknown {\n const hasOwn = Object.prototype.hasOwnProperty;\n let current: unknown = obj;\n\n for (const key of path) {\n if (\n current &&\n typeof current === 'object' &&\n !Array.isArray(current) &&\n hasOwn.call(current, key)\n ) {\n current = (current as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n// ============================================================================\n// Main Extraction Functions\n// ============================================================================\n\n/**\n * Extract a specific mode from token structure\n *\n * @param tokens - Source token object\n * @param options - Extraction options\n * @returns Extracted tokens for the specified mode\n *\n * @example\n * ```typescript\n * const tokens = {\n * Foundation: {\n * modes: {\n * Light: { colors: { primary: { $value: '#0000ff' } } },\n * Dark: { colors: { primary: { $value: '#ffffff' } } }\n * }\n * }\n * };\n *\n * const result = extractMode(tokens, {\n * modeName: 'Light',\n * modesPath: ['Foundation', 'modes']\n * });\n * // result.tokens = { colors: { primary: { $value: '#0000ff' } } }\n * ```\n */\nexport function extractMode(\n tokens: Record<string, unknown>,\n options: ModeExtractionOptions\n): ModeExtractionResult {\n const { modeName, modesPath = ['Foundation', 'modes'], preserveNonModeTokens = true } = options;\n\n // Clone to avoid mutations\n const clonedTokens = deepClone(tokens);\n\n // Get the modes object\n const modesObj = getNestedValue(clonedTokens, modesPath);\n\n if (!modesObj || typeof modesObj !== 'object') {\n return {\n tokens: preserveNonModeTokens ? clonedTokens : {},\n modeName,\n hasTokens: Object.keys(clonedTokens).length > 0,\n };\n }\n\n // Get the specific mode\n const modeTokens = (modesObj as Record<string, unknown>)[modeName];\n\n if (!modeTokens || typeof modeTokens !== 'object') {\n return {\n tokens: preserveNonModeTokens ? clonedTokens : {},\n modeName,\n hasTokens: false,\n };\n }\n\n // Build result: preserve structure but replace mode content\n const result = preserveNonModeTokens ? deepClone(clonedTokens) : {};\n\n // Navigate to the modes parent and replace with mode-specific tokens\n let current: Record<string, unknown> = result;\n for (let i = 0; i < modesPath.length - 1; i++) {\n const key = modesPath[i];\n if (!key) {\n continue;\n }\n\n if (!(key in current)) {\n current[key] = {};\n }\n const next = current[key];\n if (next && typeof next === 'object') {\n current = next as Record<string, unknown>;\n }\n }\n\n // Replace the modes object with the specific mode content\n const lastKey = modesPath[modesPath.length - 1];\n if (lastKey) {\n current[lastKey] = modeTokens;\n }\n\n return {\n tokens: result,\n modeName,\n hasTokens: true,\n };\n}\n\n/**\n * Extract multiple modes from token structure\n *\n * @param tokens - Source token object\n * @param modeNames - Array of mode names to extract\n * @param modesPath - Path to modes in structure\n * @returns Map of mode name to extracted tokens\n *\n * @example\n * ```typescript\n * const results = extractModes(tokens, ['Light', 'Dark']);\n * // results.get('Light') = light mode tokens\n * // results.get('Dark') = dark mode tokens\n * ```\n */\nexport function extractModes(\n tokens: Record<string, unknown>,\n modeNames: string[],\n modesPath: string[] = ['Foundation', 'modes']\n): Map<string, ModeExtractionResult> {\n const results = new Map<string, ModeExtractionResult>();\n\n for (const modeName of modeNames) {\n const result = extractMode(tokens, { modeName, modesPath });\n results.set(modeName, result);\n }\n\n return results;\n}\n\n/**\n * Auto-detect available modes in token structure\n *\n * @param tokens - Source token object\n * @param modesPath - Path to modes in structure\n * @returns Array of detected mode names\n *\n * @example\n * ```typescript\n * const modes = detectModes(tokens);\n * // modes = ['Light', 'Dark']\n * ```\n */\nexport function detectModes(\n tokens: Record<string, unknown>,\n modesPath: string[] = ['Foundation', 'modes']\n): string[] {\n const modesObj = getNestedValue(tokens, modesPath);\n\n if (!modesObj || typeof modesObj !== 'object') {\n return [];\n }\n\n const modes: string[] = [];\n for (const [key, value] of Object.entries(modesObj as Record<string, unknown>)) {\n if (value && typeof value === 'object') {\n modes.push(key);\n }\n }\n\n return modes;\n}\n\n/**\n * Flatten mode structure by hoisting mode tokens to top level\n *\n * Useful when you want to completely flatten the structure instead of preserving nesting\n *\n * @param tokens - Source token object\n * @param modeName - Mode to extract\n * @param modesPath - Path to modes\n * @returns Flattened token structure\n *\n * @example\n * ```typescript\n * const flattened = flattenModeStructure(tokens, 'Light');\n * // { colors: { primary: { $value: '#0000ff' } } }\n * ```\n */\nexport function flattenModeStructure(\n tokens: Record<string, unknown>,\n modeName: string,\n modesPath: string[] = ['Foundation', 'modes']\n): Record<string, unknown> {\n const result = extractMode(tokens, {\n modeName,\n modesPath,\n preserveNonModeTokens: false,\n });\n\n // Get just the mode content\n const modesObj = getNestedValue(result.tokens, modesPath);\n\n if (modesObj && typeof modesObj === 'object') {\n return modesObj as Record<string, unknown>;\n }\n\n return result.tokens;\n}\n","/**\n * Mode Preprocessor Module\n *\n * Preprocesses token files by extracting mode-specific tokens into separate files.\n * This allows theme builders to work with mode-specific token sets.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/mode-preprocessor\n */\n\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join, parse } from 'node:path';\n\nimport { detectModes, extractMode } from './mode-extractor.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Preprocessor configuration\n */\nexport interface PreprocessorConfig {\n /** Source directory containing original token files */\n sourceDir: string;\n /** Output directory for preprocessed files */\n outputDir: string;\n /** Files to preprocess (glob patterns or file paths) */\n files: string[];\n /** Mode names to extract (auto-detected if not provided) */\n modes?: string[];\n /** Path to modes in token structure */\n modesPath?: string[];\n /** Whether to preserve original files */\n preserveOriginals?: boolean;\n /** Whether to clean output directory before processing */\n clean?: boolean;\n /** Enable verbose logging */\n verbose?: boolean;\n}\n\n/**\n * Preprocessing result for a single file\n */\nexport interface FilePreprocessingResult {\n /** Original file path */\n sourceFile: string;\n /** Detected or configured modes */\n modes: string[];\n /** Generated output files by mode */\n outputFiles: Map<string, string>;\n /** Whether preprocessing succeeded */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Overall preprocessing result\n */\nexport interface PreprocessingResult {\n /** Results for each processed file */\n files: FilePreprocessingResult[];\n /** Total files processed */\n totalFiles: number;\n /** Number of successful preprocessings */\n successCount: number;\n /** Number of failed preprocessings */\n failureCount: number;\n /** Output directory used */\n outputDir: string;\n /** Cleanup function to remove preprocessed files */\n cleanup: () => void;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate output filename for a mode\n */\nfunction generateModeFilename(\n originalFilename: string,\n modeName: string,\n isDefault: boolean\n): string {\n const parsed = parse(originalFilename);\n\n // Default mode keeps original name, others get suffix\n if (isDefault) {\n return originalFilename;\n }\n\n const suffix = modeName.toLowerCase();\n return `${parsed.name}-${suffix}${parsed.ext}`;\n}\n\n/**\n * Read and parse JSON file\n */\nfunction readJsonFile(filePath: string): Record<string, unknown> | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as Record<string, unknown>;\n } catch (error) {\n console.error(`Failed to read ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Write JSON file with formatting\n */\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): boolean {\n try {\n const content = JSON.stringify(data, null, 2);\n writeFileSync(filePath, content, 'utf-8');\n return true;\n } catch (error) {\n console.error(`Failed to write ${filePath}:`, error);\n return false;\n }\n}\n\n// ============================================================================\n// Main Preprocessing Functions\n// ============================================================================\n\n/**\n * Preprocess a single token file\n *\n * @param filePath - Path to the token file\n * @param config - Preprocessor configuration\n * @returns Preprocessing result\n */\nexport function preprocessFile(\n filePath: string,\n config: PreprocessorConfig\n): FilePreprocessingResult {\n const { outputDir, modes: configuredModes, modesPath, verbose } = config;\n\n const result: FilePreprocessingResult = {\n sourceFile: filePath,\n modes: [],\n outputFiles: new Map(),\n success: false,\n };\n\n // Read source file\n const tokens = readJsonFile(filePath);\n if (!tokens) {\n result.error = 'Failed to read source file';\n return result;\n }\n\n // Detect or use configured modes\n const modes = configuredModes ?? detectModes(tokens, modesPath);\n result.modes = modes;\n\n if (modes.length === 0) {\n if (verbose) {\n console.warn(` ⚠️ No modes detected in ${filePath}`);\n }\n result.error = 'No modes detected';\n return result;\n }\n\n // Extract each mode to a separate file\n const filename = parse(filePath).base;\n let successCount = 0;\n\n for (let i = 0; i < modes.length; i++) {\n const modeName = modes[i];\n if (!modeName) {\n continue;\n }\n\n const isDefault = i === 0; // First mode is default\n\n // Extract mode\n const extracted = extractMode(tokens, {\n modeName,\n modesPath,\n preserveNonModeTokens: true,\n });\n\n if (!extracted.hasTokens) {\n if (verbose) {\n console.warn(` ⚠️ No tokens found for mode \"${modeName}\" in ${filename}`);\n }\n continue;\n }\n\n // Generate output filename\n const outputFilename = generateModeFilename(filename, modeName, isDefault);\n const outputPath = join(outputDir, outputFilename);\n\n // Write preprocessed file\n if (writeJsonFile(outputPath, extracted.tokens)) {\n result.outputFiles.set(modeName, outputPath);\n successCount++;\n\n if (verbose) {\n console.warn(` ✅ Extracted \"${modeName}\" → ${outputFilename}`);\n }\n } else if (verbose) {\n console.error(` ❌ Failed to write \"${modeName}\" → ${outputFilename}`);\n }\n }\n\n result.success = successCount > 0;\n return result;\n}\n\n/**\n * Preprocess all token files\n *\n * @param config - Preprocessor configuration\n * @returns Overall preprocessing result\n *\n * @example\n * ```typescript\n * const result = preprocessTokenFiles({\n * sourceDir: './src/figma-exports',\n * outputDir: './src/.preprocessed',\n * files: ['foundation.json', 'semantic.json'],\n * modes: ['Light', 'Dark'],\n * clean: true,\n * });\n *\n * // Build tokens using preprocessed files...\n *\n * // Cleanup when done\n * result.cleanup();\n * ```\n */\nexport function preprocessTokenFiles(config: PreprocessorConfig): PreprocessingResult {\n const { sourceDir, outputDir, files, clean = true, verbose = false } = config;\n\n if (verbose) {\n console.warn(`\\n🔧 Preprocessing token files...`);\n console.warn(` Source: ${sourceDir}`);\n console.warn(` Output: ${outputDir}`);\n }\n\n // Clean output directory if requested\n if (clean && existsSync(outputDir)) {\n rmSync(outputDir, { recursive: true, force: true });\n if (verbose) {\n console.warn(` 🧹 Cleaned output directory`);\n }\n }\n\n // Create output directory\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Process each file\n const results: FilePreprocessingResult[] = [];\n let successCount = 0;\n let failureCount = 0;\n\n for (const file of files) {\n const filePath = join(sourceDir, file);\n\n if (!existsSync(filePath)) {\n if (verbose) {\n console.warn(` ⚠️ File not found: ${file}`);\n }\n results.push({\n sourceFile: filePath,\n modes: [],\n outputFiles: new Map(),\n success: false,\n error: 'File not found',\n });\n failureCount++;\n continue;\n }\n\n if (verbose) {\n console.warn(`\\n 📄 Processing ${file}...`);\n }\n\n const result = preprocessFile(filePath, config);\n results.push(result);\n\n if (result.success) {\n successCount++;\n } else {\n failureCount++;\n }\n }\n\n // Summary\n if (verbose) {\n console.warn(`\\n📊 Preprocessing Summary:`);\n console.warn(` Total: ${files.length}`);\n console.warn(` Success: ${successCount}`);\n console.warn(` Failed: ${failureCount}`);\n }\n\n // Create cleanup function\n const cleanup = (): void => {\n if (existsSync(outputDir)) {\n rmSync(outputDir, { recursive: true, force: true });\n if (verbose) {\n console.warn(`\\n🧹 Cleaned up preprocessed files from ${outputDir}`);\n }\n }\n };\n\n return {\n files: results,\n totalFiles: files.length,\n successCount,\n failureCount,\n outputDir,\n cleanup,\n };\n}\n\n/**\n * Get list of preprocessed files for a specific mode\n *\n * @param result - Preprocessing result\n * @param modeName - Mode to get files for\n * @returns Array of file paths for the mode\n */\nexport function getPreprocessedFilesForMode(\n result: PreprocessingResult,\n modeName: string\n): string[] {\n const files: string[] = [];\n\n for (const fileResult of result.files) {\n const outputPath = fileResult.outputFiles.get(modeName);\n if (fileResult.success && outputPath) {\n files.push(outputPath);\n }\n }\n\n return files;\n}\n","/**\n * @file CSS Post-processing Module\n * @description Post-processes CSS files after SASS compilation\n *\n * This module applies DSAi-specific transformations to compiled CSS:\n * - Replaces `data-bs-theme` with `data-dsai-theme` for custom theme attribute\n * - Applies configurable text replacements\n *\n * @module @dsai-io/tools/tokens/postprocess\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { PostprocessOptions, PostprocessResult, ReplacementRule } from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default CSS distribution directory relative to tokens package */\nconst DEFAULT_CSS_DIR = 'dist/css';\n\n/** Default files to process */\nconst DEFAULT_FILES = ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'];\n\n/** Default transformations to apply */\nconst DEFAULT_TRANSFORMATIONS: ReplacementRule[] = [\n {\n description: 'Theme attribute',\n from: /data-bs-theme/g,\n to: 'data-dsai-theme',\n },\n];\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Apply all replacements to content\n */\nfunction applyReplacements(\n content: string,\n replacements: ReplacementRule[],\n verbose: boolean\n): { result: string; count: number } {\n let result = content;\n let totalCount = 0;\n\n for (const rule of replacements) {\n // Count matches first\n let matchCount = 0;\n\n if (typeof rule.from === 'string') {\n // For string patterns, count occurrences manually\n let pos = 0;\n const searchStr = rule.from;\n while (pos < result.length) {\n const idx = result.indexOf(searchStr, pos);\n if (idx === -1) {\n break;\n }\n matchCount++;\n pos = idx + 1;\n }\n // Replace all occurrences using split/join (safe, no regex)\n if (matchCount > 0) {\n result = result.split(rule.from).join(rule.to);\n }\n } else {\n // For regex patterns, use as-is\n const matches = result.match(rule.from);\n matchCount = matches ? matches.length : 0;\n if (matchCount > 0) {\n result = result.replace(rule.from, rule.to);\n }\n }\n\n if (matchCount > 0) {\n totalCount += matchCount;\n if (verbose) {\n const desc =\n rule.description ?? (typeof rule.from === 'string' ? rule.from : String(rule.from));\n console.info(` ✓ ${desc}: ${matchCount} replacement(s)`);\n }\n }\n }\n\n return { result, count: totalCount };\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Post-process a single CSS file\n *\n * @example\n * ```typescript\n * const result = postprocessCss({\n * inputFile: './dist/css/theme.css',\n * replacements: [\n * { from: /data-bs-theme/g, to: 'data-dsai-theme', description: 'Theme attribute' }\n * ],\n * });\n * ```\n */\nexport function postprocessCss(options: PostprocessOptions): PostprocessResult {\n const {\n inputFile,\n outputFile = inputFile,\n replacements = DEFAULT_TRANSFORMATIONS,\n dryRun = false,\n verbose = false,\n } = options;\n\n // Check if input file exists\n if (!existsSync(inputFile)) {\n return {\n success: false,\n replacementsMade: 0,\n outputFile,\n errors: [`File not found: ${inputFile}`],\n };\n }\n\n // Read input content\n let content: string;\n try {\n content = readFileSync(inputFile, 'utf-8');\n } catch (err) {\n return {\n success: false,\n replacementsMade: 0,\n outputFile,\n errors: [`Failed to read file: ${err instanceof Error ? err.message : 'Unknown error'}`],\n };\n }\n\n // Apply replacements\n const { result, count } = applyReplacements(content, replacements, verbose);\n\n // Write output if changed and not dry run\n if (count > 0 && !dryRun) {\n try {\n writeFileSync(outputFile, result, 'utf-8');\n } catch (err) {\n return {\n success: false,\n replacementsMade: count,\n outputFile,\n errors: [`Failed to write file: ${err instanceof Error ? err.message : 'Unknown error'}`],\n };\n }\n }\n\n return {\n success: true,\n replacementsMade: count,\n outputFile,\n };\n}\n\n/**\n * Post-process multiple CSS files in a directory\n *\n * @example\n * ```typescript\n * const results = postprocessCssFiles({\n * cssDir: './packages/@dsai-io/tokens/dist/css',\n * files: ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'],\n * });\n * ```\n */\nexport function postprocessCssFiles(options: {\n cssDir: string;\n files?: string[];\n replacements?: ReplacementRule[];\n dryRun?: boolean;\n verbose?: boolean;\n}): { success: boolean; filesModified: number; totalReplacements: number; errors: string[] } {\n const {\n cssDir,\n files = DEFAULT_FILES,\n replacements = DEFAULT_TRANSFORMATIONS,\n dryRun = false,\n verbose = false,\n } = options;\n\n let filesModified = 0;\n let totalReplacements = 0;\n const errors: string[] = [];\n\n if (verbose) {\n console.info('🔧 Post-processing CSS files...\\n');\n }\n\n for (const fileName of files) {\n const filePath = join(cssDir, fileName);\n\n if (verbose) {\n console.info(`📄 ${fileName}`);\n }\n\n const result = postprocessCss({\n inputFile: filePath,\n replacements,\n dryRun,\n verbose,\n });\n\n if (result.success) {\n if (result.replacementsMade > 0) {\n filesModified++;\n totalReplacements += result.replacementsMade;\n } else if (verbose) {\n console.info(' (no changes needed)');\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n if (verbose) {\n for (const err of result.errors) {\n console.warn(` ⚠️ ${err}`);\n }\n }\n }\n }\n\n if (verbose) {\n console.info(`\\n✅ Post-processing complete. ${filesModified} file(s) modified.`);\n if (totalReplacements > 0) {\n console.info(` Total replacements: ${totalReplacements}`);\n }\n }\n\n return {\n success: errors.length === 0,\n filesModified,\n totalReplacements,\n errors,\n };\n}\n\n/**\n * CLI entry point for CSS post-processing\n */\nexport function postprocessCLI(tokensDir: string): boolean {\n const cssDir = join(tokensDir, DEFAULT_CSS_DIR);\n\n const result = postprocessCssFiles({\n cssDir,\n verbose: true,\n });\n\n return result.success;\n}\n\n/**\n * Get the default CSS distribution directory path\n */\nexport function getDefaultCssDir(tokensDir: string): string {\n return join(tokensDir, DEFAULT_CSS_DIR);\n}\n\n/**\n * Get the default files to process\n */\nexport function getDefaultFiles(): string[] {\n return [...DEFAULT_FILES];\n}\n\n/**\n * Get the default transformation rules\n */\nexport function getDefaultTransformations(): ReplacementRule[] {\n return [...DEFAULT_TRANSFORMATIONS];\n}\n","/**\n * @fileoverview Token snapshot service for backup and rollback\n * Creates snapshots of token collections before transformations\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\n\n/**\n * Token snapshot metadata\n */\nexport interface TokenSnapshot {\n /** Unique snapshot ID */\n id: string;\n /** Timestamp when snapshot was created */\n timestamp: Date;\n /** Directory that was snapshotted */\n collectionsDir: string;\n /** Files included in snapshot */\n files: TokenSnapshotFile[];\n /** Optional description */\n description?: string;\n}\n\n/**\n * File in a token snapshot\n */\nexport interface TokenSnapshotFile {\n /** Relative path from collections directory */\n path: string;\n /** File content */\n content: string;\n /** SHA-256 checksum */\n checksum: string;\n}\n\n/**\n * Snapshot configuration\n */\nexport interface SnapshotConfig {\n /** Directory to store snapshots */\n snapshotDir?: string;\n /** Maximum number of snapshots to keep */\n maxSnapshots?: number;\n /** File patterns to include (glob) */\n include?: string[];\n /** File patterns to exclude */\n exclude?: string[];\n}\n\n/**\n * Snapshot result\n */\nexport interface SnapshotResult {\n /** Whether snapshot was successful */\n success: boolean;\n /** Snapshot metadata */\n snapshot?: TokenSnapshot;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Rollback result\n */\nexport interface RollbackResult {\n /** Whether rollback was successful */\n success: boolean;\n /** Number of files restored */\n filesRestored: number;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Token snapshot service\n */\nexport class SnapshotService {\n private readonly snapshotDir: string;\n private readonly maxSnapshots: number;\n private readonly include: string[];\n private readonly exclude: string[];\n\n constructor(config: SnapshotConfig = {}) {\n this.snapshotDir = config.snapshotDir ?? '.snapshots';\n this.maxSnapshots = config.maxSnapshots ?? 10;\n this.include = config.include ?? ['**/*.json'];\n this.exclude = config.exclude ?? ['**/node_modules/**', '**/.git/**'];\n }\n\n /**\n * Create a snapshot of the collections directory\n */\n createSnapshot(collectionsDir: string, description?: string): SnapshotResult {\n try {\n // Verify directory exists\n if (!existsSync(collectionsDir)) {\n return {\n success: false,\n error: `Collections directory not found: ${collectionsDir}`,\n };\n }\n\n // Create snapshot metadata\n const snapshot: TokenSnapshot = {\n id: this.generateSnapshotId(),\n timestamp: new Date(),\n collectionsDir,\n files: [],\n description,\n };\n\n // Scan directory for files\n const files = this.scanDirectory(collectionsDir);\n if (files.length === 0) {\n return {\n success: false,\n error: 'No files found to snapshot',\n };\n }\n\n // Create snapshot files\n for (const filePath of files) {\n const fullPath = join(collectionsDir, filePath);\n const content = readFileSync(fullPath, 'utf-8');\n const checksum = this.calculateChecksum(content);\n\n snapshot.files.push({\n path: filePath,\n content,\n checksum,\n });\n }\n\n // Ensure snapshot directory exists\n if (!existsSync(this.snapshotDir)) {\n mkdirSync(this.snapshotDir, { recursive: true });\n }\n\n // Write snapshot to disk\n const snapshotPath = join(this.snapshotDir, `${snapshot.id}.json`);\n writeFileSync(snapshotPath, JSON.stringify(snapshot, null, 2), 'utf-8');\n\n // Clean up old snapshots\n this.cleanupOldSnapshots();\n\n return {\n success: true,\n snapshot,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Rollback to a specific snapshot\n */\n rollback(snapshotId: string): RollbackResult {\n try {\n // Load snapshot\n const snapshot = this.loadSnapshot(snapshotId);\n if (!snapshot) {\n return {\n success: false,\n filesRestored: 0,\n error: `Snapshot not found: ${snapshotId}`,\n };\n }\n\n // Validate snapshot\n const validationError = this.validateSnapshot(snapshot);\n if (validationError) {\n return {\n success: false,\n filesRestored: 0,\n error: validationError,\n };\n }\n\n // Ensure target directory exists\n if (!existsSync(snapshot.collectionsDir)) {\n mkdirSync(snapshot.collectionsDir, { recursive: true });\n }\n\n // Restore files\n let filesRestored = 0;\n for (const file of snapshot.files) {\n const targetPath = join(snapshot.collectionsDir, file.path);\n\n // Ensure directory exists\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Write file\n writeFileSync(targetPath, file.content, 'utf-8');\n filesRestored++;\n }\n\n return {\n success: true,\n filesRestored,\n };\n } catch (error) {\n return {\n success: false,\n filesRestored: 0,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Get list of available snapshots\n */\n listSnapshots(): TokenSnapshot[] {\n if (!existsSync(this.snapshotDir)) {\n return [];\n }\n\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\n\n const snapshots: TokenSnapshot[] = [];\n for (const file of files) {\n const snapshot = this.loadSnapshot(basename(file, '.json'));\n if (snapshot) {\n // Don't include file contents in list\n snapshots.push({\n ...snapshot,\n files: snapshot.files.map((f) => ({\n ...f,\n content: '',\n })),\n });\n }\n }\n\n // Sort by timestamp (newest first)\n return snapshots.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n }\n\n /**\n * Get the most recent snapshot\n */\n getLatestSnapshot(): TokenSnapshot | null {\n const snapshots = this.listSnapshots();\n if (snapshots.length > 0 && snapshots[0]) {\n return snapshots[0];\n }\n return null;\n }\n\n /**\n * Delete a snapshot\n */\n deleteSnapshot(snapshotId: string): boolean {\n try {\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\n if (existsSync(snapshotPath)) {\n rmSync(snapshotPath);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Delete all snapshots\n */\n clearSnapshots(): number {\n if (!existsSync(this.snapshotDir)) {\n return 0;\n }\n\n const files = readdirSync(this.snapshotDir).filter((f) => f.endsWith('.json'));\n let deleted = 0;\n\n for (const file of files) {\n try {\n rmSync(join(this.snapshotDir, file));\n deleted++;\n } catch {\n // Continue on error\n }\n }\n\n return deleted;\n }\n\n // Private methods\n\n /**\n * Generate unique snapshot ID\n */\n private generateSnapshotId(): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 9);\n return `snapshot-${timestamp}-${random}`;\n }\n\n /**\n * Calculate SHA-256 checksum\n */\n private calculateChecksum(content: string): string {\n return createHash('sha256').update(content, 'utf-8').digest('hex');\n }\n\n /**\n * Scan directory for files matching include/exclude patterns\n */\n private scanDirectory(dir: string, baseDir = dir): string[] {\n const files: string[] = [];\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = fullPath.substring(baseDir.length + 1);\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n if (!this.shouldExclude(relativePath)) {\n files.push(...this.scanDirectory(fullPath, baseDir));\n }\n } else if (entry.isFile()) {\n // Include files matching patterns\n if (this.shouldInclude(relativePath)) {\n files.push(relativePath);\n }\n }\n }\n } catch {\n // Ignore errors\n }\n\n return files;\n }\n\n /**\n * Check if path should be included\n */\n private shouldInclude(path: string): boolean {\n // Simple pattern matching (supports *.ext and **/*.ext)\n return this.include.some((pattern) => {\n if (pattern === '**/*') {\n return true;\n }\n if (pattern.startsWith('**/')) {\n // **/*.json matches any path ending with .json\n const suffix = pattern.substring(3); // Remove **/\n if (suffix.startsWith('*.')) {\n // Pattern like **/*.json - check extension\n const ext = suffix.substring(1); // .json\n return path.endsWith(ext);\n }\n return path.endsWith(suffix);\n }\n if (pattern.startsWith('*.')) {\n return path.endsWith(pattern.substring(1));\n }\n return path === pattern;\n });\n }\n\n /**\n * Check if path should be excluded\n */\n private shouldExclude(path: string): boolean {\n return this.exclude.some((pattern) => {\n if (pattern.startsWith('**/')) {\n return path.includes(pattern.substring(3).replace('/**', ''));\n }\n return path.includes(pattern);\n });\n }\n\n /**\n * Load snapshot from disk\n */\n private loadSnapshot(snapshotId: string): TokenSnapshot | null {\n try {\n const snapshotPath = join(this.snapshotDir, `${snapshotId}.json`);\n if (!existsSync(snapshotPath)) {\n return null;\n }\n\n const content = readFileSync(snapshotPath, 'utf-8');\n const snapshot = JSON.parse(content) as TokenSnapshot;\n\n // Convert timestamp string to Date\n snapshot.timestamp = new Date(snapshot.timestamp);\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n /**\n * Validate snapshot integrity\n */\n private validateSnapshot(snapshot: TokenSnapshot): string | null {\n if (!snapshot.files || snapshot.files.length === 0) {\n return 'Snapshot has no files';\n }\n\n for (const file of snapshot.files) {\n const actualChecksum = this.calculateChecksum(file.content);\n if (actualChecksum !== file.checksum) {\n return `Checksum mismatch for file: ${file.path}`;\n }\n }\n\n return null;\n }\n\n /**\n * Clean up old snapshots keeping only maxSnapshots most recent\n */\n private cleanupOldSnapshots(): void {\n if (!existsSync(this.snapshotDir)) {\n return;\n }\n\n const files = readdirSync(this.snapshotDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => ({\n name: f,\n path: join(this.snapshotDir, f),\n mtime: this.getFileModificationTime(join(this.snapshotDir, f)),\n }))\n .sort((a, b) => b.mtime - a.mtime);\n\n // Delete old snapshots\n for (let i = this.maxSnapshots; i < files.length; i++) {\n const file = files.at(i);\n if (file?.path) {\n try {\n rmSync(file.path);\n } catch {\n // Ignore errors\n }\n }\n }\n }\n\n /**\n * Get file modification time\n */\n private getFileModificationTime(path: string): number {\n try {\n const snapshot = this.loadSnapshot(basename(path, '.json'));\n return snapshot ? snapshot.timestamp.getTime() : 0;\n } catch {\n return 0;\n }\n }\n}\n","/**\n * @file Theme Builder Module\n * @description Builds token outputs for a single theme using Style Dictionary\n *\n * This module orchestrates the build process for individual themes, generating\n * the appropriate Style Dictionary configuration based on the theme definition.\n *\n * Key responsibilities:\n * - Generate Style Dictionary config for a theme\n * - Use correct CSS format based on theme type (default vs non-default)\n * - Support all output formats (CSS, SCSS, JS, TS, JSON)\n * - Generate output file paths from theme definition\n *\n * @example\n * ```typescript\n * import { buildTheme, generateThemeBuildConfig } from '@dsai-io/tools';\n *\n * const result = await buildTheme({\n * themeName: 'dark',\n * themeDefinition: {\n * isDefault: false,\n * suffix: '-dark',\n * selector: '[data-dsai-theme=\"dark\"]',\n * outputFiles: { css: 'tokens-dark.css' },\n * },\n * files: ['collections/color-dark.json', 'collections/semantic-dark.json'],\n * outputDir: 'dist',\n * config: resolvedConfig,\n * });\n * ```\n *\n * @module @dsai-io/tools/tokens/theme-builder\n */\n\nimport { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport type { OutputFormat, ResolvedThemeDefinition, ThemeDefinition } from '../config/types.js';\nimport type { StyleDictionaryInstance } from './style-dictionary/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal configuration required for theme building\n *\n * This interface only includes the properties actually used by the theme builder,\n * allowing callers to pass either a full ResolvedTokensConfig or a minimal object.\n */\nexport interface ThemeBuildConfig {\n /** Output formats to generate */\n formats: OutputFormat[];\n\n /** Theme definitions (used by buildAllThemes to lookup theme metadata) */\n themes?: {\n definitions?: Record<string, ThemeDefinition | ResolvedThemeDefinition>;\n };\n}\n\n/**\n * Options for building a single theme\n */\nexport interface ThemeBuildOptions {\n /** Name of the theme (e.g., 'light', 'dark', 'pro') */\n themeName: string;\n\n /** Resolved theme definition with all required fields */\n themeDefinition: ResolvedThemeDefinition;\n\n /** Array of token file paths for this theme */\n files: string[];\n\n /** Output directory for generated files */\n outputDir: string;\n\n /** Build configuration (formats and optionally theme definitions) */\n config: ThemeBuildConfig;\n\n /** Enable verbose logging */\n verbose?: boolean;\n\n /** Skip cache lookup (force rebuild) */\n skipCache?: boolean;\n}\n\n/**\n * Result of building a single theme\n */\nexport interface ThemeBuildResult {\n /** Whether the build succeeded */\n success: boolean;\n\n /** Theme name that was built */\n themeName: string;\n\n /** Generated output files by format */\n outputs: Partial<Record<OutputFormat, string[]>>;\n\n /** Error message if build failed */\n error?: string;\n\n /** Duration in milliseconds */\n duration: number;\n\n /** Whether result was from cache */\n fromCache: boolean;\n}\n\n/**\n * Style Dictionary configuration for a theme\n */\nexport interface ThemeStyleDictionaryConfig {\n /** Source token files */\n source: string[];\n\n /** Platform configurations */\n platforms: Record<string, StyleDictionaryPlatformConfig>;\n\n /** Whether tokens use DTCG format ($value, $type, etc.) */\n usesDtcg?: boolean;\n\n /** Logging configuration */\n log?: {\n warnings?: 'warn' | 'error' | 'disabled';\n verbosity?: 'default' | 'silent' | 'verbose';\n errors?: {\n brokenReferences?: 'throw' | 'console';\n };\n };\n}\n\n/**\n * Style Dictionary platform configuration\n */\nexport interface StyleDictionaryPlatformConfig {\n /** Transform group to use */\n transformGroup?: string;\n\n /** Build path for outputs */\n buildPath: string;\n\n /** Output file configurations */\n files: StyleDictionaryFileConfig[];\n\n /** Custom options for formats */\n options?: Record<string, unknown>;\n}\n\n/**\n * Style Dictionary file configuration\n */\nexport interface StyleDictionaryFileConfig {\n /** Output file path (relative to buildPath) */\n destination: string;\n\n /** Format to use for output */\n format: string;\n\n /** Filter for tokens to include */\n filter?: Record<string, unknown>;\n\n /** Format-specific options */\n options?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Format config type for mapping\n */\ninterface FormatConfig {\n default: string;\n themed: string;\n}\n\n/**\n * Mapping of OutputFormat to Style Dictionary format names\n * Using Map for safe access (avoids Object Injection Sink)\n */\nconst FORMAT_MAPPING = new Map<OutputFormat, FormatConfig>([\n ['css', { default: 'css/variables-with-comments', themed: 'css/variables-dark-mode' }],\n ['scss', { default: 'scss/variables', themed: 'scss/variables' }],\n ['js', { default: 'javascript/esm-safe', themed: 'javascript/esm-safe' }],\n ['ts', { default: 'typescript/declarations', themed: 'typescript/declarations' }],\n ['json', { default: 'json/nested', themed: 'json/nested' }],\n ['android', { default: 'android/resources', themed: 'android/resources' }],\n ['ios', { default: 'ios/macros', themed: 'ios/macros' }],\n]);\n\n/**\n * Default Style Dictionary transform groups by platform\n * Using Map for safe access (avoids Object Injection Sink)\n * Note: Style Dictionary built-in groups are: web, js, scss, css, less, html, android, compose, ios, ios-swift, assets, flutter, react-native\n *\n * We use 'js-custom' for JS/TS to ensure valid JavaScript identifiers with our custom name/js-identifier transform\n */\nconst TRANSFORM_GROUPS = new Map<OutputFormat, string>([\n ['css', 'css'],\n ['scss', 'scss'],\n ['js', 'js-custom'], // Use custom transform group for valid JS identifiers\n ['ts', 'js-custom'], // TypeScript uses same transforms as JS\n ['json', 'web'], // JSON uses web transforms (no \"json\" transformGroup exists)\n ['android', 'android'],\n ['ios', 'ios'],\n]);\n\n// ============================================================================\n// Configuration Generators\n// ============================================================================\n\n/**\n * Generate Style Dictionary configuration for a single theme\n *\n * @param options - Theme build options\n * @returns Style Dictionary configuration object\n *\n * @example\n * ```typescript\n * const sdConfig = generateThemeBuildConfig({\n * themeName: 'dark',\n * themeDefinition: { isDefault: false, selector: '[data-dsai-theme=\"dark\"]' },\n * files: ['collections/color-dark.json'],\n * outputDir: 'dist',\n * config: resolvedConfig,\n * });\n * // Returns Style Dictionary config with dark mode format\n * ```\n */\nexport function generateThemeBuildConfig(options: ThemeBuildOptions): ThemeStyleDictionaryConfig {\n const { themeDefinition, files, outputDir, config } = options;\n const isDefault = themeDefinition.isDefault;\n\n // Build platforms based on enabled formats using Map for safe access\n const platformsMap = new Map<string, StyleDictionaryPlatformConfig>();\n const enabledFormats = config.formats;\n\n for (const format of enabledFormats) {\n const platformConfig = generatePlatformConfig(format, themeDefinition, outputDir, isDefault);\n if (platformConfig) {\n platformsMap.set(format, platformConfig);\n }\n }\n\n // Convert Map to object for Style Dictionary compatibility\n const platforms: Record<string, StyleDictionaryPlatformConfig> = Object.fromEntries(platformsMap);\n\n return {\n source: files,\n platforms,\n // Enable DTCG format support (tokens with $value, $type, etc.)\n usesDtcg: true,\n // Configure logging to not throw on broken references (they'll be logged but build continues)\n log: {\n warnings: 'warn' as const,\n verbosity: 'default' as const,\n errors: {\n brokenReferences: 'console' as const,\n },\n },\n };\n}\n\n/**\n * Generate platform configuration for a specific output format\n *\n * @param format - Output format (css, scss, js, etc.)\n * @param themeDefinition - Theme definition\n * @param outputDir - Output directory\n * @param isDefault - Whether this is the default theme\n * @returns Style Dictionary platform configuration\n */\nfunction generatePlatformConfig(\n format: OutputFormat,\n themeDefinition: ResolvedThemeDefinition,\n outputDir: string,\n isDefault: boolean\n): StyleDictionaryPlatformConfig | null {\n const formatConfig = FORMAT_MAPPING.get(format);\n if (!formatConfig) {\n console.warn(`Unknown format: ${format}`);\n return null;\n }\n\n const sdFormat = isDefault ? formatConfig.default : formatConfig.themed;\n\n // Use Map for safe access to outputFiles\n const outputFilesMap = new Map(Object.entries(themeDefinition.outputFiles));\n const outputFile = outputFilesMap.get(format) ?? `tokens.${format}`;\n\n // Determine subdirectory based on format\n const subDir = getFormatSubdirectory(format);\n const buildPath = subDir ? join(outputDir, subDir) + '/' : outputDir + '/';\n\n const fileConfig: StyleDictionaryFileConfig = {\n destination: outputFile,\n format: sdFormat,\n };\n\n // Add selector option for themed CSS\n if (format === 'css' && !isDefault) {\n fileConfig.options = {\n selector: themeDefinition.selector,\n };\n }\n\n // Add media query if defined\n if (themeDefinition.mediaQuery && format === 'css' && !isDefault) {\n const existingOptions = fileConfig.options ?? {};\n fileConfig.options = {\n ...existingOptions,\n mediaQuery: themeDefinition.mediaQuery,\n };\n }\n\n const transformGroup = TRANSFORM_GROUPS.get(format) ?? format;\n\n return {\n transformGroup,\n buildPath,\n files: [fileConfig],\n };\n}\n\n/**\n * Get subdirectory for a format (e.g., 'css' -> 'css', 'js' -> 'js')\n *\n * @param format - Output format\n * @returns Subdirectory name\n */\nfunction getFormatSubdirectory(format: OutputFormat): string {\n switch (format) {\n case 'css':\n return 'css';\n case 'scss':\n return 'scss';\n case 'js':\n return 'js';\n case 'ts':\n return 'ts';\n case 'json':\n return 'json';\n case 'android':\n return 'android';\n case 'ios':\n return 'ios';\n default:\n return '';\n }\n}\n\n// ============================================================================\n// Build Functions\n// ============================================================================\n\n/**\n * Build token outputs for a single theme\n *\n * This function generates Style Dictionary configuration from the theme\n * definition and runs the build process. For default themes, it uses\n * `css/variables-with-comments` format with `:root` selector. For\n * non-default themes, it uses `css/variables-dark-mode` with the\n * theme-specific selector.\n *\n * @param options - Theme build options\n * @returns Build result with success status and output files\n *\n * @example\n * ```typescript\n * const result = await buildTheme({\n * themeName: 'dark',\n * themeDefinition: resolvedThemeDef,\n * files: ['collections/color-dark.json'],\n * outputDir: 'dist',\n * config: resolvedConfig,\n * verbose: true,\n * });\n *\n * if (result.success) {\n * console.log('Built files:', result.outputs);\n * }\n * ```\n */\nexport async function buildTheme(options: ThemeBuildOptions): Promise<ThemeBuildResult> {\n const startTime = Date.now();\n const { themeName, files, verbose } = options;\n\n // Validate inputs\n if (files.length === 0) {\n return {\n success: false,\n themeName,\n outputs: {},\n error: `No token files found for theme \"${themeName}\"`,\n duration: Date.now() - startTime,\n fromCache: false,\n };\n }\n\n // Validate files exist (resolve to absolute paths for checking)\n const missingFiles: string[] = [];\n for (const file of files) {\n const resolvedPath = resolve(file);\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (!existsSync(resolvedPath)) {\n missingFiles.push(file);\n }\n }\n if (missingFiles.length > 0) {\n return {\n success: false,\n themeName,\n outputs: {},\n error: `Missing token files for theme \"${themeName}\": ${missingFiles.join(', ')}`,\n duration: Date.now() - startTime,\n fromCache: false,\n };\n }\n\n if (verbose) {\n console.warn(`🎨 Building theme: ${themeName}`);\n console.warn(` Files: ${files.length}`);\n console.warn(` Default: ${options.themeDefinition.isDefault}`);\n console.warn(` Selector: ${options.themeDefinition.selector}`);\n }\n\n try {\n // Generate Style Dictionary configuration\n const sdConfig = generateThemeBuildConfig(options);\n\n if (verbose) {\n console.warn(` Platforms: ${Object.keys(sdConfig.platforms).join(', ')}`);\n console.warn(` Enabled formats: ${options.config.formats.join(', ')}`);\n // Debug: show platform build paths\n for (const [platform, platformCfg] of Object.entries(sdConfig.platforms)) {\n console.warn(\n ` ${platform}: ${platformCfg.buildPath} -> ${platformCfg.files[0]?.destination}`\n );\n }\n }\n\n // Run Style Dictionary build\n const outputs = await runStyleDictionaryBuild(sdConfig, options);\n\n return {\n success: true,\n themeName,\n outputs,\n duration: Date.now() - startTime,\n fromCache: false,\n };\n } catch (error) {\n return {\n success: false,\n themeName,\n outputs: {},\n error: error instanceof Error ? error.message : 'Unknown build error',\n duration: Date.now() - startTime,\n fromCache: false,\n };\n }\n}\n\n/**\n * Run Style Dictionary build with generated configuration\n *\n * @param sdConfig - Style Dictionary configuration\n * @param options - Build options for context\n * @returns Map of format to output file paths\n */\nasync function runStyleDictionaryBuild(\n sdConfig: ThemeStyleDictionaryConfig,\n options: ThemeBuildOptions\n): Promise<Partial<Record<OutputFormat, string[]>>> {\n // Dynamic import to avoid circular dependencies\n const StyleDictionaryModule = await import('style-dictionary');\n const StyleDictionary = StyleDictionaryModule.default;\n\n // Register custom formats using type assertion for compatibility\n const { registerFormats: registerCustomFormats } = await import(\n './style-dictionary/formats/index.js'\n );\n registerCustomFormats(StyleDictionary as unknown as StyleDictionaryInstance);\n\n // Register custom transforms\n const { registerTransforms: registerCustomTransforms } = await import(\n './style-dictionary/transforms/index.js'\n );\n registerCustomTransforms(StyleDictionary as unknown as StyleDictionaryInstance);\n\n // Register custom transform groups (including js-custom with name/js-identifier)\n const { registerTransformGroups } = await import('./style-dictionary/groups/index.js');\n registerTransformGroups(StyleDictionary as unknown as StyleDictionaryInstance);\n\n // Debug: log platforms being built\n if (options.verbose) {\n console.warn(` 🔧 Style Dictionary platforms:`);\n for (const [platform, config] of Object.entries(sdConfig.platforms)) {\n console.warn(\n ` ${platform}: transformGroup=\"${config.transformGroup}\", format=\"${config.files[0]?.format}\"`\n );\n }\n }\n\n // Create and build Style Dictionary instance\n // Note: The built-in 'js' transform group includes 'name/pascal' which\n // generates valid JS identifiers like 'Spacing0', 'NeutralGray100', etc.\n const sd = new StyleDictionary(sdConfig);\n\n // Build all platforms and capture any errors\n try {\n await sd.buildAllPlatforms();\n } catch (error) {\n console.error(`❌ Style Dictionary build failed:`, error);\n throw error;\n }\n\n // Collect output files using Map for safe access\n const outputsMap = new Map<OutputFormat, string[]>();\n\n for (const [platformName, platformConfig] of Object.entries(sdConfig.platforms)) {\n const format = platformName as OutputFormat;\n const outputFiles = platformConfig.files.map((f) =>\n join(platformConfig.buildPath, f.destination)\n );\n outputsMap.set(format, outputFiles);\n }\n\n const outputs: Partial<Record<OutputFormat, string[]>> = Object.fromEntries(outputsMap);\n\n if (options.verbose) {\n const totalFiles = Object.values(outputs).flat().length;\n console.warn(` ✅ Generated ${totalFiles} output files`);\n // Debug: check if files actually exist\n for (const [format, files] of Object.entries(outputs)) {\n for (const file of files) {\n const exists = existsSync(file);\n if (!exists) {\n console.warn(` ⚠️ Missing: ${format} -> ${file}`);\n }\n }\n }\n }\n\n return outputs;\n}\n\n// ============================================================================\n// Batch Build Functions\n// ============================================================================\n\n/**\n * Options for building multiple themes\n */\nexport interface MultiThemeBuildOptions {\n /** Build configuration with formats and theme definitions */\n config: ThemeBuildConfig;\n\n /** Map of theme name to file paths */\n themeFiles: Map<string, string[]>;\n\n /** Output directory for all themes */\n outputDir: string;\n\n /** Enable verbose logging */\n verbose?: boolean;\n\n /** Only build these specific themes (if not set, build all) */\n themes?: string[];\n\n /** Skip cache lookup */\n skipCache?: boolean;\n}\n\n/**\n * Result of building multiple themes\n */\nexport interface MultiThemeBuildResult {\n /** Overall success (true if all themes succeeded) */\n success: boolean;\n\n /** Individual theme results */\n results: ThemeBuildResult[];\n\n /** Total duration in milliseconds */\n duration: number;\n\n /** Number of themes built successfully */\n successCount: number;\n\n /** Number of themes that failed */\n failCount: number;\n}\n\n/**\n * Build multiple themes in sequence\n *\n * This function iterates through all configured themes and builds each one\n * using the appropriate Style Dictionary configuration. It collects results\n * and returns a summary of the build process.\n *\n * @param options - Multi-theme build options\n * @returns Aggregated build results\n *\n * @example\n * ```typescript\n * const result = await buildAllThemes({\n * config: resolvedConfig,\n * themeFiles: new Map([\n * ['light', ['collections/color.json']],\n * ['dark', ['collections/color-dark.json']],\n * ]),\n * outputDir: 'dist',\n * verbose: true,\n * });\n *\n * console.log(`Built ${result.successCount}/${result.results.length} themes`);\n * ```\n */\nexport async function buildAllThemes(\n options: MultiThemeBuildOptions\n): Promise<MultiThemeBuildResult> {\n const startTime = Date.now();\n const { config, themeFiles, outputDir, verbose, themes } = options;\n\n // Get theme definitions\n const definitions = config.themes?.definitions ?? {};\n const definitionsMap = new Map(Object.entries(definitions));\n\n // Determine which themes to build\n const themesToBuild = themes ?? Array.from(themeFiles.keys());\n const results: ThemeBuildResult[] = [];\n\n if (verbose) {\n console.warn(`\\n🎨 Building ${themesToBuild.length} themes...`);\n }\n\n // Find the default theme's files (needed for non-default themes to resolve references)\n const defaultThemeName = Array.from(definitionsMap.entries()).find(\n ([_, def]) => def.isDefault\n )?.[0];\n const defaultThemeFiles = defaultThemeName ? (themeFiles.get(defaultThemeName) ?? []) : [];\n\n // Build each theme\n for (const themeName of themesToBuild) {\n const rawThemeDefinition = definitionsMap.get(themeName);\n const themeSpecificFiles = themeFiles.get(themeName);\n\n if (!rawThemeDefinition) {\n results.push({\n success: false,\n themeName,\n outputs: {},\n error: `No theme definition found for \"${themeName}\"`,\n duration: 0,\n fromCache: false,\n });\n continue;\n }\n\n if (!themeSpecificFiles || themeSpecificFiles.length === 0) {\n results.push({\n success: false,\n themeName,\n outputs: {},\n error: `No files found for theme \"${themeName}\"`,\n duration: 0,\n fromCache: false,\n });\n continue;\n }\n\n // For non-default themes, include default theme files first, then theme-specific files\n // This allows references to be resolved and theme-specific values to override defaults\n const isDefault = rawThemeDefinition.isDefault ?? false;\n let files: string[];\n if (isDefault) {\n files = themeSpecificFiles;\n } else {\n // Include default files first, then theme-specific files (which override)\n files = [...defaultThemeFiles, ...themeSpecificFiles];\n }\n\n // Resolve the theme definition to ensure all required fields are present\n const baseOutputFiles = rawThemeDefinition.outputFiles ?? {};\n const themeDefinition: ResolvedThemeDefinition = {\n isDefault,\n suffix: rawThemeDefinition.suffix ?? (isDefault ? null : `-${themeName}`),\n selector:\n rawThemeDefinition.selector ?? (isDefault ? ':root' : `[data-dsai-theme=\"${themeName}\"]`),\n mediaQuery: rawThemeDefinition.mediaQuery,\n dataAttribute: rawThemeDefinition.dataAttribute ?? `data-dsai-theme=\"${themeName}\"`,\n outputFiles: {\n css: baseOutputFiles.css ?? (isDefault ? 'tokens.css' : `tokens-${themeName}.css`),\n scss:\n baseOutputFiles.scss ?? (isDefault ? '_variables.scss' : `_variables-${themeName}.scss`),\n js: baseOutputFiles.js ?? (isDefault ? 'tokens.js' : `tokens-${themeName}.js`),\n ts: baseOutputFiles.ts ?? (isDefault ? 'tokens.d.ts' : `tokens-${themeName}.d.ts`),\n json: baseOutputFiles.json ?? (isDefault ? 'tokens.json' : `tokens-${themeName}.json`),\n android: baseOutputFiles.android ?? (isDefault ? 'tokens.xml' : `tokens-${themeName}.xml`),\n ios: baseOutputFiles.ios ?? (isDefault ? 'tokens.h' : `tokens-${themeName}.h`),\n },\n };\n\n const result = await buildTheme({\n themeName,\n themeDefinition,\n files,\n outputDir,\n config,\n verbose,\n skipCache: options.skipCache,\n });\n\n results.push(result);\n }\n\n // Calculate totals\n const successCount = results.filter((r) => r.success).length;\n const failCount = results.filter((r) => !r.success).length;\n\n if (verbose) {\n console.warn(`\\n📊 Theme Build Summary`);\n console.warn(` Total: ${results.length}`);\n console.warn(` Success: ${successCount}`);\n console.warn(` Failed: ${failCount}`);\n console.warn(` Duration: ${Date.now() - startTime}ms`);\n\n // Log failed themes\n const failed = results.filter((r) => !r.success);\n if (failed.length > 0) {\n console.warn(`\\n❌ Failed themes:`);\n for (const f of failed) {\n console.warn(` - ${f.themeName}: ${f.error}`);\n }\n }\n }\n\n return {\n success: failCount === 0,\n results,\n duration: Date.now() - startTime,\n successCount,\n failCount,\n };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the appropriate CSS format for a theme\n *\n * @param isDefault - Whether this is the default theme\n * @returns Style Dictionary format name\n */\nexport function getCssFormat(isDefault: boolean): string {\n return isDefault ? 'css/variables-with-comments' : 'css/variables-dark-mode';\n}\n\n/**\n * Get the CSS selector for a theme\n *\n * @param themeDefinition - Resolved theme definition\n * @returns CSS selector string\n */\nexport function getThemeSelector(themeDefinition: ResolvedThemeDefinition): string {\n return themeDefinition.isDefault ? ':root' : themeDefinition.selector;\n}\n\n/**\n * Validate theme definitions for conflicts\n *\n * Checks for:\n * - Multiple default themes\n * - Duplicate selectors\n * - Duplicate suffixes\n *\n * @param definitions - Map of theme name to definition\n * @returns Array of validation error messages\n */\nexport function validateThemeDefinitions(\n definitions: Map<string, ResolvedThemeDefinition>\n): string[] {\n const errors: string[] = [];\n const selectors = new Map<string, string>();\n const suffixes = new Map<string, string>();\n let defaultCount = 0;\n let defaultTheme = '';\n\n for (const [name, def] of definitions) {\n // Check for multiple defaults\n if (def.isDefault) {\n defaultCount++;\n if (defaultCount > 1) {\n errors.push(`Multiple default themes defined: \"${defaultTheme}\" and \"${name}\"`);\n }\n defaultTheme = name;\n }\n\n // Check for duplicate selectors\n const existingSelector = selectors.get(def.selector);\n if (existingSelector) {\n errors.push(\n `Duplicate selector \"${def.selector}\" used by themes \"${existingSelector}\" and \"${name}\"`\n );\n } else {\n selectors.set(def.selector, name);\n }\n\n // Check for duplicate suffixes\n const suffix = def.suffix ?? '';\n const existingSuffix = suffixes.get(suffix);\n if (existingSuffix && suffix !== '') {\n errors.push(`Duplicate suffix \"${suffix}\" used by themes \"${existingSuffix}\" and \"${name}\"`);\n } else if (suffix !== '') {\n suffixes.set(suffix, name);\n }\n }\n\n // Ensure at least one default\n if (defaultCount === 0 && definitions.size > 0) {\n errors.push('No default theme defined. One theme must have isDefault: true');\n }\n\n return errors;\n}\n","/**\n * Theme Discovery Module\n *\n * Discovers and categorizes token files by theme based on file suffix patterns.\n * Supports both auto-detection from file names and explicit theme definitions.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/theme-discovery\n */\n\nimport path from 'node:path';\n\nimport fg from 'fast-glob';\n\nimport type { ResolvedThemeDefinition, ResolvedThemesConfig } from '../config/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of theme file discovery\n */\nexport interface ThemeFilesResult {\n /** Theme name */\n theme: string;\n /** Theme definition */\n definition: ResolvedThemeDefinition;\n /** Files belonging to this theme */\n files: string[];\n}\n\n/**\n * Discovery result with all themes\n */\nexport interface DiscoveryResult {\n /** Files organized by theme - Map of theme name to file paths */\n themes: Map<string, string[]>;\n /** Theme definitions organized by theme name */\n definitions: Map<string, ResolvedThemeDefinition>;\n /** Files that couldn't be matched to any theme (when autoDetect is false) */\n orphanFiles: string[];\n /** Themes with no files found */\n emptyThemes: string[];\n /** Total files discovered */\n totalFiles: number;\n}\n\n/**\n * Options for theme discovery\n */\nexport interface DiscoveryOptions {\n /** Base directory for file patterns */\n sourceDir: string;\n /** Glob pattern for finding token files */\n pattern?: string;\n /** Whether to include verbose logging */\n verbose?: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Extract theme suffixes from definitions\n */\nfunction getThemeSuffixes(\n definitions: Record<string, ResolvedThemeDefinition>\n): Map<string, string> {\n const suffixToTheme = new Map<string, string>();\n\n for (const [themeName, definition] of Object.entries(definitions)) {\n if (definition.suffix) {\n suffixToTheme.set(definition.suffix, themeName);\n }\n }\n\n return suffixToTheme;\n}\n\n/**\n * Get the default theme name from definitions\n */\nfunction getDefaultThemeName(\n definitions: Record<string, ResolvedThemeDefinition>\n): string | undefined {\n for (const [themeName, definition] of Object.entries(definitions)) {\n if (definition.isDefault) {\n return themeName;\n }\n }\n return undefined;\n}\n\n/**\n * Check if a file matches a theme suffix\n * Returns the theme name if matched, undefined otherwise\n */\nfunction matchFileSuffix(filename: string, suffixToTheme: Map<string, string>): string | undefined {\n // Remove .json extension\n const baseName = filename.replace(/\\.json$/i, '');\n\n // Check each suffix\n for (const [suffix, themeName] of suffixToTheme.entries()) {\n if (baseName.endsWith(suffix)) {\n return themeName;\n }\n }\n\n return undefined;\n}\n\n/**\n * Generate ignore patterns for non-default theme files\n */\nfunction generateIgnorePatterns(\n sourceDir: string,\n definitions: Record<string, ResolvedThemeDefinition>\n): string[] {\n const patterns: string[] = [];\n\n for (const definition of Object.values(definitions)) {\n if (definition.suffix) {\n patterns.push(`${sourceDir}/**/*${definition.suffix}.json`);\n }\n }\n\n return patterns;\n}\n\n// ============================================================================\n// Main Discovery Function\n// ============================================================================\n\n/**\n * Discover token files organized by theme\n *\n * This function scans the source directory for JSON token files and\n * categorizes them by theme based on their file suffix patterns.\n *\n * @param themesConfig - Resolved themes configuration\n * @param options - Discovery options including source directory\n * @returns Discovery result with files organized by theme\n *\n * @example\n * ```typescript\n * const result = discoverThemeFiles(themesConfig, {\n * sourceDir: 'src/collections',\n * pattern: '**\\/*.json',\n * });\n *\n * // result.themes = [\n * // { theme: 'light', files: ['foundation.json', 'semantic.json'] },\n * // { theme: 'dark', files: ['foundation-dark.json', 'semantic-dark.json'] },\n * // ]\n * ```\n */\nexport function discoverThemeFiles(\n themesConfig: ResolvedThemesConfig,\n options: DiscoveryOptions\n): DiscoveryResult {\n const { sourceDir, pattern = '**/*.json', verbose = false } = options;\n const { definitions } = themesConfig;\n\n // Build suffix mapping\n const suffixToTheme = getThemeSuffixes(definitions);\n const defaultThemeName = getDefaultThemeName(definitions);\n\n // Initialize result containers\n const themeFilesMap = new Map<string, string[]>();\n const orphanFiles: string[] = [];\n const emptyThemes: string[] = [];\n\n // Initialize theme file arrays\n for (const themeName of Object.keys(definitions)) {\n themeFilesMap.set(themeName, []);\n }\n\n // Discover all JSON files\n const allFiles = fg.sync(pattern, {\n cwd: sourceDir,\n absolute: false,\n });\n\n if (verbose) {\n console.warn(` 📂 Found ${allFiles.length} token files in ${sourceDir}`);\n }\n\n // Categorize each file\n for (const file of allFiles) {\n const filename = path.basename(file);\n const matchedTheme = matchFileSuffix(filename, suffixToTheme);\n\n if (matchedTheme) {\n // File matches a non-default theme\n const files = themeFilesMap.get(matchedTheme);\n if (files) {\n files.push(file);\n } else if (!themesConfig.autoDetect) {\n // Theme not defined and autoDetect is off\n orphanFiles.push(file);\n }\n } else if (defaultThemeName) {\n // File has no theme suffix - belongs to default theme\n themeFilesMap.get(defaultThemeName)?.push(file);\n } else {\n // No default theme defined\n orphanFiles.push(file);\n }\n }\n\n // Build result Maps\n const themesMap = new Map<string, string[]>();\n const definitionsMap = new Map<string, ResolvedThemeDefinition>();\n const themeResults: ThemeFilesResult[] = [];\n\n for (const [themeName, files] of themeFilesMap.entries()) {\n // Safe access using Map lookup since we control the keys\n const definition = definitions[themeName as keyof typeof definitions] as\n | ResolvedThemeDefinition\n | undefined;\n\n if (!definition) {\n continue;\n }\n\n const fullPaths = files.map((f) => path.join(sourceDir, f));\n\n if (files.length === 0) {\n emptyThemes.push(themeName);\n }\n\n // Add to Maps\n themesMap.set(themeName, fullPaths);\n definitionsMap.set(themeName, definition);\n\n // Also keep array format for sorting/iteration\n themeResults.push({\n theme: themeName,\n definition,\n files: fullPaths,\n });\n }\n\n // Sort themes: default first, then alphabetically\n themeResults.sort((a, b) => {\n if (a.definition.isDefault) {\n return -1;\n }\n if (b.definition.isDefault) {\n return 1;\n }\n return a.theme.localeCompare(b.theme);\n });\n\n const totalFiles = themeResults.reduce((sum, t) => sum + t.files.length, 0);\n\n if (verbose) {\n for (const { theme, files, definition } of themeResults) {\n const suffix = definition.suffix ?? '(no suffix)';\n console.warn(` 🎨 ${theme} [${suffix}]: ${files.length} files`);\n }\n if (orphanFiles.length > 0) {\n console.warn(` ⚠️ ${orphanFiles.length} orphan files (no matching theme)`);\n }\n if (emptyThemes.length > 0) {\n console.warn(` ⚠️ Empty themes: ${emptyThemes.join(', ')}`);\n }\n }\n\n return {\n themes: themesMap,\n definitions: definitionsMap,\n orphanFiles,\n emptyThemes,\n totalFiles,\n };\n}\n\n/**\n * Get files for a specific theme\n *\n * For the default theme, this returns all files EXCEPT those\n * matching other theme suffixes.\n *\n * For non-default themes, this returns only files with the\n * matching suffix.\n *\n * @param themeName - Name of the theme to get files for\n * @param themesConfig - Resolved themes configuration\n * @param options - Discovery options\n * @returns Array of file paths for the theme\n */\nexport function getThemeFiles(\n themeName: string,\n themesConfig: ResolvedThemesConfig,\n options: DiscoveryOptions\n): string[] {\n const { sourceDir, pattern = '**/*.json' } = options;\n\n // Use Map for safe access\n const definitionsMap = new Map(Object.entries(themesConfig.definitions));\n const definition = definitionsMap.get(themeName);\n\n if (!definition) {\n throw new Error(`Unknown theme: ${themeName}`);\n }\n\n if (definition.isDefault) {\n // Default theme: all files EXCEPT those with theme suffixes\n const ignorePatterns = generateIgnorePatterns(sourceDir, themesConfig.definitions);\n\n return fg.sync(path.join(sourceDir, pattern), {\n ignore: ignorePatterns,\n absolute: true,\n });\n }\n\n // Non-default theme: files with specific suffix\n if (!definition.suffix) {\n return [];\n }\n\n const suffixPattern = pattern.replace(/\\.json$/i, `${definition.suffix}.json`);\n\n return fg.sync(path.join(sourceDir, suffixPattern), {\n absolute: true,\n });\n}\n\n/**\n * Auto-detect themes from file suffixes\n *\n * Scans files in the source directory and extracts unique\n * theme suffixes to build a dynamic theme list.\n *\n * @param sourceDir - Directory to scan\n * @param pattern - Glob pattern for files\n * @param selectorPattern - Pattern for generating selectors\n * @returns Map of theme names to their suffixes\n */\nexport function autoDetectThemes(\n sourceDir: string,\n pattern: string = '**/*.json',\n selectorPattern: string = '[data-dsai-theme=\"{mode}\"]'\n): Map<string, { suffix: string | null; selector: string }> {\n const themes = new Map<string, { suffix: string | null; selector: string }>();\n\n // Get all files\n const files = fg.sync(pattern, { cwd: sourceDir });\n\n // Extract unique suffixes\n const suffixRegex = /-([a-z0-9]+)\\.json$/i;\n const foundSuffixes = new Set<string>();\n\n for (const file of files) {\n const match = suffixRegex.exec(file);\n if (match?.[1]) {\n foundSuffixes.add(match[1].toLowerCase());\n }\n }\n\n // Add default theme (light)\n themes.set('light', {\n suffix: null,\n selector: ':root',\n });\n\n // Add detected themes\n for (const suffix of foundSuffixes) {\n themes.set(suffix, {\n suffix: `-${suffix}`,\n selector: selectorPattern.replace('{mode}', suffix),\n });\n }\n\n return themes;\n}\n","/**\n * @file Token Build Module\n * @description Orchestrates the complete token build pipeline\n *\n * Runs all token build steps in sequence with clear logging:\n * 1. Validate tokens\n * 2. Transform Figma tokens\n * 3. Build Style Dictionary outputs (CSS, JS, TS, SCSS, JSON)\n * 4. Sync tokens-flat.ts\n * 5. Compile Bootstrap theme SCSS → CSS\n * 6. Post-process theme CSS (data-bs-theme → data-dsai-theme)\n * 7. Compile DSAi utilities SCSS → CSS\n * 8. Bundle with tsup (ESM + CJS)\n *\n * The pipeline is configurable via dsai.config.mjs tokens.pipeline section.\n * Packages can specify which steps to run and customize paths.\n *\n * @module @dsai-io/tools/tokens/build\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport { CacheService } from './cache.js';\nimport {\n analyzeChanges,\n generateIncrementalReport,\n updateCacheAfterBuild,\n type IncrementalOptions,\n} from './incremental.js';\nimport { preprocessTokenFiles, type FilePreprocessingResult } from './mode-preprocessor.js';\nimport { postprocessCssFiles } from './postprocess.js';\nimport { SnapshotService } from './snapshot.js';\nimport { syncTokensCLI } from './sync.js';\nimport { buildAllThemes } from './theme-builder.js';\nimport { discoverThemeFiles } from './theme-discovery.js';\nimport { transformTokens } from './transform.js';\nimport { validateTokens } from './validate.js';\n\nimport type { BuildOptions, BuildResult, BuildStep } from './types';\nimport type {\n BuildPipelinePaths,\n BuildPipelineStep,\n OutputFormat,\n TokensBuildPipeline,\n} from '../config/types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Global cleanup function for preprocessed files */\nlet preprocessCleanup: (() => void) | null = null;\n\n/** Default SASS deprecation silencing flags */\nconst SASS_FLAGS = [\n '--quiet-deps',\n '--silence-deprecation=import',\n '--silence-deprecation=global-builtin',\n '--silence-deprecation=color-functions',\n].join(' ');\n\n/** Minimal SASS flags (no color functions deprecation) */\nconst SASS_FLAGS_MINIMAL = ['--quiet-deps', '--silence-deprecation=import'].join(' ');\n\n/** Default build pipeline steps (full @dsai-io/tokens build) */\nconst DEFAULT_PIPELINE_STEPS: BuildPipelineStep[] = [\n 'validate',\n 'snapshot', // Create backup before transform\n 'preprocess', // Extract modes from nested Figma structure\n 'transform',\n 'style-dictionary',\n 'sync',\n 'sass-theme',\n 'sass-theme-minified',\n 'postprocess',\n 'sass-utilities',\n 'sass-utilities-minified',\n 'bundle',\n];\n\n/** Default pipeline paths */\nconst DEFAULT_PIPELINE_PATHS: Required<BuildPipelinePaths> = {\n syncSource: 'dist/js/tokens.js',\n syncTarget: 'src/tokens-flat.ts',\n sassThemeInput: 'src/scss/dsai-theme-bs.scss',\n sassThemeOutput: 'dist/css/dsai-theme-bs.css',\n sassThemeMinifiedOutput: 'dist/css/dsai-theme-bs.min.css',\n sassUtilitiesInput: 'src/scss/dsai-utilities.scss',\n sassUtilitiesOutput: 'dist/css/dsai.css',\n sassUtilitiesMinifiedOutput: 'dist/css/dsai.min.css',\n};\n\n// ============================================================================\n// Build Step Runner\n// ============================================================================\n\n/**\n * Run a single build step\n */\nasync function runStep(\n step: BuildStep,\n index: number,\n total: number,\n verbose: boolean\n): Promise<boolean> {\n const stepNum = `[${index + 1}/${total}]`;\n\n if (step.skip) {\n if (verbose) {\n console.info(`${stepNum} ⏭️ ${step.name} (skipped)`);\n }\n return true;\n }\n\n if (verbose) {\n console.info(`\\n${stepNum} 🔧 ${step.name}`);\n }\n\n // If step has a function, run it\n if (step.fn) {\n try {\n // Run function and await if it returns a promise\n const result = await step.fn();\n // Check if function returned false (failure)\n if (result === false) {\n console.error(` ❌ Failed: Step returned false`);\n return false;\n }\n if (verbose) {\n console.info(' ✅ Done');\n }\n return true;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error(` ❌ Failed: ${errorMsg}`);\n return false;\n }\n }\n\n // Otherwise run command\n if (step.command) {\n if (verbose) {\n const shortCmd = step.command.split(' ').slice(0, 4).join(' ');\n console.info(` $ ${shortCmd}...`);\n }\n\n try {\n execSync(step.command, {\n cwd: step.cwd ?? process.cwd(),\n stdio: verbose ? 'inherit' : 'pipe',\n env: { ...process.env, FORCE_COLOR: '1' },\n });\n if (verbose) {\n console.info(' ✅ Done');\n }\n return true;\n } catch (error) {\n console.error(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n return false;\n }\n }\n\n console.warn(` ⚠️ Step ${step.name} has no command or function`);\n return true;\n}\n\n// ============================================================================\n// Build Steps Configuration\n// ============================================================================\n\n/**\n * Get merged pipeline paths with defaults\n */\nfunction getPipelinePaths(customPaths?: BuildPipelinePaths): Required<BuildPipelinePaths> {\n return {\n ...DEFAULT_PIPELINE_PATHS,\n ...customPaths,\n };\n}\n\n/**\n * Map of step names to human-readable names\n * Using Map for safe access (avoids Object Injection Sink)\n */\nconst STEP_DISPLAY_NAMES = new Map<BuildPipelineStep, string>([\n ['validate', 'Validate Tokens'],\n ['snapshot', 'Create Snapshot Backup'],\n ['preprocess', 'Preprocess Mode Files'],\n ['transform', 'Transform Figma Tokens'],\n ['style-dictionary', 'Build Style Dictionary'],\n ['multi-theme', 'Build Multi-Theme Tokens'],\n ['sync', 'Sync tokens-flat.ts'],\n ['sass-theme', 'Compile Bootstrap Theme (unminified)'],\n ['sass-theme-minified', 'Compile Bootstrap Theme (minified)'],\n ['postprocess', 'Post-process Theme CSS'],\n ['sass-utilities', 'Compile DSAi Utilities (unminified)'],\n ['sass-utilities-minified', 'Compile DSAi Utilities (minified)'],\n ['bundle', 'Bundle with tsup'],\n]);\n\n/**\n * Create a single build step from step name\n */\nfunction createStepFromName(\n stepName: BuildPipelineStep,\n tokensPackageDir: string,\n figmaExportsDir: string,\n tokensDir: string,\n paths: Required<BuildPipelinePaths>,\n sdConfigFile: string,\n strict: boolean,\n snapshotService?: SnapshotService,\n themesConfig?: BuildOptions['themesConfig'],\n outputDir?: string,\n formats: OutputFormat[] = ['css', 'scss', 'json'],\n cssOutputDir?: string,\n postprocessConfig?: BuildOptions['postprocessConfig']\n): BuildStep {\n const displayName = STEP_DISPLAY_NAMES.get(stepName) ?? `Unknown: ${stepName}`;\n\n switch (stepName) {\n case 'validate':\n return {\n name: displayName,\n fn: async () => {\n // Create minimal config for validation\n const config = {\n tokens: {\n collectionsDir: tokensDir,\n sourceDir: figmaExportsDir,\n },\n } as Parameters<typeof validateTokens>[0];\n\n const result = await validateTokens(config, {\n verbose: true,\n strict,\n });\n\n if (!result.valid) {\n for (const error of result.errors) {\n console.error(`❌ ${error.message}`);\n }\n }\n return result.valid;\n },\n };\n\n case 'snapshot':\n return {\n name: displayName,\n fn: () => {\n if (!snapshotService) {\n console.warn(' ⚠️ Snapshot service not available, skipping');\n return true;\n }\n try {\n // tokensDir is collectionsDir from config (e.g., ./src)\n // actual collections are in tokensDir/collections\n const collectionsPath = join(tokensDir, 'collections');\n console.info(` 📂 Snapshot path: ${collectionsPath}`);\n const result = snapshotService.createSnapshot(\n collectionsPath,\n `Pre-transform backup - ${new Date().toISOString()}`\n );\n\n if (!result.success || !result.snapshot) {\n console.error(` ❌ Snapshot failed: ${result.error || 'Unknown error'}`);\n return false;\n }\n\n console.info(` 📸 Snapshot created: ${result.snapshot.id}`);\n console.info(` Files: ${result.snapshot.files.length}`);\n return true;\n } catch (error) {\n console.error(\n ` ❌ Snapshot failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n return false;\n }\n },\n };\n\n case 'preprocess':\n return {\n name: displayName,\n fn: async () => {\n try {\n const outputDir = join(figmaExportsDir, '.preprocessed');\n console.info(` 📂 Source: ${figmaExportsDir}`);\n console.info(` 📂 Output: ${outputDir}`);\n\n // Get all JSON files from the source directory\n const jsonFiles = readdirSync(figmaExportsDir).filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) {\n console.warn(` ⚠️ No JSON files found in ${figmaExportsDir}`);\n return true; // Not a failure, just skip\n }\n\n const result = preprocessTokenFiles({\n sourceDir: figmaExportsDir,\n outputDir,\n files: jsonFiles,\n modesPath: ['Foundation', 'modes'],\n verbose: true,\n });\n\n // Only fail if actual processing errors occurred (not \"no modes detected\")\n const failedFiles = result.files.filter(\n (f) => !f.success && f.error !== 'No modes detected'\n );\n if (failedFiles.length > 0) {\n console.error(` ❌ Preprocessing failed for ${failedFiles.length} file(s)`);\n for (const failed of failedFiles) {\n console.error(` - ${failed.sourceFile}: ${failed.error ?? 'Unknown error'}`);\n }\n return false;\n }\n\n const successFiles = result.files.filter((f) => f.success);\n const skippedFiles = result.files.filter((f) => f.error === 'No modes detected');\n\n console.info(` ✅ Preprocessed ${successFiles.length} file(s)`);\n if (skippedFiles.length > 0) {\n console.info(` ⏭️ Skipped ${skippedFiles.length} file(s) (no modes)`);\n }\n\n const totalModes = result.files.reduce(\n (sum: number, file: FilePreprocessingResult) => sum + file.modes.length,\n 0\n );\n console.info(` 📊 Total modes extracted: ${totalModes}`);\n\n // Store cleanup function for later\n preprocessCleanup = result.cleanup;\n\n return true;\n } catch (error) {\n console.error(\n ` ❌ Preprocessing failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n return false;\n }\n },\n };\n\n case 'transform':\n return {\n name: displayName,\n fn: () => {\n // Check if preprocessed directory exists and use it instead\n const preprocessedDir = join(figmaExportsDir, '.preprocessed');\n const sourceDir = existsSync(preprocessedDir) ? preprocessedDir : figmaExportsDir;\n\n if (sourceDir === preprocessedDir) {\n console.info(` 📂 Using preprocessed directory: ${preprocessedDir}`);\n }\n\n const result = transformTokens({\n sourceDir,\n collectionsDir: tokensDir,\n verbose: true,\n strict,\n });\n if (!result.success) {\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n }\n return result.success;\n },\n };\n\n case 'style-dictionary':\n return {\n name: displayName,\n command: `style-dictionary build --config ${sdConfigFile}`,\n cwd: tokensPackageDir,\n };\n\n case 'multi-theme':\n return {\n name: displayName,\n fn: async () => {\n // Check if themes config is provided and enabled\n if (!themesConfig?.enabled || !themesConfig?.definitions) {\n console.warn(' ⚠️ Multi-theme build requires themes config with enabled: true');\n console.warn(' ℹ️ Falling back to single-theme build via style-dictionary');\n return true; // Skip but don't fail\n }\n\n try {\n // Build minimal resolved config for theme builder\n const definitions = new Map(Object.entries(themesConfig.definitions));\n\n // Discover theme files\n const discoveryResult = discoverThemeFiles(\n {\n enabled: true,\n default: 'light',\n autoDetect: true,\n ignoreModes: [],\n selectorPattern: {\n default: ':root',\n others: '[data-dsai-theme=\"{mode}\"]',\n },\n definitions: Object.fromEntries(\n Array.from(definitions.entries()).map(([name, def]) => [\n name,\n {\n isDefault: def.isDefault ?? name === 'light',\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\n selector: def.selector,\n mediaQuery: def.mediaQuery,\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\n outputFiles: {\n css:\n def.outputFiles?.['css'] ??\n (def.isDefault ? 'tokens.css' : `tokens-${name}.css`),\n scss:\n def.outputFiles?.['scss'] ??\n (def.isDefault ? '_variables.scss' : `_variables-${name}.scss`),\n js:\n def.outputFiles?.['js'] ??\n (def.isDefault ? 'tokens.js' : `tokens-${name}.js`),\n ts:\n def.outputFiles?.['ts'] ??\n (def.isDefault ? 'tokens.d.ts' : `tokens-${name}.d.ts`),\n json:\n def.outputFiles?.['json'] ??\n (def.isDefault ? 'tokens.json' : `tokens-${name}.json`),\n android:\n def.outputFiles?.['android'] ??\n (def.isDefault ? 'tokens.xml' : `tokens-${name}.xml`),\n ios:\n def.outputFiles?.['ios'] ??\n (def.isDefault ? 'tokens.h' : `tokens-${name}.h`),\n },\n },\n ])\n ),\n },\n { sourceDir: join(tokensDir, 'collections'), verbose: true }\n );\n\n if (discoveryResult.emptyThemes.length > 0) {\n console.warn(\n ` ⚠️ Empty themes (no files): ${discoveryResult.emptyThemes.join(', ')}`\n );\n }\n\n console.info(\n ` 📂 Found ${discoveryResult.totalFiles} files across ${discoveryResult.themes.size} themes`\n );\n\n // Build all themes\n const themeFiles = discoveryResult.themes;\n\n // Convert definitions to the format buildAllThemes expects\n const themeDefinitions = Object.fromEntries(\n Array.from(definitions.entries()).map(([name, def]) => [\n name,\n {\n isDefault: def.isDefault ?? name === 'light',\n suffix: def.suffix ?? (def.isDefault ? null : `-${name}`),\n selector: def.selector,\n mediaQuery: def.mediaQuery,\n dataAttribute: def.dataAttribute ?? `data-dsai-theme=\"${name}\"`,\n outputFiles: def.outputFiles,\n },\n ])\n );\n\n const result = await buildAllThemes({\n config: {\n formats: formats,\n themes: {\n definitions: themeDefinitions,\n },\n },\n themeFiles,\n outputDir: outputDir ?? `${tokensPackageDir}/dist`,\n verbose: true,\n });\n\n if (!result.success) {\n console.error(` ❌ Multi-theme build failed: ${result.failCount} theme(s) failed`);\n for (const themeResult of result.results.filter((r) => !r.success)) {\n console.error(` - ${themeResult.themeName}: ${themeResult.error}`);\n }\n return false;\n }\n\n console.info(` ✅ Built ${result.successCount} themes in ${result.duration}ms`);\n return true;\n } catch (error) {\n console.error(\n ` ❌ Multi-theme build error: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n return false;\n }\n },\n };\n\n case 'sync':\n return {\n name: displayName,\n fn: () =>\n syncTokensCLI(tokensPackageDir, {\n syncSource: paths.syncSource,\n syncTarget: paths.syncTarget,\n }),\n };\n\n case 'sass-theme':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeOutput}`,\n cwd: tokensPackageDir,\n };\n\n case 'sass-theme-minified':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeMinifiedOutput} --style=compressed`,\n cwd: tokensPackageDir,\n };\n\n case 'postprocess':\n return {\n name: displayName,\n fn: () => {\n // Use cssOutputDir or postprocessConfig.cssDir if provided (now absolute paths from CLI)\n // Fall back to tokensPackageDir + 'dist/css' if neither is set\n const cssDir =\n cssOutputDir ?? postprocessConfig?.cssDir ?? join(tokensPackageDir, 'dist/css');\n\n const result = postprocessCssFiles({\n cssDir,\n files: postprocessConfig?.files,\n replacements: postprocessConfig?.replacements,\n verbose: true,\n });\n return result.success;\n },\n };\n\n case 'sass-utilities':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesOutput}`,\n cwd: tokensPackageDir,\n };\n\n case 'sass-utilities-minified':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesMinifiedOutput} --style=compressed`,\n cwd: tokensPackageDir,\n };\n\n case 'bundle':\n return {\n name: displayName,\n command: 'tsup',\n cwd: tokensPackageDir,\n };\n\n default:\n return {\n name: `Unknown step: ${stepName}`,\n fn: () => {\n console.warn(`⚠️ Unknown pipeline step: ${stepName}`);\n return true;\n },\n };\n }\n}\n\n/**\n * Create build steps based on options and pipeline configuration\n */\nfunction createBuildSteps(\n tokensDir: string,\n _toolsDir: string,\n options: BuildOptions,\n pipeline?: TokensBuildPipeline\n): BuildStep[] {\n const { skipValidate, skipTransform, onlyTheme, strict = false } = options;\n\n // Get the tokens package root directory\n // tokensDir is typically the collections dir (e.g., packages/@dsai-io/tokens/collections)\n // We need the package root for running commands\n const tokensPackageDir = tokensDir.endsWith('/collections')\n ? dirname(tokensDir)\n : dirname(tokensDir);\n\n // Path to figma-exports source directory\n // Use sourceDir from options if provided, otherwise use sibling directory\n const figmaExportsDir = options.sourceDir ?? `${tokensPackageDir}/figma-exports`;\n\n // Initialize snapshot service for backup/rollback\n const snapshotService = new SnapshotService({\n snapshotDir: `${tokensPackageDir}/.snapshots`,\n maxSnapshots: 10,\n include: ['**/*.json'],\n });\n\n // Get pipeline configuration\n const pipelineSteps = pipeline?.steps ?? DEFAULT_PIPELINE_STEPS;\n const paths = getPipelinePaths(pipeline?.paths);\n const sdConfigFile = pipeline?.styleDictionaryConfig ?? 'sd.config.mjs';\n\n // Get formats from options (default: css, scss, json - no js/ts by default to avoid numeric identifier issues)\n const formats = (options.formats ?? ['css', 'scss', 'json']) as OutputFormat[];\n\n // Build steps based on pipeline configuration\n const steps: BuildStep[] = [];\n\n for (const stepName of pipelineSteps) {\n const step = createStepFromName(\n stepName,\n tokensPackageDir,\n figmaExportsDir,\n tokensDir,\n paths,\n sdConfigFile,\n strict,\n snapshotService,\n options.themesConfig,\n options.outputDir,\n formats,\n options.cssOutputDir,\n options.postprocessConfig\n );\n\n // Apply skip flags based on legacy options\n if (stepName === 'validate' && skipValidate) {\n step.skip = true;\n }\n if (stepName === 'transform' && (skipTransform || onlyTheme)) {\n step.skip = true;\n }\n if (onlyTheme && !['sass-theme', 'sass-theme-minified', 'postprocess'].includes(stepName)) {\n // Only run theme-related steps when onlyTheme is true\n if (!['validate'].includes(stepName)) {\n step.skip = true;\n }\n }\n\n steps.push(step);\n }\n\n return steps;\n}\n\n// ============================================================================\n// Main Build Function\n// ============================================================================\n\n/**\n * Run the complete token build pipeline\n *\n * @example\n * ```typescript\n * // Full build\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * });\n *\n * // Skip validation\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * skipValidate: true,\n * });\n *\n * // Only build theme CSS\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * onlyTheme: true,\n * });\n * ```\n */\nexport async function buildTokens(\n tokensDir: string,\n toolsDir: string,\n options: BuildOptions = {}\n): Promise<BuildResult> {\n const {\n skipValidate,\n onlyTheme,\n verbose = true,\n quiet = false,\n incremental = false,\n force = false,\n cacheDir,\n } = options;\n\n // Use config values from options (already passed from CLI)\n // No need to reload config here - CLI already loaded it\n const cssOutputDir = options.cssOutputDir;\n const postprocessConfig = options.postprocessConfig;\n\n // Pass config to options so createBuildSteps can access it\n const optionsWithConfig: BuildOptions = {\n ...options,\n cssOutputDir,\n postprocessConfig,\n };\n\n const startTime = Date.now();\n const stepsCompleted: string[] = [];\n const stepsFailed: string[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Verify directories exist\n try {\n if (!existsSync(tokensDir)) {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Tokens directory not found: ${tokensDir}`],\n warnings,\n };\n }\n } catch {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Failed to check tokens directory: ${tokensDir}`],\n warnings,\n };\n }\n\n try {\n if (!existsSync(toolsDir)) {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Tools directory not found: ${toolsDir}`],\n warnings,\n };\n }\n } catch {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Failed to check tools directory: ${toolsDir}`],\n warnings,\n };\n }\n\n // Print header\n if (verbose && !quiet) {\n console.info('╔════════════════════════════════════════════════════════════╗');\n console.info('║ DSAi Tokens - Complete Build ║');\n console.info('╚════════════════════════════════════════════════════════════╝');\n\n if (skipValidate) {\n console.info('⚠️ Skipping validation (--skip-validate)');\n }\n if (onlyTheme) {\n console.info('⚠️ Building only theme CSS (--only-theme)');\n }\n if (incremental) {\n console.info('🔄 Incremental build enabled');\n if (force) {\n console.info('⚡ Force rebuild - ignoring cache');\n }\n }\n }\n\n // Initialize cache service for incremental builds\n let cacheService: CacheService | undefined;\n let incrementalAnalysis: Awaited<ReturnType<typeof analyzeChanges>> | undefined;\n\n if (incremental) {\n cacheService = new CacheService({\n cacheDir: cacheDir || `${tokensDir}/.dsai-cache`,\n enabled: true,\n });\n\n // Analyze what needs to be rebuilt\n const figmaExportsDir = `${tokensDir}/figma-exports`;\n const incrementalOptions: IncrementalOptions = {\n enabled: true,\n force,\n cacheService,\n verbose: verbose && !quiet,\n };\n\n incrementalAnalysis = await analyzeChanges(figmaExportsDir, incrementalOptions);\n\n // If no changes detected, skip build\n if (!incrementalAnalysis.needsFullBuild && incrementalAnalysis.changedFiles.length === 0) {\n const duration = Date.now() - startTime;\n\n if (verbose && !quiet) {\n console.info(generateIncrementalReport(incrementalAnalysis, startTime, 0, 0));\n }\n\n return {\n success: true,\n stepsCompleted: ['Cache Check'],\n stepsFailed: [],\n duration,\n errors: [],\n warnings: ['No changes detected - build skipped'],\n };\n }\n }\n\n // Create and run build steps\n const steps = createBuildSteps(\n tokensDir,\n toolsDir,\n optionsWithConfig,\n optionsWithConfig.pipeline\n );\n\n for (const step of steps) {\n const stepIndex = steps.indexOf(step);\n const success = await runStep(step, stepIndex, steps.length, verbose && !quiet);\n\n if (success) {\n if (!step.skip) {\n stepsCompleted.push(step.name);\n }\n } else {\n stepsFailed.push(step.name);\n errors.push(`Build failed at step: ${step.name}`);\n\n // Stop on first failure\n const failDuration = Date.now() - startTime;\n\n if (verbose && !quiet) {\n console.error(`\\n💥 Build failed at step: ${step.name}`);\n }\n\n return {\n success: false,\n stepsCompleted,\n stepsFailed,\n duration: failDuration,\n errors,\n warnings,\n };\n }\n }\n\n const duration = Date.now() - startTime;\n const durationSec = (duration / 1000).toFixed(2);\n\n // Update cache after successful build\n if (incremental && cacheService && incrementalAnalysis) {\n const figmaExportsDir = `${tokensDir}/figma-exports`;\n const collectionsDir = `${tokensDir}/collections`;\n\n await updateCacheAfterBuild(\n cacheService,\n incrementalAnalysis.changedFiles,\n [], // Output files - would need to track from transform step\n figmaExportsDir,\n collectionsDir,\n verbose && !quiet\n );\n\n // Show incremental build report\n if (verbose && !quiet) {\n console.info(\n generateIncrementalReport(\n incrementalAnalysis,\n startTime,\n stepsCompleted.length,\n steps.length\n )\n );\n }\n }\n\n // Cleanup preprocessed files if they exist\n if (preprocessCleanup) {\n try {\n preprocessCleanup();\n if (verbose && !quiet) {\n console.info('🧹 Cleaned up preprocessed files');\n }\n } catch (error) {\n if (verbose && !quiet) {\n console.warn(\n `⚠️ Failed to cleanup preprocessed files: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n } finally {\n preprocessCleanup = null;\n }\n }\n\n // Print footer\n if (verbose && !quiet) {\n console.info('\\n╔════════════════════════════════════════════════════════════╗');\n console.info('║ ✅ Build Complete ║');\n console.info(\n `║ 📊 ${stepsCompleted.length} steps passed in ${durationSec}s ║`\n );\n console.info('╚════════════════════════════════════════════════════════════╝');\n }\n\n return {\n success: true,\n stepsCompleted,\n stepsFailed,\n duration,\n errors,\n warnings,\n };\n}\n\n/**\n * CLI entry point for token build\n */\nexport async function buildTokensCLI(\n tokensDir: string,\n toolsDir: string,\n args: string[] = []\n): Promise<boolean> {\n const skipValidate = args.includes('--skip-validate');\n const skipTransform = args.includes('--skip-transform');\n const onlyTheme = args.includes('--only-theme');\n const quiet = args.includes('--quiet') || args.includes('-q');\n const strict = args.includes('--strict');\n const incremental = args.includes('--incremental') || args.includes('--cache');\n const force = args.includes('--force');\n\n // Extract --cache-dir argument\n const cacheDirIndex = args.findIndex((arg) => arg.startsWith('--cache-dir='));\n const cacheDirArg = cacheDirIndex >= 0 ? args.at(cacheDirIndex) : undefined;\n const cacheDir = cacheDirArg?.split('=')[1];\n\n const result = await buildTokens(tokensDir, toolsDir, {\n skipValidate,\n skipTransform,\n onlyTheme,\n verbose: !quiet,\n quiet,\n strict,\n incremental,\n force,\n cacheDir,\n });\n\n return result.success;\n}\n\n/**\n * Parse CLI arguments and run build\n * Used as the main entry point when called directly\n */\nexport async function runBuildCLI(tokensDir: string, toolsDir: string): Promise<void> {\n const args = process.argv.slice(2);\n const success = await buildTokensCLI(tokensDir, toolsDir, args);\n process.exit(success ? 0 : 1);\n}\n","/**\n * @file Token Clean Module\n * @description Provides functionality to clean token output directories before builds.\n *\n * This module supports:\n * - Cleaning individual output directories (dist/css, dist/js, etc.)\n * - Cleaning all build outputs\n * - Dry-run mode to preview what would be deleted\n * - Safe deletion with directory validation\n *\n * @module @dsai-io/tools/tokens/clean\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-non-literal-regexp */\n\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\nimport { basename, join, resolve } from 'node:path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Clean operation options\n */\nexport interface CleanOptions {\n /**\n * Base directory for cleaning (typically the package root)\n * @default process.cwd()\n */\n baseDir?: string;\n\n /**\n * Directories to clean relative to baseDir\n * @default ['dist']\n */\n directories?: string[];\n\n /**\n * Show what would be deleted without actually deleting\n * @default false\n */\n dryRun?: boolean;\n\n /**\n * Enable verbose logging\n * @default false\n */\n verbose?: boolean;\n\n /**\n * File patterns to preserve (glob patterns)\n * Files matching these patterns will not be deleted\n * @example ['.gitkeep', 'README.md']\n */\n preserve?: string[];\n}\n\n/**\n * Information about a cleaned directory\n */\nexport interface CleanedDirectory {\n /** Path to the cleaned directory */\n path: string;\n\n /** Number of files removed */\n filesRemoved: number;\n\n /** Number of directories removed */\n directoriesRemoved: number;\n\n /** Whether the directory existed before cleaning */\n existed: boolean;\n}\n\n/**\n * Result of a clean operation\n */\nexport interface CleanResult {\n /** Whether the clean operation completed successfully */\n success: boolean;\n\n /** List of cleaned directories with details */\n cleaned: CleanedDirectory[];\n\n /** Total number of files removed */\n totalFilesRemoved: number;\n\n /** Total number of directories removed */\n totalDirectoriesRemoved: number;\n\n /** Any errors encountered */\n errors: string[];\n\n /** Any warnings (non-blocking issues) */\n warnings: string[];\n\n /** Whether this was a dry run */\n dryRun: boolean;\n\n /** Duration of the operation in milliseconds */\n duration: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default directories to clean for token builds\n */\nexport const DEFAULT_CLEAN_DIRECTORIES = ['dist'] as const;\n\n/**\n * Files to always preserve\n */\nconst ALWAYS_PRESERVE = ['.gitkeep', '.gitignore'] as const;\n\n/**\n * Directories that should never be cleaned (safety check)\n */\nconst PROTECTED_DIRECTORIES = [\n 'src',\n 'node_modules',\n '.git',\n '.github',\n 'test',\n 'tests',\n '__tests__',\n 'docs',\n 'config',\n] as const;\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that a directory is safe to clean\n *\n * @param dirPath - Absolute path to the directory\n * @param baseDir - Base directory for relative validation\n * @returns Validation result with error message if invalid\n */\nfunction validateCleanTarget(dirPath: string, baseDir: string): { valid: boolean; error?: string } {\n // Ensure path is within baseDir (prevent directory traversal)\n const resolvedDir = resolve(dirPath);\n const resolvedBase = resolve(baseDir);\n\n if (!resolvedDir.startsWith(resolvedBase)) {\n return {\n valid: false,\n error: `Directory \"${dirPath}\" is outside base directory \"${baseDir}\"`,\n };\n }\n\n // Check for protected directories\n const dirName = basename(resolvedDir);\n if (PROTECTED_DIRECTORIES.includes(dirName as (typeof PROTECTED_DIRECTORIES)[number])) {\n return {\n valid: false,\n error: `Directory \"${dirName}\" is protected and cannot be cleaned`,\n };\n }\n\n // Don't allow cleaning the base directory itself\n if (resolvedDir === resolvedBase) {\n return {\n valid: false,\n error: 'Cannot clean the base directory itself',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Match a string against a glob pattern using dynamic programming\n * Safely handles * (any chars) and ? (single char) without regex\n *\n * @param str - String to match\n * @param pattern - Glob pattern\n * @returns Whether the string matches the pattern\n */\nfunction matchGlobDP(str: string, pattern: string): boolean {\n const m = str.length;\n const n = pattern.length;\n\n // Use a Map for type-safe access instead of 2D array\n const dp = new Map<string, boolean>();\n const key = (i: number, j: number): string => `${i},${j}`;\n const get = (i: number, j: number): boolean => dp.get(key(i, j)) ?? false;\n const set = (i: number, j: number, val: boolean): void => {\n dp.set(key(i, j), val);\n };\n\n // Initialize all to false (Map returns undefined -> false via get helper)\n // Empty pattern matches empty string\n set(0, 0, true);\n\n // Handle patterns starting with *\n for (let j = 1; j <= n; j++) {\n if (pattern[j - 1] === '*') {\n set(0, j, get(0, j - 1));\n }\n }\n\n // Fill the DP table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const pChar = pattern[j - 1];\n\n if (pChar === '*') {\n // * can match zero chars (dp[i][j-1]) or one+ chars (dp[i-1][j])\n set(i, j, get(i, j - 1) || get(i - 1, j));\n } else if (pChar === '?' || pChar === str[i - 1]) {\n // ? matches any single char, or exact character match\n set(i, j, get(i - 1, j - 1));\n }\n // else remains false (not set in Map)\n }\n }\n\n return get(m, n);\n}\n\n/**\n * Match a filename against a glob pattern safely\n * Uses optimized string methods for simple patterns, DP algorithm for complex ones\n *\n * @param fileName - Name of the file to match\n * @param pattern - Glob pattern (supports * and ? wildcards)\n * @returns Whether the filename matches the pattern\n */\nfunction matchGlobPattern(fileName: string, pattern: string): boolean {\n // For patterns without wildcards, use exact match\n if (!pattern.includes('*') && !pattern.includes('?')) {\n return fileName === pattern;\n }\n\n // For simple extension patterns like \"*.json\", use endsWith for safety\n if (pattern.startsWith('*.') && !pattern.slice(2).includes('*') && !pattern.includes('?')) {\n const extension = pattern.slice(1); // \".json\"\n return fileName.endsWith(extension);\n }\n\n // For simple prefix patterns like \"file*\", use startsWith for safety\n if (pattern.endsWith('*') && !pattern.slice(0, -1).includes('*') && !pattern.includes('?')) {\n const prefix = pattern.slice(0, -1);\n return fileName.startsWith(prefix);\n }\n\n // For complex patterns, use safe DP-based glob matching (no regex)\n return matchGlobDP(fileName, pattern);\n}\n\n/**\n * Check if a file should be preserved\n *\n * @param fileName - Name of the file\n * @param preservePatterns - Additional patterns to preserve\n * @returns Whether the file should be preserved\n */\nfunction shouldPreserve(fileName: string, preservePatterns: string[]): boolean {\n const allPatterns = [...ALWAYS_PRESERVE, ...preservePatterns];\n return allPatterns.some((pattern) => matchGlobPattern(fileName, pattern));\n}\n\n// ============================================================================\n// Directory Cleaning\n// ============================================================================\n\n/**\n * Count files and directories in a path recursively\n *\n * @param dirPath - Path to count\n * @returns Object with file and directory counts\n */\nfunction countContents(dirPath: string): { files: number; dirs: number } {\n if (!existsSync(dirPath)) {\n return { files: 0, dirs: 0 };\n }\n\n let files = 0;\n let dirs = 0;\n\n const entries = readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n dirs++;\n const subCounts = countContents(join(dirPath, entry.name));\n files += subCounts.files;\n dirs += subCounts.dirs;\n } else {\n files++;\n }\n }\n\n return { files, dirs };\n}\n\n/**\n * Clean a single directory\n *\n * @param dirPath - Absolute path to the directory to clean\n * @param options - Clean options\n * @returns Cleaned directory info\n */\nfunction cleanDirectory(\n dirPath: string,\n options: Required<Pick<CleanOptions, 'dryRun' | 'verbose' | 'preserve'>>\n): CleanedDirectory {\n const existed = existsSync(dirPath);\n\n if (!existed) {\n if (options.verbose) {\n console.info(` ℹ️ Directory does not exist: ${dirPath}`);\n }\n return {\n path: dirPath,\n filesRemoved: 0,\n directoriesRemoved: 0,\n existed: false,\n };\n }\n\n // Count contents before deletion\n const counts = countContents(dirPath);\n\n if (options.dryRun) {\n if (options.verbose) {\n console.info(\n ` 🔍 Would remove: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`\n );\n }\n return {\n path: dirPath,\n filesRemoved: counts.files,\n directoriesRemoved: counts.dirs,\n existed: true,\n };\n }\n\n // Check for files to preserve\n const entries = readdirSync(dirPath, { withFileTypes: true });\n const toPreserve = entries.filter((e) => shouldPreserve(e.name, options.preserve));\n\n if (toPreserve.length > 0) {\n // Delete contents except preserved files\n for (const entry of entries) {\n if (shouldPreserve(entry.name, options.preserve)) {\n if (options.verbose) {\n console.info(` 📌 Preserving: ${entry.name}`);\n }\n continue;\n }\n\n const entryPath = join(dirPath, entry.name);\n rmSync(entryPath, { recursive: true, force: true });\n }\n } else {\n // Delete entire directory\n rmSync(dirPath, { recursive: true, force: true });\n }\n\n if (options.verbose) {\n console.info(` ✅ Cleaned: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`);\n }\n\n return {\n path: dirPath,\n filesRemoved: counts.files,\n directoriesRemoved: counts.dirs,\n existed: true,\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Clean token output directories\n *\n * Removes build artifacts from output directories to ensure a fresh build.\n * Supports dry-run mode, preserve patterns, and safety validation.\n *\n * @param options - Clean operation options\n * @returns Clean operation result\n *\n * @example\n * // Clean default dist directory\n * const result = cleanTokenOutputs();\n *\n * @example\n * // Clean specific directories with dry-run\n * const result = cleanTokenOutputs({\n * directories: ['dist/css', 'dist/js'],\n * dryRun: true,\n * verbose: true,\n * });\n *\n * @example\n * // Clean with preserved files\n * const result = cleanTokenOutputs({\n * preserve: ['README.md', '*.d.ts'],\n * });\n */\nexport function cleanTokenOutputs(options: CleanOptions = {}): CleanResult {\n const startTime = Date.now();\n\n // Normalize options with defaults\n const normalizedOptions = {\n baseDir: options.baseDir ?? process.cwd(),\n directories: options.directories ?? [...DEFAULT_CLEAN_DIRECTORIES],\n dryRun: options.dryRun ?? false,\n verbose: options.verbose ?? false,\n preserve: options.preserve ?? [],\n };\n\n const result: CleanResult = {\n success: true,\n cleaned: [],\n totalFilesRemoved: 0,\n totalDirectoriesRemoved: 0,\n errors: [],\n warnings: [],\n dryRun: normalizedOptions.dryRun,\n duration: 0,\n };\n\n if (normalizedOptions.verbose) {\n const modeStr = normalizedOptions.dryRun ? '(dry-run)' : '';\n console.info(`\\n🧹 Cleaning token outputs ${modeStr}`);\n console.info(` Base: ${normalizedOptions.baseDir}`);\n }\n\n // Validate and clean each directory\n for (const dir of normalizedOptions.directories) {\n const absolutePath = resolve(normalizedOptions.baseDir, dir);\n\n // Validate target\n const validation = validateCleanTarget(absolutePath, normalizedOptions.baseDir);\n if (!validation.valid && validation.error) {\n result.errors.push(validation.error);\n result.success = false;\n continue;\n }\n\n // Clean directory\n try {\n const cleaned = cleanDirectory(absolutePath, {\n dryRun: normalizedOptions.dryRun,\n verbose: normalizedOptions.verbose,\n preserve: normalizedOptions.preserve,\n });\n\n result.cleaned.push(cleaned);\n result.totalFilesRemoved += cleaned.filesRemoved;\n result.totalDirectoriesRemoved += cleaned.directoriesRemoved;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.errors.push(`Failed to clean \"${dir}\": ${errorMessage}`);\n result.success = false;\n }\n }\n\n result.duration = Date.now() - startTime;\n\n if (normalizedOptions.verbose) {\n console.info('');\n if (result.success) {\n const actionStr = normalizedOptions.dryRun ? 'Would remove' : 'Removed';\n console.info(\n `✅ ${actionStr} ${result.totalFilesRemoved} files, ` +\n `${result.totalDirectoriesRemoved} directories in ${result.duration}ms`\n );\n } else {\n console.error('❌ Clean failed with errors:');\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n }\n }\n\n return result;\n}\n\n/**\n * CLI wrapper for cleanTokenOutputs\n *\n * Provides formatted output suitable for CLI usage.\n *\n * @param baseDir - Base directory for the clean operation\n * @param options - Clean options\n * @returns Whether the clean was successful\n */\nexport function cleanTokensCLI(\n baseDir: string,\n options: Omit<CleanOptions, 'baseDir'> = {}\n): boolean {\n const result = cleanTokenOutputs({\n ...options,\n baseDir,\n verbose: options.verbose ?? true,\n });\n\n return result.success;\n}\n","/**\n * @file Token Collections Merge Module\n * @description Merge multiple Figma Tokens Studio collection files into one unified collection\n *\n * Features:\n * - Intelligently merges nested token structures\n * - Preserves all metadata ($codeSyntax, $scopes, $type, etc.)\n * - Maintains token references and aliases\n * - Handles mode-based tokens (Light Mode, Dark Mode)\n * - Deep merges sections without overwriting\n * - Normalizes reference format to lowercase {colors.path}\n * - Adds $libraryName and $collectionName to aliased tokens\n * - Sorts properties alphabetically for consistency\n * - Removes duplicate sections (like \"hue\" that duplicates \"brand\")\n *\n * @module @dsai-io/tools/tokens/merge\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-object-injection */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type { MergeOptions, MergeResult } from './types';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype TokenValue = string | number | boolean | null | TokenObject | TokenValue[];\n\ninterface TokenObject {\n [key: string]: TokenValue;\n}\n\ntype CollectionData = TokenObject[];\n\n// ============================================================================\n// Token Detection\n// ============================================================================\n\n/**\n * Check if an object is a token (has $type or $value)\n */\nfunction isToken(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n const record = obj as Record<string, unknown>;\n return '$type' in record || '$value' in record;\n}\n\n/**\n * Check if an object has child tokens\n */\nfunction hasChildTokens(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (!key.startsWith('$') && typeof record[key] === 'object') {\n return true;\n }\n }\n return false;\n}\n\n// ============================================================================\n// Deep Merge\n// ============================================================================\n\n/**\n * Deep merge two objects, preserving all properties\n * Special handling: If target has child tokens and source is a token,\n * or vice versa, prioritize the structure with children\n */\nfunction deepMerge(\n target: TokenObject | undefined,\n source: TokenObject,\n verbose = false\n): TokenObject {\n const result: TokenObject = target ? { ...target } : {};\n\n // Check for conflict: one is a token, the other has child tokens\n const targetIsToken = isToken(target);\n const sourceIsToken = isToken(source);\n const targetHasChildren = hasChildTokens(target);\n const sourceHasChildren = hasChildTokens(source);\n\n if (targetHasChildren && sourceIsToken) {\n if (verbose) {\n console.info(' ⚠️ Skipping single token in favor of children structure');\n }\n return result;\n }\n\n if (sourceHasChildren && targetIsToken) {\n if (verbose) {\n console.info(' ⚠️ Replacing single token with children structure');\n }\n return { ...source };\n }\n\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n // Recursively merge nested objects\n result[key] = deepMerge(\n targetValue as TokenObject | undefined,\n sourceValue as TokenObject,\n verbose\n );\n } else if (Array.isArray(sourceValue)) {\n // Concatenate arrays\n const existingArray = Array.isArray(targetValue) ? targetValue : [];\n result[key] = [...existingArray, ...sourceValue];\n } else if (sourceValue !== undefined) {\n // Overwrite primitive values (source takes precedence)\n result[key] = sourceValue;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Token Counting\n// ============================================================================\n\n/**\n * Count tokens recursively in a nested structure\n */\nfunction countTokens(obj: unknown): number {\n if (!obj || typeof obj !== 'object') {\n return 0;\n }\n\n let count = 0;\n const record = obj as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n const value = record[key];\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueRecord = value as Record<string, unknown>;\n // Check if this is a token\n if ('$type' in valueRecord || '$value' in valueRecord) {\n count++;\n } else {\n // Recursively count nested tokens\n count += countTokens(value);\n }\n }\n }\n\n return count;\n}\n\n// ============================================================================\n// Reference Normalization\n// ============================================================================\n\n/**\n * Update token references to match new collection name\n * Normalizes to lowercase format: {colors.path} instead of {Colors.path}\n */\nfunction updateReferences(\n obj: TokenObject,\n oldName: string,\n newName: string,\n collectionName: string\n): void {\n const normalizedOld = oldName.toLowerCase().replace(/\\s+/g, '');\n const normalizedNew = newName.toLowerCase().replace(/\\s+/g, '');\n\n // Build patterns to match (case-insensitive)\n const patternsLower = [`{${oldName.toLowerCase()}.`, `{${normalizedOld}.`];\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) {\n // This is a token reference - normalize to lowercase\n let newValue = value;\n const valueLower = value.toLowerCase();\n\n for (const pattern of patternsLower) {\n if (valueLower.startsWith(pattern)) {\n // Replace the prefix with the normalized version\n const suffix = value.slice(pattern.length);\n newValue = `{${normalizedNew}.${suffix}`;\n break;\n }\n }\n obj[key] = newValue;\n\n // Add metadata for aliased tokens\n if ((obj[key] as string).startsWith('{')) {\n if (!('$libraryName' in obj)) {\n obj['$libraryName'] = '';\n }\n if (!('$collectionName' in obj)) {\n obj['$collectionName'] = collectionName;\n }\n }\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n updateReferences(value as TokenObject, oldName, newName, collectionName);\n }\n }\n}\n\n// ============================================================================\n// Property Sorting\n// ============================================================================\n\n/**\n * Sort object properties alphabetically, with $ properties first\n */\nfunction sortProperties(obj: unknown): unknown {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const record = obj as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(record).sort((a, b) => {\n // $ properties first, then alphabetically\n const aIsMeta = a.startsWith('$');\n const bIsMeta = b.startsWith('$');\n if (aIsMeta && !bIsMeta) {\n return -1;\n }\n if (!aIsMeta && bIsMeta) {\n return 1;\n }\n return a.localeCompare(b);\n });\n\n for (const key of keys) {\n sorted[key] = sortProperties(record[key]);\n }\n\n return sorted;\n}\n\n// ============================================================================\n// Duplicate Detection\n// ============================================================================\n\n/**\n * Check if a section is a duplicate/alias section\n * (e.g., \"hue\" that just references \"brand\")\n */\nfunction isDuplicateSection(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n let hasOnlyReferences = true;\n let referenceCount = 0;\n\n function checkReferences(item: Record<string, unknown>): void {\n for (const key of Object.keys(item)) {\n if (key.startsWith('$')) {\n continue;\n }\n\n const value = item[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueRecord = value as Record<string, unknown>;\n if ('$value' in valueRecord) {\n referenceCount++;\n if (\n typeof valueRecord['$value'] === 'string' &&\n (valueRecord['$value'] as string).startsWith('{')\n ) {\n continue;\n } else {\n hasOnlyReferences = false;\n return;\n }\n }\n checkReferences(valueRecord);\n }\n }\n }\n\n checkReferences(obj as Record<string, unknown>);\n return hasOnlyReferences && referenceCount > 10;\n}\n\n/**\n * Get collection name from file structure\n */\nfunction getCollectionName(data: CollectionData): string | null {\n if (Array.isArray(data) && data[0]) {\n const keys = Object.keys(data[0]);\n return keys[0] ?? null;\n }\n return null;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Load and parse JSON file\n */\nfunction loadJSON(filePath: string, verbose: boolean): CollectionData | null {\n try {\n const fullPath = resolve(filePath);\n if (verbose) {\n console.info(`📖 Reading: ${fullPath}`);\n }\n const content = readFileSync(fullPath, 'utf-8');\n return JSON.parse(content) as CollectionData;\n } catch {\n return null;\n }\n}\n\n/**\n * Save JSON to file with pretty formatting\n */\nfunction saveJSON(filePath: string, data: unknown, verbose: boolean): boolean {\n try {\n const fullPath = resolve(filePath);\n const content = JSON.stringify(data, null, 2);\n writeFileSync(fullPath, content, 'utf-8');\n if (verbose) {\n console.info(`✅ Saved: ${fullPath}`);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Merge multiple collection files into one\n *\n * @example\n * ```typescript\n * const result = mergeCollections({\n * sourceFiles: ['colors-scales.json', 'colors.json'],\n * outputFile: 'merged-colors.json',\n * });\n * ```\n */\nexport function mergeCollections(options: MergeOptions): MergeResult {\n const { sourceFiles, outputFile, strategy = 'last', dryRun = false, verbose = false } = options;\n\n const errors: string[] = [];\n const conflicts: string[] = [];\n\n if (sourceFiles.length < 2) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors: ['At least two source files are required'],\n };\n }\n\n // Validate files exist\n for (const file of sourceFiles) {\n if (!existsSync(file)) {\n errors.push(`Source file not found: ${file}`);\n }\n }\n\n if (errors.length > 0) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors,\n };\n }\n\n if (verbose) {\n console.info('🔄 Starting merge process...\\n');\n }\n\n // Load all source files\n const collections: { name: string | null; data: TokenObject; tokenCount: number }[] = [];\n\n for (const file of sourceFiles) {\n const data = loadJSON(file, verbose);\n if (!data || !Array.isArray(data) || !data[0]) {\n errors.push(`Invalid collection structure in: ${file}`);\n continue;\n }\n\n const name = getCollectionName(data);\n const collectionData = name\n ? (data[0][name] as TokenObject)\n : (data[0] as unknown as TokenObject);\n const tokenCount = countTokens(collectionData);\n\n if (verbose) {\n console.info(`📦 Collection: \"${name ?? 'unknown'}\" (${tokenCount} tokens)`);\n }\n\n collections.push({ name, data: collectionData, tokenCount });\n }\n\n if (collections.length < 2) {\n return {\n success: false,\n collectionsCount: collections.length,\n tokensCount: 0,\n outputFile,\n errors: errors.length > 0 ? errors : ['Not enough valid collections to merge'],\n };\n }\n\n // Determine unified collection name\n const collectionNames = collections.map((c) => c.name).filter((n): n is string => n !== null);\n const defaultName = collectionNames[0] ?? 'Tokens';\n const unifiedName = collectionNames.includes('Colors')\n ? 'Colors'\n : collectionNames.reduce((a, b) => (a.length <= b.length ? a : b), defaultName);\n\n if (verbose) {\n console.info(`\\n🎯 Unified collection name: \"${unifiedName}\"`);\n console.info('\\n🔀 Merging structures...');\n }\n\n // Merge collections based on strategy\n const firstCollection = collections[0];\n if (!firstCollection) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors: ['No collections to merge'],\n };\n }\n\n let merged: TokenObject = firstCollection.data;\n for (let i = 1; i < collections.length; i++) {\n const source = collections[i];\n if (!source) {\n continue;\n }\n if (strategy === 'first') {\n // First wins - merge source into target but target takes precedence\n merged = deepMerge(source.data, merged, verbose);\n } else {\n // Last wins (default) - source overwrites target\n merged = deepMerge(merged, source.data, verbose);\n }\n }\n\n // Remove duplicate sections\n if (verbose) {\n console.info('🗑️ Checking for duplicate sections...');\n }\n const modes = merged['modes'] as TokenObject | undefined;\n if (modes) {\n for (const modeName of Object.keys(modes)) {\n const mode = modes[modeName] as TokenObject | undefined;\n const colors = mode?.['colors'] as TokenObject | undefined;\n\n if (colors) {\n for (const sectionName of Object.keys(colors)) {\n if (isDuplicateSection(colors[sectionName])) {\n if (verbose) {\n console.info(` ⚠️ Removing duplicate section: ${sectionName}`);\n }\n delete colors[sectionName];\n }\n }\n }\n }\n }\n\n // Normalize references\n if (verbose) {\n const normalized = unifiedName.toLowerCase().replace(/\\s+/g, '');\n console.info(`🔗 Normalizing references to lowercase \"{${normalized}.\" format...`);\n }\n for (const coll of collections) {\n if (coll.name) {\n updateReferences(merged, coll.name, unifiedName, unifiedName);\n }\n }\n\n // Sort properties\n if (verbose) {\n console.info('📋 Sorting properties alphabetically...');\n }\n const sorted = sortProperties(merged) as TokenObject;\n\n // Count final tokens\n const tokensCount = countTokens(sorted);\n\n if (verbose) {\n console.info(`✨ Merged collection: ${tokensCount} tokens\\n`);\n }\n\n // Create output structure\n const output = [{ [unifiedName]: sorted }];\n\n // Save if not dry run\n if (!dryRun) {\n if (!saveJSON(outputFile, output, verbose)) {\n errors.push(`Failed to write output file: ${outputFile}`);\n return {\n success: false,\n collectionsCount: collections.length,\n tokensCount,\n outputFile,\n errors,\n conflicts: conflicts.length > 0 ? conflicts : undefined,\n };\n }\n }\n\n if (verbose) {\n console.info('\\n✅ Merge complete!');\n console.info('📊 Summary:');\n for (const coll of collections) {\n console.info(` Source: ${coll.tokenCount} tokens`);\n }\n console.info(` Merged: ${tokensCount} tokens`);\n }\n\n return {\n success: true,\n collectionsCount: collections.length,\n tokensCount,\n outputFile,\n conflicts: conflicts.length > 0 ? conflicts : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * CLI entry point for merging collections\n */\nexport function mergeCollectionsCLI(source1: string, source2: string, output: string): boolean {\n const result = mergeCollections({\n sourceFiles: [source1, source2],\n outputFile: output,\n verbose: true,\n });\n\n if (result.errors) {\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n }\n\n return result.success;\n}\n","/**\n * Scanner for finding stylesheet files in directories\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-regexp */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { StyleScannerOptions, StyleScannerResult, StyleScannedFile } from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default ignore patterns\n */\nconst DEFAULT_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/_index.scss',\n '**/*.test.scss',\n '**/*.spec.scss',\n '**/test/**',\n '**/tests/**',\n];\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Convert a glob pattern to a regular expression\n */\nfunction globToRegex(pattern: string): RegExp {\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars (except * and ?)\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>') // Temporarily replace **\n .replace(/\\*/g, '[^/]*') // * matches anything except /\n .replace(/\\?/g, '.') // ? matches single char\n .replace(/<<<GLOBSTAR>>>/g, '.*'); // ** matches anything including /\n return new RegExp(`^${regex}$`);\n}\n\n/**\n * Check if a path matches any of the ignore patterns\n */\nfunction matchesIgnorePattern(relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const regex = globToRegex(pattern);\n if (regex.test(relativePath)) {\n return true;\n }\n // Also check just the filename\n const fileName = path.basename(relativePath);\n if (regex.test(fileName)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Recursively scan a directory for files\n */\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n extension: string,\n ignorePatterns: string[],\n maxDepth: number,\n currentDepth: number,\n followSymlinks: boolean\n): Promise<StyleScannedFile[]> {\n const files: StyleScannedFile[] = [];\n\n if (currentDepth > maxDepth) {\n return files;\n }\n\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n const relativePath = path.relative(rootDir, entryPath);\n\n // Check ignore patterns\n if (matchesIgnorePattern(relativePath, ignorePatterns)) {\n continue;\n }\n\n if (entry.isDirectory() || (followSymlinks && entry.isSymbolicLink())) {\n // Recurse into directory\n const subFiles = await scanDirectory(\n entryPath,\n rootDir,\n extension,\n ignorePatterns,\n maxDepth,\n currentDepth + 1,\n followSymlinks\n );\n files.push(...subFiles);\n } else if (entry.isFile() && entry.name.endsWith(`.${extension}`)) {\n // Add file\n const stat = await fs.promises.stat(entryPath);\n files.push({\n absolutePath: entryPath,\n relativePath,\n name: path.basename(entry.name, `.${extension}`),\n extension: extension as 'scss' | 'css',\n size: stat.size,\n mtime: stat.mtime,\n depth: currentDepth,\n });\n }\n }\n } catch (error) {\n // Directory read error - skip silently\n console.warn(`Warning: Could not read directory ${dir}: ${(error as Error).message}`);\n }\n\n return files;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Scan directories for stylesheet files\n *\n * @param options Scanner options\n * @returns Scanner result with found files\n *\n * @example\n * ```typescript\n * const result = await scanDirectories({\n * directories: ['src/styles/overrides', 'src/styles/custom'],\n * extension: 'scss',\n * });\n *\n * console.log(`Found ${result.totalFiles} files`);\n * ```\n */\nexport async function scanDirectories(options: StyleScannerOptions): Promise<StyleScannerResult> {\n const {\n directories,\n extension,\n ignorePatterns = DEFAULT_IGNORE_PATTERNS,\n followSymlinks = false,\n maxDepth = 10,\n } = options;\n\n const files: StyleScannedFile[] = [];\n const scannedDirs: string[] = [];\n const missingDirs: string[] = [];\n\n for (const dir of directories) {\n const absoluteDir = path.resolve(dir);\n\n // Check if directory exists\n try {\n const stat = await fs.promises.stat(absoluteDir);\n if (!stat.isDirectory()) {\n missingDirs.push(absoluteDir);\n continue;\n }\n } catch {\n missingDirs.push(absoluteDir);\n continue;\n }\n\n scannedDirs.push(absoluteDir);\n\n // Scan directory recursively\n const foundFiles = await scanDirectory(\n absoluteDir,\n absoluteDir,\n extension,\n ignorePatterns,\n maxDepth,\n 0,\n followSymlinks\n );\n\n files.push(...foundFiles);\n }\n\n // Calculate totals\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n\n return {\n files,\n directories: scannedDirs,\n missingDirectories: missingDirs,\n totalFiles: files.length,\n totalSize,\n };\n}\n\n/**\n * Sort scanned files according to specified order\n *\n * @param files Files to sort\n * @param order Sort order\n * @returns Sorted files\n */\nexport function sortFiles(\n files: StyleScannedFile[],\n order: 'alphabetical' | 'directory-first' = 'alphabetical'\n): StyleScannedFile[] {\n const sorted = [...files];\n\n if (order === 'alphabetical') {\n sorted.sort((a, b) => a.name.localeCompare(b.name));\n } else if (order === 'directory-first') {\n sorted.sort((a, b) => {\n // First by directory\n const dirA = path.dirname(a.relativePath);\n const dirB = path.dirname(b.relativePath);\n if (dirA !== dirB) {\n return dirA.localeCompare(dirB);\n }\n // Then by name\n return a.name.localeCompare(b.name);\n });\n }\n\n return sorted;\n}\n\n/**\n * Filter files matching patterns\n *\n * @param files Files to filter\n * @param patterns Glob patterns to match\n * @param include If true, keep matching files; if false, exclude matching\n * @returns Filtered files\n */\nexport function filterFiles(\n files: StyleScannedFile[],\n patterns: string[],\n include = false\n): StyleScannedFile[] {\n return files.filter((file) => {\n const matches = matchesIgnorePattern(file.relativePath, patterns);\n return include ? matches : !matches;\n });\n}\n\n/**\n * Get default ignore patterns\n */\nexport function getDefaultIgnorePatterns(): string[] {\n return [...DEFAULT_IGNORE_PATTERNS];\n}\n","/**\n * Merge stylesheet content\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { MergeConfig, MergeContent, StyleMergeResult } from './types.js';\n\n// ============================================================================\n// Content Generation\n// ============================================================================\n\n/**\n * Generate header comment for merged file\n */\nfunction generateHeaderComment(_format: 'scss' | 'css'): string {\n const timestamp = new Date().toISOString();\n const comment = `/**\n * DSAi Design Tokens - Merged Bundle\n * Generated: ${timestamp}\n *\n * This file was automatically generated and includes:\n * - Generated design tokens\n * - Merged additional stylesheets\n *\n * DO NOT EDIT DIRECTLY - changes will be overwritten on rebuild\n */`;\n\n return comment;\n}\n\n/**\n * Generate source comment for section\n */\nfunction generateSourceComment(source: string, _format: 'scss' | 'css'): string {\n return `/* ========== Source: ${source} ========== */`;\n}\n\n// ============================================================================\n// Issue Detection\n// ============================================================================\n\n/**\n * Detect potential issues in merged content\n */\nfunction detectMergeIssues(content: string, format: 'scss' | 'css'): string[] {\n const warnings: string[] = [];\n\n // Check for duplicate :root selectors\n const rootMatches = content.match(/:root\\s*\\{/g);\n const rootCount = rootMatches ? rootMatches.length : 0;\n if (rootCount > 1) {\n warnings.push(\n `Found ${rootCount} :root selectors. Consider consolidating for better performance.`\n );\n }\n\n // Check for duplicate CSS custom properties (simplified check)\n const customProps = content.match(/--[\\w-]+:/g) ?? [];\n const uniqueProps = new Set(customProps);\n if (customProps.length > uniqueProps.size) {\n warnings.push(\n `Found duplicate CSS custom properties. Later definitions will override earlier ones.`\n );\n }\n\n // SCSS-specific checks\n if (format === 'scss') {\n // Check for @import after content\n const importAfterContent = /@import\\s+['\"][^'\"]+['\"];?\\s*$/gm;\n if (importAfterContent.test(content)) {\n warnings.push(`Found @import statements that may not be at the top of the file.`);\n }\n }\n\n return warnings;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Merge stylesheet content in specified order\n *\n * @param tokenContent Generated token content\n * @param userContent User stylesheet content\n * @param config Merge configuration\n * @returns Merged result\n *\n * @example\n * ```typescript\n * const result = await mergeContent(\n * { content: ':root { --color-primary: blue; }', format: 'css' },\n * [{ source: 'overrides.css', content: ':root { --color-bg: white; }' }],\n * { mergeOrder: 'after' }\n * );\n * ```\n */\nexport async function mergeContent(\n tokenContent: { content: string; format: 'scss' | 'css' },\n userContent: MergeContent[],\n config: Partial<MergeConfig> = {}\n): Promise<StyleMergeResult> {\n const { mergeOrder = 'after' } = config;\n\n const parts: string[] = [];\n const sources: string[] = ['<generated-tokens>'];\n const warnings: string[] = [];\n\n // Add header comment\n parts.push(generateHeaderComment(tokenContent.format));\n\n // Build content based on merge order\n if (mergeOrder === 'before') {\n // User styles first\n for (const content of userContent) {\n parts.push(generateSourceComment(content.source, tokenContent.format));\n parts.push(content.content);\n sources.push(content.source);\n }\n // Then token styles\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\n parts.push(tokenContent.content);\n } else {\n // Token styles first\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\n parts.push(tokenContent.content);\n // Then user styles\n for (const content of userContent) {\n parts.push(generateSourceComment(content.source, tokenContent.format));\n parts.push(content.content);\n sources.push(content.source);\n }\n }\n\n // Check for potential issues\n const mergedContent = parts.join('\\n\\n');\n warnings.push(...detectMergeIssues(mergedContent, tokenContent.format));\n\n return {\n content: mergedContent,\n sources,\n warnings,\n };\n}\n\n/**\n * Load content from files\n *\n * @param files File paths to load\n * @param type Content type (token or user)\n * @param format File format\n * @returns Loaded content\n */\nexport async function loadContent(\n files: string[],\n type: 'token' | 'user',\n format: 'scss' | 'css'\n): Promise<MergeContent[]> {\n const content: MergeContent[] = [];\n\n for (const filePath of files) {\n try {\n const fileContent = await fs.promises.readFile(filePath, 'utf-8');\n content.push({\n source: filePath,\n content: fileContent,\n type,\n format,\n });\n } catch (error) {\n console.warn(`Failed to load file: ${filePath}`, error);\n }\n }\n\n return content;\n}\n\n/**\n * Process SCSS imports header\n *\n * @param importHeader Import header configuration\n * @param configDir Config directory for resolving relative paths\n * @returns Processed import statements\n */\nexport function processScssImportHeader(\n importHeader: string | string[] | undefined,\n configDir: string\n): string {\n if (!importHeader) {\n return '';\n }\n\n const imports = Array.isArray(importHeader) ? importHeader : [importHeader];\n const statements: string[] = [];\n\n for (const importPath of imports) {\n // Determine if it's a path or module import\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\n // Relative or absolute path\n const resolvedPath = path.resolve(configDir, importPath);\n statements.push(`@import '${resolvedPath}';`);\n } else {\n // Module import (e.g., 'normalize.css')\n statements.push(`@import '${importPath}';`);\n }\n }\n\n return `${statements.join('\\n')}\\n\\n`;\n}\n\n/**\n * Add SCSS import header to content\n *\n * @param content SCSS content\n * @param importHeader Import header to add\n * @param configDir Config directory for resolving paths\n * @returns Content with import header\n */\nexport function addScssImportHeader(\n content: string,\n importHeader: string | string[] | undefined,\n configDir: string\n): string {\n const header = processScssImportHeader(importHeader, configDir);\n if (!header) {\n return content;\n }\n\n return header + content;\n}\n","/**\n * Bundle generator for combined stylesheets\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-unsafe-regex */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { loadContent, mergeContent } from './merger.js';\nimport { sortFiles } from './scanner.js';\n\nimport type { BundleConfig, BundleResult, StyleScannedFile, StyleMergeResult } from './types.js';\n\n// ============================================================================\n// Content Processing\n// ============================================================================\n\n/**\n * Remove source comments from content\n */\nfunction removeSourceComments(content: string): string {\n return content.replace(/\\/\\* ========== Source: .+ ========== \\*\\/\\n?/g, '');\n}\n\n/**\n * Simple CSS minification\n * Note: For production, consider using a proper minifier like cssnano\n */\nfunction minifyContent(content: string): string {\n return (\n content\n // Remove comments (but keep /*! ... */ license comments)\n .replace(/\\/\\*(?!!)[^*]*\\*+([^/*][^*]*\\*+)*\\//g, '')\n // Remove whitespace\n .replace(/\\s+/g, ' ')\n // Remove space around special characters\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n // Remove trailing semicolons before closing braces\n .replace(/;}/g, '}')\n // Remove empty rules\n .replace(/[^{}]+\\{\\s*\\}/g, '')\n .trim()\n );\n}\n\n/**\n * Detect output extension based on content\n */\nfunction detectExtension(mergeResult: StyleMergeResult): string {\n const hasScssFeatures = mergeResult.content.match(/@mixin|@include|\\$[a-zA-Z]/);\n return hasScssFeatures ? '.scss' : '.css';\n}\n\n/**\n * Generate a basic sourcemap\n */\nfunction generateSourcemap(sources: string[], name: string, extension: string): string {\n const sourceMapV3 = {\n version: 3,\n file: `${name}${extension}`,\n sources,\n names: [],\n mappings: '',\n };\n\n return JSON.stringify(sourceMapV3, null, 2);\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Create a stylesheet bundle\n *\n * @param mergeResult Result from merge operation\n * @param config Bundle configuration\n * @returns Bundle result\n *\n * @example\n * ```typescript\n * const bundle = await createBundle(mergeResult, {\n * name: 'tokens-bundle',\n * outputDir: 'dist',\n * includeSourceComments: true,\n * sourcemaps: true,\n * minify: false,\n * });\n * ```\n */\nexport async function createBundle(\n mergeResult: StyleMergeResult,\n config: BundleConfig\n): Promise<BundleResult> {\n const { name, outputDir, includeSourceComments, sourcemaps, minify } = config;\n\n let content = mergeResult.content;\n\n // Optionally remove source comments\n if (!includeSourceComments) {\n content = removeSourceComments(content);\n }\n\n // Minify if requested\n let minifiedSize: number | undefined;\n if (minify) {\n const minified = minifyContent(content);\n minifiedSize = Buffer.byteLength(minified, 'utf-8');\n content = minified;\n }\n\n // Determine output path\n const extension = detectExtension(mergeResult);\n const outputPath = path.join(outputDir, `${name}${extension}`);\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n // Write bundle\n await fs.promises.writeFile(outputPath, content, 'utf-8');\n\n // Write sourcemap if requested\n let sourcemap: string | undefined;\n if (sourcemaps) {\n sourcemap = generateSourcemap(mergeResult.sources, name, extension);\n const mapPath = `${outputPath}.map`;\n await fs.promises.writeFile(mapPath, sourcemap, 'utf-8');\n\n // Add sourcemap reference to content\n const mapRef = `\\n/*# sourceMappingURL=${name}${extension}.map */`;\n content += mapRef;\n await fs.promises.writeFile(outputPath, content, 'utf-8');\n }\n\n return {\n content,\n sourcemap,\n outputPath,\n files: mergeResult.sources,\n size: Buffer.byteLength(content, 'utf-8'),\n minifiedSize,\n };\n}\n\n/**\n * Create both CSS and SCSS bundles\n *\n * @param tokenCss Generated CSS tokens\n * @param tokenScss Generated SCSS tokens\n * @param cssFiles User CSS files (StyleScannedFile objects)\n * @param scssFiles User SCSS files (StyleScannedFile objects)\n * @param config Bundle configuration\n * @returns Map of bundle type to result\n */\nexport async function createBundles(\n tokenCss: string,\n tokenScss: string,\n cssFiles: StyleScannedFile[],\n scssFiles: StyleScannedFile[],\n config: Omit<BundleConfig, 'name'> & { baseName?: string }\n): Promise<{ css?: BundleResult; scss?: BundleResult }> {\n const { baseName = 'tokens-bundle', ...bundleConfig } = config;\n const results: { css?: BundleResult; scss?: BundleResult } = {};\n\n // Create CSS bundle if we have CSS content\n const sortedCss = sortFiles(cssFiles);\n if (tokenCss || sortedCss.length > 0) {\n const userContent = await loadContent(\n sortedCss.map((f) => f.absolutePath),\n 'user',\n 'css'\n );\n const mergeResult = await mergeContent({ content: tokenCss, format: 'css' }, userContent);\n\n results.css = await createBundle(mergeResult, {\n ...bundleConfig,\n name: baseName,\n });\n }\n\n // Create SCSS bundle if we have SCSS content\n const sortedScss = sortFiles(scssFiles);\n if (tokenScss || sortedScss.length > 0) {\n const userContent = await loadContent(\n sortedScss.map((f) => f.absolutePath),\n 'user',\n 'scss'\n );\n const mergeResult = await mergeContent({ content: tokenScss, format: 'scss' }, userContent);\n\n results.scss = await createBundle(mergeResult, {\n ...bundleConfig,\n name: `_${baseName}`,\n });\n }\n\n return results;\n}\n\n/**\n * Create a bundle from scanned files (no token content)\n *\n * @param files Scanned files to bundle\n * @param format Output format\n * @param config Bundle configuration\n * @returns Bundle result\n */\nexport async function createBundleFromFiles(\n files: StyleScannedFile[],\n format: 'css' | 'scss',\n config: BundleConfig\n): Promise<BundleResult> {\n const sorted = sortFiles(files);\n const userContent = await loadContent(\n sorted.map((f) => f.absolutePath),\n 'user',\n format\n );\n\n // Create merge result with empty token content\n const mergeResult = await mergeContent({ content: '', format }, userContent);\n\n return createBundle(mergeResult, config);\n}\n","/**\n * Output path resolver with placeholder support\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-object-injection */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { OutputFormat } from '../../config/types.js';\nimport type { OutputConfig, PlaceholderValues } from '../merge/types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default file names per format\n */\nexport const DEFAULT_FILE_NAMES: Record<OutputFormat, string> = {\n css: 'tokens.css',\n scss: '_tokens.scss',\n js: 'tokens.js',\n ts: 'tokens.ts',\n json: 'tokens.json',\n android: 'tokens.xml',\n ios: 'Tokens.swift',\n};\n\n// ============================================================================\n// Placeholder Functions\n// ============================================================================\n\n/**\n * Replace placeholders in a string\n *\n * @param template Template string with placeholders\n * @param values Values to replace\n * @returns String with placeholders replaced\n */\nexport function replacePlaceholders(template: string, values: PlaceholderValues): string {\n const now = new Date();\n\n const allValues: Record<string, string> = {\n theme: values.theme ?? 'default',\n name: values.name ?? 'tokens',\n format: values.format ?? '',\n date: values.date ?? now.toISOString().split('T')[0] ?? '',\n timestamp: values.timestamp ?? now.toISOString(),\n };\n\n let result = template;\n for (const [key, value] of Object.entries(allValues)) {\n result = result.replaceAll(`{${key}}`, value);\n }\n\n return result;\n}\n\n// ============================================================================\n// Path Resolution\n// ============================================================================\n\n/**\n * Resolve output path for a specific format\n *\n * @param format Output format\n * @param config Output configuration\n * @param values Placeholder values\n * @returns Resolved output path\n *\n * @example\n * ```typescript\n * const outputPath = resolveOutputPath('css', {\n * baseDir: 'dist',\n * formatDirs: { css: 'dist/css' },\n * fileNames: { css: 'design-tokens-{theme}.css' },\n * }, { theme: 'light' });\n *\n * // Returns: 'dist/css/design-tokens-light.css'\n * ```\n */\nexport function resolveOutputPath(\n format: OutputFormat,\n config: OutputConfig,\n values: PlaceholderValues = {}\n): string {\n // Determine directory\n const dir = config.formatDirs[format] ?? config.baseDir;\n\n // Determine file name\n let fileName = config.fileNames[format] ?? DEFAULT_FILE_NAMES[format];\n\n // Replace placeholders\n fileName = replacePlaceholders(fileName, values);\n\n return path.join(dir, fileName);\n}\n\n/**\n * Resolve all output paths for all formats\n *\n * @param formats Formats to generate\n * @param config Output configuration\n * @param values Placeholder values\n * @returns Map of format to output path\n */\nexport function resolveAllOutputPaths(\n formats: OutputFormat[],\n config: OutputConfig,\n values: PlaceholderValues = {}\n): Record<OutputFormat, string> {\n const result: Partial<Record<OutputFormat, string>> = {};\n\n for (const format of formats) {\n result[format] = resolveOutputPath(format, config, values);\n }\n\n return result as Record<OutputFormat, string>;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate output paths don't conflict\n *\n * @param paths Output paths to validate\n * @returns Validation result with any conflicts found\n */\nexport function validateOutputPaths(paths: Record<string, string>): {\n valid: boolean;\n conflicts: [string, string][];\n} {\n const conflicts: [string, string][] = [];\n const pathToFormat: Record<string, string> = {};\n\n for (const [format, outputPath] of Object.entries(paths)) {\n const normalized = path.normalize(outputPath);\n const existingFormat = pathToFormat[normalized];\n\n if (existingFormat !== undefined) {\n conflicts.push([existingFormat, format]);\n } else {\n pathToFormat[normalized] = format;\n }\n }\n\n return {\n valid: conflicts.length === 0,\n conflicts,\n };\n}\n\n// ============================================================================\n// Directory Management\n// ============================================================================\n\n/**\n * Ensure all output directories exist\n *\n * @param paths Output paths\n * @returns Created directories\n */\nexport async function ensureOutputDirs(paths: Record<string, string>): Promise<string[]> {\n const directories = new Set<string>();\n for (const outputPath of Object.values(paths)) {\n directories.add(path.dirname(outputPath));\n }\n\n const created: string[] = [];\n for (const dir of directories) {\n await fs.promises.mkdir(dir, { recursive: true });\n created.push(dir);\n }\n\n return created;\n}\n\n/**\n * Create output configuration from token config\n *\n * @param tokenConfig Token configuration\n * @returns Output configuration\n */\nexport function createOutputConfig(tokenConfig: {\n outputDir?: string;\n outputDirs?: Partial<Record<OutputFormat, string>>;\n outputFileNames?: Partial<Record<OutputFormat, string>>;\n}): OutputConfig {\n return {\n baseDir: tokenConfig.outputDir ?? 'dist',\n formatDirs: tokenConfig.outputDirs ?? {},\n fileNames: tokenConfig.outputFileNames ?? {},\n createDirs: true,\n };\n}\n","/**\n * Style Dictionary Type Definitions\n *\n * Types for Style Dictionary integration including tokens, transforms,\n * formats, preprocessors, and configuration.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/types\n */\n\n// ============================================================================\n// Token Types\n// ============================================================================\n\n/**\n * Style Dictionary token (runtime representation)\n */\nexport interface SDToken {\n /** Token name (after name transforms) */\n name: string;\n\n /** Resolved value (after value transforms) */\n value: unknown;\n\n /** Original value (may contain references) */\n original: {\n value: unknown;\n $value?: unknown;\n };\n\n /** Token path segments */\n path: string[];\n\n /** DTCG $value property */\n $value?: unknown;\n\n /** Token type */\n type?: string;\n\n /** DTCG $type property */\n $type?: string;\n\n /** Token description */\n description?: string;\n\n /** DTCG $description property */\n $description?: string;\n\n /** Comment for documentation */\n comment?: string;\n\n /** DTCG $extensions */\n $extensions?: Record<string, unknown>;\n\n /** DTCG $scopes (from Figma Variables) */\n $scopes?: string[];\n\n /** CTI (Category/Type/Item) attributes */\n attributes?: {\n category?: string;\n type?: string;\n item?: string;\n subitem?: string;\n state?: string;\n };\n\n /** File path where token was defined */\n filePath?: string;\n\n /** Whether token is a reference to another token */\n isSource?: boolean;\n}\n\n/**\n * Style Dictionary dictionary containing all tokens\n */\nexport interface SDDictionary {\n /** Flat array of all tokens */\n allTokens: SDToken[];\n\n /** Nested token structure */\n tokens: Record<string, unknown>;\n\n /** Unfiltered tokens (before platform filtering) */\n unfilteredTokens: Record<string, unknown>;\n}\n\n// ============================================================================\n// Transform Types\n// ============================================================================\n\n/**\n * Transform type - what aspect of the token is being transformed\n */\nexport type TransformType = 'name' | 'value' | 'attribute';\n\n/**\n * Options passed to transform functions\n */\nexport interface SDTransformOptions {\n /** Base font size for rem conversion (default: 16) */\n basePxFontSize?: number;\n\n /** CSS variable prefix */\n prefix?: string;\n\n /** Additional options */\n [key: string]: unknown;\n}\n\n/**\n * Transform definition for Style Dictionary\n */\nexport interface TransformDefinition {\n /** Unique transform name (e.g., 'fontWeight/unitless') */\n name: string;\n\n /** Transform type */\n type: TransformType;\n\n /**\n * Filter function - return true to apply transform\n * If omitted, transform applies to all tokens\n */\n filter?: (token: SDToken) => boolean;\n\n /**\n * Transform function\n * @param token - The token being transformed\n * @param options - Transform options from platform config\n * @returns Transformed value\n */\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\n}\n\n/**\n * Transform group definition\n */\nexport interface TransformGroupDefinition {\n /** Unique group name (e.g., 'custom/css') */\n name: string;\n\n /** Ordered list of transform names to apply */\n transforms: string[];\n}\n\n// ============================================================================\n// Format Types\n// ============================================================================\n\n/**\n * Platform configuration passed to formats\n */\nexport interface SDPlatform {\n /** Transform group to use */\n transformGroup?: string;\n\n /** Individual transforms (alternative to transformGroup) */\n transforms?: string[];\n\n /** Output path prefix */\n buildPath?: string;\n\n /** Files to generate */\n files?: SDFile[];\n\n /** Platform-specific options */\n options?: Record<string, unknown>;\n}\n\n/**\n * File configuration for platform output\n */\nexport interface SDFile {\n /** Output file name */\n destination: string;\n\n /** Format to use for generating content */\n format: string;\n\n /**\n * Filter tokens to include in this file\n * Can be a string (filter name) or function\n */\n filter?: string | ((token: SDToken) => boolean);\n\n /** File-specific options passed to format */\n options?: Record<string, unknown>;\n}\n\n/**\n * Arguments passed to format functions\n */\nexport interface SDFormatArgs {\n /** Dictionary containing all tokens */\n dictionary: SDDictionary;\n\n /** Options from file config */\n options: Record<string, unknown>;\n\n /** Platform configuration */\n platform: SDPlatform;\n\n /** File configuration */\n file: SDFile;\n}\n\n/**\n * Format definition for Style Dictionary\n */\nexport interface FormatDefinition {\n /** Unique format name (e.g., 'css/variables-with-comments') */\n name: string;\n\n /**\n * Format function - generates file content\n * @param args - Format arguments\n * @returns File content as string\n */\n format: (args: SDFormatArgs) => string;\n}\n\n// ============================================================================\n// Preprocessor Types\n// ============================================================================\n\n/**\n * Preprocessor definition for Style Dictionary\n */\nexport interface PreprocessorDefinition {\n /** Unique preprocessor name */\n name: string;\n\n /**\n * Preprocessor function - modifies token dictionary before processing\n * @param dictionary - Raw token dictionary\n * @returns Modified dictionary\n */\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Style Dictionary log configuration\n */\nexport interface SDLogConfig {\n /** Logging verbosity */\n verbosity?: 'default' | 'silent' | 'verbose';\n\n /** How to handle warnings */\n warnings?: 'warn' | 'error' | 'disabled';\n\n /** How to handle errors */\n errors?: 'error' | 'throw';\n}\n\n/**\n * Expand configuration for composite tokens\n */\nexport interface SDExpandConfig {\n /** Optional type mapping for composite token properties */\n typesMap?: Record<string, string | string[] | Record<string, string | string[]>>;\n /** Include specific token types */\n include?: string[] | ((token: SDToken, config: SDConfig) => boolean);\n /** Exclude specific token types */\n exclude?: string[] | ((token: SDToken, config: SDConfig) => boolean);\n}\n\n/**\n * Full Style Dictionary configuration\n */\nexport interface SDConfig {\n /** Logging configuration */\n log?: SDLogConfig;\n\n /** Preprocessors to run on source tokens */\n preprocessors?: string[];\n\n /** Configures whether and how composite tokens will be expanded */\n expand?: boolean | SDExpandConfig | ((token: SDToken, config: SDConfig) => boolean);\n\n /** Source token file patterns */\n source?: string[];\n\n /** Additional files to include */\n include?: string[];\n\n /** Platform configurations */\n platforms?: Record<string, SDPlatform>;\n}\n\n/**\n * Options for creating Style Dictionary configuration\n */\nexport interface CreateSDConfigOptions {\n /** Token source files (glob patterns) */\n source?: string[];\n\n /** CSS variable prefix (default: '--dsai-') */\n prefix?: string;\n\n /** Output directory base path */\n buildPath?: string;\n\n /** Base font size for rem conversion (default: 16) */\n baseFontSize?: number;\n\n /** Whether to output references in generated files */\n outputReferences?: boolean;\n\n /** Additional transforms to register */\n customTransforms?: TransformDefinition[];\n\n /** Additional formats to register */\n customFormats?: FormatDefinition[];\n\n /** Additional preprocessors to register */\n customPreprocessors?: PreprocessorDefinition[];\n\n /** Platforms to include (default: all) */\n platforms?: SDPlatformType[];\n\n /** Enable verbose logging */\n verbose?: boolean;\n}\n\n/**\n * Available platform types\n */\nexport type SDPlatformType = 'css' | 'js' | 'ts' | 'scss' | 'scss-dist' | 'json';\n\n// ============================================================================\n// Registration Types\n// ============================================================================\n\n/**\n * Style Dictionary instance type (for registration functions)\n * This is a minimal interface - actual SD has more methods\n */\nexport interface StyleDictionaryInstance {\n registerTransform: (transform: {\n name: string;\n type: TransformType;\n filter?: (token: SDToken) => boolean;\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\n }) => void;\n\n registerTransformGroup: (group: { name: string; transforms: string[] }) => void;\n\n registerFormat: (format: { name: string; format: (args: SDFormatArgs) => string }) => void;\n\n registerPreprocessor: (preprocessor: {\n name: string;\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\n }) => void;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a value is an SD token\n */\nexport function isSDToken(obj: unknown): obj is SDToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const token = obj as Record<string, unknown>;\n\n // Must have name and path\n if (typeof token['name'] !== 'string') {\n return false;\n }\n\n if (!Array.isArray(token['path'])) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Check if token has a DTCG $value\n */\nexport function hasDTCGValue(token: SDToken): boolean {\n return token.$value !== undefined;\n}\n\n/**\n * Get token value (DTCG or legacy format)\n */\nexport function getSDTokenValue(token: SDToken): unknown {\n return token.$value ?? token.value;\n}\n\n/**\n * Get token type (DTCG or legacy format)\n */\nexport function getSDTokenType(token: SDToken): string | undefined {\n return token.$type ?? token.type;\n}\n","/**\n * Style Dictionary Configuration Generator\n *\n * Creates Style Dictionary configuration from DSAi config.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/config\n */\n\nimport { registerFormats } from './formats/index.js';\nimport { registerTransformGroups } from './groups/index.js';\nimport { registerPreprocessors } from './preprocessors/index.js';\nimport { registerTransforms } from './transforms/index.js';\n\nimport type {\n CreateSDConfigOptions,\n SDConfig,\n SDPlatformType,\n StyleDictionaryInstance,\n} from './types.js';\nimport type { ResolvedConfig } from '../../config/types.js';\n\n/**\n * Default source patterns for token files\n */\nconst DEFAULT_SOURCE_PATTERNS = [\n 'collections/color/*.json',\n 'collections/typography/*.json',\n 'collections/spacing/*.json',\n 'collections/border/*.json',\n 'collections/shadow/*.json',\n 'collections/layout/*.json',\n];\n\n/**\n * Default platforms to generate\n */\nconst DEFAULT_PLATFORMS: SDPlatformType[] = ['css', 'js', 'ts', 'scss', 'scss-dist', 'json'];\n\n/**\n * Create Style Dictionary configuration from DSAi config\n *\n * Generates a complete Style Dictionary configuration based on\n * the resolved DSAi configuration, with sensible defaults.\n *\n * @param dsaiConfig - Resolved DSAi configuration\n * @param options - Additional options to override defaults\n * @returns Style Dictionary configuration object\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { createStyleDictionaryConfig, registerAll } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * const { config } = await loadConfig();\n * const sdConfig = createStyleDictionaryConfig(config);\n *\n * registerAll(StyleDictionary);\n *\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n * ```\n */\nexport function createStyleDictionaryConfig(\n dsaiConfig: ResolvedConfig,\n options: Partial<CreateSDConfigOptions> = {}\n): SDConfig {\n const {\n source = DEFAULT_SOURCE_PATTERNS,\n prefix = dsaiConfig.tokens.prefix,\n buildPath = dsaiConfig.tokens.outputDir,\n baseFontSize = dsaiConfig.tokens.baseFontSize ?? 16,\n outputReferences = dsaiConfig.tokens.outputReferences ?? true,\n platforms = DEFAULT_PLATFORMS,\n verbose = dsaiConfig.global.debug ?? false,\n } = options;\n\n const config: SDConfig = {\n log: {\n verbosity: verbose ? 'verbose' : 'default',\n warnings: 'warn',\n errors: 'error',\n },\n preprocessors: ['fix-references'],\n expand: {\n typesMap: {\n sizing: 'dimension',\n spacing: 'dimension',\n borderRadius: 'dimension',\n borderWidth: 'dimension',\n },\n },\n source,\n platforms: {},\n };\n\n // Ensure buildPath ends with /\n const normalizedBuildPath = buildPath.endsWith('/') ? buildPath : `${buildPath}/`;\n\n const platformConfigs = config.platforms ?? {};\n\n // CSS Platform\n if (platforms.includes('css')) {\n platformConfigs['css'] = {\n transformGroup: 'custom/css',\n buildPath: `${normalizedBuildPath}css/`,\n files: [\n {\n destination: 'variables.css',\n format: 'css/variables-with-comments',\n options: {\n prefix,\n // For CSS, we need resolved values, not references\n // CSS custom properties cannot reference other tokens using {token.path} syntax\n // They need actual values or var(--other-token) syntax\n outputReferences: false,\n },\n },\n ],\n };\n }\n\n // JavaScript Platform\n if (platforms.includes('js')) {\n platformConfigs['js'] = {\n transformGroup: 'js-custom',\n buildPath: `${normalizedBuildPath}js/`,\n files: [\n {\n destination: 'tokens.js',\n format: 'javascript/es6',\n options: { outputReferences },\n },\n {\n destination: 'tokens.cjs',\n format: 'javascript/module',\n options: { outputReferences },\n },\n ],\n };\n }\n\n // TypeScript Platform\n if (platforms.includes('ts')) {\n platformConfigs['ts'] = {\n transformGroup: 'js-custom',\n buildPath: `${normalizedBuildPath}ts/`,\n files: [\n {\n destination: 'tokens.ts',\n format: 'javascript/es6',\n options: { outputReferences },\n },\n {\n destination: 'tokens.d.ts',\n format: 'typescript/declarations',\n },\n ],\n };\n }\n\n // SCSS Platform (source - for Bootstrap & DSAi builds)\n if (platforms.includes('scss')) {\n platformConfigs['scss'] = {\n transformGroup: 'custom/scss',\n buildPath: 'src/scss/',\n files: [\n {\n destination: '_variables.scss',\n format: 'scss/variables',\n options: {\n outputReferences,\n basePxFontSize: baseFontSize,\n },\n },\n ],\n };\n }\n\n // SCSS Platform (dist - for npm package consumers)\n if (platforms.includes('scss-dist')) {\n platformConfigs['scss-dist'] = {\n transformGroup: 'custom/scss',\n buildPath: `${normalizedBuildPath}scss/`,\n files: [\n {\n destination: '_variables.scss',\n format: 'scss/variables',\n options: {\n outputReferences,\n basePxFontSize: baseFontSize,\n },\n },\n ],\n };\n }\n\n // JSON Platform (for documentation)\n if (platforms.includes('json')) {\n platformConfigs['json'] = {\n transformGroup: 'js',\n buildPath: `${normalizedBuildPath}json/`,\n files: [\n { destination: 'tokens.json', format: 'json/flat' },\n { destination: 'tokens-nested.json', format: 'json/nested' },\n ],\n };\n }\n\n config.platforms = platformConfigs;\n return config;\n}\n\n/**\n * Register all custom transforms, formats, preprocessors, and groups\n *\n * Must be called before creating a Style Dictionary instance with\n * a config generated by createStyleDictionaryConfig.\n *\n * @param sd - Style Dictionary instance (the imported module)\n * @param options - Custom extensions to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerAll } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerAll(StyleDictionary, {\n * customTransforms: [myCustomTransform],\n * customFormats: [myCustomFormat],\n * });\n * ```\n */\nexport function registerAll(\n sd: StyleDictionaryInstance,\n options: Partial<CreateSDConfigOptions> = {}\n): void {\n const { customTransforms = [], customFormats = [], customPreprocessors = [] } = options;\n\n // Order matters: transforms first, then groups (which reference transforms)\n registerTransforms(sd, customTransforms);\n registerTransformGroups(sd);\n registerFormats(sd, customFormats);\n registerPreprocessors(sd, customPreprocessors);\n}\n\n/**\n * Create and register a complete Style Dictionary setup\n *\n * Convenience function that combines registerAll and createStyleDictionaryConfig.\n *\n * @param sd - Style Dictionary instance\n * @param dsaiConfig - Resolved DSAi configuration\n * @param options - Additional options\n * @returns Style Dictionary configuration\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { setupStyleDictionary } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * const { config } = await loadConfig();\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\n *\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n * ```\n */\nexport function setupStyleDictionary(\n sd: StyleDictionaryInstance,\n dsaiConfig: ResolvedConfig,\n options: Partial<CreateSDConfigOptions> = {}\n): SDConfig {\n registerAll(sd, options);\n return createStyleDictionaryConfig(dsaiConfig, options);\n}\n","/**\n * Fix References Preprocessor\n *\n * Fixes token reference paths that may be mismatched between\n * Figma exports and the actual token structure.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors/fix-references\n */\n\nimport type { PreprocessorDefinition } from '../types.js';\n\n/**\n * Default reference path mappings\n * Maps incorrect reference paths to correct paths\n */\nconst DEFAULT_PATH_MAPPINGS: Array<[string, string]> = [\n ['{colors.brand.', '{color.'],\n ['{colors.neutral.', '{neutral.'],\n ['{borders.width.', '{border.width.'],\n];\n\n/**\n * Fix a single value's reference path\n */\nfunction fixValue(value: unknown, mappings: Array<[string, string]>): unknown {\n if (typeof value !== 'string' || !value.startsWith('{')) {\n return value;\n }\n\n let result = value;\n for (const mapping of mappings) {\n result = result.split(mapping[0]).join(mapping[1]);\n }\n return result;\n}\n\n/**\n * Process tokens recursively to fix reference paths\n */\nfunction processTokens(obj: Record<string, unknown>, mappings: Array<[string, string]>): void {\n for (const key of Object.keys(obj)) {\n // eslint-disable-next-line security/detect-object-injection\n const value = obj[key];\n\n if (value && typeof value === 'object') {\n const typedValue = value as Record<string, unknown>;\n\n // DTCG format - fix $value\n if ('$value' in typedValue) {\n typedValue['$value'] = fixValue(typedValue['$value'], mappings);\n }\n // Legacy format - fix value\n else if ('value' in typedValue) {\n typedValue['value'] = fixValue(typedValue['value'], mappings);\n }\n // Recurse into nested objects\n else {\n processTokens(typedValue, mappings);\n }\n }\n }\n}\n\n/**\n * fix-references preprocessor\n *\n * Fixes token reference paths that may be mismatched.\n * Our tokens use \"color.blue.500\" but Figma exports may reference\n * \"{colors.brand.blue.500}\" - this preprocessor fixes the mismatch.\n *\n * @example\n * Before: { $value: \"{colors.brand.primary}\" }\n * After: { $value: \"{color.primary}\" }\n */\nexport const fixReferences: PreprocessorDefinition = {\n name: 'fix-references',\n preprocessor: (dictionary) => {\n processTokens(dictionary, DEFAULT_PATH_MAPPINGS);\n return dictionary;\n },\n};\n\n/**\n * Create a custom fix-references preprocessor with custom mappings\n *\n * @param mappings - Array of [from, to] path mapping pairs\n * @returns Custom preprocessor definition\n *\n * @example\n * ```typescript\n * const customFixReferences = createFixReferencesPreprocessor([\n * ['{colors.brand.', '{color.'],\n * ['{acme.', '{brand.'],\n * ]);\n * ```\n */\nexport function createFixReferencesPreprocessor(\n mappings: Array<[string, string]>\n): PreprocessorDefinition {\n return {\n name: 'fix-references-custom',\n preprocessor: (dictionary) => {\n processTokens(dictionary, mappings);\n return dictionary;\n },\n };\n}\n","/**\n * Style Dictionary Preprocessors\n *\n * Exports all built-in preprocessors and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors\n */\n\nimport { fixReferences } from './fix-references.js';\n\nimport type { PreprocessorDefinition, StyleDictionaryInstance } from '../types.js';\n\n/**\n * All built-in preprocessors\n */\nexport const builtInPreprocessors: PreprocessorDefinition[] = [fixReferences];\n\n/**\n * Register all preprocessors with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customPreprocessors - Additional custom preprocessors to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerPreprocessors } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerPreprocessors(StyleDictionary);\n * ```\n */\nexport function registerPreprocessors(\n sd: StyleDictionaryInstance,\n customPreprocessors: PreprocessorDefinition[] = []\n): void {\n const allPreprocessors = [...builtInPreprocessors, ...customPreprocessors];\n\n for (const preprocessor of allPreprocessors) {\n sd.registerPreprocessor({\n name: preprocessor.name,\n preprocessor: preprocessor.preprocessor,\n });\n }\n}\n\n// Re-export individual preprocessors\nexport { fixReferences, createFixReferencesPreprocessor } from './fix-references.js';\n","/**\n * Style Dictionary Integration Module\n *\n * Provides reusable transforms, formats, preprocessors, and configuration\n * generation for Style Dictionary token builds.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { loadConfig } from '@dsai-io/tools/config';\n * import {\n * setupStyleDictionary,\n * registerAll,\n * createStyleDictionaryConfig,\n * } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * // Option 1: All-in-one setup\n * const { config } = await loadConfig();\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n *\n * // Option 2: Manual registration\n * registerAll(StyleDictionary);\n * const sdConfig = createStyleDictionaryConfig(config);\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Token types\n SDToken,\n SDDictionary,\n // Transform types\n TransformType,\n SDTransformOptions,\n TransformDefinition,\n TransformGroupDefinition,\n // Format types\n SDPlatform,\n SDFile,\n SDFormatArgs,\n FormatDefinition,\n // Preprocessor types\n PreprocessorDefinition,\n // Config types\n SDLogConfig,\n SDConfig,\n CreateSDConfigOptions,\n SDPlatformType,\n // Registration types\n StyleDictionaryInstance,\n} from './types.js';\n\n// Type guards\nexport { isSDToken, hasDTCGValue, getSDTokenValue, getSDTokenType } from './types.js';\n\n// ============================================================================\n// Config Generation\n// ============================================================================\n\nexport { createStyleDictionaryConfig, registerAll, setupStyleDictionary } from './config.js';\n\n// ============================================================================\n// Transforms\n// ============================================================================\n\nexport {\n // Collections\n builtInTransforms,\n // Registration\n registerTransforms,\n // Individual transforms\n fontWeightUnitless,\n lineHeightUnitless,\n dimensionRem,\n nameKebab,\n} from './transforms/index.js';\n\n// ============================================================================\n// Formats\n// ============================================================================\n\nexport {\n // Collections\n builtInFormats,\n // Registration\n registerFormats,\n // Individual formats\n cssVariablesWithComments,\n typescriptDeclarations,\n} from './formats/index.js';\n\n// ============================================================================\n// Preprocessors\n// ============================================================================\n\nexport {\n // Collections\n builtInPreprocessors,\n // Registration\n registerPreprocessors,\n // Individual preprocessors\n fixReferences,\n createFixReferencesPreprocessor,\n} from './preprocessors/index.js';\n\n// ============================================================================\n// Transform Groups\n// ============================================================================\n\nexport {\n // Collections\n transformGroups,\n // Registration\n registerTransformGroups,\n // Individual groups\n cssTransformGroup,\n jsTransformGroup,\n scssTransformGroup,\n} from './groups/index.js';\n","/**\n * Framework Mappers\n *\n * Maps Figma/DTCG token names to framework-specific variable names.\n * Supports Bootstrap, shadcn/ui, Tailwind, MUI, and custom mappings.\n *\n * @packageDocumentation\n */\n\nexport {\n bootstrapMapper,\n BOOTSTRAP_MAPPINGS,\n BOOTSTRAP_PATTERNS,\n mapToBootstrapName,\n} from './bootstrap.js';\nexport { shadcnMapper, SHADCN_MAPPINGS, mapToShadcnName } from './shadcn.js';\nexport {\n createFrameworkMapper,\n getFrameworkMapper,\n applyNameMapping,\n type FrameworkMapper,\n type FrameworkMapperWithConfig,\n} from './mapper.js';\nexport type {\n FrameworkTarget,\n FrameworkMappingConfig,\n FrameworkMappingPattern,\n} from '../../config/types.js';\n","/**\n * Token Changelog Generator\n *\n * Generates human-readable changelogs from token diffs in Markdown format.\n *\n * @packageDocumentation\n */\n\nimport { existsSync } from 'node:fs';\nimport { writeFile, readFile } from 'node:fs/promises';\n\nimport type { TokenDiff, TokenChange } from './diff.js';\nimport type { TokenCollection } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for changelog generation\n */\nexport interface ChangelogOptions {\n /** Version number (e.g., '1.2.0') */\n version?: string;\n /** Release date (defaults to today) */\n date?: Date;\n /** Custom header for the changelog entry */\n header?: string;\n /** Whether to include descriptions */\n includeDescriptions?: boolean;\n /** Whether to include value changes (before/after) */\n includeValues?: boolean;\n /** Maximum value length to display (truncates longer values) */\n maxValueLength?: number;\n /** Whether to group by change type */\n groupByType?: boolean;\n}\n\n/**\n * Result of changelog generation\n */\nexport interface ChangelogResult {\n /** Generated Markdown content */\n content: string;\n /** Number of entries in the changelog */\n entryCount: number;\n /** Whether there are breaking changes */\n hasBreaking: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Format a date as YYYY-MM-DD\n */\nfunction formatDate(date: Date): string {\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Format a value for display (truncate if too long)\n */\nfunction formatValue(value: unknown, maxLength = 100): string {\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n\n if (str.length <= maxLength) {\n return str;\n }\n\n return `${str.slice(0, maxLength)}...`;\n}\n\n/**\n * Escape Markdown special characters\n */\nfunction escapeMarkdown(text: string): string {\n return text.replace(/[*_`[\\]]/g, '\\\\$&');\n}\n\n/**\n * Generate Markdown for a single token change\n */\nfunction formatChange(change: TokenChange, options: ChangelogOptions): string {\n const lines: string[] = [];\n\n // Token path with breaking indicator\n const breaking = change.breaking ? ' ⚠️ **BREAKING**' : '';\n lines.push(`- \\`${escapeMarkdown(change.path)}\\`${breaking}`);\n\n // Description\n if (options.includeDescriptions && change.description) {\n lines.push(` - ${change.description}`);\n }\n\n // Value change details\n if (options.includeValues && change.valueChange) {\n const { oldValue, newValue, oldType, newType } = change.valueChange;\n\n if (change.type === 'type-changed') {\n lines.push(` - Type: \\`${oldType}\\` → \\`${newType}\\``);\n }\n\n const oldFormatted = formatValue(oldValue, options.maxValueLength);\n const newFormatted = formatValue(newValue, options.maxValueLength);\n\n if (change.type === 'modified' || change.type === 'type-changed') {\n lines.push(` - Before: \\`${escapeMarkdown(oldFormatted)}\\``);\n lines.push(` - After: \\`${escapeMarkdown(newFormatted)}\\``);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a section for a specific change type\n */\nfunction formatSection(title: string, changes: TokenChange[], options: ChangelogOptions): string {\n if (changes.length === 0) {\n return '';\n }\n\n const lines: string[] = [];\n lines.push(`### ${title}`);\n lines.push('');\n\n for (const change of changes) {\n lines.push(formatChange(change, options));\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Generate a changelog entry from a token diff\n *\n * @param diff - Token diff to generate changelog from\n * @param options - Changelog options\n * @returns Generated changelog content\n */\nexport function generateChangelog(\n diff: TokenDiff,\n options: ChangelogOptions = {}\n): ChangelogResult {\n const {\n version = 'Unreleased',\n date = new Date(),\n header,\n includeDescriptions = true,\n includeValues = true,\n maxValueLength = 100,\n groupByType = true,\n } = options;\n\n const lines: string[] = [];\n\n // Header\n if (header) {\n lines.push(header);\n } else {\n const dateStr = formatDate(date);\n lines.push(`## [${version}] - ${dateStr}`);\n }\n\n lines.push('');\n\n // Summary\n if (diff.totalChanges === 0) {\n lines.push('No changes.');\n lines.push('');\n return {\n content: lines.join('\\n'),\n entryCount: 0,\n hasBreaking: false,\n };\n }\n\n if (diff.hasBreaking) {\n lines.push('⚠️ **This release contains breaking changes**');\n lines.push('');\n }\n\n lines.push(`**Total changes:** ${diff.totalChanges}`);\n lines.push('');\n\n // Group changes by type\n if (groupByType) {\n // Breaking changes first\n if (diff.removed.length > 0 || diff.typeChanged.length > 0) {\n lines.push(\n formatSection('Breaking Changes', [...diff.removed, ...diff.typeChanged], {\n ...options,\n includeDescriptions,\n includeValues,\n maxValueLength,\n })\n );\n }\n\n // Added tokens\n if (diff.added.length > 0) {\n lines.push(\n formatSection('Added', diff.added, {\n ...options,\n includeDescriptions,\n includeValues: false, // No before/after for additions\n maxValueLength,\n })\n );\n }\n\n // Modified tokens\n if (diff.modified.length > 0) {\n lines.push(\n formatSection('Changed', diff.modified, {\n ...options,\n includeDescriptions,\n includeValues,\n maxValueLength,\n })\n );\n }\n\n // Deprecated tokens\n if (diff.deprecated.length > 0) {\n lines.push(\n formatSection('Deprecated', diff.deprecated, {\n ...options,\n includeDescriptions,\n includeValues: false,\n maxValueLength,\n })\n );\n }\n } else {\n // Flat list of all changes\n const allChanges = [\n ...diff.removed,\n ...diff.typeChanged,\n ...diff.added,\n ...diff.modified,\n ...diff.deprecated,\n ];\n\n for (const change of allChanges) {\n lines.push(\n formatChange(change, {\n ...options,\n includeDescriptions,\n includeValues,\n maxValueLength,\n })\n );\n }\n lines.push('');\n }\n\n return {\n content: lines.join('\\n'),\n entryCount: diff.totalChanges,\n hasBreaking: diff.hasBreaking,\n };\n}\n\n/**\n * Write changelog to file (append mode)\n *\n * @param content - Changelog content to write\n * @param filePath - Path to changelog file\n * @returns Whether the write was successful\n */\nexport async function writeChangelog(content: string, filePath: string): Promise<boolean> {\n try {\n let finalContent = content;\n\n // If file exists, prepend new content\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(filePath)) {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const existingContent = await readFile(filePath, 'utf-8');\n\n // Check if there's a header (# Changelog)\n const hasHeader = existingContent.trim().startsWith('#');\n\n if (hasHeader) {\n // Insert after first line\n const lines = existingContent.split('\\n');\n const header = lines[0];\n const rest = lines.slice(1).join('\\n');\n finalContent = `${header}\\n\\n${content}${rest}`;\n } else {\n // Prepend\n finalContent = `${content}\\n${existingContent}`;\n }\n } else {\n // Create new file with header\n finalContent = `# Changelog\\n\\nAll notable changes to design tokens will be documented in this file.\\n\\n${content}`;\n }\n\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n await writeFile(filePath, finalContent, 'utf-8');\n return true;\n } catch (error) {\n console.error('Failed to write changelog:', error);\n return false;\n }\n}\n\n/**\n * Generate and write changelog in one step\n *\n * @param diff - Token diff to generate changelog from\n * @param filePath - Path to changelog file\n * @param options - Changelog options\n * @returns Result of changelog generation\n */\nexport async function generateAndWriteChangelog(\n diff: TokenDiff,\n filePath: string,\n options: ChangelogOptions = {}\n): Promise<ChangelogResult & { written: boolean }> {\n const result = generateChangelog(diff, options);\n const written = await writeChangelog(result.content, filePath);\n\n return {\n ...result,\n written,\n };\n}\n\n/**\n * CLI entry point for generating changelog from two token files\n *\n * @param oldTokensPath - Path to old/previous tokens file\n * @param newTokensPath - Path to new/current tokens file\n * @param outputPath - Path to changelog file (default: 'TOKENS-CHANGELOG.md')\n * @param version - Version number for the changelog entry\n * @returns Whether the operation was successful\n */\nexport async function generateChangelogCLI(\n oldTokensPath: string,\n newTokensPath: string,\n outputPath = 'TOKENS-CHANGELOG.md',\n version?: string\n): Promise<boolean> {\n /* eslint-disable no-console */\n try {\n console.log('📝 Generating token changelog...\\n');\n\n // Import required modules dynamically\n const { readFile: fsReadFile } = await import('node:fs/promises');\n const { diffTokens: diffFn } = await import('./diff.js');\n\n // Load token files\n console.log(`📖 Reading old tokens: ${oldTokensPath}`);\n const oldContent = await fsReadFile(oldTokensPath, 'utf-8');\n const oldTokens = JSON.parse(oldContent) as TokenCollection;\n\n console.log(`📖 Reading new tokens: ${newTokensPath}`);\n const newContent = await fsReadFile(newTokensPath, 'utf-8');\n const newTokens = JSON.parse(newContent) as TokenCollection;\n\n // Compute diff\n console.log('🔍 Computing differences...');\n const diff = diffFn(oldTokens, newTokens);\n\n if (diff.totalChanges === 0) {\n console.log('✨ No changes detected.');\n return true;\n }\n\n console.log(`\\n📊 Summary:`);\n console.log(` • Total changes: ${diff.totalChanges}`);\n if (diff.added.length > 0) {\n console.log(` • Added: ${diff.added.length}`);\n }\n if (diff.removed.length > 0) {\n console.log(` • Removed: ${diff.removed.length} ⚠️`);\n }\n if (diff.modified.length > 0) {\n console.log(` • Modified: ${diff.modified.length}`);\n }\n if (diff.typeChanged.length > 0) {\n console.log(` • Type changed: ${diff.typeChanged.length} ⚠️`);\n }\n if (diff.deprecated.length > 0) {\n console.log(` • Deprecated: ${diff.deprecated.length}`);\n }\n\n if (diff.hasBreaking) {\n console.log('\\n⚠️ Warning: This release contains breaking changes!');\n }\n\n // Generate and write changelog\n console.log(`\\n📄 Writing changelog to: ${outputPath}`);\n const result = await generateAndWriteChangelog(diff, outputPath, {\n version,\n includeDescriptions: true,\n includeValues: true,\n });\n\n if (result.written) {\n console.log('✅ Changelog generated successfully!');\n return true;\n } else {\n console.error('❌ Failed to write changelog file');\n return false;\n }\n } catch (error) {\n console.error('❌ Error generating changelog:', error);\n return false;\n }\n /* eslint-enable no-console */\n}\n","/**\n * @file Token Tooling Module\n * @description Provides utilities for token validation, transformation,\n * and build orchestration using Style Dictionary.\n *\n * @module @dsai-io/tools/tokens\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n // Core token types\n DTCGToken,\n LegacyToken,\n Token,\n TokenType,\n TokenCollection,\n // Figma types\n FigmaCollection,\n FigmaExport,\n // Validation types\n ValidationSeverity,\n ValidationIssue,\n ValidateOptions,\n // Build types\n BuildOptions,\n BuildResult,\n BuildStep,\n // Sync types\n SyncOptions,\n SyncResult,\n // Postprocess types\n PostprocessOptions,\n PostprocessResult,\n ReplacementRule,\n // Merge types\n MergeOptions,\n MergeResult,\n} from './types.js';\n\n// Re-export with prefixed names to avoid conflicts with config module\nexport type {\n ValidationResult as TokenValidationResult,\n TransformOptions as TokenTransformOptions,\n TransformResult as TokenTransformResult,\n} from './types.js';\n\n// Mode extraction and preprocessing types\nexport type {\n ModeExtractionOptions,\n ModeExtractionResult,\n} from './mode-extractor.js';\n\nexport type {\n PreprocessorConfig,\n FilePreprocessingResult,\n PreprocessingResult,\n} from './mode-preprocessor.js';\n\n// ============================================================================\n// Type Guards and Utility Functions\n// ============================================================================\n\nexport {\n // Type guards\n isDTCGToken,\n isLegacyToken,\n isToken,\n isValidTokenType,\n isTokenReference,\n // Token utilities\n getTokenValue,\n getTokenType,\n getTokenDescription,\n toDTCGToken,\n parseTokenReference,\n // Constants\n VALID_TOKEN_TYPES,\n} from './types.js';\n\n// ============================================================================\n// Validation Module\n// ============================================================================\n\nexport { validateTokens, validateTokensCLI } from './validate.js';\n\n// ============================================================================\n// Schema Validation Module\n// ============================================================================\n\nexport {\n // DTCG schemas\n dtcgFileSchema,\n dtcgTokenCollectionSchema,\n dtcgTokenSchema,\n // Figma schemas\n figmaExportSchema,\n figmaExportWithMetadataSchema,\n figmaVariablesResponseSchema,\n // Style Dictionary schemas\n styleDictionaryInputSchema,\n styleDictionaryTokenSchema,\n // Validation functions\n validateDTCGFile,\n validateDTCGTokens,\n validateFigmaExport,\n validateFigmaExportWithMetadata,\n validateFigmaVariablesResponse,\n validateStyleDictionaryInput,\n validateStyleDictionaryTokens,\n} from './schemas/index.js';\n\nexport type {\n // Schema types\n DTCGFile,\n DTCGTokenCollection,\n FigmaExportWithMetadata,\n FigmaVariablesResponse,\n // Validation types\n ValidationError as SchemaValidationError,\n ValidationOptions as SchemaValidationOptions,\n ValidationResult as SchemaValidationResult,\n} from './schemas/index.js';\n\n// ============================================================================\n// Figma Validation Module\n// ============================================================================\n\nexport {\n validateFigmaExports,\n validateFigmaFile,\n validateFigmaCLI,\n detectModes as detectFigmaModes,\n} from './validate-figma.js';\n\n// ============================================================================\n// Transform Module\n// ============================================================================\n\nexport {\n transformTokens,\n transformTokensCLI,\n transformToken,\n transformTokenTree,\n transformType,\n transformValue,\n detectModes as detectTransformModes,\n} from './transform.js';\n\n// ============================================================================\n// Sync Module\n// ============================================================================\n\nexport { syncTokens, syncTokensCLI, getDefaultSyncPaths } from './sync.js';\n\n// ============================================================================\n// Build Module\n// ============================================================================\n\nexport { buildTokens, buildTokensCLI, runBuildCLI } from './build.js';\n\n// ============================================================================\n// Theme Discovery Module\n// ============================================================================\n\nexport {\n discoverThemeFiles,\n getThemeFiles,\n autoDetectThemes,\n} from './theme-discovery.js';\n\nexport type {\n ThemeFilesResult,\n DiscoveryResult,\n DiscoveryOptions,\n} from './theme-discovery.js';\n\n// ============================================================================\n// Mode Extraction and Preprocessing Module\n// ============================================================================\n\nexport {\n extractMode,\n extractModes,\n detectModes,\n flattenModeStructure,\n} from './mode-extractor.js';\n\nexport {\n preprocessFile,\n preprocessTokenFiles,\n getPreprocessedFilesForMode,\n} from './mode-preprocessor.js';\n\n// ============================================================================\n// Theme Builder Module\n// ============================================================================\n\nexport {\n buildTheme,\n buildAllThemes,\n generateThemeBuildConfig,\n getCssFormat,\n getThemeSelector,\n validateThemeDefinitions,\n} from './theme-builder.js';\n\nexport type {\n ThemeBuildConfig,\n ThemeBuildOptions,\n ThemeBuildResult,\n MultiThemeBuildOptions,\n MultiThemeBuildResult,\n ThemeStyleDictionaryConfig,\n StyleDictionaryPlatformConfig,\n StyleDictionaryFileConfig,\n} from './theme-builder.js';\n\n// ============================================================================\n// Clean Module\n// ============================================================================\n\nexport {\n cleanTokenOutputs,\n cleanTokensCLI,\n DEFAULT_CLEAN_DIRECTORIES,\n} from './clean.js';\n\nexport type {\n CleanOptions,\n CleanResult,\n CleanedDirectory,\n} from './clean.js';\n\n// ============================================================================\n// Postprocess Module\n// ============================================================================\n\nexport {\n postprocessCss,\n postprocessCssFiles,\n postprocessCLI,\n getDefaultCssDir,\n getDefaultFiles,\n getDefaultTransformations,\n} from './postprocess.js';\n\n// ============================================================================\n// Merge Module (Token Collections)\n// ============================================================================\n\nexport { mergeCollections, mergeCollectionsCLI } from './merge.js';\n\n// ============================================================================\n// Style Merge Module (CSS/SCSS Bundling)\n// ============================================================================\n\nexport * from './merge/index.js';\n\n// ============================================================================\n// Output Path Resolution\n// ============================================================================\n\nexport * from './output/index.js';\n\n// ============================================================================\n// Style Dictionary Integration\n// ============================================================================\n\n// Re-export all Style Dictionary types and utilities\nexport * from './style-dictionary/index.js';\n\n// ============================================================================\n// Framework Mappers\n// ============================================================================\n\n// Re-export framework mapping utilities\nexport * from './framework-mappers/index.js';\n\n// ============================================================================\n// Changelog Generation\n// ============================================================================\n\nexport {\n generateChangelog,\n writeChangelog,\n generateAndWriteChangelog,\n generateChangelogCLI,\n} from './changelog.js';\n\nexport type {\n ChangelogOptions,\n ChangelogResult,\n} from './changelog.js';\n\nexport {\n diffTokens,\n summarizeDiff,\n filterDiff,\n getBreakingChanges,\n} from './diff.js';\n\nexport type {\n TokenChangeType,\n TokenValueChange,\n TokenChange,\n TokenDiff,\n} from './diff.js';\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * SVG file scanner\n *\n * Scans directories for SVG files and reads their contents.\n *\n * @packageDocumentation\n */\n\nimport { readFileSync, statSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport type { RawSVGData, ScannerOptions } from '../types.js';\n\n/**\n * Scan directory for SVG files\n *\n * Uses fast-glob to find SVG files matching the specified patterns.\n *\n * @param options - Scanner options\n * @returns Array of raw SVG data\n *\n * @example\n * ```typescript\n * const files = await scanSVGFiles({\n * sourceDir: './icons',\n * include: ['**\\/*.svg'],\n * exclude: ['**\\/node_modules\\/**'],\n * });\n * ```\n */\nexport async function scanSVGFiles(options: ScannerOptions): Promise<RawSVGData[]> {\n const {\n sourceDir,\n include = ['**/*.svg'],\n exclude = ['**/node_modules/**', '**/dist/**'],\n } = options;\n\n // Dynamic import of fast-glob (ESM module)\n const { default: fg } = await import('fast-glob');\n\n // Find all SVG files\n const files = await fg(include, {\n cwd: sourceDir,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n\n // Read each file\n const svgFiles: RawSVGData[] = [];\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const stats = statSync(filePath);\n\n // Extract file name without extension\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\n\n svgFiles.push({\n filePath,\n fileName,\n content,\n originalSize: stats.size,\n });\n } catch {\n console.warn(`Warning: Failed to read ${filePath}`);\n }\n }\n\n // Sort by name for consistent output\n svgFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n return svgFiles;\n}\n\n/**\n * Read a single SVG file\n *\n * @param filePath - Path to SVG file\n * @returns Raw SVG data or null if failed\n */\nexport function readSVGFile(filePath: string): RawSVGData | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const stats = statSync(filePath);\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\n\n return {\n filePath,\n fileName,\n content,\n originalSize: stats.size,\n };\n } catch {\n return null;\n }\n}\n","/**\n * Icon naming utilities\n *\n * @packageDocumentation\n */\n\n/**\n * Convert string to PascalCase component name\n *\n * @param input - Input string (e.g., file name)\n * @returns PascalCase component name\n *\n * @example\n * ```typescript\n * toComponentName('arrow-left') // 'ArrowLeft'\n * toComponentName('24px-icon') // 'Icon24px'\n * toComponentName('my_icon') // 'MyIcon'\n * toComponentName('chevron-down-small') // 'ChevronDownSmall'\n * ```\n */\nexport function toComponentName(input: string): string {\n // Handle numbers at start by prefixing with 'Icon'\n let processed = input;\n if (/^\\d/.test(processed)) {\n processed = `icon-${processed}`;\n }\n\n return (\n processed\n // Split on non-alphanumeric characters\n .split(/[^a-zA-Z0-9]+/)\n // Filter empty strings\n .filter((word) => word.length > 0)\n // Capitalize each word\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n // Join into single string\n .join('')\n );\n}\n\n/**\n * Convert string to kebab-case icon name\n *\n * @param input - Input string (e.g., component name)\n * @returns kebab-case icon name\n *\n * @example\n * ```typescript\n * toIconName('ArrowLeft') // 'arrow-left'\n * toIconName('ChevronDownSmall') // 'chevron-down-small'\n * toIconName('Icon24px') // 'icon-24px'\n * ```\n */\nexport function toIconName(input: string): string {\n return (\n input\n // Insert hyphen before uppercase letters\n .replace(/([A-Z])/g, '-$1')\n // Insert hyphen before number sequences\n .replace(/(\\d+)/g, '-$1')\n // Clean up multiple hyphens\n .replace(/-+/g, '-')\n // Remove leading hyphen\n .replace(/^-/, '')\n // Lowercase\n .toLowerCase()\n );\n}\n\n/**\n * Validate icon name\n *\n * @param name - Icon name to validate\n * @returns True if valid, false otherwise\n */\nexport function isValidIconName(name: string): boolean {\n // Must be non-empty\n if (!name || name.length === 0) {\n return false;\n }\n\n // Must be valid identifier-like (alphanumeric, hyphens, underscores)\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Normalize icon name from file name\n *\n * @param fileName - File name (without extension)\n * @returns Normalized icon name\n */\nexport function normalizeIconName(fileName: string): string {\n return fileName\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n}\n","/**\n * SVG parser\n *\n * Parses SVG content into structured data.\n *\n * @packageDocumentation\n */\n\nimport { normalizeIconName, toComponentName } from '../utils/naming.js';\n\nimport type { ParsedSVG, RawSVGData } from '../types.js';\n\n/**\n * Parse raw SVG data into structured format\n *\n * Extracts viewBox, attributes, inner content, and accessibility info.\n *\n * @param raw - Raw SVG data\n * @returns Parsed SVG data\n */\nexport function parseSVG(raw: RawSVGData): ParsedSVG {\n const { content, fileName } = raw;\n\n // Extract SVG opening tag attributes\n const svgMatch = content.match(/<svg([^>]*)>/i);\n const svgAttributes = svgMatch?.[1] ?? '';\n\n // Parse attributes into object\n const attributes: Record<string, string> = {};\n const attrRegex = /([a-zA-Z][a-zA-Z0-9-]*)=[\"']([^\"']*)[\"']/g;\n\n for (const attrMatch of svgAttributes.matchAll(attrRegex)) {\n const key = attrMatch[1];\n const value = attrMatch[2];\n if (key && value !== undefined) {\n Object.assign(attributes, { [key]: value });\n }\n }\n\n // Extract viewBox (or construct from width/height)\n let viewBox = attributes['viewBox'] ?? '';\n if (!viewBox) {\n const width = attributes['width']?.replace(/[^\\d.]/g, '') ?? '24';\n const height = attributes['height']?.replace(/[^\\d.]/g, '') ?? '24';\n viewBox = `0 0 ${width} ${height}`;\n }\n\n // Extract inner content (everything between <svg> and </svg>)\n const innerContentMatch = content.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\n const innerContent = innerContentMatch?.[1]?.trim() ?? '';\n\n // Extract title for accessibility\n const titleMatch = content.match(/<title>([^<]*)<\\/title>/i);\n const title = titleMatch?.[1];\n\n // Extract description for accessibility\n const descMatch = content.match(/<desc>([^<]*)<\\/desc>/i);\n const description = descMatch?.[1];\n\n // Generate normalized name and component name\n const name = normalizeIconName(fileName);\n const componentName = toComponentName(fileName);\n\n return {\n name,\n componentName,\n fileName,\n viewBox,\n width: attributes['width'],\n height: attributes['height'],\n innerContent,\n fullContent: content,\n attributes,\n title,\n description,\n };\n}\n\n/**\n * Parse multiple SVG files\n *\n * @param rawFiles - Array of raw SVG data\n * @returns Array of parsed SVG data\n */\nexport function parseSVGFiles(rawFiles: RawSVGData[]): ParsedSVG[] {\n return rawFiles.map(parseSVG);\n}\n\n/**\n * Clean SVG content for React compatibility\n *\n * Converts kebab-case attributes to camelCase for JSX.\n *\n * @param svg - SVG content string\n * @returns Cleaned SVG content\n */\nexport function cleanSVGForReact(svg: string): string {\n return (\n svg\n // Convert kebab-case attributes to camelCase for React\n .replace(\n /(stroke|fill|line|clip|stop|color|font|text|letter|word|alignment|dominant|glyph|horiz|overline|paint|pointer|shape|strikethrough|underline|unicode|units|vert|writing)-([a-z])/g,\n (_, p1, p2) => p1 + p2.toUpperCase()\n )\n // Convert specific attributes\n .replace(/class=\"/g, 'className=\"')\n .replace(/xlink:href/g, 'xlinkHref')\n .replace(/xmlns:xlink/g, 'xmlnsXlink')\n // Use currentColor for strokes and fills (inherits from CSS)\n .replace(/stroke=\"#[^\"]+\"/g, 'stroke=\"currentColor\"')\n .replace(/fill=\"#[^\"]+\"/g, 'fill=\"currentColor\"')\n // Handle fill=\"none\" (keep as-is, common for stroke-only icons)\n .replace(/fill=\"currentColor\"([^>]*stroke)/g, 'fill=\"none\"$1')\n );\n}\n\n/**\n * Extract viewBox from SVG string\n *\n * @param svg - SVG content string\n * @returns ViewBox string or default\n */\nexport function extractViewBox(svg: string): string {\n const match = svg.match(/viewBox=\"([^\"]+)\"/);\n return match?.[1] ?? '0 0 24 24';\n}\n","/**\n * Core icon processing exports\n *\n * @packageDocumentation\n */\n\nexport { readSVGFile, scanSVGFiles } from './scanner.js';\nexport { cleanSVGForReact, extractViewBox, parseSVG, parseSVGFiles } from './parser.js';\nexport {\n defaultSVGOConfig,\n optimizeSVG,\n optimizeSVGFiles,\n skipOptimization,\n} from './optimizer.js';\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * React component generator\n *\n * Generates React icon components from optimized SVG data.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { cleanSVGForReact } from '../core/parser.js';\n\nimport type {\n GeneratedIcon,\n GeneratorOptions,\n IconTemplate,\n IndexTemplate,\n OptimizedSVG,\n TypesTemplate,\n} from '../types.js';\n\n/**\n * Default React icon template\n *\n * Generates a forwardRef component with size, title, and aria support.\n */\nexport const defaultReactTemplate: IconTemplate = (icon) => {\n const cleanedContent = cleanSVGForReact(icon.innerContent);\n\n return `/**\n * ${icon.componentName} icon\n *\n * @generated by @dsai-io/tools\n */\n\nimport * as React from 'react';\n\nimport type { SVGProps } from 'react';\n\nexport interface ${icon.componentName}Props extends SVGProps<SVGSVGElement> {\n /** Icon size */\n size?: number | string;\n /** Icon title for accessibility */\n title?: string;\n}\n\nexport const ${icon.componentName} = React.forwardRef<SVGSVGElement, ${icon.componentName}Props>(\n ({ size = 24, title${icon.title ? ` = \"${icon.title}\"` : ''}, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"${icon.viewBox}\"\n width={size}\n height={size}\n fill=\"currentColor\"\n role={title ? 'img' : 'presentation'}\n aria-label={title}\n {...props}\n >\n {title && <title>{title}</title>}\n ${cleanedContent}\n </svg>\n )\n);\n\n${icon.componentName}.displayName = '${icon.componentName}';\n\nexport default ${icon.componentName};\n`;\n};\n\n/**\n * Default React index template\n *\n * Exports all icon components from a single entry point.\n */\nexport const defaultReactIndexTemplate: IndexTemplate = (icons) => `/**\n * Icon exports\n *\n * @generated by @dsai-io/tools\n */\n\n${icons.map((icon) => `export { ${icon.componentName} } from './${icon.componentName}.js';`).join('\\n')}\n\n// Re-export types\nexport type { SVGProps } from 'react';\n`;\n\n/**\n * Default React types template\n *\n * Generates TypeScript types for all icons.\n */\nexport const defaultReactTypesTemplate: TypesTemplate = (icons) => `/**\n * Icon types\n *\n * @generated by @dsai-io/tools\n */\n\nimport type { ForwardRefExoticComponent, RefAttributes, SVGProps } from 'react';\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number | string;\n title?: string;\n}\n\nexport type IconComponent = ForwardRefExoticComponent<\n IconProps & RefAttributes<SVGSVGElement>\n>;\n\n/**\n * Available icon names\n */\nexport type IconName =\n${icons.map((icon) => ` | '${icon.name}'`).join('\\n')};\n\n/**\n * Icon component map\n */\nexport interface IconMap {\n${icons.map((icon) => ` '${icon.name}': IconComponent;`).join('\\n')}\n}\n\n/**\n * Icon metadata\n */\nexport interface IconMeta {\n name: IconName;\n componentName: string;\n viewBox: string;\n}\n\nexport const iconMeta: IconMeta[] = [\n${icons.map((icon) => ` { name: '${icon.name}', componentName: '${icon.componentName}', viewBox: '${icon.viewBox}' },`).join('\\n')}\n];\n`;\n\n/**\n * Generate React icon components\n *\n * @param icons - Optimized SVG data\n * @param outputDir - Output directory\n * @param options - Generator options\n * @returns Generated icons\n *\n * @example\n * ```typescript\n * const generated = await generateReactIcons(optimizedIcons, './dist/icons/react', {\n * dryRun: false,\n * });\n * console.log(\\`Generated \\${generated.length} files\\`);\n * ```\n */\nexport async function generateReactIcons(\n icons: OptimizedSVG[],\n outputDir: string,\n options: GeneratorOptions = {}\n): Promise<GeneratedIcon[]> {\n const {\n template = defaultReactTemplate,\n indexTemplate = defaultReactIndexTemplate,\n typesTemplate = defaultReactTypesTemplate,\n dryRun = false,\n } = options;\n\n const generated: GeneratedIcon[] = [];\n\n // Ensure output directory exists\n if (!dryRun && !existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate individual icon components\n for (const icon of icons) {\n const code = template(icon);\n const outputPath = join(outputDir, `${icon.componentName}.tsx`);\n\n if (!dryRun) {\n writeFileSync(outputPath, code, 'utf-8');\n }\n\n generated.push({\n name: icon.name,\n componentName: icon.componentName,\n code,\n outputPath,\n format: 'react',\n });\n }\n\n // Generate index file\n const indexCode = indexTemplate(icons);\n const indexPath = join(outputDir, 'index.ts');\n\n if (!dryRun) {\n writeFileSync(indexPath, indexCode, 'utf-8');\n }\n\n generated.push({\n name: 'index',\n componentName: 'index',\n code: indexCode,\n outputPath: indexPath,\n format: 'react',\n });\n\n // Generate types file\n const typesCode = typesTemplate(icons);\n const typesPath = join(outputDir, 'types.ts');\n\n if (!dryRun) {\n writeFileSync(typesPath, typesCode, 'utf-8');\n }\n\n generated.push({\n name: 'types',\n componentName: 'types',\n code: typesCode,\n outputPath: typesPath,\n format: 'react',\n });\n\n return generated;\n}\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * SVG sprite generator\n *\n * Generates SVG sprite files with symbol definitions.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { GeneratedIcon, OptimizedSVG } from '../types.js';\n\n/**\n * SVG sprite generator options\n */\nexport interface SpriteOptions {\n /** Sprite file name */\n fileName?: string;\n\n /** Generate preview HTML file */\n generatePreview?: boolean;\n\n /** Dry run - don't write files */\n dryRun?: boolean;\n}\n\n/**\n * Generate SVG sprite\n *\n * Creates an SVG sprite with symbol definitions for all icons.\n *\n * @param icons - Optimized SVG data\n * @param outputDir - Output directory\n * @param options - Generator options\n * @returns Generated files\n *\n * @example\n * ```typescript\n * const generated = await generateSVGSprite(optimizedIcons, './dist/icons/sprite', {\n * fileName: 'icons.svg',\n * generatePreview: true,\n * });\n * ```\n */\nexport async function generateSVGSprite(\n icons: OptimizedSVG[],\n outputDir: string,\n options: SpriteOptions = {}\n): Promise<GeneratedIcon[]> {\n const { fileName = 'sprite.svg', generatePreview = true, dryRun = false } = options;\n\n const generated: GeneratedIcon[] = [];\n\n // Ensure output directory exists\n if (!dryRun && !existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate sprite symbols\n const symbols = icons\n .map(\n (icon) => ` <symbol id=\"${icon.name}\" viewBox=\"${icon.viewBox}\">\n ${icon.innerContent}\n </symbol>`\n )\n .join('\\n');\n\n // Create sprite SVG\n const spriteCode = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n SVG Sprite\n @generated by @dsai-io/tools\n Contains ${icons.length} icons\n-->\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n${symbols}\n </defs>\n</svg>\n`;\n\n const outputPath = join(outputDir, fileName);\n\n if (!dryRun) {\n writeFileSync(outputPath, spriteCode, 'utf-8');\n }\n\n generated.push({\n name: 'sprite',\n componentName: 'sprite',\n code: spriteCode,\n outputPath,\n format: 'svg-sprite',\n });\n\n // Generate usage helper HTML\n if (generatePreview) {\n const usageCode = generatePreviewHTML(icons, fileName);\n const usagePath = join(outputDir, 'sprite-preview.html');\n\n if (!dryRun) {\n writeFileSync(usagePath, usageCode, 'utf-8');\n }\n\n generated.push({\n name: 'preview',\n componentName: 'preview',\n code: usageCode,\n outputPath: usagePath,\n format: 'svg-sprite',\n });\n }\n\n return generated;\n}\n\n/**\n * Generate preview HTML for sprite\n */\nfunction generatePreviewHTML(icons: OptimizedSVG[], spriteFileName: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Icon Sprite Preview</title>\n <style>\n * { box-sizing: border-box; }\n body { font-family: system-ui, sans-serif; padding: 2rem; max-width: 1200px; margin: 0 auto; }\n h1 { margin-bottom: 0.5rem; }\n .meta { color: #666; margin-bottom: 2rem; }\n .icon { width: 24px; height: 24px; fill: currentColor; }\n .icon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 1rem; }\n .icon-item { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; padding: 1rem; border: 1px solid #eee; border-radius: 8px; transition: background 0.2s; }\n .icon-item:hover { background: #f5f5f5; }\n .icon-name { font-size: 11px; color: #666; text-align: center; word-break: break-all; }\n pre { background: #f5f5f5; padding: 1rem; border-radius: 8px; overflow-x: auto; }\n code { font-family: ui-monospace, monospace; font-size: 13px; }\n </style>\n</head>\n<body>\n <h1>Icon Sprite Preview</h1>\n <p class=\"meta\">${icons.length} icons • Generated by @dsai-io/tools</p>\n\n <h2>Usage</h2>\n <pre><code>&lt;svg class=\"icon\"&gt;\n &lt;use href=\"${spriteFileName}#icon-name\"&gt;&lt;/use&gt;\n&lt;/svg&gt;</code></pre>\n\n <h2>All Icons</h2>\n <div class=\"icon-grid\">\n${icons\n .map(\n (icon) => ` <div class=\"icon-item\">\n <svg class=\"icon\"><use href=\"${spriteFileName}#${icon.name}\"></use></svg>\n <span class=\"icon-name\">${icon.name}</span>\n </div>`\n )\n .join('\\n')}\n </div>\n</body>\n</html>\n`;\n}\n","/**\n * Icon tooling module for @dsai-io/tools\n *\n * Provides utilities for generating icon components from SVG source files.\n * Supports React components, SVG sprites, with SVGO optimization.\n *\n * @packageDocumentation\n */\n\nimport { join } from 'node:path';\n\nimport { optimizeSVGFiles, parseSVGFiles, scanSVGFiles } from './core/index.js';\nimport { generateReactIcons } from './generators/react.js';\nimport { generateSVGSprite } from './generators/svg-sprite.js';\n\nimport type {\n GeneratedIcon,\n IconBuildOptions,\n IconBuildResult,\n IconFormat,\n OptimizedSVG,\n SVGOConfig,\n} from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n/**\n * Build icons from SVG source files\n *\n * Scans the source directory, parses and optimizes SVGs, then generates\n * output in the specified formats (React, SVG sprite).\n *\n * @param config - Resolved DSAi configuration\n * @param options - Build options\n * @returns Build result with generated files\n *\n * @example\n * ```typescript\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { buildIcons } from '@dsai-io/tools/icons';\n *\n * const { config } = await loadConfig();\n * const result = await buildIcons(config, {\n * formats: ['react', 'svg-sprite'],\n * });\n *\n * console.log(\\`Generated \\${result.totalIcons} icons\\`);\n * ```\n */\nexport async function buildIcons(\n config: ResolvedConfig,\n options: IconBuildOptions = {}\n): Promise<IconBuildResult> {\n const startTime = Date.now();\n const defaultFormat = config.icons.framework === 'react' ? 'react' : 'svg-sprite';\n const { formats = [defaultFormat as IconFormat], icons: iconFilter, dryRun = false } = options;\n\n const result: IconBuildResult = {\n success: false,\n icons: [],\n totalIcons: 0,\n filesWritten: 0,\n totalSizeReduction: 0,\n errors: [],\n warnings: [],\n duration: 0,\n };\n\n try {\n // Step 1: Scan for SVG files\n const rawFiles = await scanSVGFiles({\n sourceDir: config.icons.sourceDir,\n });\n\n if (rawFiles.length === 0) {\n result.warnings.push({\n icon: '*',\n message: `No SVG files found in ${config.icons.sourceDir}`,\n });\n result.success = true;\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // Filter by specific icons if provided\n const filteredFiles = iconFilter\n ? rawFiles.filter((f) => iconFilter.includes(f.fileName))\n : rawFiles;\n\n // Step 2: Parse SVG content\n const parsedFiles = parseSVGFiles(filteredFiles);\n\n // Step 3: Optimize SVGs (if enabled)\n let optimizedFiles: OptimizedSVG[];\n if (config.icons.optimize) {\n const svgoConfig: SVGOConfig = {\n multipass: true,\n };\n optimizedFiles = await optimizeSVGFiles(parsedFiles, filteredFiles, svgoConfig);\n\n // Calculate total size reduction\n const totalReduction = optimizedFiles.reduce((sum, f) => sum + f.sizeReduction, 0);\n result.totalSizeReduction =\n optimizedFiles.length > 0 ? totalReduction / optimizedFiles.length : 0;\n } else {\n // Skip optimization - just add size metadata\n const { skipOptimization } = await import('./core/optimizer.js');\n optimizedFiles = parsedFiles.map((parsed, index) => {\n const rawFile = filteredFiles.at(index);\n if (!rawFile) {\n throw new Error(`Missing raw file for ${parsed.fileName}`);\n }\n return skipOptimization(parsed, rawFile);\n });\n }\n\n result.totalIcons = optimizedFiles.length;\n\n // Step 4: Generate output for each format\n const generated: GeneratedIcon[] = [];\n\n for (const format of formats) {\n const outputDir = join(config.icons.outputDir, format);\n\n switch (format) {\n case 'react':\n generated.push(...(await generateReactIcons(optimizedFiles, outputDir, { dryRun })));\n break;\n\n case 'svg':\n case 'svg-sprite':\n generated.push(...(await generateSVGSprite(optimizedFiles, outputDir, { dryRun })));\n break;\n\n default:\n result.warnings.push({\n icon: '*',\n message: `Unknown format: ${format}`,\n });\n }\n }\n\n result.icons = generated;\n result.filesWritten = dryRun ? 0 : generated.length;\n result.success = true;\n } catch (error) {\n result.errors.push({\n icon: '*',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'BUILD_ERROR',\n });\n }\n\n result.duration = Date.now() - startTime;\n return result;\n}\n\n// Re-export types\nexport type {\n GeneratedIcon,\n GeneratorOptions,\n IconBuildOptions,\n IconBuildResult,\n IconError,\n IconErrorCode,\n IconFormat,\n IconTemplate,\n IconWarning,\n IndexTemplate,\n OptimizedSVG,\n ParsedSVG,\n RawSVGData,\n ScannerOptions,\n SVGOConfig,\n SVGOPlugin,\n TypesTemplate,\n} from './types.js';\n\n// Re-export core utilities\nexport {\n cleanSVGForReact,\n defaultSVGOConfig,\n extractViewBox,\n optimizeSVG,\n optimizeSVGFiles,\n parseSVG,\n parseSVGFiles,\n readSVGFile,\n scanSVGFiles,\n skipOptimization,\n} from './core/index.js';\n\n// Re-export generators\nexport {\n defaultReactIndexTemplate,\n defaultReactTemplate,\n defaultReactTypesTemplate,\n generateReactIcons,\n generateSVGSprite,\n} from './generators/index.js';\n\n// Re-export naming utilities\nexport {\n isValidIconName,\n normalizeIconName,\n toComponentName,\n toIconName,\n} from './utils/index.js';\n","/**\n * Utility functions for @dsai-io/tools\n *\n * Common utilities used across the tools package.\n */\n\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport pc from 'picocolors';\n\n/**\n * Get the root directory of the @dsai-io/tools package\n *\n * @returns Absolute path to package root\n */\nexport function getPackageRoot(): string {\n const currentFile = fileURLToPath(import.meta.url);\n return resolve(dirname(currentFile), '..');\n}\n\n/**\n * Resolve a path relative to the current working directory\n *\n * @param segments - Path segments to join\n * @returns Absolute path\n */\nexport function resolvePath(...segments: string[]): string {\n return resolve(process.cwd(), ...segments);\n}\n\n/**\n * Check if a file or directory exists\n *\n * @param path - Path to check\n * @returns True if the path exists\n */\nexport function fileExists(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return existsSync(targetPath);\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a directory\n *\n * @param path - Path to check\n * @returns True if the path is a directory\n */\nexport function isDirectory(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (!existsSync(targetPath)) {\n return false;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return statSync(targetPath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a file\n *\n * @param path - Path to check\n * @returns True if the path is a file\n */\nexport function isFile(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (!existsSync(targetPath)) {\n return false;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return statSync(targetPath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Find package.json by traversing up from a starting directory\n *\n * @param startFrom - Directory to start searching from\n * @returns Path to package.json or null if not found\n */\nexport function findPackageJson(startFrom: string = process.cwd()): string | null {\n let current = resolve(startFrom);\n const root = dirname(current);\n\n while (current !== root) {\n const packagePath = join(current, 'package.json');\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(packagePath)) {\n return packagePath;\n }\n current = dirname(current);\n }\n\n return null;\n}\n\n/**\n * Logger utility with colored output\n */\nexport const logger = {\n /**\n * Log an info message\n */\n info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(pc.blue('ℹ'), message);\n },\n\n /**\n * Log a success message\n */\n success(message: string): void {\n // eslint-disable-next-line no-console\n console.info(pc.green('✔'), message);\n },\n\n /**\n * Log a warning message\n */\n warn(message: string): void {\n console.warn(pc.yellow('⚠'), message);\n },\n\n /**\n * Log an error message\n */\n error(message: string): void {\n console.error(pc.red('✖'), message);\n },\n\n /**\n * Log a debug message (only in verbose mode)\n */\n debug(message: string, verbose = false): void {\n if (verbose) {\n // eslint-disable-next-line no-console\n console.debug(pc.gray('⋯'), message);\n }\n },\n};\n\n/**\n * Format milliseconds to human-readable duration\n *\n * @param ms - Duration in milliseconds\n * @returns Formatted duration string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Deep merge two objects\n *\n * @param target - Target object\n * @param source - Source object to merge\n * @returns Merged object\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n const keys = Object.keys(source) as Array<keyof T>;\n\n for (const key of keys) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\n const sourceValue = source[key];\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\n const targetValue = target[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\n output[key] = sourceValue as T[keyof T];\n }\n }\n\n return output;\n}\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/diff.ts","../src/icons/core/optimizer.ts","../src/version.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/config/resolver.ts","../src/config/loader.ts","../src/config/env.ts","../src/config/migrate.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","../src/icons/core/scanner.ts","../src/icons/utils/naming.ts","../src/icons/core/parser.ts","../src/icons/core/index.ts","../src/icons/generators/react.ts","../src/icons/generators/svg-sprite.ts","../src/icons/index.ts","../src/registry/schema.ts","../src/registry/component-map.ts","../src/registry/builder.ts","../src/registry/resolver.ts","../src/registry/transformer.ts","../src/registry/writer.ts","../src/utils/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","defaultSVGOConfig","z","version","cosmiconfig","cosmiconfigSync","readFileSync","existsSync","readdirSync","join","statSync","relative","basename","extname","countTokens","DEFAULT_COLLECTIONS","dirname","mkdirSync","detectModes","writeFileSync","createHash","fs","getNestedValue","parse","rmSync","resolve","registerTransformGroups","fg","execSync","outputDir","duration","path4","fs2","path5","path6","fs3","path7","fs4","readFile","writeFile","skipOptimization","execFileSync","fileURLToPath","pc","deepMerge"],"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 * SVG optimizer (SVGO integration)\r\n *\r\n * Optimizes SVG files using SVGO for smaller file sizes.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { OptimizedSVG, ParsedSVG, RawSVGData, SVGOConfig } from '../types.js';\r\n\r\n/**\r\n * Default SVGO configuration\r\n *\r\n * Provides sensible defaults for icon optimization.\r\n */\r\nexport const defaultSVGOConfig: SVGOConfig = {\r\n multipass: true,\r\n plugins: [\r\n { name: 'preset-default' },\r\n { name: 'removeXMLNS' },\r\n { name: 'removeDimensions' },\r\n { name: 'removeStyleElement' },\r\n { name: 'removeScriptElement' },\r\n {\r\n name: 'removeAttrs',\r\n params: {\r\n attrs: ['class', 'style', 'data-name', 'xmlns:xlink'],\r\n },\r\n },\r\n {\r\n name: 'addAttributesToSVGElement',\r\n params: {\r\n attributes: [{ 'aria-hidden': 'true' }, { focusable: 'false' }],\r\n },\r\n },\r\n {\r\n name: 'sortAttrs',\r\n params: {\r\n xmlnsOrder: 'alphabetical',\r\n },\r\n },\r\n ],\r\n};\r\n\r\n/**\r\n * Optimize a single SVG\r\n *\r\n * @param parsed - Parsed SVG data\r\n * @param raw - Raw SVG data (for size comparison)\r\n * @param config - SVGO configuration\r\n * @returns Optimized SVG data\r\n */\r\nexport async function optimizeSVG(\r\n parsed: ParsedSVG,\r\n raw: RawSVGData,\r\n config: SVGOConfig = defaultSVGOConfig\r\n): Promise<OptimizedSVG> {\r\n // Dynamic import of SVGO\r\n const svgo = await import('svgo');\r\n\r\n // Merge plugins with defaults if provided\r\n const plugins = config.plugins ?? defaultSVGOConfig.plugins ?? [];\r\n\r\n // Convert our plugin format to SVGO's expected format\r\n const svgoPlugins = plugins.map((p) => ({\r\n name: p.name,\r\n ...(p.params ? { params: p.params } : {}),\r\n }));\r\n\r\n // Run SVGO optimization\r\n const result = svgo.optimize(raw.content, {\r\n multipass: config.multipass ?? true,\r\n plugins: svgoPlugins as NonNullable<Parameters<typeof svgo.optimize>[1]>['plugins'],\r\n });\r\n\r\n const optimizedContent = result.data;\r\n const optimizedSize = Buffer.byteLength(optimizedContent, 'utf-8');\r\n const sizeReduction =\r\n raw.originalSize > 0 ? ((raw.originalSize - optimizedSize) / raw.originalSize) * 100 : 0;\r\n\r\n // Re-parse optimized content to get updated inner content\r\n const innerContentMatch = optimizedContent.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\r\n const innerContent = innerContentMatch?.[1]?.trim() ?? parsed.innerContent;\r\n\r\n // Extract updated viewBox\r\n const viewBoxMatch = optimizedContent.match(/viewBox=[\"']([^\"']*)[\"']/i);\r\n const viewBox = viewBoxMatch?.[1] ?? parsed.viewBox;\r\n\r\n return {\r\n ...parsed,\r\n innerContent,\r\n fullContent: optimizedContent,\r\n viewBox,\r\n optimizedSize,\r\n sizeReduction,\r\n };\r\n}\r\n\r\n/**\r\n * Optimize multiple SVGs\r\n *\r\n * @param parsedFiles - Array of parsed SVG data\r\n * @param rawFiles - Array of raw SVG data\r\n * @param config - SVGO configuration\r\n * @returns Array of optimized SVG data\r\n */\r\nexport async function optimizeSVGFiles(\r\n parsedFiles: ParsedSVG[],\r\n rawFiles: RawSVGData[],\r\n config: SVGOConfig = defaultSVGOConfig\r\n): Promise<OptimizedSVG[]> {\r\n const results: OptimizedSVG[] = [];\r\n\r\n for (const parsed of parsedFiles) {\r\n const raw = rawFiles.find((r) => r.fileName === parsed.fileName);\r\n if (!raw) {\r\n throw new Error(`Raw file not found for ${parsed.fileName}`);\r\n }\r\n const optimized = await optimizeSVG(parsed, raw, config);\r\n results.push(optimized);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Skip optimization and just add size metadata\r\n *\r\n * Useful when SVGO is not needed but the type structure is required.\r\n *\r\n * @param parsed - Parsed SVG data\r\n * @param raw - Raw SVG data\r\n * @returns Optimized SVG data (without actual optimization)\r\n */\r\nexport function skipOptimization(parsed: ParsedSVG, raw: RawSVGData): OptimizedSVG {\r\n return {\r\n ...parsed,\r\n optimizedSize: raw.originalSize,\r\n sizeReduction: 0,\r\n };\r\n}\r\n","/**\r\n * Package version\r\n */\r\nexport const version = '0.0.1';\r\n","/**\r\n * @fileoverview Zod schemas for DSAI Tools configuration validation\r\n *\r\n * Provides comprehensive runtime validation for all configuration options.\r\n * Schemas mirror the TypeScript types in types.ts for type safety.\r\n *\r\n * @module @dsai-io/tools/config/schema\r\n * @see {@link ./types.ts} for TypeScript type definitions\r\n */\r\n\r\nimport { z } from 'zod';\r\n\r\n// ============================================================================\r\n// Primitive Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Log level for CLI output verbosity\r\n */\r\nexport const logLevelSchema = z.enum(['silent', 'error', 'warn', 'info', 'debug', 'verbose']);\r\n\r\n/**\r\n * Output format for token/build outputs\r\n */\r\nexport const outputFormatSchema = z.enum(['css', 'scss', 'less', 'json', 'js', 'ts', 'esm', 'cjs']);\r\n\r\n/**\r\n * Supported frontend frameworks for generated code\r\n */\r\nexport const frameworkSchema = z.enum(['react', 'vue', 'angular', 'svelte', 'vanilla']);\r\n\r\n/**\r\n * File hash type for cache busting\r\n */\r\nexport const hashTypeSchema = z.enum(['content', 'timestamp', 'version', 'none']);\r\n\r\n// ============================================================================\r\n// Utility Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Glob pattern for file matching\r\n * Must be a non-empty string\r\n */\r\nexport const globPatternSchema = z.string().min(1, 'Glob pattern cannot be empty');\r\n\r\n/**\r\n * File path validation\r\n * Allows relative or absolute paths\r\n */\r\nexport const filePathSchema = z.string().min(1, 'File path cannot be empty');\r\n\r\n/**\r\n * Semantic version validation (loose)\r\n * Matches x.y.z format with optional pre-release\r\n */\r\nexport const versionSchema = z.string().refine(\r\n (val) => {\r\n const parts = val.split('-');\r\n const version = parts[0] ?? '';\r\n const preRelease = parts[1];\r\n const versionParts = version.split('.');\r\n if (versionParts.length !== 3) {\r\n return false;\r\n }\r\n for (const part of versionParts) {\r\n const num = Number(part);\r\n if (!Number.isInteger(num) || num < 0) {\r\n return false;\r\n }\r\n }\r\n if (preRelease !== undefined && preRelease.length === 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n { message: 'Invalid semantic version format' }\r\n);\r\n\r\n// ============================================================================\r\n// Transform and Format Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Custom transform function schema\r\n * For token value transformations\r\n */\r\nexport const customTransformSchema = z.object({\r\n name: z.string().min(1, 'Transform name is required'),\r\n description: z.string().optional(),\r\n type: z.enum(['value', 'attribute', 'name']).optional().default('value'),\r\n transform: z.function().optional(),\r\n filter: z.function().optional(),\r\n matcher: z.function().optional(),\r\n});\r\n\r\n/**\r\n * Custom format schema for output generation\r\n */\r\nexport const customFormatSchema = z.object({\r\n name: z.string().min(1, 'Format name is required'),\r\n description: z.string().optional(),\r\n formatter: z.function().optional(),\r\n extension: z.string().min(1).optional(),\r\n});\r\n\r\n// ============================================================================\r\n// Theme Configuration Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Output format enum for validation\r\n */\r\nconst outputFormatEnum = z.enum(['css', 'scss', 'js', 'ts', 'json', 'android', 'ios']);\r\n\r\n/**\r\n * Theme definition schema\r\n * Defines how a single theme is discovered and built\r\n */\r\nexport const themeDefinitionSchema = z.object({\r\n isDefault: z.boolean().optional().default(false),\r\n suffix: z.string().nullable().optional(),\r\n selector: z.string().min(1, 'Theme selector is required'),\r\n mediaQuery: z.string().optional(),\r\n dataAttribute: z.string().optional(),\r\n outputFiles: z.record(outputFormatEnum, z.string()).optional(),\r\n});\r\n\r\n/**\r\n * Theme selector pattern schema\r\n */\r\nexport const themeSelectorPatternSchema = z.object({\r\n default: z.string().optional().default(':root'),\r\n others: z.string().optional().default('[data-dsai-theme=\"{mode}\"]'),\r\n});\r\n\r\n/**\r\n * Themes configuration section\r\n * Supports both legacy mode-based config and new definitions-based config\r\n */\r\nexport const themesConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n autoDetect: z.boolean().optional().default(true),\r\n default: z.string().optional().default('light'),\r\n ignoreModes: z.array(z.string()).optional().default([]),\r\n selectorPattern: themeSelectorPatternSchema.optional(),\r\n definitions: z.record(z.string(), themeDefinitionSchema).optional(),\r\n\r\n // Legacy fields (for backward compatibility)\r\n defaultMode: z.enum(['light', 'dark', 'system']).optional(),\r\n modes: z\r\n .record(\r\n z.string(),\r\n z.object({\r\n selector: z.string().min(1),\r\n mediaQuery: z.string().optional(),\r\n dataAttribute: z.string().optional(),\r\n cssVariables: z.boolean().optional(),\r\n generateSeparateFiles: z.boolean().optional(),\r\n prefix: z.string().optional(),\r\n })\r\n )\r\n .optional(),\r\n outputFileName: z.string().optional(),\r\n colorScheme: z\r\n .object({\r\n light: z.string().optional(),\r\n dark: z.string().optional(),\r\n })\r\n .optional(),\r\n});\r\n\r\n// ============================================================================\r\n// Icon Configuration Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Icon optimization settings\r\n */\r\nexport const iconOptimizationSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n removeComments: z.boolean().optional().default(true),\r\n removeDimensions: z.boolean().optional().default(false),\r\n removeViewBox: z.boolean().optional().default(false),\r\n removeXMLNS: z.boolean().optional().default(true),\r\n cleanupIds: z.boolean().optional().default(true),\r\n minify: z.boolean().optional().default(true),\r\n});\r\n\r\n/**\r\n * Icon sprite generation settings\r\n */\r\nexport const iconSpriteSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n fileName: z.string().optional().default('icons'),\r\n format: z.enum(['symbol', 'stack', 'css']).optional().default('symbol'),\r\n prefix: z.string().optional().default('icon-'),\r\n});\r\n\r\n/**\r\n * Icons configuration section\r\n */\r\nexport const iconsConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n sourceDir: z.string().optional().default('assets/icons'),\r\n outputDir: z.string().optional().default('dist/icons'),\r\n formats: z\r\n .array(z.enum(['svg', 'react', 'vue', 'sprite', 'font']))\r\n .optional()\r\n .default(['svg']),\r\n optimization: iconOptimizationSchema.optional(),\r\n sprite: iconSpriteSchema.optional(),\r\n componentPrefix: z.string().optional().default('Icon'),\r\n componentSuffix: z.string().optional().default(''),\r\n generateIndex: z.boolean().optional().default(true),\r\n generateTypes: z.boolean().optional().default(true),\r\n});\r\n\r\n// ============================================================================\r\n// Token Configuration Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Token build configuration schema\r\n */\r\nexport const tokenBuildConfigSchema = z.object({\r\n format: outputFormatSchema,\r\n outputDir: z.string().optional(),\r\n outputFileName: z.string().optional(),\r\n fileExtension: z.string().optional(),\r\n prefix: z.string().optional(),\r\n useVariables: z.boolean().optional(),\r\n selector: z.string().optional(),\r\n transforms: z.array(z.string()).optional(),\r\n customTransforms: z.array(customTransformSchema).optional(),\r\n filter: z.function().optional(),\r\n header: z.string().optional(),\r\n footer: z.string().optional(),\r\n});\r\n\r\n/**\r\n * Postprocess configuration for CSS files\r\n */\r\nexport const postprocessConfigSchema = z.object({\r\n enabled: z.boolean().optional(),\r\n cssDir: z.string().optional(),\r\n files: z.array(z.string()).optional(),\r\n replacements: z\r\n .array(\r\n z.object({\r\n description: z.string().optional(),\r\n from: z.union([z.string(), z.instanceof(RegExp)]),\r\n to: z.string(),\r\n })\r\n )\r\n .optional(),\r\n});\r\n\r\n/**\r\n * SCSS/CSS output configuration for token builds\r\n */\r\nexport const scssConfigSchema = z.object({\r\n /** Output styles to generate: 'expanded' (readable) or 'compressed' (minified) */\r\n outputStyles: z.array(z.enum(['expanded', 'compressed'])).optional(),\r\n /** Generate source maps for SCSS compilation */\r\n generateSourceMaps: z.boolean().optional(),\r\n /** Suffix for minified files (e.g., '.min') */\r\n minifiedSuffix: z.string().optional(),\r\n /** Theme entry point SCSS file */\r\n themeEntry: z.string().optional(),\r\n /** Utilities entry point SCSS file */\r\n utilitiesEntry: z.string().optional(),\r\n /** Output directory for compiled CSS files */\r\n cssOutputDir: z.string().optional(),\r\n /** Additional Sass load paths */\r\n loadPaths: z.array(z.string()).optional(),\r\n /** Target CSS framework for variable name mapping */\r\n framework: z.enum(['bootstrap', 'tailwind', 'material', 'custom']).optional(),\r\n /** Custom token to variable name mappings */\r\n nameMapping: z.record(z.string(), z.string()).optional(),\r\n /** Output path for Bootstrap-compatible SCSS variables */\r\n variablesOutput: z.string().optional(),\r\n});\r\n\r\n/**\r\n * Token cache configuration\r\n */\r\nexport const tokenCacheConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n directory: z.string().optional().default('.cache'),\r\n hashType: hashTypeSchema.optional().default('content'),\r\n maxAge: z.number().optional().default(86400000),\r\n});\r\n\r\n/**\r\n * Token watch mode configuration\r\n */\r\nexport const tokenWatchConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(false),\r\n debounce: z.number().optional().default(300),\r\n clearScreen: z.boolean().optional().default(true),\r\n ignorePatterns: z.array(z.string()).optional().default([]),\r\n});\r\n\r\n/**\r\n * Token processing hooks\r\n */\r\nexport const tokensHooksSchema = z.object({\r\n onBuildStart: z.function().optional(),\r\n onFormatComplete: z.function().optional(),\r\n onAllFormatsComplete: z.function().optional(),\r\n onBuildComplete: z.function().optional(),\r\n onError: z.function().optional(),\r\n});\r\n\r\n/**\r\n * Build pipeline step names\r\n */\r\nexport const buildPipelineStepSchema = z.enum([\r\n 'validate',\r\n 'snapshot',\r\n 'preprocess',\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/**\r\n * Build pipeline configuration\r\n * Controls which steps run and their paths\r\n */\r\nexport const tokensBuildPipelineSchema = z.object({\r\n /**\r\n * Steps to include in the build.\r\n * Order matters - steps run in sequence.\r\n * Default includes all steps for full @dsai-io/tokens build.\r\n * Simpler packages can use subset like ['validate', 'transform', 'style-dictionary']\r\n */\r\n steps: z.array(buildPipelineStepSchema).optional(),\r\n\r\n /**\r\n * Paths configuration for build steps\r\n */\r\n paths: z\r\n .object({\r\n /** Source file for sync step (Style Dictionary JS output) */\r\n syncSource: z.string().optional(),\r\n /** Target file for sync step */\r\n syncTarget: z.string().optional(),\r\n /** SCSS theme input file */\r\n sassThemeInput: z.string().optional(),\r\n /** CSS theme output file */\r\n sassThemeOutput: z.string().optional(),\r\n /** CSS theme minified output file */\r\n sassThemeMinifiedOutput: z.string().optional(),\r\n /** SCSS utilities input file */\r\n sassUtilitiesInput: z.string().optional(),\r\n /** CSS utilities output file */\r\n sassUtilitiesOutput: z.string().optional(),\r\n /** CSS utilities minified output file */\r\n sassUtilitiesMinifiedOutput: z.string().optional(),\r\n })\r\n .optional(),\r\n\r\n /** Style Dictionary config file name */\r\n styleDictionaryConfig: z.string().optional(),\r\n});\r\n\r\n/**\r\n * Tokens configuration section\r\n */\r\nexport const tokensConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n sourcePatterns: z\r\n .array(z.string())\r\n .optional()\r\n .default(['src/tokens/**/*.json', 'src/tokens/**/*.yaml']),\r\n outputDirs: z\r\n .object({\r\n css: z.string().optional().default('dist/css'),\r\n scss: z.string().optional().default('dist/scss'),\r\n less: z.string().optional().default('dist/less'),\r\n js: z.string().optional().default('dist/js'),\r\n ts: z.string().optional().default('dist/ts'),\r\n json: z.string().optional().default('dist/json'),\r\n })\r\n .optional(),\r\n additionalScssDirectories: z.array(z.string()).optional().default([]),\r\n outputFileNames: z\r\n .object({\r\n variables: z.string().optional().default('variables'),\r\n utilities: z.string().optional().default('utilities'),\r\n mixins: z.string().optional().default('mixins'),\r\n tokens: z.string().optional().default('tokens'),\r\n })\r\n .optional(),\r\n prefix: z.string().optional().default('dsai'),\r\n mergeOrder: z.array(z.string()).optional().default(['base', 'semantic', 'component']),\r\n createBundle: z.boolean().optional().default(true),\r\n bundleFileName: z.string().optional().default('bundle'),\r\n formats: z.array(outputFormatSchema).optional().default(['css', 'scss', 'json']),\r\n platforms: z.record(z.string(), tokenBuildConfigSchema).optional(),\r\n transforms: z.array(z.string()).optional().default([]),\r\n customTransforms: z.array(customTransformSchema).optional().default([]),\r\n customFormats: z.array(customFormatSchema).optional().default([]),\r\n hooks: tokensHooksSchema.optional(),\r\n cache: tokenCacheConfigSchema.optional(),\r\n watch: tokenWatchConfigSchema.optional(),\r\n verbose: z.boolean().optional().default(false),\r\n /** SCSS/CSS output configuration */\r\n scss: scssConfigSchema.optional(),\r\n /** Build pipeline configuration */\r\n pipeline: tokensBuildPipelineSchema.optional(),\r\n /** Postprocess configuration */\r\n postprocess: postprocessConfigSchema.optional(),\r\n});\r\n\r\n// ============================================================================\r\n// Global Configuration Schemas\r\n// ============================================================================\r\n\r\n/**\r\n * Global build configuration\r\n */\r\nexport const buildConfigSchema = z.object({\r\n outDir: z.string().optional().default('dist'),\r\n clean: z.boolean().optional().default(true),\r\n sourcemap: z.boolean().optional().default(false),\r\n minify: z.boolean().optional().default(true),\r\n parallel: z.boolean().optional().default(true),\r\n maxConcurrency: z.number().optional().default(4),\r\n});\r\n\r\n/**\r\n * Global configuration section\r\n */\r\nexport const globalConfigSchema = z.object({\r\n logLevel: logLevelSchema.optional().default('info'),\r\n colors: z.boolean().optional().default(true),\r\n ci: z.boolean().optional().default(false),\r\n dryRun: z.boolean().optional().default(false),\r\n cwd: z.string().optional(),\r\n configPath: z.string().optional(),\r\n framework: frameworkSchema.optional(),\r\n build: buildConfigSchema.optional(),\r\n});\r\n\r\n// ============================================================================\r\n// Aliases Configuration Schema\r\n// ============================================================================\r\n\r\n/**\r\n * Path aliases for component installation\r\n * Controls where `dsai add` writes files in the consumer's project\r\n */\r\nexport const aliasesConfigSchema = z.object({\r\n importAlias: z.string().optional().default('@/'),\r\n ui: z.string().optional().default('src/components/ui'),\r\n hooks: z.string().optional().default('src/hooks'),\r\n utils: z.string().optional().default('src/lib/utils'),\r\n components: z.string().optional().default('src/components'),\r\n lib: z.string().optional().default('src/lib'),\r\n});\r\n\r\n// ============================================================================\r\n// Components Configuration Schema\r\n// ============================================================================\r\n\r\n/**\r\n * Configuration for component distribution (shadcn-style)\r\n */\r\nexport const componentsConfigSchema = z.object({\r\n enabled: z.boolean().optional().default(true),\r\n registryUrl: z.string().optional().default('https://registry.dsai.dev'),\r\n tsx: z.boolean().optional().default(true),\r\n overwrite: z.boolean().optional().default(false),\r\n});\r\n\r\n// ============================================================================\r\n// Root Configuration Schema\r\n// ============================================================================\r\n\r\n/**\r\n * DSAI Tools configuration root schema\r\n *\r\n * This is the primary schema used for validating configuration files.\r\n * It combines all section schemas into a complete configuration object.\r\n */\r\nexport const dsaiConfigSchema = z.object({\r\n $schema: z.string().optional(),\r\n extends: z.union([z.string(), z.array(z.string())]).optional(),\r\n global: globalConfigSchema.optional(),\r\n tokens: tokensConfigSchema.optional(),\r\n themes: themesConfigSchema.optional(),\r\n icons: iconsConfigSchema.optional(),\r\n aliases: aliasesConfigSchema.optional(),\r\n components: componentsConfigSchema.optional(),\r\n});\r\n\r\n// ============================================================================\r\n// Inferred Types from Schemas\r\n// ============================================================================\r\n\r\n/** Inferred LogLevel type from schema */\r\nexport type LogLevelFromSchema = z.infer<typeof logLevelSchema>;\r\n\r\n/** Inferred OutputFormat type from schema */\r\nexport type OutputFormatFromSchema = z.infer<typeof outputFormatSchema>;\r\n\r\n/** Inferred Framework type from schema */\r\nexport type FrameworkFromSchema = z.infer<typeof frameworkSchema>;\r\n\r\n/** Inferred DsaiConfig type from schema */\r\nexport type DsaiConfigFromSchema = z.infer<typeof dsaiConfigSchema>;\r\n\r\n/** Inferred TokensConfig type from schema */\r\nexport type TokensConfigFromSchema = z.infer<typeof tokensConfigSchema>;\r\n\r\n/** Inferred ThemesConfig type from schema */\r\nexport type ThemesConfigFromSchema = z.infer<typeof themesConfigSchema>;\r\n\r\n/** Inferred IconsConfig type from schema */\r\nexport type IconsConfigFromSchema = z.infer<typeof iconsConfigSchema>;\r\n\r\n/** Inferred GlobalConfig type from schema */\r\nexport type GlobalConfigFromSchema = z.infer<typeof globalConfigSchema>;\r\n\r\n/** Inferred AliasesConfig type from schema */\r\nexport type AliasesConfigFromSchema = z.infer<typeof aliasesConfigSchema>;\r\n\r\n/** Inferred ComponentsConfig type from schema */\r\nexport type ComponentsConfigFromSchema = z.infer<typeof componentsConfigSchema>;\r\n\r\n// ============================================================================\r\n// Validation Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Validation result with typed data\r\n */\r\nexport interface ValidationResult<T> {\r\n success: boolean;\r\n data?: T;\r\n errors?: ValidationError[];\r\n}\r\n\r\n/**\r\n * Structured validation error\r\n */\r\nexport interface ValidationError {\r\n path: string;\r\n message: string;\r\n code: string;\r\n expected?: string;\r\n received?: string;\r\n}\r\n\r\n/**\r\n * Format Zod errors into user-friendly validation errors\r\n *\r\n * @param zodError - Zod error object\r\n * @returns Array of formatted validation errors\r\n */\r\nexport function formatValidationErrors(zodError: z.ZodError): ValidationError[] {\r\n return zodError.issues.map((err: z.ZodIssue) => ({\r\n path: err.path.join('.') || 'root',\r\n message: err.message,\r\n code: err.code,\r\n expected: 'expected' in err ? String(err.expected) : undefined,\r\n received: 'received' in err ? String(err.received) : undefined,\r\n }));\r\n}\r\n\r\n/**\r\n * Validate configuration object against schema\r\n *\r\n * @param config - Configuration object to validate\r\n * @returns Validation result with typed data or errors\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = validateConfig({\r\n * tokens: { enabled: true },\r\n * themes: { defaultMode: 'dark' }\r\n * });\r\n *\r\n * if (result.success) {\r\n * console.log(result.data);\r\n * } else {\r\n * result.errors?.forEach(err => console.error(err.message));\r\n * }\r\n * ```\r\n */\r\nexport function validateConfig(config: unknown): ValidationResult<DsaiConfigFromSchema> {\r\n const result = dsaiConfigSchema.safeParse(config);\r\n\r\n if (result.success) {\r\n return {\r\n success: true,\r\n data: result.data,\r\n };\r\n }\r\n\r\n return {\r\n success: false,\r\n errors: formatValidationErrors(result.error),\r\n };\r\n}\r\n\r\n/**\r\n * Validate configuration and throw on errors\r\n *\r\n * @param config - Configuration object to validate\r\n * @returns Validated configuration\r\n * @throws {Error} If validation fails\r\n *\r\n * @example\r\n * ```typescript\r\n * try {\r\n * const validConfig = validateConfigOrThrow(rawConfig);\r\n * // Use validConfig safely\r\n * } catch (error) {\r\n * console.error('Invalid configuration:', error.message);\r\n * }\r\n * ```\r\n */\r\nexport function validateConfigOrThrow(config: unknown): DsaiConfigFromSchema {\r\n const result = validateConfig(config);\r\n\r\n if (!result.success) {\r\n const errorMessages = result.errors?.map((e) => ` - ${e.path}: ${e.message}`).join('\\n');\r\n throw new Error(`Configuration validation failed:\\n${errorMessages}`);\r\n }\r\n\r\n return result.data as DsaiConfigFromSchema;\r\n}\r\n\r\n/**\r\n * Validate a specific section of the configuration\r\n *\r\n * @param section - Section name to validate\r\n * @param config - Section configuration object\r\n * @returns Validation result for the section\r\n */\r\nexport function validateConfigSection<T extends keyof DsaiConfigFromSchema>(\r\n section: T,\r\n config: unknown\r\n): ValidationResult<NonNullable<DsaiConfigFromSchema[T]>> {\r\n const sectionSchemas = {\r\n global: globalConfigSchema,\r\n tokens: tokensConfigSchema,\r\n themes: themesConfigSchema,\r\n icons: iconsConfigSchema,\r\n aliases: aliasesConfigSchema,\r\n components: componentsConfigSchema,\r\n } as const;\r\n\r\n const schema = sectionSchemas[section as keyof typeof sectionSchemas];\r\n\r\n if (!schema) {\r\n return {\r\n success: false,\r\n errors: [\r\n {\r\n path: section,\r\n message: `Unknown configuration section: ${section}`,\r\n code: 'unknown_section',\r\n },\r\n ],\r\n };\r\n }\r\n\r\n const result = schema.safeParse(config);\r\n\r\n if (result.success) {\r\n return {\r\n success: true,\r\n data: result.data as NonNullable<DsaiConfigFromSchema[T]>,\r\n };\r\n }\r\n\r\n return {\r\n success: false,\r\n errors: formatValidationErrors(result.error),\r\n };\r\n}\r\n\r\n/**\r\n * Create a pretty-printed error message from validation errors\r\n *\r\n * @param errors - Array of validation errors\r\n * @returns Formatted error message string\r\n */\r\nexport function formatErrorMessage(errors: ValidationError[]): string {\r\n const lines = ['Configuration validation failed:', ''];\r\n\r\n for (const error of errors) {\r\n lines.push(` ✗ ${error.path}`);\r\n lines.push(` ${error.message}`);\r\n\r\n if (error.expected && error.received) {\r\n lines.push(` Expected: ${error.expected}`);\r\n lines.push(` Received: ${error.received}`);\r\n }\r\n\r\n lines.push('');\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n","/**\r\n * @fileoverview Default configuration values for DSAI Tools\r\n *\r\n * Provides comprehensive default values for all configuration options.\r\n * These defaults are merged with user configuration during resolution.\r\n *\r\n * @module @dsai-io/tools/config/defaults\r\n */\r\n\r\nimport type {\r\n IconFramework,\r\n LogLevel,\r\n OutputFormat,\r\n ResolvedAliasesConfig,\r\n ResolvedComponentsConfig,\r\n ResolvedConfig,\r\n ResolvedGlobalConfig,\r\n ResolvedIconsConfig,\r\n ResolvedThemeDefinition,\r\n ResolvedThemesConfig,\r\n ResolvedTokensConfig,\r\n ThemeSelectorPattern,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Default prefix for CSS custom properties\r\n */\r\nexport const DEFAULT_PREFIX = '--dsai-';\r\n\r\n/**\r\n * Default log level for CLI output\r\n */\r\nexport const DEFAULT_LOG_LEVEL: LogLevel = 'info';\r\n\r\n/**\r\n * Default output directory\r\n */\r\nexport const DEFAULT_OUTPUT_DIR = 'dist';\r\n\r\n/**\r\n * Default source directory for tokens (Figma exports)\r\n */\r\nexport const DEFAULT_SOURCE_DIR = 'figma-exports';\r\n\r\n/**\r\n * Default collections directory\r\n */\r\nexport const DEFAULT_COLLECTIONS_DIR = 'collections';\r\n\r\n/**\r\n * Default icons source directory\r\n */\r\nexport const DEFAULT_ICONS_SOURCE_DIR = 'icons';\r\n\r\n/**\r\n * Default icons output directory\r\n */\r\nexport const DEFAULT_ICONS_OUTPUT_DIR = 'dist/icons';\r\n\r\n// ============================================================================\r\n// Default Output Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Default source patterns for finding Figma exports\r\n */\r\nexport const defaultSourcePatterns = ['theme.json', 'tokens.json', '*.tokens.json'];\r\n\r\n/**\r\n * Default output formats for tokens\r\n */\r\nexport const defaultFormats: OutputFormat[] = ['css', 'scss', 'js', 'ts', 'json'];\r\n\r\n/**\r\n * Default output file names for each format\r\n */\r\nexport const defaultOutputFileNames: 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.h',\r\n};\r\n\r\n// ============================================================================\r\n// Theme Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default theme selector pattern\r\n */\r\nexport const defaultSelectorPattern: Required<ThemeSelectorPattern> = {\r\n default: ':root',\r\n others: '[data-dsai-theme=\"{mode}\"]',\r\n};\r\n\r\n/**\r\n * Default theme definitions\r\n * Provides light and dark themes out of the box\r\n */\r\nexport const defaultThemeDefinitions: Record<string, ResolvedThemeDefinition> = {\r\n light: {\r\n isDefault: true,\r\n suffix: null,\r\n selector: ':root',\r\n outputFiles: {\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.h',\r\n },\r\n },\r\n dark: {\r\n isDefault: false,\r\n suffix: '-dark',\r\n selector: '[data-dsai-theme=\"dark\"]',\r\n mediaQuery: '(prefers-color-scheme: dark)',\r\n outputFiles: {\r\n css: 'tokens-dark.css',\r\n scss: '_tokens-dark.scss',\r\n js: 'tokens-dark.js',\r\n ts: 'tokens-dark.ts',\r\n json: 'tokens-dark.json',\r\n android: 'tokens-dark.xml',\r\n ios: 'tokens-dark.h',\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * Default resolved themes configuration\r\n */\r\nexport const defaultThemesConfig: ResolvedThemesConfig = {\r\n enabled: true,\r\n autoDetect: true,\r\n default: 'light',\r\n ignoreModes: [],\r\n selectorPattern: defaultSelectorPattern,\r\n definitions: defaultThemeDefinitions,\r\n};\r\n\r\n// ============================================================================\r\n// Icon Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default icon framework\r\n */\r\nexport const defaultIconFramework: IconFramework = 'react';\r\n\r\n/**\r\n * Default resolved icons configuration\r\n */\r\nexport const defaultIconsConfig: ResolvedIconsConfig = {\r\n sourceDir: DEFAULT_ICONS_SOURCE_DIR,\r\n outputDir: DEFAULT_ICONS_OUTPUT_DIR,\r\n framework: defaultIconFramework,\r\n typescript: true,\r\n optimize: true,\r\n prefix: 'Icon',\r\n};\r\n\r\n// ============================================================================\r\n// Aliases Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default resolved aliases configuration\r\n */\r\nexport const defaultAliasesConfig: ResolvedAliasesConfig = {\r\n importAlias: '@/',\r\n ui: 'src/components/ui',\r\n hooks: 'src/hooks',\r\n utils: 'src/lib/utils',\r\n components: 'src/components',\r\n lib: 'src/lib',\r\n};\r\n\r\n// ============================================================================\r\n// Components Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default resolved components configuration\r\n */\r\nexport const defaultComponentsConfig: ResolvedComponentsConfig = {\r\n enabled: true,\r\n registryUrl: 'https://registry.dsai.dev',\r\n tsx: true,\r\n overwrite: false,\r\n};\r\n\r\n// ============================================================================\r\n// Token Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default resolved tokens configuration\r\n */\r\nexport const defaultTokensConfig: ResolvedTokensConfig = {\r\n source: 'theme',\r\n sourceDir: DEFAULT_SOURCE_DIR,\r\n collectionsDir: DEFAULT_COLLECTIONS_DIR,\r\n sourcePatterns: defaultSourcePatterns,\r\n collectionMapping: {},\r\n outputDir: DEFAULT_OUTPUT_DIR,\r\n outputDirs: {},\r\n outputFileNames: defaultOutputFileNames,\r\n prefix: DEFAULT_PREFIX,\r\n formats: defaultFormats,\r\n additionalScssDirectories: [],\r\n additionalCssDirectories: [],\r\n mergeOrder: 'after',\r\n createBundle: false,\r\n themes: defaultThemesConfig,\r\n transforms: [],\r\n customFormats: [],\r\n preprocessors: [],\r\n filters: [],\r\n outputReferences: true,\r\n baseFontSize: 16,\r\n separateThemeFiles: false,\r\n watch: false,\r\n watchDirectories: [],\r\n};\r\n\r\n// ============================================================================\r\n// Global Defaults\r\n// ============================================================================\r\n\r\n/**\r\n * Default resolved global configuration\r\n */\r\nexport const defaultGlobalConfig: ResolvedGlobalConfig = {\r\n cwd: process.cwd(),\r\n debug: false,\r\n logLevel: DEFAULT_LOG_LEVEL,\r\n};\r\n\r\n// ============================================================================\r\n// Complete Default Configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Complete default resolved configuration\r\n *\r\n * This is used as the base for merging user configurations.\r\n * All values have sensible defaults that work for most projects.\r\n */\r\nexport const defaultConfig: ResolvedConfig = {\r\n tokens: defaultTokensConfig,\r\n icons: defaultIconsConfig,\r\n aliases: defaultAliasesConfig,\r\n components: defaultComponentsConfig,\r\n global: defaultGlobalConfig,\r\n configDir: process.cwd(),\r\n};\r\n\r\n// ============================================================================\r\n// Environment Variable Mappings\r\n// ============================================================================\r\n\r\n/**\r\n * Mapping of environment variables to configuration paths\r\n *\r\n * Format: { ENV_VAR_NAME: 'config.path.to.value' }\r\n *\r\n * @example\r\n * DSAI_LOG_LEVEL=debug → { global: { logLevel: 'debug' } }\r\n * DSAI_PREFIX=myapp → { tokens: { prefix: 'myapp' } }\r\n */\r\nexport const envMappings: Record<string, string> = {\r\n // Global settings\r\n DSAI_LOG_LEVEL: 'global.logLevel',\r\n DSAI_DEBUG: 'global.debug',\r\n DSAI_CWD: 'global.cwd',\r\n\r\n // Token settings\r\n DSAI_PREFIX: 'tokens.prefix',\r\n DSAI_SOURCE_DIR: 'tokens.sourceDir',\r\n DSAI_OUTPUT_DIR: 'tokens.outputDir',\r\n DSAI_WATCH: 'tokens.watch',\r\n DSAI_CREATE_BUNDLE: 'tokens.createBundle',\r\n DSAI_BASE_FONT_SIZE: 'tokens.baseFontSize',\r\n\r\n // Theme settings\r\n DSAI_DEFAULT_THEME: 'tokens.themes.default',\r\n DSAI_AUTO_DETECT_THEMES: 'tokens.themes.autoDetect',\r\n\r\n // Icon settings\r\n DSAI_ICONS_SOURCE_DIR: 'icons.sourceDir',\r\n DSAI_ICONS_OUTPUT_DIR: 'icons.outputDir',\r\n DSAI_ICONS_FRAMEWORK: 'icons.framework',\r\n DSAI_ICONS_TYPESCRIPT: 'icons.typescript',\r\n DSAI_ICONS_OPTIMIZE: 'icons.optimize',\r\n DSAI_ICONS_PREFIX: 'icons.prefix',\r\n};\r\n\r\n/**\r\n * Environment variables that should be parsed as booleans\r\n */\r\nexport const envBooleanKeys: Set<string> = new Set([\r\n 'DSAI_DEBUG',\r\n 'DSAI_WATCH',\r\n 'DSAI_CREATE_BUNDLE',\r\n 'DSAI_AUTO_DETECT_THEMES',\r\n 'DSAI_ICONS_TYPESCRIPT',\r\n 'DSAI_ICONS_OPTIMIZE',\r\n]);\r\n\r\n/**\r\n * Environment variables that should be parsed as numbers\r\n */\r\nexport const envNumberKeys: Set<string> = new Set(['DSAI_BASE_FONT_SIZE']);\r\n\r\n/**\r\n * Environment variables that should be parsed as arrays (comma-separated)\r\n */\r\nexport const envArrayKeys: Set<string> = new Set(['DSAI_FORMATS', 'DSAI_IGNORE_MODES']);\r\n\r\n// ============================================================================\r\n// Helper Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Get the output file name for a format with optional theme\r\n *\r\n * @param format - Output format\r\n * @param theme - Optional theme name\r\n * @returns Output file name\r\n */\r\nexport function getOutputFileName(format: OutputFormat, theme?: string): string {\r\n let baseName: string;\r\n\r\n switch (format) {\r\n case 'css':\r\n baseName = 'tokens.css';\r\n break;\r\n case 'scss':\r\n baseName = '_tokens.scss';\r\n break;\r\n case 'js':\r\n baseName = 'tokens.js';\r\n break;\r\n case 'ts':\r\n baseName = 'tokens.ts';\r\n break;\r\n case 'json':\r\n baseName = 'tokens.json';\r\n break;\r\n case 'android':\r\n baseName = 'tokens.xml';\r\n break;\r\n case 'ios':\r\n baseName = 'tokens.h';\r\n break;\r\n default:\r\n baseName = 'tokens.txt';\r\n }\r\n\r\n if (!theme) {\r\n return baseName;\r\n }\r\n\r\n // Insert theme before extension\r\n const dotIndex = baseName.lastIndexOf('.');\r\n if (dotIndex === -1) {\r\n return `${baseName}-${theme}`;\r\n }\r\n\r\n const name = baseName.slice(0, dotIndex);\r\n const ext = baseName.slice(dotIndex);\r\n return `${name}-${theme}${ext}`;\r\n}\r\n\r\n/**\r\n * Get the default output directory for a format\r\n *\r\n * @param format - Output format\r\n * @returns Output directory path\r\n */\r\nexport function getDefaultOutputDir(format: OutputFormat): string {\r\n switch (format) {\r\n case 'css':\r\n return `${DEFAULT_OUTPUT_DIR}/css`;\r\n case 'scss':\r\n return `${DEFAULT_OUTPUT_DIR}/scss`;\r\n case 'js':\r\n case 'ts':\r\n return `${DEFAULT_OUTPUT_DIR}/js`;\r\n case 'json':\r\n return `${DEFAULT_OUTPUT_DIR}/json`;\r\n case 'android':\r\n return `${DEFAULT_OUTPUT_DIR}/android`;\r\n case 'ios':\r\n return `${DEFAULT_OUTPUT_DIR}/ios`;\r\n default:\r\n return DEFAULT_OUTPUT_DIR;\r\n }\r\n}\r\n\r\n/**\r\n * Get default extension for a format\r\n *\r\n * @param format - Output format\r\n * @returns File extension including the dot\r\n */\r\nexport function getDefaultExtension(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 '.xml';\r\n case 'ios':\r\n return '.h';\r\n default:\r\n return '.txt';\r\n }\r\n}\r\n","/**\r\n * @fileoverview Configuration resolver for DSAI Tools\r\n *\r\n * Merges user configuration with defaults and resolves relative paths.\r\n * Handles configuration inheritance and validation.\r\n *\r\n * @module @dsai-io/tools/config/resolver\r\n */\r\n\r\nimport path from 'node:path';\r\n\r\nimport {\r\n defaultAliasesConfig,\r\n defaultComponentsConfig,\r\n defaultConfig,\r\n defaultGlobalConfig,\r\n defaultIconsConfig,\r\n defaultOutputFileNames,\r\n defaultThemeDefinitions,\r\n defaultThemesConfig,\r\n defaultTokensConfig,\r\n} from './defaults.js';\r\n\r\nimport type {\r\n AliasesConfig,\r\n ComponentsConfig,\r\n DsaiConfig,\r\n GlobalConfig,\r\n IconsConfig,\r\n OutputFormat,\r\n ResolvedAliasesConfig,\r\n ResolvedComponentsConfig,\r\n ResolvedConfig,\r\n ResolvedGlobalConfig,\r\n ResolvedIconsConfig,\r\n ResolvedThemeDefinition,\r\n ResolvedThemesConfig,\r\n ResolvedTokensConfig,\r\n ThemeDefinition,\r\n ThemesConfig,\r\n TokensConfig,\r\n} from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for resolving configuration\r\n */\r\nexport interface ResolveOptions {\r\n /** Working directory */\r\n cwd?: string;\r\n\r\n /** Directory containing config file (for relative path resolution) */\r\n configDir?: string;\r\n\r\n /** Override values (highest priority) */\r\n overrides?: Partial<DsaiConfig>;\r\n}\r\n\r\n// ============================================================================\r\n// Section Resolvers\r\n// ============================================================================\r\n\r\n/**\r\n * Resolve global configuration section\r\n */\r\nfunction resolveGlobalConfig(\r\n config: GlobalConfig | undefined,\r\n options: ResolveOptions\r\n): ResolvedGlobalConfig {\r\n const base = defaultGlobalConfig;\r\n const cwd = options.cwd ?? process.cwd();\r\n\r\n return {\r\n cwd: config?.cwd ? path.resolve(cwd, config.cwd) : cwd,\r\n debug: config?.debug ?? base.debug,\r\n logLevel: config?.logLevel ?? base.logLevel,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve a single theme definition\r\n */\r\nfunction resolveThemeDefinition(\r\n themeName: string,\r\n definition: ThemeDefinition | undefined,\r\n selectorPattern: { default: string; others: string },\r\n _outputFileNames: Record<OutputFormat, string>,\r\n isDefaultTheme: boolean\r\n): ResolvedThemeDefinition {\r\n // Generate default output files based on theme name\r\n const generateOutputFiles = (): Record<OutputFormat, string> => {\r\n const suffix = isDefaultTheme ? '' : `-${themeName}`;\r\n return {\r\n css: `tokens${suffix}.css`,\r\n scss: `_tokens${suffix}.scss`,\r\n js: `tokens${suffix}.js`,\r\n ts: `tokens${suffix}.ts`,\r\n json: `tokens${suffix}.json`,\r\n android: `tokens${suffix}.xml`,\r\n ios: `tokens${suffix}.h`,\r\n };\r\n };\r\n\r\n // Generate default selector based on pattern\r\n const generateSelector = (): string => {\r\n if (isDefaultTheme) {\r\n return selectorPattern.default;\r\n }\r\n return selectorPattern.others.replace('{mode}', themeName);\r\n };\r\n\r\n const defaultOutputFiles = generateOutputFiles();\r\n\r\n return {\r\n isDefault: definition?.isDefault ?? isDefaultTheme,\r\n suffix: definition?.suffix ?? (isDefaultTheme ? null : `-${themeName}`),\r\n selector: definition?.selector ?? generateSelector(),\r\n mediaQuery: definition?.mediaQuery,\r\n dataAttribute: definition?.dataAttribute,\r\n outputFiles: {\r\n ...defaultOutputFiles,\r\n ...definition?.outputFiles,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Resolve themes configuration section\r\n */\r\nfunction resolveThemesConfig(config: ThemesConfig | undefined): ResolvedThemesConfig {\r\n const base = defaultThemesConfig;\r\n\r\n const selectorPattern = {\r\n default: config?.selectorPattern?.default ?? base.selectorPattern.default,\r\n others: config?.selectorPattern?.others ?? base.selectorPattern.others,\r\n };\r\n\r\n // Determine the default theme name\r\n const defaultThemeName = config?.default?.toLowerCase() ?? base.default;\r\n\r\n // Resolve definitions\r\n let definitions: Record<string, ResolvedThemeDefinition>;\r\n\r\n if (config?.definitions && Object.keys(config.definitions).length > 0) {\r\n // User provided explicit definitions\r\n definitions = {};\r\n for (const [themeName, definition] of Object.entries(config.definitions)) {\r\n const normalizedName = themeName.toLowerCase();\r\n const isDefaultTheme = definition.isDefault ?? normalizedName === defaultThemeName;\r\n const resolvedDef = resolveThemeDefinition(\r\n normalizedName,\r\n definition,\r\n selectorPattern,\r\n defaultOutputFileNames,\r\n isDefaultTheme\r\n );\r\n Object.defineProperty(definitions, normalizedName, {\r\n value: resolvedDef,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n } else {\r\n // Use default definitions (light & dark)\r\n definitions = { ...defaultThemeDefinitions };\r\n }\r\n\r\n return {\r\n enabled: config?.enabled ?? base.enabled,\r\n autoDetect: config?.autoDetect ?? base.autoDetect,\r\n default: defaultThemeName,\r\n ignoreModes: config?.ignoreModes ?? [...base.ignoreModes],\r\n selectorPattern,\r\n definitions,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve icons configuration section\r\n */\r\nfunction resolveIconsConfig(\r\n config: IconsConfig | undefined,\r\n options: ResolveOptions\r\n): ResolvedIconsConfig {\r\n const base = defaultIconsConfig;\r\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\r\n\r\n return {\r\n sourceDir: config?.sourceDir ? path.resolve(configDir, config.sourceDir) : base.sourceDir,\r\n outputDir: config?.outputDir ? path.resolve(configDir, config.outputDir) : base.outputDir,\r\n framework: config?.framework ?? base.framework,\r\n typescript: config?.typescript ?? base.typescript,\r\n optimize: config?.optimize ?? base.optimize,\r\n prefix: config?.prefix ?? base.prefix,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve tokens configuration section\r\n */\r\nfunction resolveTokensConfig(\r\n config: TokensConfig | undefined,\r\n options: ResolveOptions\r\n): ResolvedTokensConfig {\r\n const base = defaultTokensConfig;\r\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\r\n\r\n // Resolve paths relative to config directory\r\n const resolveDir = (dir: string): string => path.resolve(configDir, dir);\r\n\r\n // Resolve output directories using Map to avoid object injection\r\n const outputDirsMap = new Map(Object.entries(base.outputDirs));\r\n if (config?.outputDirs) {\r\n for (const [format, dir] of Object.entries(config.outputDirs)) {\r\n if (dir !== undefined) {\r\n outputDirsMap.set(format, resolveDir(dir));\r\n }\r\n }\r\n }\r\n const outputDirs = Object.fromEntries(outputDirsMap) as ResolvedTokensConfig['outputDirs'];\r\n\r\n // Merge collection mapping with resolved paths using Map\r\n const collectionMappingMap = new Map<string, string>();\r\n if (config?.collectionMapping) {\r\n for (const [name, filePath] of Object.entries(config.collectionMapping)) {\r\n collectionMappingMap.set(name, resolveDir(filePath));\r\n }\r\n }\r\n const collectionMapping = Object.fromEntries(collectionMappingMap);\r\n\r\n // Resolve additional directories\r\n const additionalScssDirectories = (config?.additionalScssDirectories ?? []).map(resolveDir);\r\n const additionalCssDirectories = (config?.additionalCssDirectories ?? []).map(resolveDir);\r\n const watchDirectories = (config?.watchDirectories ?? []).map(resolveDir);\r\n\r\n return {\r\n source: config?.source ?? base.source,\r\n sourceDir: config?.sourceDir ? resolveDir(config.sourceDir) : base.sourceDir,\r\n collectionsDir: config?.collectionsDir\r\n ? resolveDir(config.collectionsDir)\r\n : base.collectionsDir,\r\n sourcePatterns: config?.sourcePatterns ?? [...base.sourcePatterns],\r\n collectionMapping,\r\n outputDir: config?.outputDir ? resolveDir(config.outputDir) : base.outputDir,\r\n outputDirs,\r\n outputFileNames: { ...base.outputFileNames, ...config?.outputFileNames },\r\n prefix: config?.prefix ?? base.prefix,\r\n formats: config?.formats ?? [...base.formats],\r\n additionalScssDirectories,\r\n additionalCssDirectories,\r\n mergeOrder: config?.mergeOrder ?? base.mergeOrder,\r\n createBundle: config?.createBundle ?? base.createBundle,\r\n scssImportHeader: config?.scssImportHeader,\r\n themes: resolveThemesConfig(config?.themes),\r\n transforms: config?.transforms ?? [],\r\n customFormats: config?.customFormats ?? [],\r\n preprocessors: config?.preprocessors ?? [],\r\n filters: config?.filters ?? [],\r\n onBuildStart: config?.onBuildStart,\r\n onFormatComplete: config?.onFormatComplete,\r\n onAllFormatsComplete: config?.onAllFormatsComplete,\r\n onBuildComplete: config?.onBuildComplete,\r\n outputReferences: config?.outputReferences ?? base.outputReferences,\r\n baseFontSize: config?.baseFontSize ?? base.baseFontSize,\r\n separateThemeFiles: config?.separateThemeFiles ?? base.separateThemeFiles,\r\n watch: config?.watch ?? base.watch,\r\n watchDirectories,\r\n pipeline: config?.pipeline,\r\n scss: config?.scss,\r\n postprocess: config?.postprocess,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve aliases configuration section\r\n */\r\nfunction resolveAliasesConfig(config: AliasesConfig | undefined): ResolvedAliasesConfig {\r\n const base = defaultAliasesConfig;\r\n\r\n return {\r\n importAlias: config?.importAlias ?? base.importAlias,\r\n ui: config?.ui ?? base.ui,\r\n hooks: config?.hooks ?? base.hooks,\r\n utils: config?.utils ?? base.utils,\r\n components: config?.components ?? base.components,\r\n lib: config?.lib ?? base.lib,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve components configuration section\r\n */\r\nfunction resolveComponentsConfig(config: ComponentsConfig | undefined): ResolvedComponentsConfig {\r\n const base = defaultComponentsConfig;\r\n\r\n return {\r\n enabled: config?.enabled ?? base.enabled,\r\n registryUrl: config?.registryUrl ?? base.registryUrl,\r\n tsx: config?.tsx ?? base.tsx,\r\n overwrite: config?.overwrite ?? base.overwrite,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Main Resolver\r\n// ============================================================================\r\n\r\n/**\r\n * Merge config with overrides (simple shallow merge for top-level)\r\n */\r\nfunction applyOverrides(config: DsaiConfig, overrides: Partial<DsaiConfig>): DsaiConfig {\r\n return {\r\n tokens: overrides.tokens ? { ...config.tokens, ...overrides.tokens } : config.tokens,\r\n icons: overrides.icons ? { ...config.icons, ...overrides.icons } : config.icons,\r\n aliases: overrides.aliases ? { ...config.aliases, ...overrides.aliases } : config.aliases,\r\n components: overrides.components\r\n ? { ...config.components, ...overrides.components }\r\n : config.components,\r\n global: overrides.global ? { ...config.global, ...overrides.global } : config.global,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve user configuration with defaults\r\n *\r\n * Merges user configuration with defaults, resolves relative paths,\r\n * and applies overrides.\r\n *\r\n * Resolution order (later overrides earlier):\r\n * 1. Default configuration\r\n * 2. User configuration (from file)\r\n * 3. Override configuration (from CLI or programmatic)\r\n *\r\n * @param config - User configuration object\r\n * @param options - Resolution options\r\n * @returns Fully resolved configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * const resolved = resolveConfig(\r\n * { tokens: { prefix: '--custom-' } },\r\n * { cwd: '/path/to/project' }\r\n * );\r\n * ```\r\n */\r\nexport function resolveConfig(\r\n config: DsaiConfig = {},\r\n options: ResolveOptions = {}\r\n): ResolvedConfig {\r\n // Merge overrides into config\r\n const mergedConfig = options.overrides ? applyOverrides(config, options.overrides) : config;\r\n\r\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\r\n\r\n return {\r\n global: resolveGlobalConfig(mergedConfig.global, options),\r\n tokens: resolveTokensConfig(mergedConfig.tokens, options),\r\n icons: resolveIconsConfig(mergedConfig.icons, options),\r\n aliases: resolveAliasesConfig(mergedConfig.aliases),\r\n components: resolveComponentsConfig(mergedConfig.components),\r\n configDir,\r\n };\r\n}\r\n\r\n/**\r\n * Merge multiple configurations\r\n *\r\n * Useful for extending base configurations.\r\n *\r\n * @param configs - Array of configurations to merge (later overrides earlier)\r\n * @returns Merged configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * const merged = mergeConfigs(\r\n * baseConfig,\r\n * teamConfig,\r\n * projectConfig\r\n * );\r\n * ```\r\n */\r\nexport function mergeConfigs(...configs: DsaiConfig[]): DsaiConfig {\r\n let result: DsaiConfig = {};\r\n\r\n for (const config of configs) {\r\n result = applyOverrides(result, config);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Create a partial resolved config for testing\r\n *\r\n * @param partial - Partial configuration to fill\r\n * @returns Full resolved configuration with defaults\r\n */\r\nexport function createResolvedConfig(partial: Partial<ResolvedConfig> = {}): ResolvedConfig {\r\n return {\r\n global: partial.global ?? defaultConfig.global,\r\n tokens: partial.tokens ?? defaultConfig.tokens,\r\n icons: partial.icons ?? defaultConfig.icons,\r\n aliases: partial.aliases ?? defaultConfig.aliases,\r\n components: partial.components ?? defaultConfig.components,\r\n configDir: partial.configDir ?? process.cwd(),\r\n configPath: partial.configPath,\r\n };\r\n}\r\n","/**\r\n * @fileoverview Configuration file loader for DSAI Tools\r\n *\r\n * Uses cosmiconfig to load configuration from multiple file formats\r\n * and locations following standard conventions.\r\n *\r\n * @module @dsai-io/tools/config/loader\r\n */\r\n\r\nimport path from 'node:path';\r\n\r\nimport { cosmiconfig, cosmiconfigSync } from 'cosmiconfig';\r\n\r\nimport { resolveConfig } from './resolver.js';\r\n\r\nimport type { DsaiConfig, LoadConfigOptions, LoadConfigResult } from './types.js';\r\nimport type { CosmiconfigResult, PublicExplorer, PublicExplorerSync } from 'cosmiconfig';\r\n\r\n// ============================================================================\r\n// Constants\r\n// ============================================================================\r\n\r\n/**\r\n * Module name for cosmiconfig search\r\n * This determines the config file naming conventions:\r\n * - dsai.config.{js,mjs,cjs,ts}\r\n * - .dsairc\r\n * - .dsairc.{json,yaml,yml,js,mjs,cjs}\r\n * - package.json \"dsai\" key\r\n */\r\nconst MODULE_NAME = 'dsai';\r\n\r\n/**\r\n * Supported configuration file names (in search order)\r\n */\r\nexport const CONFIG_FILE_NAMES = [\r\n 'dsai.config.ts',\r\n 'dsai.config.mjs',\r\n 'dsai.config.js',\r\n 'dsai.config.cjs',\r\n '.dsairc.ts',\r\n '.dsairc.mjs',\r\n '.dsairc.js',\r\n '.dsairc.cjs',\r\n '.dsairc.json',\r\n '.dsairc.yaml',\r\n '.dsairc.yml',\r\n '.dsairc',\r\n 'package.json',\r\n];\r\n\r\n// ============================================================================\r\n// Loader Instance\r\n// ============================================================================\r\n\r\n/**\r\n * Create a cosmiconfig explorer instance\r\n *\r\n * @param options - Optional loader options\r\n * @returns Cosmiconfig explorer\r\n */\r\nfunction createExplorer(options?: { stopDir?: string }): PublicExplorer {\r\n return cosmiconfig(MODULE_NAME, {\r\n searchPlaces: CONFIG_FILE_NAMES,\r\n stopDir: options?.stopDir,\r\n packageProp: MODULE_NAME,\r\n });\r\n}\r\n\r\n/**\r\n * Create a synchronous cosmiconfig explorer instance\r\n *\r\n * @param options - Optional loader options\r\n * @returns Cosmiconfig sync explorer\r\n */\r\nfunction createExplorerSync(options?: { stopDir?: string }): PublicExplorerSync {\r\n return cosmiconfigSync(MODULE_NAME, {\r\n searchPlaces: CONFIG_FILE_NAMES,\r\n stopDir: options?.stopDir,\r\n packageProp: MODULE_NAME,\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Loading Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Load configuration from file and merge with defaults\r\n *\r\n * This is the main entry point for loading configuration.\r\n * It searches for config files, loads them, validates,\r\n * and resolves with defaults.\r\n *\r\n * @param options - Load options\r\n * @returns Resolved configuration with metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * // Load from current directory\r\n * const result = await loadConfig();\r\n *\r\n * // Load from specific path\r\n * const result = await loadConfig({\r\n * configPath: './my-config.js'\r\n * });\r\n *\r\n * // Load with overrides\r\n * const result = await loadConfig({\r\n * overrides: { global: { debug: true } }\r\n * });\r\n * ```\r\n */\r\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult> {\r\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\r\n const warnings: string[] = [];\r\n\r\n let fileConfig: DsaiConfig = {};\r\n let resolvedConfigPath: string | undefined;\r\n\r\n // Load configuration from file unless skipped\r\n if (!skipFile) {\r\n const explorer = createExplorer({ stopDir: path.dirname(cwd) });\r\n let cosmicResult: CosmiconfigResult;\r\n\r\n try {\r\n if (configPath) {\r\n // Load from explicit path\r\n const absolutePath = path.isAbsolute(configPath)\r\n ? configPath\r\n : path.resolve(cwd, configPath);\r\n cosmicResult = await explorer.load(absolutePath);\r\n } else {\r\n // Search for config file\r\n cosmicResult = await explorer.search(cwd);\r\n }\r\n\r\n if (cosmicResult && !cosmicResult.isEmpty) {\r\n fileConfig = cosmicResult.config as DsaiConfig;\r\n resolvedConfigPath = cosmicResult.filepath;\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n warnings.push(`Failed to load configuration: ${message}`);\r\n }\r\n }\r\n\r\n // Resolve configuration with defaults\r\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\r\n\r\n const resolvedConfig = resolveConfig(fileConfig, {\r\n cwd,\r\n configDir,\r\n overrides,\r\n });\r\n\r\n return {\r\n config: resolvedConfig,\r\n configPath: resolvedConfigPath,\r\n warnings,\r\n };\r\n}\r\n\r\n/**\r\n * Search for configuration file without loading\r\n *\r\n * Useful for checking if a config file exists before operations.\r\n *\r\n * @param cwd - Directory to search from\r\n * @returns Path to config file if found, undefined otherwise\r\n */\r\nexport async function searchConfigFile(cwd: string = process.cwd()): Promise<string | undefined> {\r\n const explorer = createExplorer();\r\n\r\n try {\r\n const result = await explorer.search(cwd);\r\n return result?.filepath;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Clear the configuration cache\r\n *\r\n * Useful when files have changed and need to be reloaded.\r\n */\r\nexport function clearConfigCache(): void {\r\n const explorer = createExplorer();\r\n explorer.clearCaches();\r\n}\r\n\r\n/**\r\n * Load configuration synchronously (limited format support)\r\n *\r\n * Note: This only works with JSON and synchronous JS/CJS configs.\r\n * For full format support including ESM and TypeScript, use loadConfig().\r\n *\r\n * @param options - Load options\r\n * @returns Resolved configuration with metadata\r\n */\r\nexport function loadConfigSync(options: LoadConfigOptions = {}): LoadConfigResult {\r\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\r\n const warnings: string[] = [];\r\n\r\n let fileConfig: DsaiConfig = {};\r\n let resolvedConfigPath: string | undefined;\r\n\r\n // Load configuration from file unless skipped\r\n if (!skipFile) {\r\n const explorer = createExplorerSync({ stopDir: path.dirname(cwd) });\r\n\r\n try {\r\n if (configPath) {\r\n // Load from explicit path\r\n const absolutePath = path.isAbsolute(configPath)\r\n ? configPath\r\n : path.resolve(cwd, configPath);\r\n const result = explorer.load(absolutePath);\r\n\r\n if (result && !result.isEmpty) {\r\n fileConfig = result.config as DsaiConfig;\r\n resolvedConfigPath = result.filepath;\r\n }\r\n } else {\r\n // Search for config file\r\n const result = explorer.search(cwd);\r\n\r\n if (result && !result.isEmpty) {\r\n fileConfig = result.config as DsaiConfig;\r\n resolvedConfigPath = result.filepath;\r\n }\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n warnings.push(`Failed to load configuration: ${message}`);\r\n }\r\n }\r\n\r\n // Resolve configuration with defaults\r\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\r\n\r\n const resolvedConfig = resolveConfig(fileConfig, {\r\n cwd,\r\n configDir,\r\n overrides,\r\n });\r\n\r\n return {\r\n config: resolvedConfig,\r\n configPath: resolvedConfigPath,\r\n warnings,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// Config Helper\r\n// ============================================================================\r\n\r\n/**\r\n * Define configuration with type checking\r\n *\r\n * A helper function that provides TypeScript type checking for config files.\r\n * Use this in your dsai.config.ts or dsai.config.mjs files.\r\n *\r\n * @param config - Configuration object\r\n * @returns The same configuration object with type checking applied\r\n *\r\n * @example\r\n * ```typescript\r\n * // dsai.config.ts\r\n * import { defineConfig } from '@dsai-io/tools';\r\n *\r\n * export default defineConfig({\r\n * tokens: {\r\n * prefix: '--myapp-',\r\n * formats: ['css', 'scss', 'ts'],\r\n * },\r\n * icons: {\r\n * framework: 'react',\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: DsaiConfig): DsaiConfig {\r\n return config;\r\n}\r\n\r\n/**\r\n * Define configuration with async function\r\n *\r\n * Allows async operations during configuration creation.\r\n *\r\n * @param configFn - Async function returning configuration\r\n * @returns Promise resolving to the configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * // dsai.config.ts\r\n * import { defineConfigAsync } from '@dsai-io/tools';\r\n *\r\n * export default defineConfigAsync(async () => {\r\n * const baseConfig = await loadExternalConfig();\r\n * return {\r\n * ...baseConfig,\r\n * tokens: {\r\n * prefix: '--custom-',\r\n * },\r\n * };\r\n * });\r\n * ```\r\n */\r\nexport function defineConfigAsync(configFn: () => Promise<DsaiConfig>): Promise<DsaiConfig> {\r\n return configFn();\r\n}\r\n","/**\r\n * @fileoverview Environment variable parsing for DSAI Tools configuration\r\n *\r\n * Reads configuration values from environment variables and converts\r\n * them to the appropriate types.\r\n *\r\n * @module @dsai-io/tools/config/env\r\n */\r\n\r\nimport { envArrayKeys, envBooleanKeys, envMappings, envNumberKeys } from './defaults.js';\r\n\r\nimport type { DsaiConfig } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Options for parsing environment variables\r\n */\r\nexport interface EnvParseOptions {\r\n /** Environment object to read from (default: process.env) */\r\n env?: NodeJS.ProcessEnv;\r\n\r\n /** Prefix filter for environment variables */\r\n prefix?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Parsing Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Parse a boolean from environment variable value\r\n *\r\n * @param value - Environment variable value\r\n * @returns Parsed boolean or undefined\r\n */\r\nfunction parseBoolean(value: string | undefined): boolean | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.toLowerCase().trim();\r\n\r\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\r\n return true;\r\n }\r\n\r\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\r\n return false;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Parse a number from environment variable value\r\n *\r\n * @param value - Environment variable value\r\n * @returns Parsed number or undefined\r\n */\r\nfunction parseNumber(value: string | undefined): number | undefined {\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n const num = Number(value);\r\n return Number.isNaN(num) ? undefined : num;\r\n}\r\n\r\n/**\r\n * Parse an array from environment variable value (comma-separated)\r\n *\r\n * @param value - Environment variable value\r\n * @returns Parsed array or undefined\r\n */\r\nfunction parseArray(value: string | undefined): string[] | undefined {\r\n if (value === undefined || value.trim() === '') {\r\n return undefined;\r\n }\r\n\r\n return value\r\n .split(',')\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n}\r\n\r\n/**\r\n * Set a nested value in an object using dot notation path\r\n *\r\n * @param obj - Object to modify\r\n * @param path - Dot notation path (e.g., 'global.logLevel')\r\n * @param value - Value to set\r\n */\r\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\r\n const parts = path.split('.');\r\n\r\n if (parts.length === 1) {\r\n const key = parts[0];\r\n if (key !== undefined) {\r\n Object.defineProperty(obj, key, {\r\n value,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (parts.length === 2) {\r\n const [first, second] = parts;\r\n if (first !== undefined && second !== undefined) {\r\n if (!(first in obj)) {\r\n Object.defineProperty(obj, first, {\r\n value: {},\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n const nested = Reflect.get(obj, first) as Record<string, unknown>;\r\n Object.defineProperty(nested, second, {\r\n value,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (parts.length === 3) {\r\n const [first, second, third] = parts;\r\n if (first !== undefined && second !== undefined && third !== undefined) {\r\n if (!(first in obj)) {\r\n Object.defineProperty(obj, first, {\r\n value: {},\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n const nested1 = Reflect.get(obj, first) as Record<string, unknown>;\r\n if (!(second in nested1)) {\r\n Object.defineProperty(nested1, second, {\r\n value: {},\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n const nested2 = Reflect.get(nested1, second) as Record<string, unknown>;\r\n Object.defineProperty(nested2, third, {\r\n value,\r\n writable: true,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n }\r\n }\r\n\r\n // For paths deeper than 3 levels, we don't support them in config\r\n}\r\n\r\n// ============================================================================\r\n// Main Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Read configuration values from environment variables\r\n *\r\n * Parses environment variables according to the mappings defined in defaults.ts.\r\n * Supports string, boolean, number, and array types.\r\n *\r\n * @param options - Parse options\r\n * @returns Partial configuration object from environment\r\n *\r\n * @example\r\n * ```typescript\r\n * // Read from process.env\r\n * const envConfig = getConfigFromEnv();\r\n *\r\n * // Read from custom env object\r\n * const envConfig = getConfigFromEnv({\r\n * env: { DSAI_LOG_LEVEL: 'debug' }\r\n * });\r\n * ```\r\n */\r\nexport function getConfigFromEnv(options: EnvParseOptions = {}): Partial<DsaiConfig> {\r\n const env = options.env ?? process.env;\r\n const prefix = options.prefix ?? 'DSAI_';\r\n\r\n const config: Record<string, unknown> = {};\r\n\r\n for (const [envKey, configPath] of Object.entries(envMappings)) {\r\n // Check prefix filter\r\n if (!envKey.startsWith(prefix)) {\r\n continue;\r\n }\r\n\r\n const envValue = Reflect.get(env, envKey) as string | undefined;\r\n if (envValue === undefined) {\r\n continue;\r\n }\r\n\r\n let parsedValue: unknown;\r\n\r\n // Parse based on expected type\r\n if (envBooleanKeys.has(envKey)) {\r\n parsedValue = parseBoolean(envValue);\r\n } else if (envNumberKeys.has(envKey)) {\r\n parsedValue = parseNumber(envValue);\r\n } else if (envArrayKeys.has(envKey)) {\r\n parsedValue = parseArray(envValue);\r\n } else {\r\n // Default to string\r\n parsedValue = envValue;\r\n }\r\n\r\n // Only set if we got a valid value\r\n if (parsedValue !== undefined) {\r\n setNestedValue(config, configPath, parsedValue);\r\n }\r\n }\r\n\r\n return config as Partial<DsaiConfig>;\r\n}\r\n\r\n/**\r\n * Check if running in CI environment\r\n *\r\n * Checks common CI environment variables.\r\n *\r\n * @param env - Environment object to check\r\n * @returns True if CI environment detected\r\n */\r\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\r\n return (\r\n env['CI'] === 'true' ||\r\n env['CONTINUOUS_INTEGRATION'] === 'true' ||\r\n env['GITHUB_ACTIONS'] === 'true' ||\r\n env['GITLAB_CI'] === 'true' ||\r\n env['CIRCLECI'] === 'true' ||\r\n env['TRAVIS'] === 'true' ||\r\n env['BUILDKITE'] === 'true' ||\r\n env['JENKINS_URL'] !== undefined ||\r\n env['TF_BUILD'] === 'True'\r\n );\r\n}\r\n\r\n/**\r\n * Check if colors should be disabled based on environment\r\n *\r\n * @param env - Environment object to check\r\n * @returns True if colors should be disabled\r\n */\r\nexport function shouldDisableColors(env: NodeJS.ProcessEnv = process.env): boolean {\r\n return env['NO_COLOR'] !== undefined || env['FORCE_COLOR'] === '0' || env['TERM'] === 'dumb';\r\n}\r\n\r\n/**\r\n * Get the effective log level from environment\r\n *\r\n * Checks DSAI_LOG_LEVEL, DEBUG, and VERBOSE env vars.\r\n *\r\n * @param env - Environment object to check\r\n * @returns Log level string or undefined\r\n */\r\nexport function getLogLevelFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {\r\n const dsaiLogLevel = env['DSAI_LOG_LEVEL'];\r\n const dsaiDebug = env['DSAI_DEBUG'];\r\n const debug = env['DEBUG'];\r\n const verbose = env['VERBOSE'];\r\n\r\n // Explicit DSAI log level takes precedence\r\n if (dsaiLogLevel) {\r\n return dsaiLogLevel;\r\n }\r\n\r\n // Check for debug mode\r\n if (dsaiDebug === 'true' || debug?.includes('dsai')) {\r\n return 'debug';\r\n }\r\n\r\n // Check for verbose mode\r\n if (verbose === 'true') {\r\n return 'verbose';\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get environment-based overrides for configuration\r\n *\r\n * This combines all environment-based settings into a single override object.\r\n *\r\n * @param env - Environment object to check\r\n * @returns Configuration overrides from environment\r\n */\r\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): Partial<DsaiConfig> {\r\n const config = getConfigFromEnv({ env });\r\n\r\n // Apply CI detection\r\n if (isCI(env) && !config.global) {\r\n config.global = { debug: false };\r\n }\r\n\r\n // Apply log level from various sources\r\n const logLevel = getLogLevelFromEnv(env);\r\n if (logLevel) {\r\n config.global = {\r\n ...config.global,\r\n logLevel: logLevel as 'silent' | 'error' | 'warn' | 'info' | 'debug',\r\n };\r\n }\r\n\r\n return config;\r\n}\r\n","/**\r\n * Legacy configuration migration utilities\r\n *\r\n * Provides migration support for older config formats and helps users\r\n * upgrade to the latest configuration schema.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { DsaiConfig, TokensConfig } from './types.js';\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\n/**\r\n * Legacy tokens.config.json format (v0.x)\r\n */\r\ninterface LegacyTokensConfig {\r\n /** Source directory for tokens */\r\n source?: string;\r\n /** Output directory */\r\n output?: string;\r\n /** CSS prefix */\r\n prefix?: string;\r\n /** Output formats */\r\n formats?: string[];\r\n /** Theme configuration */\r\n themes?: {\r\n default?: string;\r\n modes?: string[];\r\n };\r\n}\r\n\r\n/**\r\n * Result of migration check\r\n */\r\nexport interface MigrationCheck {\r\n /** Whether migration is needed */\r\n needsMigration: boolean;\r\n /** Detected config version or format */\r\n detectedFormat: ConfigFormat;\r\n /** Warnings about deprecated options */\r\n warnings: string[];\r\n /** Suggested migration steps */\r\n suggestions: string[];\r\n}\r\n\r\n/**\r\n * Supported configuration formats\r\n */\r\nexport type ConfigFormat =\r\n | 'current' // dsai.config.mjs/js/ts\r\n | 'legacy-tokens' // tokens.config.json (v0.x)\r\n | 'unknown';\r\n\r\n// ============================================================================\r\n// Migration Detection\r\n// ============================================================================\r\n\r\n/**\r\n * Check if a configuration needs migration\r\n *\r\n * @param config - Raw configuration object\r\n * @param filename - Optional filename for format detection\r\n * @returns Migration check result\r\n *\r\n * @example\r\n * ```typescript\r\n * const check = checkMigrationNeeded(oldConfig, 'tokens.config.json');\r\n * if (check.needsMigration) {\r\n * console.log('Migration needed:', check.suggestions);\r\n * }\r\n * ```\r\n */\r\nexport function checkMigrationNeeded(config: unknown, filename?: string): MigrationCheck {\r\n const warnings: string[] = [];\r\n const suggestions: string[] = [];\r\n\r\n // Check filename for legacy format\r\n if (filename?.includes('tokens.config.json')) {\r\n warnings.push('tokens.config.json is deprecated. Please migrate to dsai.config.mjs.');\r\n suggestions.push('Run: npx @dsai-io/tools migrate to automatically migrate your config.');\r\n\r\n return {\r\n needsMigration: true,\r\n detectedFormat: 'legacy-tokens',\r\n warnings,\r\n suggestions,\r\n };\r\n }\r\n\r\n // Check for legacy structure\r\n if (isLegacyTokensConfig(config)) {\r\n warnings.push('Legacy configuration format detected. Some options may be deprecated.');\r\n suggestions.push('Consider updating to the new configuration format.');\r\n\r\n return {\r\n needsMigration: true,\r\n detectedFormat: 'legacy-tokens',\r\n warnings,\r\n suggestions,\r\n };\r\n }\r\n\r\n return {\r\n needsMigration: false,\r\n detectedFormat: 'current',\r\n warnings,\r\n suggestions,\r\n };\r\n}\r\n\r\n/**\r\n * Type guard for legacy tokens config\r\n */\r\nfunction isLegacyTokensConfig(config: unknown): config is LegacyTokensConfig {\r\n if (typeof config !== 'object' || config === null) {\r\n return false;\r\n }\r\n\r\n const obj = config as Record<string, unknown>;\r\n\r\n // Legacy format has 'output' instead of 'outputDir'\r\n // and 'source' as a string path instead of structured source config\r\n return (\r\n typeof obj['output'] === 'string' ||\r\n (typeof obj['source'] === 'string' && !('sourceDir' in obj))\r\n );\r\n}\r\n\r\n// ============================================================================\r\n// Migration Functions\r\n// ============================================================================\r\n\r\n/**\r\n * Migrate legacy tokens.config.json to new format\r\n *\r\n * @param legacy - Legacy configuration object\r\n * @returns Migrated configuration\r\n *\r\n * @example\r\n * ```typescript\r\n * const oldConfig = require('./tokens.config.json');\r\n * const newConfig = migrateLegacyTokensConfig(oldConfig);\r\n * ```\r\n */\r\nexport function migrateLegacyTokensConfig(legacy: LegacyTokensConfig): DsaiConfig {\r\n const tokens: TokensConfig = {};\r\n\r\n // Migrate source → sourceDir\r\n if (legacy.source !== undefined && legacy.source !== null) {\r\n tokens.sourceDir = legacy.source;\r\n }\r\n\r\n // Migrate output → outputDir\r\n if (legacy.output !== undefined && legacy.output !== null) {\r\n tokens.outputDir = legacy.output;\r\n }\r\n\r\n // Direct migrations\r\n if (legacy.prefix !== undefined && legacy.prefix !== null) {\r\n tokens.prefix = legacy.prefix;\r\n }\r\n\r\n if (Array.isArray(legacy.formats)) {\r\n // Filter to only valid formats\r\n const validFormats = ['css', 'scss', 'js', 'ts', 'json', 'android', 'ios'] as const;\r\n tokens.formats = legacy.formats.filter((f): f is (typeof validFormats)[number] =>\r\n validFormats.includes(f as (typeof validFormats)[number])\r\n );\r\n }\r\n\r\n // Migrate themes\r\n if (legacy.themes !== undefined && legacy.themes !== null) {\r\n tokens.themes = {\r\n default: legacy.themes.default ?? 'Light',\r\n // ignoreModes can be derived from modes if needed\r\n };\r\n }\r\n\r\n return { tokens };\r\n}\r\n\r\n/**\r\n * Migrate any legacy configuration to current format\r\n *\r\n * @param config - Raw configuration (any format)\r\n * @param filename - Optional filename for format detection\r\n * @returns Migrated configuration and warnings\r\n *\r\n * @example\r\n * ```typescript\r\n * const { config, warnings } = migrateConfig(rawConfig, 'tokens.config.json');\r\n * if (warnings.length > 0) {\r\n * warnings.forEach(w => console.warn(w));\r\n * }\r\n * ```\r\n */\r\nexport function migrateConfig(\r\n config: unknown,\r\n filename?: string\r\n): { config: DsaiConfig; warnings: string[] } {\r\n const check = checkMigrationNeeded(config, filename);\r\n\r\n if (!check.needsMigration) {\r\n return {\r\n config: config as DsaiConfig,\r\n warnings: check.warnings,\r\n };\r\n }\r\n\r\n switch (check.detectedFormat) {\r\n case 'legacy-tokens':\r\n return {\r\n config: migrateLegacyTokensConfig(config as LegacyTokensConfig),\r\n warnings: check.warnings,\r\n };\r\n\r\n default:\r\n return {\r\n config: config as DsaiConfig,\r\n warnings: [...check.warnings, 'Unknown config format - using as-is.'],\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Deprecation Warnings\r\n// ============================================================================\r\n\r\n/**\r\n * Check for deprecated options in a configuration\r\n *\r\n * @param config - Configuration to check\r\n * @returns Array of deprecation warnings\r\n */\r\nexport function checkDeprecatedOptions(config: DsaiConfig): string[] {\r\n const warnings: string[] = [];\r\n\r\n // Check tokens.output (legacy)\r\n const configAny = config as Record<string, unknown>;\r\n const tokens = configAny['tokens'] as Record<string, unknown> | undefined;\r\n\r\n if (tokens !== undefined) {\r\n if ('output' in tokens) {\r\n warnings.push(\r\n `Deprecated: Use 'tokens.outputDir' instead of 'tokens.output' (tokens.outputDir)`\r\n );\r\n }\r\n if ('source' in tokens && typeof tokens['source'] === 'string') {\r\n warnings.push(\r\n `Deprecated: Use 'tokens.sourceDir' instead of 'tokens.source' for directory paths (tokens.sourceDir)`\r\n );\r\n }\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Generate migration script content\r\n *\r\n * @param _oldConfig - Old configuration (unused, reserved for future use)\r\n * @param newConfig - Migrated configuration\r\n * @returns String content for new config file\r\n */\r\nexport function generateMigrationScript(_oldConfig: unknown, newConfig: DsaiConfig): string {\r\n const configJson = JSON.stringify(newConfig, null, '\\t');\r\n\r\n return `// @ts-check\r\n/**\r\n * DSAI Configuration\r\n *\r\n * Migrated from legacy format.\r\n * Please review and adjust as needed.\r\n *\r\n * @type {import('@dsai-io/tools').DsaiConfig}\r\n */\r\nimport { defineConfig } from '@dsai-io/tools';\r\n\r\nexport default defineConfig(${configJson.replace(/\"([^\"]+)\":/g, '$1:')});\r\n`;\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","/* eslint-disable security/detect-non-literal-fs-filename */\r\n/**\r\n * SVG file scanner\r\n *\r\n * Scans directories for SVG files and reads their contents.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { readFileSync, statSync } from 'node:fs';\r\nimport { basename } from 'node:path';\r\n\r\nimport type { RawSVGData, ScannerOptions } from '../types.js';\r\n\r\n/**\r\n * Scan directory for SVG files\r\n *\r\n * Uses fast-glob to find SVG files matching the specified patterns.\r\n *\r\n * @param options - Scanner options\r\n * @returns Array of raw SVG data\r\n *\r\n * @example\r\n * ```typescript\r\n * const files = await scanSVGFiles({\r\n * sourceDir: './icons',\r\n * include: ['**\\/*.svg'],\r\n * exclude: ['**\\/node_modules\\/**'],\r\n * });\r\n * ```\r\n */\r\nexport async function scanSVGFiles(options: ScannerOptions): Promise<RawSVGData[]> {\r\n const {\r\n sourceDir,\r\n include = ['**/*.svg'],\r\n exclude = ['**/node_modules/**', '**/dist/**'],\r\n } = options;\r\n\r\n // Dynamic import of fast-glob (ESM module)\r\n const { default: fg } = await import('fast-glob');\r\n\r\n // Find all SVG files\r\n const files = await fg(include, {\r\n cwd: sourceDir,\r\n ignore: exclude,\r\n absolute: true,\r\n onlyFiles: true,\r\n });\r\n\r\n // Read each file\r\n const svgFiles: RawSVGData[] = [];\r\n\r\n for (const filePath of files) {\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n const stats = statSync(filePath);\r\n\r\n // Extract file name without extension\r\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\r\n\r\n svgFiles.push({\r\n filePath,\r\n fileName,\r\n content,\r\n originalSize: stats.size,\r\n });\r\n } catch {\r\n console.warn(`Warning: Failed to read ${filePath}`);\r\n }\r\n }\r\n\r\n // Sort by name for consistent output\r\n svgFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\r\n\r\n return svgFiles;\r\n}\r\n\r\n/**\r\n * Read a single SVG file\r\n *\r\n * @param filePath - Path to SVG file\r\n * @returns Raw SVG data or null if failed\r\n */\r\nexport function readSVGFile(filePath: string): RawSVGData | null {\r\n try {\r\n const content = readFileSync(filePath, 'utf-8');\r\n const stats = statSync(filePath);\r\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\r\n\r\n return {\r\n filePath,\r\n fileName,\r\n content,\r\n originalSize: stats.size,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Icon naming utilities\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n/**\r\n * Convert string to PascalCase component name\r\n *\r\n * @param input - Input string (e.g., file name)\r\n * @returns PascalCase component name\r\n *\r\n * @example\r\n * ```typescript\r\n * toComponentName('arrow-left') // 'ArrowLeft'\r\n * toComponentName('24px-icon') // 'Icon24px'\r\n * toComponentName('my_icon') // 'MyIcon'\r\n * toComponentName('chevron-down-small') // 'ChevronDownSmall'\r\n * ```\r\n */\r\nexport function toComponentName(input: string): string {\r\n // Handle numbers at start by prefixing with 'Icon'\r\n let processed = input;\r\n if (/^\\d/.test(processed)) {\r\n processed = `icon-${processed}`;\r\n }\r\n\r\n return (\r\n processed\r\n // Split on non-alphanumeric characters\r\n .split(/[^a-zA-Z0-9]+/)\r\n // Filter empty strings\r\n .filter((word) => word.length > 0)\r\n // Capitalize each word\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n // Join into single string\r\n .join('')\r\n );\r\n}\r\n\r\n/**\r\n * Convert string to kebab-case icon name\r\n *\r\n * @param input - Input string (e.g., component name)\r\n * @returns kebab-case icon name\r\n *\r\n * @example\r\n * ```typescript\r\n * toIconName('ArrowLeft') // 'arrow-left'\r\n * toIconName('ChevronDownSmall') // 'chevron-down-small'\r\n * toIconName('Icon24px') // 'icon-24px'\r\n * ```\r\n */\r\nexport function toIconName(input: string): string {\r\n return (\r\n input\r\n // Insert hyphen before uppercase letters\r\n .replace(/([A-Z])/g, '-$1')\r\n // Insert hyphen before number sequences\r\n .replace(/(\\d+)/g, '-$1')\r\n // Clean up multiple hyphens\r\n .replace(/-+/g, '-')\r\n // Remove leading hyphen\r\n .replace(/^-/, '')\r\n // Lowercase\r\n .toLowerCase()\r\n );\r\n}\r\n\r\n/**\r\n * Validate icon name\r\n *\r\n * @param name - Icon name to validate\r\n * @returns True if valid, false otherwise\r\n */\r\nexport function isValidIconName(name: string): boolean {\r\n // Must be non-empty\r\n if (!name || name.length === 0) {\r\n return false;\r\n }\r\n\r\n // Must be valid identifier-like (alphanumeric, hyphens, underscores)\r\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Normalize icon name from file name\r\n *\r\n * @param fileName - File name (without extension)\r\n * @returns Normalized icon name\r\n */\r\nexport function normalizeIconName(fileName: string): string {\r\n return fileName\r\n .replace(/[^a-zA-Z0-9]+/g, '-')\r\n .replace(/^-+|-+$/g, '')\r\n .toLowerCase();\r\n}\r\n","/**\r\n * SVG parser\r\n *\r\n * Parses SVG content into structured data.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { normalizeIconName, toComponentName } from '../utils/naming.js';\r\n\r\nimport type { ParsedSVG, RawSVGData } from '../types.js';\r\n\r\n/**\r\n * Parse raw SVG data into structured format\r\n *\r\n * Extracts viewBox, attributes, inner content, and accessibility info.\r\n *\r\n * @param raw - Raw SVG data\r\n * @returns Parsed SVG data\r\n */\r\nexport function parseSVG(raw: RawSVGData): ParsedSVG {\r\n const { content, fileName } = raw;\r\n\r\n // Extract SVG opening tag attributes\r\n const svgMatch = content.match(/<svg([^>]*)>/i);\r\n const svgAttributes = svgMatch?.[1] ?? '';\r\n\r\n // Parse attributes into object\r\n const attributes: Record<string, string> = {};\r\n const attrRegex = /([a-zA-Z][a-zA-Z0-9-]*)=[\"']([^\"']*)[\"']/g;\r\n\r\n for (const attrMatch of svgAttributes.matchAll(attrRegex)) {\r\n const key = attrMatch[1];\r\n const value = attrMatch[2];\r\n if (key && value !== undefined) {\r\n Object.assign(attributes, { [key]: value });\r\n }\r\n }\r\n\r\n // Extract viewBox (or construct from width/height)\r\n let viewBox = attributes['viewBox'] ?? '';\r\n if (!viewBox) {\r\n const width = attributes['width']?.replace(/[^\\d.]/g, '') ?? '24';\r\n const height = attributes['height']?.replace(/[^\\d.]/g, '') ?? '24';\r\n viewBox = `0 0 ${width} ${height}`;\r\n }\r\n\r\n // Extract inner content (everything between <svg> and </svg>)\r\n const innerContentMatch = content.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\r\n const innerContent = innerContentMatch?.[1]?.trim() ?? '';\r\n\r\n // Extract title for accessibility\r\n const titleMatch = content.match(/<title>([^<]*)<\\/title>/i);\r\n const title = titleMatch?.[1];\r\n\r\n // Extract description for accessibility\r\n const descMatch = content.match(/<desc>([^<]*)<\\/desc>/i);\r\n const description = descMatch?.[1];\r\n\r\n // Generate normalized name and component name\r\n const name = normalizeIconName(fileName);\r\n const componentName = toComponentName(fileName);\r\n\r\n return {\r\n name,\r\n componentName,\r\n fileName,\r\n viewBox,\r\n width: attributes['width'],\r\n height: attributes['height'],\r\n innerContent,\r\n fullContent: content,\r\n attributes,\r\n title,\r\n description,\r\n };\r\n}\r\n\r\n/**\r\n * Parse multiple SVG files\r\n *\r\n * @param rawFiles - Array of raw SVG data\r\n * @returns Array of parsed SVG data\r\n */\r\nexport function parseSVGFiles(rawFiles: RawSVGData[]): ParsedSVG[] {\r\n return rawFiles.map(parseSVG);\r\n}\r\n\r\n/**\r\n * Clean SVG content for React compatibility\r\n *\r\n * Converts kebab-case attributes to camelCase for JSX.\r\n *\r\n * @param svg - SVG content string\r\n * @returns Cleaned SVG content\r\n */\r\nexport function cleanSVGForReact(svg: string): string {\r\n return (\r\n svg\r\n // Convert kebab-case attributes to camelCase for React\r\n .replace(\r\n /(stroke|fill|line|clip|stop|color|font|text|letter|word|alignment|dominant|glyph|horiz|overline|paint|pointer|shape|strikethrough|underline|unicode|units|vert|writing)-([a-z])/g,\r\n (_, p1, p2) => p1 + p2.toUpperCase()\r\n )\r\n // Convert specific attributes\r\n .replace(/class=\"/g, 'className=\"')\r\n .replace(/xlink:href/g, 'xlinkHref')\r\n .replace(/xmlns:xlink/g, 'xmlnsXlink')\r\n // Use currentColor for strokes and fills (inherits from CSS)\r\n .replace(/stroke=\"#[^\"]+\"/g, 'stroke=\"currentColor\"')\r\n .replace(/fill=\"#[^\"]+\"/g, 'fill=\"currentColor\"')\r\n // Handle fill=\"none\" (keep as-is, common for stroke-only icons)\r\n .replace(/fill=\"currentColor\"([^>]*stroke)/g, 'fill=\"none\"$1')\r\n );\r\n}\r\n\r\n/**\r\n * Extract viewBox from SVG string\r\n *\r\n * @param svg - SVG content string\r\n * @returns ViewBox string or default\r\n */\r\nexport function extractViewBox(svg: string): string {\r\n const match = svg.match(/viewBox=\"([^\"]+)\"/);\r\n return match?.[1] ?? '0 0 24 24';\r\n}\r\n","/**\r\n * Core icon processing exports\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nexport { readSVGFile, scanSVGFiles } from './scanner.js';\r\nexport { cleanSVGForReact, extractViewBox, parseSVG, parseSVGFiles } from './parser.js';\r\nexport {\r\n defaultSVGOConfig,\r\n optimizeSVG,\r\n optimizeSVGFiles,\r\n skipOptimization,\r\n} from './optimizer.js';\r\n","/* eslint-disable security/detect-non-literal-fs-filename */\r\n/**\r\n * React component generator\r\n *\r\n * Generates React icon components from optimized SVG data.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport { cleanSVGForReact } from '../core/parser.js';\r\n\r\nimport type {\r\n GeneratedIcon,\r\n GeneratorOptions,\r\n IconTemplate,\r\n IndexTemplate,\r\n OptimizedSVG,\r\n TypesTemplate,\r\n} from '../types.js';\r\n\r\n/**\r\n * Default React icon template\r\n *\r\n * Generates a forwardRef component with size, title, and aria support.\r\n */\r\nexport const defaultReactTemplate: IconTemplate = (icon) => {\r\n const cleanedContent = cleanSVGForReact(icon.innerContent);\r\n\r\n return `/**\r\n * ${icon.componentName} icon\r\n *\r\n * @generated by @dsai-io/tools\r\n */\r\n\r\nimport * as React from 'react';\r\n\r\nimport type { SVGProps } from 'react';\r\n\r\nexport interface ${icon.componentName}Props extends SVGProps<SVGSVGElement> {\r\n /** Icon size */\r\n size?: number | string;\r\n /** Icon title for accessibility */\r\n title?: string;\r\n}\r\n\r\nexport const ${icon.componentName} = React.forwardRef<SVGSVGElement, ${icon.componentName}Props>(\r\n ({ size = 24, title${icon.title ? ` = \"${icon.title}\"` : ''}, ...props }, ref) => (\r\n <svg\r\n ref={ref}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"${icon.viewBox}\"\r\n width={size}\r\n height={size}\r\n fill=\"currentColor\"\r\n role={title ? 'img' : 'presentation'}\r\n aria-label={title}\r\n {...props}\r\n >\r\n {title && <title>{title}</title>}\r\n ${cleanedContent}\r\n </svg>\r\n )\r\n);\r\n\r\n${icon.componentName}.displayName = '${icon.componentName}';\r\n\r\nexport default ${icon.componentName};\r\n`;\r\n};\r\n\r\n/**\r\n * Default React index template\r\n *\r\n * Exports all icon components from a single entry point.\r\n */\r\nexport const defaultReactIndexTemplate: IndexTemplate = (icons) => `/**\r\n * Icon exports\r\n *\r\n * @generated by @dsai-io/tools\r\n */\r\n\r\n${icons.map((icon) => `export { ${icon.componentName} } from './${icon.componentName}.js';`).join('\\n')}\r\n\r\n// Re-export types\r\nexport type { SVGProps } from 'react';\r\n`;\r\n\r\n/**\r\n * Default React types template\r\n *\r\n * Generates TypeScript types for all icons.\r\n */\r\nexport const defaultReactTypesTemplate: TypesTemplate = (icons) => `/**\r\n * Icon types\r\n *\r\n * @generated by @dsai-io/tools\r\n */\r\n\r\nimport type { ForwardRefExoticComponent, RefAttributes, SVGProps } from 'react';\r\n\r\nexport interface IconProps extends SVGProps<SVGSVGElement> {\r\n size?: number | string;\r\n title?: string;\r\n}\r\n\r\nexport type IconComponent = ForwardRefExoticComponent<\r\n IconProps & RefAttributes<SVGSVGElement>\r\n>;\r\n\r\n/**\r\n * Available icon names\r\n */\r\nexport type IconName =\r\n${icons.map((icon) => ` | '${icon.name}'`).join('\\n')};\r\n\r\n/**\r\n * Icon component map\r\n */\r\nexport interface IconMap {\r\n${icons.map((icon) => ` '${icon.name}': IconComponent;`).join('\\n')}\r\n}\r\n\r\n/**\r\n * Icon metadata\r\n */\r\nexport interface IconMeta {\r\n name: IconName;\r\n componentName: string;\r\n viewBox: string;\r\n}\r\n\r\nexport const iconMeta: IconMeta[] = [\r\n${icons.map((icon) => ` { name: '${icon.name}', componentName: '${icon.componentName}', viewBox: '${icon.viewBox}' },`).join('\\n')}\r\n];\r\n`;\r\n\r\n/**\r\n * Generate React icon components\r\n *\r\n * @param icons - Optimized SVG data\r\n * @param outputDir - Output directory\r\n * @param options - Generator options\r\n * @returns Generated icons\r\n *\r\n * @example\r\n * ```typescript\r\n * const generated = await generateReactIcons(optimizedIcons, './dist/icons/react', {\r\n * dryRun: false,\r\n * });\r\n * console.log(\\`Generated \\${generated.length} files\\`);\r\n * ```\r\n */\r\nexport async function generateReactIcons(\r\n icons: OptimizedSVG[],\r\n outputDir: string,\r\n options: GeneratorOptions = {}\r\n): Promise<GeneratedIcon[]> {\r\n const {\r\n template = defaultReactTemplate,\r\n indexTemplate = defaultReactIndexTemplate,\r\n typesTemplate = defaultReactTypesTemplate,\r\n dryRun = false,\r\n } = options;\r\n\r\n const generated: GeneratedIcon[] = [];\r\n\r\n // Ensure output directory exists\r\n if (!dryRun && !existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate individual icon components\r\n for (const icon of icons) {\r\n const code = template(icon);\r\n const outputPath = join(outputDir, `${icon.componentName}.tsx`);\r\n\r\n if (!dryRun) {\r\n writeFileSync(outputPath, code, 'utf-8');\r\n }\r\n\r\n generated.push({\r\n name: icon.name,\r\n componentName: icon.componentName,\r\n code,\r\n outputPath,\r\n format: 'react',\r\n });\r\n }\r\n\r\n // Generate index file\r\n const indexCode = indexTemplate(icons);\r\n const indexPath = join(outputDir, 'index.ts');\r\n\r\n if (!dryRun) {\r\n writeFileSync(indexPath, indexCode, 'utf-8');\r\n }\r\n\r\n generated.push({\r\n name: 'index',\r\n componentName: 'index',\r\n code: indexCode,\r\n outputPath: indexPath,\r\n format: 'react',\r\n });\r\n\r\n // Generate types file\r\n const typesCode = typesTemplate(icons);\r\n const typesPath = join(outputDir, 'types.ts');\r\n\r\n if (!dryRun) {\r\n writeFileSync(typesPath, typesCode, 'utf-8');\r\n }\r\n\r\n generated.push({\r\n name: 'types',\r\n componentName: 'types',\r\n code: typesCode,\r\n outputPath: typesPath,\r\n format: 'react',\r\n });\r\n\r\n return generated;\r\n}\r\n","/* eslint-disable security/detect-non-literal-fs-filename */\r\n/**\r\n * SVG sprite generator\r\n *\r\n * Generates SVG sprite files with symbol definitions.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nimport type { GeneratedIcon, OptimizedSVG } from '../types.js';\r\n\r\n/**\r\n * SVG sprite generator options\r\n */\r\nexport interface SpriteOptions {\r\n /** Sprite file name */\r\n fileName?: string;\r\n\r\n /** Generate preview HTML file */\r\n generatePreview?: boolean;\r\n\r\n /** Dry run - don't write files */\r\n dryRun?: boolean;\r\n}\r\n\r\n/**\r\n * Generate SVG sprite\r\n *\r\n * Creates an SVG sprite with symbol definitions for all icons.\r\n *\r\n * @param icons - Optimized SVG data\r\n * @param outputDir - Output directory\r\n * @param options - Generator options\r\n * @returns Generated files\r\n *\r\n * @example\r\n * ```typescript\r\n * const generated = await generateSVGSprite(optimizedIcons, './dist/icons/sprite', {\r\n * fileName: 'icons.svg',\r\n * generatePreview: true,\r\n * });\r\n * ```\r\n */\r\nexport async function generateSVGSprite(\r\n icons: OptimizedSVG[],\r\n outputDir: string,\r\n options: SpriteOptions = {}\r\n): Promise<GeneratedIcon[]> {\r\n const { fileName = 'sprite.svg', generatePreview = true, dryRun = false } = options;\r\n\r\n const generated: GeneratedIcon[] = [];\r\n\r\n // Ensure output directory exists\r\n if (!dryRun && !existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate sprite symbols\r\n const symbols = icons\r\n .map(\r\n (icon) => ` <symbol id=\"${icon.name}\" viewBox=\"${icon.viewBox}\">\r\n ${icon.innerContent}\r\n </symbol>`\r\n )\r\n .join('\\n');\r\n\r\n // Create sprite SVG\r\n const spriteCode = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!--\r\n SVG Sprite\r\n @generated by @dsai-io/tools\r\n Contains ${icons.length} icons\r\n-->\r\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n <defs>\r\n${symbols}\r\n </defs>\r\n</svg>\r\n`;\r\n\r\n const outputPath = join(outputDir, fileName);\r\n\r\n if (!dryRun) {\r\n writeFileSync(outputPath, spriteCode, 'utf-8');\r\n }\r\n\r\n generated.push({\r\n name: 'sprite',\r\n componentName: 'sprite',\r\n code: spriteCode,\r\n outputPath,\r\n format: 'svg-sprite',\r\n });\r\n\r\n // Generate usage helper HTML\r\n if (generatePreview) {\r\n const usageCode = generatePreviewHTML(icons, fileName);\r\n const usagePath = join(outputDir, 'sprite-preview.html');\r\n\r\n if (!dryRun) {\r\n writeFileSync(usagePath, usageCode, 'utf-8');\r\n }\r\n\r\n generated.push({\r\n name: 'preview',\r\n componentName: 'preview',\r\n code: usageCode,\r\n outputPath: usagePath,\r\n format: 'svg-sprite',\r\n });\r\n }\r\n\r\n return generated;\r\n}\r\n\r\n/**\r\n * Generate preview HTML for sprite\r\n */\r\nfunction generatePreviewHTML(icons: OptimizedSVG[], spriteFileName: string): string {\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>Icon Sprite Preview</title>\r\n <style>\r\n * { box-sizing: border-box; }\r\n body { font-family: system-ui, sans-serif; padding: 2rem; max-width: 1200px; margin: 0 auto; }\r\n h1 { margin-bottom: 0.5rem; }\r\n .meta { color: #666; margin-bottom: 2rem; }\r\n .icon { width: 24px; height: 24px; fill: currentColor; }\r\n .icon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 1rem; }\r\n .icon-item { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; padding: 1rem; border: 1px solid #eee; border-radius: 8px; transition: background 0.2s; }\r\n .icon-item:hover { background: #f5f5f5; }\r\n .icon-name { font-size: 11px; color: #666; text-align: center; word-break: break-all; }\r\n pre { background: #f5f5f5; padding: 1rem; border-radius: 8px; overflow-x: auto; }\r\n code { font-family: ui-monospace, monospace; font-size: 13px; }\r\n </style>\r\n</head>\r\n<body>\r\n <h1>Icon Sprite Preview</h1>\r\n <p class=\"meta\">${icons.length} icons • Generated by @dsai-io/tools</p>\r\n\r\n <h2>Usage</h2>\r\n <pre><code>&lt;svg class=\"icon\"&gt;\r\n &lt;use href=\"${spriteFileName}#icon-name\"&gt;&lt;/use&gt;\r\n&lt;/svg&gt;</code></pre>\r\n\r\n <h2>All Icons</h2>\r\n <div class=\"icon-grid\">\r\n${icons\r\n .map(\r\n (icon) => ` <div class=\"icon-item\">\r\n <svg class=\"icon\"><use href=\"${spriteFileName}#${icon.name}\"></use></svg>\r\n <span class=\"icon-name\">${icon.name}</span>\r\n </div>`\r\n )\r\n .join('\\n')}\r\n </div>\r\n</body>\r\n</html>\r\n`;\r\n}\r\n","/**\r\n * Icon tooling module for @dsai-io/tools\r\n *\r\n * Provides utilities for generating icon components from SVG source files.\r\n * Supports React components, SVG sprites, with SVGO optimization.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { join } from 'node:path';\r\n\r\nimport { optimizeSVGFiles, parseSVGFiles, scanSVGFiles } from './core/index.js';\r\nimport { generateReactIcons } from './generators/react.js';\r\nimport { generateSVGSprite } from './generators/svg-sprite.js';\r\n\r\nimport type {\r\n GeneratedIcon,\r\n IconBuildOptions,\r\n IconBuildResult,\r\n IconFormat,\r\n OptimizedSVG,\r\n SVGOConfig,\r\n} from './types.js';\r\nimport type { ResolvedConfig } from '../config/types.js';\r\n\r\n/**\r\n * Build icons from SVG source files\r\n *\r\n * Scans the source directory, parses and optimizes SVGs, then generates\r\n * output in the specified formats (React, SVG sprite).\r\n *\r\n * @param config - Resolved DSAi configuration\r\n * @param options - Build options\r\n * @returns Build result with generated files\r\n *\r\n * @example\r\n * ```typescript\r\n * import { loadConfig } from '@dsai-io/tools/config';\r\n * import { buildIcons } from '@dsai-io/tools/icons';\r\n *\r\n * const { config } = await loadConfig();\r\n * const result = await buildIcons(config, {\r\n * formats: ['react', 'svg-sprite'],\r\n * });\r\n *\r\n * console.log(\\`Generated \\${result.totalIcons} icons\\`);\r\n * ```\r\n */\r\nexport async function buildIcons(\r\n config: ResolvedConfig,\r\n options: IconBuildOptions = {}\r\n): Promise<IconBuildResult> {\r\n const startTime = Date.now();\r\n const defaultFormat = config.icons.framework === 'react' ? 'react' : 'svg-sprite';\r\n const { formats = [defaultFormat as IconFormat], icons: iconFilter, dryRun = false } = options;\r\n\r\n const result: IconBuildResult = {\r\n success: false,\r\n icons: [],\r\n totalIcons: 0,\r\n filesWritten: 0,\r\n totalSizeReduction: 0,\r\n errors: [],\r\n warnings: [],\r\n duration: 0,\r\n };\r\n\r\n try {\r\n // Step 1: Scan for SVG files\r\n const rawFiles = await scanSVGFiles({\r\n sourceDir: config.icons.sourceDir,\r\n });\r\n\r\n if (rawFiles.length === 0) {\r\n result.warnings.push({\r\n icon: '*',\r\n message: `No SVG files found in ${config.icons.sourceDir}`,\r\n });\r\n result.success = true;\r\n result.duration = Date.now() - startTime;\r\n return result;\r\n }\r\n\r\n // Filter by specific icons if provided\r\n const filteredFiles = iconFilter\r\n ? rawFiles.filter((f) => iconFilter.includes(f.fileName))\r\n : rawFiles;\r\n\r\n // Step 2: Parse SVG content\r\n const parsedFiles = parseSVGFiles(filteredFiles);\r\n\r\n // Step 3: Optimize SVGs (if enabled)\r\n let optimizedFiles: OptimizedSVG[];\r\n if (config.icons.optimize) {\r\n const svgoConfig: SVGOConfig = {\r\n multipass: true,\r\n };\r\n optimizedFiles = await optimizeSVGFiles(parsedFiles, filteredFiles, svgoConfig);\r\n\r\n // Calculate total size reduction\r\n const totalReduction = optimizedFiles.reduce((sum, f) => sum + f.sizeReduction, 0);\r\n result.totalSizeReduction =\r\n optimizedFiles.length > 0 ? totalReduction / optimizedFiles.length : 0;\r\n } else {\r\n // Skip optimization - just add size metadata\r\n const { skipOptimization } = await import('./core/optimizer.js');\r\n optimizedFiles = parsedFiles.map((parsed, index) => {\r\n const rawFile = filteredFiles.at(index);\r\n if (!rawFile) {\r\n throw new Error(`Missing raw file for ${parsed.fileName}`);\r\n }\r\n return skipOptimization(parsed, rawFile);\r\n });\r\n }\r\n\r\n result.totalIcons = optimizedFiles.length;\r\n\r\n // Step 4: Generate output for each format\r\n const generated: GeneratedIcon[] = [];\r\n\r\n for (const format of formats) {\r\n const outputDir = join(config.icons.outputDir, format);\r\n\r\n switch (format) {\r\n case 'react':\r\n generated.push(...(await generateReactIcons(optimizedFiles, outputDir, { dryRun })));\r\n break;\r\n\r\n case 'svg':\r\n case 'svg-sprite':\r\n generated.push(...(await generateSVGSprite(optimizedFiles, outputDir, { dryRun })));\r\n break;\r\n\r\n default:\r\n result.warnings.push({\r\n icon: '*',\r\n message: `Unknown format: ${format}`,\r\n });\r\n }\r\n }\r\n\r\n result.icons = generated;\r\n result.filesWritten = dryRun ? 0 : generated.length;\r\n result.success = true;\r\n } catch (error) {\r\n result.errors.push({\r\n icon: '*',\r\n message: error instanceof Error ? error.message : 'Unknown error',\r\n code: 'BUILD_ERROR',\r\n });\r\n }\r\n\r\n result.duration = Date.now() - startTime;\r\n return result;\r\n}\r\n\r\n// Re-export types\r\nexport type {\r\n GeneratedIcon,\r\n GeneratorOptions,\r\n IconBuildOptions,\r\n IconBuildResult,\r\n IconError,\r\n IconErrorCode,\r\n IconFormat,\r\n IconTemplate,\r\n IconWarning,\r\n IndexTemplate,\r\n OptimizedSVG,\r\n ParsedSVG,\r\n RawSVGData,\r\n ScannerOptions,\r\n SVGOConfig,\r\n SVGOPlugin,\r\n TypesTemplate,\r\n} from './types.js';\r\n\r\n// Re-export core utilities\r\nexport {\r\n cleanSVGForReact,\r\n defaultSVGOConfig,\r\n extractViewBox,\r\n optimizeSVG,\r\n optimizeSVGFiles,\r\n parseSVG,\r\n parseSVGFiles,\r\n readSVGFile,\r\n scanSVGFiles,\r\n skipOptimization,\r\n} from './core/index.js';\r\n\r\n// Re-export generators\r\nexport {\r\n defaultReactIndexTemplate,\r\n defaultReactTemplate,\r\n defaultReactTypesTemplate,\r\n generateReactIcons,\r\n generateSVGSprite,\r\n} from './generators/index.js';\r\n\r\n// Re-export naming utilities\r\nexport {\r\n isValidIconName,\r\n normalizeIconName,\r\n toComponentName,\r\n toIconName,\r\n} from './utils/index.js';\r\n","/**\n * Zod schemas for registry validation.\n * @module @dsai-io/tools/registry/schema\n */\n\nimport { z } from 'zod';\n\nexport const registryItemTypeSchema = z.enum([\n 'registry:ui',\n 'registry:hook',\n 'registry:util',\n 'registry:lib',\n 'registry:component',\n 'registry:style',\n 'registry:type',\n]);\n\nexport const registryFileSchema = z.object({\n path: z.string().min(1, 'File path is required'),\n type: registryItemTypeSchema,\n content: z.string(),\n target: z.string().optional(),\n});\n\nexport const registryItemSchema = z.object({\n name: z.string().min(1, 'Registry item name is required'),\n type: registryItemTypeSchema,\n title: z.string().min(1, 'Title is required'),\n description: z.string().default(''),\n dependencies: z.array(z.string()).default([]),\n devDependencies: z.array(z.string()).default([]),\n registryDependencies: z.array(z.string()).default([]),\n files: z.array(registryFileSchema).min(1, 'At least one file is required'),\n cssVars: z\n .object({\n light: z.record(z.string(), z.string()).optional(),\n dark: z.record(z.string(), z.string()).optional(),\n })\n .optional(),\n categories: z.array(z.string()).optional(),\n});\n\nexport const registryIndexEntrySchema = z.object({\n name: z.string(),\n type: registryItemTypeSchema,\n title: z.string(),\n description: z.string(),\n dependencies: z.array(z.string()),\n registryDependencies: z.array(z.string()),\n categories: z.array(z.string()).optional(),\n});\n\nexport const registryIndexSchema = z.object({\n version: z.string(),\n count: z.number(),\n items: z.array(registryIndexEntrySchema),\n});\n\nexport type RegistryItemFromSchema = z.infer<typeof registryItemSchema>;\nexport type RegistryIndexFromSchema = z.infer<typeof registryIndexSchema>;\n","/**\n * Hand-curated metadata for all DSAi components, hooks, and utilities.\n * The registry builder uses this to know what to scan and how to label items.\n * @module @dsai-io/tools/registry/component-map\n */\n\nimport type { RegistryItemType } from './types.js';\n\nexport interface ComponentMeta {\n type: RegistryItemType;\n title: string;\n description: string;\n categories?: string[];\n npmDependencies?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Components\n// ---------------------------------------------------------------------------\n\nexport const componentMap: Record<string, ComponentMeta> = {\n accordion: {\n type: 'registry:ui',\n title: 'Accordion',\n description: 'Collapsible content panels for presenting information in a limited space.',\n categories: ['disclosure', 'layout'],\n },\n alert: {\n type: 'registry:ui',\n title: 'Alert',\n description: 'Contextual feedback messages for user actions.',\n categories: ['feedback'],\n },\n avatar: {\n type: 'registry:ui',\n title: 'Avatar',\n description: 'Graphical representation of a user or entity.',\n categories: ['data-display'],\n },\n badge: {\n type: 'registry:ui',\n title: 'Badge',\n description: 'Small count or status indicator, typically displayed on other elements.',\n categories: ['data-display'],\n },\n breadcrumb: {\n type: 'registry:ui',\n title: 'Breadcrumb',\n description: 'Navigation aid showing the current page location within a hierarchy.',\n categories: ['navigation'],\n },\n button: {\n type: 'registry:ui',\n title: 'Button',\n description: 'Trigger for actions and events.',\n categories: ['actions'],\n },\n card: {\n type: 'registry:ui',\n title: 'Card',\n description: 'Flexible container for grouping related content and actions.',\n categories: ['layout', 'data-display'],\n },\n 'card-list': {\n type: 'registry:ui',\n title: 'CardList',\n description: 'Responsive list of selectable cards with keyboard navigation.',\n categories: ['layout', 'data-display'],\n },\n carousel: {\n type: 'registry:ui',\n title: 'Carousel',\n description: 'Slideshow component for cycling through content.',\n categories: ['data-display'],\n },\n checkbox: {\n type: 'registry:ui',\n title: 'Checkbox',\n description: 'Toggle control for boolean selections.',\n categories: ['forms'],\n },\n 'checkbox-group': {\n type: 'registry:ui',\n title: 'CheckboxGroup',\n description: 'Managed group of checkboxes with shared state.',\n categories: ['forms'],\n },\n dropdown: {\n type: 'registry:ui',\n title: 'Dropdown',\n description: 'Toggleable overlay menu for displaying a list of actions.',\n categories: ['navigation', 'actions'],\n npmDependencies: ['@floating-ui/react'],\n },\n icon: {\n type: 'registry:ui',\n title: 'Icon',\n description: 'Scalable vector icon component with accessibility support.',\n categories: ['data-display'],\n },\n input: {\n type: 'registry:ui',\n title: 'Input',\n description: 'Text input field with validation and formatting support.',\n categories: ['forms'],\n },\n 'list-group': {\n type: 'registry:ui',\n title: 'ListGroup',\n description: 'Flexible component for displaying a series of items.',\n categories: ['data-display', 'navigation'],\n },\n modal: {\n type: 'registry:ui',\n title: 'Modal',\n description: 'Dialog overlay for focused content and user interactions.',\n categories: ['feedback', 'disclosure'],\n },\n navbar: {\n type: 'registry:ui',\n title: 'Navbar',\n description: 'Responsive navigation header with branding and links.',\n categories: ['navigation'],\n },\n pagination: {\n type: 'registry:ui',\n title: 'Pagination',\n description: 'Navigation controls for paged content.',\n categories: ['navigation'],\n },\n popover: {\n type: 'registry:ui',\n title: 'Popover',\n description: 'Floating content panel anchored to a trigger element.',\n categories: ['disclosure'],\n npmDependencies: ['@floating-ui/react'],\n },\n progress: {\n type: 'registry:ui',\n title: 'Progress',\n description: 'Visual indicator of task completion.',\n categories: ['feedback'],\n },\n radio: {\n type: 'registry:ui',\n title: 'Radio',\n description: 'Single-select control within a group of options.',\n categories: ['forms'],\n },\n scrollspy: {\n type: 'registry:ui',\n title: 'Scrollspy',\n description: 'Automatically highlights navigation links based on scroll position.',\n categories: ['navigation'],\n },\n select: {\n type: 'registry:ui',\n title: 'Select',\n description: 'Dropdown selector for choosing from a list of options.',\n categories: ['forms'],\n npmDependencies: ['@floating-ui/react'],\n },\n 'selectable-card': {\n type: 'registry:ui',\n title: 'SelectableCard',\n description: 'Card variant that acts as a selectable option.',\n categories: ['forms', 'data-display'],\n },\n sheet: {\n type: 'registry:ui',\n title: 'Sheet',\n description: 'Sliding panel overlay from screen edges.',\n categories: ['disclosure', 'layout'],\n },\n spinner: {\n type: 'registry:ui',\n title: 'Spinner',\n description: 'Loading indicator for asynchronous operations.',\n categories: ['feedback'],\n },\n switch: {\n type: 'registry:ui',\n title: 'Switch',\n description: 'Toggle control for binary on/off states.',\n categories: ['forms'],\n },\n table: {\n type: 'registry:ui',\n title: 'Table',\n description: 'Data table with sorting, selection, and responsive layout.',\n categories: ['data-display'],\n },\n tabs: {\n type: 'registry:ui',\n title: 'Tabs',\n description: 'Tabbed interface for switching between content panels.',\n categories: ['navigation', 'layout'],\n },\n 'tabs-pro': {\n type: 'registry:ui',\n title: 'TabsPro',\n description: 'Advanced tabbed interface with closable, sortable, and overflow support.',\n categories: ['navigation', 'layout'],\n },\n toast: {\n type: 'registry:ui',\n title: 'Toast',\n description: 'Brief notification messages that auto-dismiss.',\n categories: ['feedback'],\n },\n tooltip: {\n type: 'registry:ui',\n title: 'Tooltip',\n description: 'Informational popup displayed on hover or focus.',\n categories: ['data-display'],\n npmDependencies: ['@floating-ui/react'],\n },\n typography: {\n type: 'registry:ui',\n title: 'Typography',\n description: 'Text rendering primitives with semantic variants.',\n categories: ['data-display'],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\nexport const hookMap: Record<string, ComponentMeta> = {\n 'use-async': {\n type: 'registry:hook',\n title: 'useAsync',\n description: 'Manages async operation lifecycle (loading, error, data states).',\n categories: ['state'],\n },\n 'use-callback-ref': {\n type: 'registry:hook',\n title: 'useCallbackRef',\n description: 'Stable callback reference that always points to the latest function.',\n categories: ['refs'],\n },\n 'use-click-outside': {\n type: 'registry:hook',\n title: 'useClickOutside',\n description: 'Detects clicks outside of a target element.',\n categories: ['dom'],\n },\n 'use-controllable-state': {\n type: 'registry:hook',\n title: 'useControllableState',\n description: 'Manages state that can be either controlled or uncontrolled.',\n categories: ['state'],\n },\n 'use-dark-mode': {\n type: 'registry:hook',\n title: 'useDarkMode',\n description: 'Detects and toggles dark mode preference.',\n categories: ['theme'],\n },\n 'use-debounce': {\n type: 'registry:hook',\n title: 'useDebounce',\n description: 'Debounces a value or callback over a specified delay.',\n categories: ['timing'],\n },\n 'use-field': {\n type: 'registry:hook',\n title: 'useField',\n description: 'Form field state management with validation.',\n categories: ['forms'],\n },\n 'use-focus-trap': {\n type: 'registry:hook',\n title: 'useFocusTrap',\n description: 'Traps keyboard focus within a container for modal-like experiences.',\n categories: ['a11y'],\n },\n 'use-form': {\n type: 'registry:hook',\n title: 'useForm',\n description: 'Comprehensive form state management with validation.',\n categories: ['forms'],\n },\n 'use-hover': {\n type: 'registry:hook',\n title: 'useHover',\n description: 'Tracks hover state of an element with enter/leave delays.',\n categories: ['dom'],\n },\n 'use-id': {\n type: 'registry:hook',\n title: 'useId',\n description: 'Generates stable unique identifiers for accessibility attributes.',\n categories: ['a11y'],\n },\n 'use-intersection-observer': {\n type: 'registry:hook',\n title: 'useIntersectionObserver',\n description: 'Observes element visibility within the viewport.',\n categories: ['dom'],\n },\n 'use-key-press': {\n type: 'registry:hook',\n title: 'useKeyPress',\n description: 'Listens for specific keyboard key presses.',\n categories: ['dom'],\n },\n 'use-local-storage': {\n type: 'registry:hook',\n title: 'useLocalStorage',\n description: 'Persists state to localStorage with serialization.',\n categories: ['state', 'storage'],\n },\n 'use-media-query': {\n type: 'registry:hook',\n title: 'useMediaQuery',\n description: 'Matches CSS media queries and provides responsive breakpoint helpers.',\n categories: ['responsive'],\n },\n 'use-mounted': {\n type: 'registry:hook',\n title: 'useMounted',\n description: 'Tracks whether the component is currently mounted.',\n categories: ['lifecycle'],\n },\n 'use-previous': {\n type: 'registry:hook',\n title: 'usePrevious',\n description: 'Returns the previous value of a variable across renders.',\n categories: ['state'],\n },\n 'use-reduced-motion': {\n type: 'registry:hook',\n title: 'useReducedMotion',\n description: 'Detects user preference for reduced motion.',\n categories: ['a11y'],\n },\n 'use-resize-observer': {\n type: 'registry:hook',\n title: 'useResizeObserver',\n description: 'Observes element size changes via ResizeObserver.',\n categories: ['dom'],\n },\n 'use-roving-focus': {\n type: 'registry:hook',\n title: 'useRovingFocus',\n description: 'Implements roving tabindex pattern for composite widgets.',\n categories: ['a11y'],\n },\n 'use-scroll-lock': {\n type: 'registry:hook',\n title: 'useScrollLock',\n description: 'Prevents body scrolling while active (for modals/overlays).',\n categories: ['dom'],\n },\n 'use-session-storage': {\n type: 'registry:hook',\n title: 'useSessionStorage',\n description: 'Persists state to sessionStorage with serialization.',\n categories: ['state', 'storage'],\n },\n 'use-throttle': {\n type: 'registry:hook',\n title: 'useThrottle',\n description: 'Throttles a value or callback to fire at most once per interval.',\n categories: ['timing'],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nexport const utilMap: Record<string, ComponentMeta> = {\n cn: {\n type: 'registry:util',\n title: 'cn',\n description: 'Conditional class name composition utility.',\n categories: ['styling'],\n },\n a11y: {\n type: 'registry:util',\n title: 'a11y',\n description: 'Accessibility utilities including screen reader announcements and ARIA helpers.',\n categories: ['a11y'],\n },\n async: {\n type: 'registry:util',\n title: 'async',\n description: 'Async operation utilities: abortable tasks, queues, exponential backoff.',\n categories: ['async'],\n },\n browser: {\n type: 'registry:util',\n title: 'browser',\n description: 'Browser environment detection and feature checks.',\n categories: ['platform'],\n },\n collections: {\n type: 'registry:util',\n title: 'collections',\n description: 'Collection utilities: chunk, paginate, memoize, selectors.',\n categories: ['data'],\n },\n color: {\n type: 'registry:util',\n title: 'color',\n description: 'Color manipulation utilities: contrast, luminance, hex/rgb conversion.',\n categories: ['styling'],\n },\n date: {\n type: 'registry:util',\n title: 'date',\n description: 'Date formatting and relative time utilities.',\n categories: ['formatting'],\n },\n 'merge-refs': {\n type: 'registry:util',\n title: 'mergeRefs',\n description: 'Merges multiple React refs into a single callback ref.',\n categories: ['refs'],\n },\n dx: {\n type: 'registry:util',\n title: 'dx',\n description: 'Developer experience helpers: component creation, context factories, polymorphic patterns.',\n categories: ['dx'],\n },\n forms: {\n type: 'registry:util',\n title: 'forms',\n description: 'Form utilities: validators, field error extraction, dirty checking.',\n categories: ['forms'],\n },\n keyboard: {\n type: 'registry:util',\n title: 'keyboard',\n description: 'Keyboard event helpers for detecting specific keys.',\n categories: ['dom'],\n },\n layout: {\n type: 'registry:util',\n title: 'layout',\n description: 'Layout measurement utilities: element bounds, viewport size, resize observation.',\n categories: ['dom'],\n },\n misc: {\n type: 'registry:util',\n title: 'misc',\n description: 'Miscellaneous utilities: clear icon, safe input props, event helpers.',\n categories: ['misc'],\n },\n motion: {\n type: 'registry:util',\n title: 'motion',\n description: 'Animation utilities: spring physics, easing functions, distance calculations.',\n categories: ['animation'],\n },\n number: {\n type: 'registry:util',\n title: 'number',\n description: 'Number formatting and clamping utilities.',\n categories: ['formatting'],\n },\n object: {\n type: 'registry:util',\n title: 'object',\n description: 'Object manipulation utilities: deep merge, pick, omit.',\n categories: ['data'],\n },\n platform: {\n type: 'registry:util',\n title: 'platform',\n description: 'Platform detection utilities: browser, OS, device pixel ratio, text direction.',\n categories: ['platform'],\n },\n responsive: {\n type: 'registry:util',\n title: 'responsive',\n description: 'Responsive design utilities.',\n categories: ['responsive'],\n },\n safety: {\n type: 'registry:util',\n title: 'safety',\n description: 'Security utilities: clipboard access, crypto ID generation, token generation.',\n categories: ['security'],\n },\n string: {\n type: 'registry:util',\n title: 'string',\n description: 'String manipulation utilities: capitalize, slugify, variant classes.',\n categories: ['formatting'],\n },\n telemetry: {\n type: 'registry:util',\n title: 'telemetry',\n description: 'Telemetry utilities: error catching, performance measurement, timing.',\n categories: ['observability'],\n },\n timing: {\n type: 'registry:util',\n title: 'timing',\n description: 'Timing utilities: debounce and throttle functions.',\n categories: ['timing'],\n },\n types: {\n type: 'registry:util',\n title: 'types',\n description: 'Shared type guards and type utilities.',\n categories: ['types'],\n },\n validation: {\n type: 'registry:util',\n title: 'validation',\n description: 'Input validation utilities: email, URL, href safety checks.',\n categories: ['validation'],\n },\n};\n\n// ---------------------------------------------------------------------------\n// Directory name -> registry name mappings\n// ---------------------------------------------------------------------------\n\n/** Maps PascalCase component directory names to kebab-case registry names. */\nexport const directoryToRegistryName: Record<string, string> = {\n Accordion: 'accordion',\n Alert: 'alert',\n Avatar: 'avatar',\n Badge: 'badge',\n Breadcrumb: 'breadcrumb',\n Button: 'button',\n Card: 'card',\n CardList: 'card-list',\n Carousel: 'carousel',\n Checkbox: 'checkbox',\n CheckboxGroup: 'checkbox-group',\n Dropdown: 'dropdown',\n Icon: 'icon',\n Input: 'input',\n ListGroup: 'list-group',\n Modal: 'modal',\n Navbar: 'navbar',\n Pagination: 'pagination',\n Popover: 'popover',\n Progress: 'progress',\n Radio: 'radio',\n Scrollspy: 'scrollspy',\n Select: 'select',\n SelectableCard: 'selectable-card',\n Sheet: 'sheet',\n Spinner: 'spinner',\n Switch: 'switch',\n Table: 'table',\n Tabs: 'tabs',\n TabsPro: 'tabs-pro',\n Toast: 'toast',\n Tooltip: 'tooltip',\n Typography: 'typography',\n};\n\n/** Maps hook directory names (camelCase) to kebab-case registry names. */\nexport const hookDirectoryToRegistryName: Record<string, string> = {\n useAsync: 'use-async',\n useCallbackRef: 'use-callback-ref',\n useClickOutside: 'use-click-outside',\n useControllableState: 'use-controllable-state',\n useDarkMode: 'use-dark-mode',\n useDebounce: 'use-debounce',\n useField: 'use-field',\n useFocusTrap: 'use-focus-trap',\n useForm: 'use-form',\n useHover: 'use-hover',\n useId: 'use-id',\n useIntersectionObserver: 'use-intersection-observer',\n useKeyPress: 'use-key-press',\n useLocalStorage: 'use-local-storage',\n useMediaQuery: 'use-media-query',\n useMounted: 'use-mounted',\n usePrevious: 'use-previous',\n useReducedMotion: 'use-reduced-motion',\n useResizeObserver: 'use-resize-observer',\n useRovingFocus: 'use-roving-focus',\n useScrollLock: 'use-scroll-lock',\n useSessionStorage: 'use-session-storage',\n useThrottle: 'use-throttle',\n};\n","/**\n * Registry builder — scans @dsai-io/react source, analyzes imports,\n * inlines file content, and writes registry JSON files.\n * @module @dsai-io/tools/registry/builder\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { extname, join, relative } from 'node:path';\n\nimport {\n componentMap,\n directoryToRegistryName,\n hookDirectoryToRegistryName,\n hookMap,\n utilMap,\n} from './component-map.js';\n\nimport type { RegistryFile, RegistryIndex, RegistryIndexEntry, RegistryItem, RegistryItemType } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface BuildRegistryOptions {\n /** Absolute path to the @dsai-io/react src directory. */\n reactSrcDir: string;\n /** Absolute path to the output directory for registry JSON files. */\n outputDir: string;\n /** Enable verbose logging. */\n verbose?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst EXCLUDE_PATTERNS: RegExp[] = [\n /\\.test\\.(tsx?|jsx?)$/,\n /\\.spec\\.(tsx?|jsx?)$/,\n /\\.stories\\.(tsx?|jsx?)$/,\n /\\.figma\\.(tsx?|jsx?)$/,\n /\\.a11y\\.test\\./,\n /\\.security\\.test\\./,\n /\\.integration\\.test\\./,\n /README\\.md$/,\n];\n\nconst REACT_BUILTINS = new Set(['react', 'react-dom', 'react/jsx-runtime', 'react-dom/client']);\n\n/**\n * Maps a util import sub-path (the part after `../../utils/`) to the\n * registry name used in `utilMap`.\n */\nconst UTIL_SUBPATH_TO_REGISTRY: Record<string, string> = {\n index: 'cn',\n keyboard: 'keyboard',\n dom: 'merge-refs',\n 'dom/mergeRefs': 'merge-refs',\n browser: 'browser',\n validation: 'validation',\n string: 'string',\n misc: 'misc',\n a11y: 'a11y',\n types: 'types',\n async: 'async',\n collections: 'collections',\n color: 'color',\n date: 'date',\n dx: 'dx',\n forms: 'forms',\n layout: 'layout',\n motion: 'motion',\n number: 'number',\n object: 'object',\n platform: 'platform',\n responsive: 'responsive',\n safety: 'safety',\n telemetry: 'telemetry',\n timing: 'timing',\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction shouldIncludeFile(filePath: string): boolean {\n const ext = extname(filePath);\n if (!['.ts', '.tsx', '.css'].includes(ext)) return false;\n return !EXCLUDE_PATTERNS.some((pattern) => pattern.test(filePath));\n}\n\nfunction readSourceFiles(dirPath: string): { path: string; content: string }[] {\n if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) return [];\n\n const results: { path: string; content: string }[] = [];\n\n for (const entry of readdirSync(dirPath, { withFileTypes: true })) {\n const fullPath = join(dirPath, entry.name);\n if (entry.isDirectory()) {\n // Only go one level deep for sub-directories within a component\n for (const sub of readdirSync(fullPath, { withFileTypes: true })) {\n if (sub.isFile()) {\n const subPath = join(fullPath, sub.name);\n if (shouldIncludeFile(subPath)) {\n results.push({ path: relative(dirPath, subPath), content: readFileSync(subPath, 'utf-8') });\n }\n }\n }\n } else if (entry.isFile() && shouldIncludeFile(fullPath)) {\n results.push({ path: entry.name, content: readFileSync(fullPath, 'utf-8') });\n }\n }\n\n return results;\n}\n\n/** Extract the cn function from the utils index as a standalone file. */\nfunction extractCnSource(utilsIndexPath: string): string {\n const content = readFileSync(utilsIndexPath, 'utf-8');\n const cnPattern = /(\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?export function cn\\b[\\s\\S]*?\\n\\}/;\n const match = cnPattern.exec(content);\n return match\n ? match[0]\n : 'export function cn(...classes: (string | boolean | undefined | null)[]): string {\\n return classes.filter(Boolean).join(\\' \\');\\n}';\n}\n\n// ---------------------------------------------------------------------------\n// Import analysis\n// ---------------------------------------------------------------------------\n\ninterface AnalyzedDeps {\n registryDeps: Set<string>;\n npmDeps: Set<string>;\n}\n\nfunction analyzeImports(files: { content: string }[], knownNpmDeps: string[]): AnalyzedDeps {\n const registryDeps = new Set<string>();\n const npmDeps = new Set<string>(knownNpmDeps);\n\n const importPattern = /(?:import|export)\\s+(?:[\\s\\S]*?)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n\n for (const file of files) {\n let m: RegExpExecArray | null;\n importPattern.lastIndex = 0;\n while ((m = importPattern.exec(file.content)) !== null) {\n const specifier = m[1] ?? '';\n\n // Shared types imports: ../../types or ../../types/<subpath>\n const typesPattern = /\\.\\.\\/(?:\\.\\.\\/)?types(?:\\/.*)?$/;\n if (typesPattern.test(specifier)) {\n registryDeps.add('dsai-types');\n continue;\n }\n\n // Hook imports: ../../hooks/<hookName> or ../hooks/<hookName>\n const hookPattern = /\\.\\.\\/(?:\\.\\.\\/)?hooks\\/(\\w+)/;\n const hookMatch = hookPattern.exec(specifier);\n if (hookMatch && hookMatch[1]) {\n const regName = hookDirectoryToRegistryName[hookMatch[1]];\n if (regName) registryDeps.add(regName);\n continue;\n }\n\n // Util imports: ../../utils or ../../utils/<subpath>\n const utilPattern = /\\.\\.\\/(?:\\.\\.\\/)?utils(?:\\/(.+))?$/;\n const utilMatch = utilPattern.exec(specifier);\n if (utilMatch) {\n const subpath = utilMatch[1] ?? 'index';\n const regName = UTIL_SUBPATH_TO_REGISTRY[subpath];\n if (regName) registryDeps.add(regName);\n continue;\n }\n\n // Component cross-imports: ../../components/<Dir>, ../<PascalCaseDir>, or ../<PascalCaseDir>/<file>\n // Matches: ../Icon, ../Spinner, ../Card/Card.types, ../../components/Modal\n const compPattern = /^\\.\\.\\/(\\.\\.\\/)?(?:components\\/)?([A-Z]\\w+)(?:\\/.*)?$/;\n const compMatch = compPattern.exec(specifier);\n if (compMatch && compMatch[2]) {\n const compDir = compMatch[2];\n const regName = directoryToRegistryName[compDir];\n if (regName) registryDeps.add(regName);\n continue;\n }\n\n // External npm packages (not relative, not react builtins)\n if (!specifier.startsWith('.') && !specifier.startsWith('/')) {\n // Get the package name (handle scoped packages)\n const parts = specifier.split('/');\n const pkgName = specifier.startsWith('@') && parts.length >= 2\n ? `${parts[0]}/${parts[1]}`\n : (parts[0] ?? specifier);\n\n if (pkgName && !REACT_BUILTINS.has(pkgName) && !pkgName.startsWith('@dsai-io/')) {\n npmDeps.add(pkgName);\n }\n }\n }\n }\n\n return { registryDeps, npmDeps };\n}\n\n// ---------------------------------------------------------------------------\n// Item builders\n// ---------------------------------------------------------------------------\n\nfunction buildComponentItem(\n name: string,\n dirPath: string,\n log: (msg: string) => void,\n): RegistryItem | null {\n const meta = componentMap[name];\n if (!meta) {\n log(` [WARN] No metadata for component \"${name}\", skipping`);\n return null;\n }\n\n const sourceFiles = readSourceFiles(dirPath);\n if (sourceFiles.length === 0) {\n log(` [WARN] No source files found in ${dirPath}`);\n return null;\n }\n\n const { registryDeps, npmDeps } = analyzeImports(sourceFiles, meta.npmDependencies ?? []);\n\n const files: RegistryFile[] = sourceFiles.map((f) => ({\n path: f.path,\n type: (extname(f.path) === '.css' ? 'registry:style' : meta.type) as RegistryItemType,\n content: f.content,\n }));\n\n return {\n name,\n type: meta.type,\n title: meta.title,\n description: meta.description,\n dependencies: [...npmDeps].sort(),\n devDependencies: [],\n registryDependencies: [...registryDeps].sort(),\n files,\n categories: meta.categories,\n };\n}\n\nfunction buildHookItem(\n name: string,\n dirPath: string,\n log: (msg: string) => void,\n): RegistryItem | null {\n const meta = hookMap[name];\n if (!meta) {\n log(` [WARN] No metadata for hook \"${name}\", skipping`);\n return null;\n }\n\n const sourceFiles = readSourceFiles(dirPath);\n if (sourceFiles.length === 0) {\n log(` [WARN] No source files found in ${dirPath}`);\n return null;\n }\n\n const { registryDeps, npmDeps } = analyzeImports(sourceFiles, meta.npmDependencies ?? []);\n\n const files: RegistryFile[] = sourceFiles.map((f) => ({\n path: f.path,\n type: (extname(f.path) === '.css' ? 'registry:style' : meta.type) as RegistryItemType,\n content: f.content,\n }));\n\n return {\n name,\n type: meta.type,\n title: meta.title,\n description: meta.description,\n dependencies: [...npmDeps].sort(),\n devDependencies: [],\n registryDependencies: [...registryDeps].sort(),\n files,\n categories: meta.categories,\n };\n}\n\nfunction buildUtilItem(\n name: string,\n reactSrcDir: string,\n log: (msg: string) => void,\n): RegistryItem | null {\n const meta = utilMap[name];\n if (!meta) {\n log(` [WARN] No metadata for util \"${name}\", skipping`);\n return null;\n }\n\n let files: RegistryFile[];\n let registryDeps = new Set<string>();\n let npmDeps = new Set<string>();\n\n if (name === 'cn') {\n // Special case: extract cn from utils/index.ts\n const indexPath = join(reactSrcDir, 'utils', 'index.ts');\n const cnSource = extractCnSource(indexPath);\n files = [{ path: 'cn.ts', type: 'registry:util', content: cnSource }];\n } else if (name === 'merge-refs') {\n // merge-refs maps to utils/dom\n const dirPath = join(reactSrcDir, 'utils', 'dom');\n const sourceFiles = readSourceFiles(dirPath);\n const analyzed = analyzeImports(sourceFiles, []);\n registryDeps = analyzed.registryDeps;\n npmDeps = analyzed.npmDeps;\n files = sourceFiles.map((f) => ({\n path: `dom/${f.path}`,\n type: (extname(f.path) === '.css' ? 'registry:style' : 'registry:util') as RegistryItemType,\n content: f.content,\n }));\n } else {\n // Standard util directory\n const dirPath = join(reactSrcDir, 'utils', name);\n if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) {\n log(` [WARN] Util directory not found: ${dirPath}`);\n return null;\n }\n const sourceFiles = readSourceFiles(dirPath);\n if (sourceFiles.length === 0) {\n log(` [WARN] No source files found in ${dirPath}`);\n return null;\n }\n const analyzed = analyzeImports(sourceFiles, []);\n registryDeps = analyzed.registryDeps;\n npmDeps = analyzed.npmDeps;\n files = sourceFiles.map((f) => ({\n path: `${name}/${f.path}`,\n type: (extname(f.path) === '.css' ? 'registry:style' : 'registry:util') as RegistryItemType,\n content: f.content,\n }));\n }\n\n return {\n name,\n type: meta.type,\n title: meta.title,\n description: meta.description,\n dependencies: [...npmDeps].sort(),\n devDependencies: [],\n registryDependencies: [...registryDeps].sort(),\n files,\n categories: meta.categories,\n };\n}\n\nfunction buildTypesItem(\n reactSrcDir: string,\n log: (msg: string) => void,\n): RegistryItem | null {\n const typesDir = join(reactSrcDir, 'types');\n const sourceFiles = readSourceFiles(typesDir);\n if (sourceFiles.length === 0) {\n log(' [WARN] No type files found');\n return null;\n }\n\n // Filter out files that import from utils (responsive.ts re-exports runtime helpers)\n // and strip those re-export lines\n const files: RegistryFile[] = sourceFiles.map((f) => {\n let content = f.content;\n // Remove re-exports of runtime helpers from utils (they don't belong in types)\n content = content.replace(/export \\{[^}]*\\} from ['\"]\\.\\.\\/utils\\/[^'\"]+['\"];?\\n?/g, '');\n return {\n path: `types/${f.path}`,\n type: 'registry:type' as RegistryItemType,\n content,\n };\n });\n\n return {\n name: 'dsai-types',\n type: 'registry:type',\n title: 'Shared Types',\n description: 'Shared type definitions (SafeHTMLAttributes, ComponentSize, PolymorphicComponentProps, etc.)',\n dependencies: [],\n devDependencies: [],\n registryDependencies: [],\n files,\n categories: ['types'],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function buildRegistry(options: BuildRegistryOptions): RegistryIndex {\n const { reactSrcDir, outputDir, verbose = false } = options;\n const log = verbose ? (msg: string) => console.log(msg) : (_msg: string) => {};\n\n const componentsDir = join(reactSrcDir, 'components');\n const hooksDir = join(reactSrcDir, 'hooks');\n\n const allItems: RegistryItem[] = [];\n\n // --- Components ---\n log('[registry] Scanning components...');\n if (existsSync(componentsDir)) {\n for (const entry of readdirSync(componentsDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const dirName = entry.name;\n const registryName = directoryToRegistryName[dirName];\n if (!registryName) {\n log(` [SKIP] Unknown component directory: ${dirName}`);\n continue;\n }\n log(` Building ${registryName}...`);\n const item = buildComponentItem(registryName, join(componentsDir, dirName), log);\n if (item) allItems.push(item);\n }\n }\n\n // --- Hooks ---\n log('[registry] Scanning hooks...');\n if (existsSync(hooksDir)) {\n for (const entry of readdirSync(hooksDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const dirName = entry.name;\n const registryName = hookDirectoryToRegistryName[dirName];\n if (!registryName) {\n log(` [SKIP] Unknown hook directory: ${dirName}`);\n continue;\n }\n log(` Building ${registryName}...`);\n const item = buildHookItem(registryName, join(hooksDir, dirName), log);\n if (item) allItems.push(item);\n }\n }\n\n // --- Utils ---\n log('[registry] Scanning utils...');\n for (const name of Object.keys(utilMap)) {\n log(` Building ${name}...`);\n const item = buildUtilItem(name, reactSrcDir, log);\n if (item) allItems.push(item);\n }\n\n // --- Shared Types ---\n log('[registry] Building shared types...');\n const typesItem = buildTypesItem(reactSrcDir, log);\n if (typesItem) {\n allItems.push(typesItem);\n log(` Built dsai-types (${typesItem.files.length} files)`);\n }\n\n // --- Write output ---\n log(`[registry] Writing ${allItems.length} items to ${outputDir}...`);\n\n // Ensure output directories exist\n for (const sub of ['components', 'hooks', 'utils', 'types']) {\n const dir = join(outputDir, sub);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n }\n\n const typeToSubdir: Record<string, string> = {\n 'registry:ui': 'components',\n 'registry:component': 'components',\n 'registry:hook': 'hooks',\n 'registry:util': 'utils',\n 'registry:lib': 'utils',\n 'registry:type': 'types',\n };\n\n for (const item of allItems) {\n const subdir = typeToSubdir[item.type] ?? 'utils';\n const filePath = join(outputDir, subdir, `${item.name}.json`);\n writeFileSync(filePath, JSON.stringify(item, null, 2) + '\\n', 'utf-8');\n log(` Wrote ${relative(outputDir, filePath)}`);\n }\n\n // --- Build index ---\n const indexEntries: RegistryIndexEntry[] = allItems.map((item) => ({\n name: item.name,\n type: item.type,\n title: item.title,\n description: item.description,\n dependencies: item.dependencies,\n registryDependencies: item.registryDependencies,\n categories: item.categories,\n }));\n\n const registryIndex: RegistryIndex = {\n version: '0.1.0',\n count: indexEntries.length,\n items: indexEntries,\n };\n\n writeFileSync(join(outputDir, 'index.json'), JSON.stringify(registryIndex, null, 2) + '\\n', 'utf-8');\n log(`[registry] Wrote index.json (${registryIndex.count} items)`);\n\n return registryIndex;\n}\n","/**\n * Registry dependency resolver.\n * @module @dsai-io/tools/registry/resolver\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { RegistryItem, ResolvedTree } from './types.js';\n\nfunction loadItem(name: string, registryDir: string): RegistryItem | null {\n const subdirs = ['components', 'hooks', 'utils', 'lib', 'styles', 'types'];\n for (const sub of subdirs) {\n const filePath = join(registryDir, sub, `${name}.json`);\n if (existsSync(filePath)) {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as RegistryItem;\n }\n }\n return null;\n}\n\nexport function resolveTree(names: string[], registryDir: string): ResolvedTree {\n const visited = new Map<string, RegistryItem>();\n const queue = [...names];\n\n // BFS: collect all items and transitive dependencies\n while (queue.length > 0) {\n const name = queue.shift()!;\n if (visited.has(name)) continue;\n const item = loadItem(name, registryDir);\n if (!item) {\n throw new Error(`Registry item \"${name}\" not found. Run \\`dsai registry build\\` or check the name.`);\n }\n visited.set(name, item);\n for (const dep of item.registryDependencies) {\n if (!visited.has(dep)) queue.push(dep);\n }\n }\n\n // Topological sort (Kahn's algorithm)\n const inDeg = new Map<string, number>();\n for (const [name, item] of visited) {\n inDeg.set(name, item.registryDependencies.filter((d) => visited.has(d)).length);\n }\n\n const sorted: RegistryItem[] = [];\n const ready: string[] = [];\n for (const [name, deg] of inDeg) {\n if (deg === 0) ready.push(name);\n }\n\n while (ready.length > 0) {\n const name = ready.shift()!;\n sorted.push(visited.get(name)!);\n for (const [otherName, otherItem] of visited) {\n if (otherItem.registryDependencies.includes(name)) {\n const newDeg = (inDeg.get(otherName) ?? 1) - 1;\n inDeg.set(otherName, newDeg);\n if (newDeg === 0) ready.push(otherName);\n }\n }\n }\n\n if (sorted.length !== visited.size) {\n const missing = [...visited.keys()].filter((n) => !sorted.some((s) => s.name === n));\n throw new Error(`Circular dependency detected involving: ${missing.join(', ')}`);\n }\n\n const allDeps = new Set<string>();\n const allDevDeps = new Set<string>();\n const lightVars: Record<string, string> = {};\n const darkVars: Record<string, string> = {};\n for (const item of sorted) {\n for (const dep of item.dependencies) allDeps.add(dep);\n for (const dep of item.devDependencies) allDevDeps.add(dep);\n if (item.cssVars?.light) Object.assign(lightVars, item.cssVars.light);\n if (item.cssVars?.dark) Object.assign(darkVars, item.cssVars.dark);\n }\n\n return {\n items: sorted,\n dependencies: [...allDeps],\n devDependencies: [...allDevDeps],\n cssVars: { light: lightVars, dark: darkVars },\n };\n}\n","/**\n * Import path transformer for registry files.\n * @module @dsai-io/tools/registry/transformer\n */\n\nimport type { ResolvedAliasesConfig } from '../config/types.js';\n\nexport interface TransformOptions {\n aliases: ResolvedAliasesConfig;\n tsx: boolean;\n}\n\nexport function transformImports(content: string, options: TransformOptions): string {\n const { aliases } = options;\n let result = content;\n\n // ../../types or ../../types/<subpath> -> @/components/types (or wherever types land)\n // Types are placed relative to UI components since components import them as ../../types\n result = result.replace(\n /(from\\s+['\"])(?:\\.\\.\\/)+types(?:\\/([^'\"]+))?(['\"])/g,\n (_match, prefix, subpath, suffix) => {\n if (subpath) {\n return `${prefix}${aliases.importAlias}${aliases.components}/types/${subpath}${suffix}`;\n }\n return `${prefix}${aliases.importAlias}${aliases.components}/types${suffix}`;\n }\n );\n\n // ../<PascalCaseDir> or ../<PascalCaseDir>/<file> -> @/components/ui/<dir>/<file>\n // Handles cross-component imports like ../Spinner, ../Icon, ../Card/Card.types\n result = result.replace(\n /(from\\s+['\"])\\.\\.\\/(([A-Z]\\w+)(\\/[^'\"]+)?)(['\"])/g,\n (_match, prefix, _fullPath, dirName, subPath, suffix) => {\n // Convert PascalCase dir to kebab-case for the registry name\n const kebab = dirName.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n if (subPath) {\n return `${prefix}${aliases.importAlias}${aliases.ui}/${kebab}${subPath}${suffix}`;\n }\n return `${prefix}${aliases.importAlias}${aliases.ui}/${kebab}${suffix}`;\n }\n );\n\n // ../../hooks/<hookName> -> @/hooks/<hookName>\n result = result.replace(\n /(from\\s+['\"])(?:\\.\\.\\/)+hooks\\/(\\w+)(['\"])/g,\n `$1${aliases.importAlias}${aliases.hooks}/$2$3`\n );\n\n // ../../utils/<submodule> -> @/lib/utils/<submodule>\n result = result.replace(\n /(from\\s+['\"])(?:\\.\\.\\/)+utils\\/(\\w+(?:\\/\\w+)?)(['\"])/g,\n `$1${aliases.importAlias}${aliases.utils}/$2$3`\n );\n\n // ../../utils (bare) -> @/lib/utils\n result = result.replace(\n /(from\\s+['\"])(?:\\.\\.\\/)+utils(['\"])/g,\n `$1${aliases.importAlias}${aliases.utils}$2`\n );\n\n return result;\n}\n\nexport function normalizeExtensions(content: string, tsx: boolean): string {\n if (!tsx) {\n return content\n .replace(/(from\\s+['\"][^'\"]+)\\.tsx(['\"])/g, '$1.jsx$2')\n .replace(/(from\\s+['\"][^'\"]+)\\.ts(['\"])/g, '$1.js$2');\n }\n return content;\n}\n","/**\n * Registry file writer.\n * @module @dsai-io/tools/registry/writer\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\n\nimport { normalizeExtensions, transformImports } from './transformer.js';\n\nimport type { ResolvedAliasesConfig, ResolvedComponentsConfig } from '../config/types.js';\nimport type { ResolvedTree } from './types.js';\n\nexport interface WriteOptions {\n projectDir: string;\n aliases: ResolvedAliasesConfig;\n components: ResolvedComponentsConfig;\n overwrite?: boolean;\n dryRun?: boolean;\n log?: (message: string) => void;\n}\n\nexport interface WriteResult {\n written: string[];\n skipped: string[];\n installedDeps: string[];\n}\n\nfunction getTargetDir(type: string, aliases: ResolvedAliasesConfig): string {\n switch (type) {\n case 'registry:ui': return aliases.ui;\n case 'registry:hook': return aliases.hooks;\n case 'registry:util': return aliases.utils;\n case 'registry:lib': return aliases.lib;\n case 'registry:component': return aliases.components;\n case 'registry:type': return aliases.components;\n case 'registry:style': return aliases.ui;\n default: return aliases.lib;\n }\n}\n\nfunction detectPackageManager(projectDir: string): 'pnpm' | 'yarn' | 'npm' | 'bun' {\n if (existsSync(join(projectDir, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(projectDir, 'bun.lockb')) || existsSync(join(projectDir, 'bun.lock'))) return 'bun';\n if (existsSync(join(projectDir, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction getInstallArgs(pm: string, packages: string[], dev: boolean): [string, string[]] {\n switch (pm) {\n case 'pnpm': return ['pnpm', ['add', ...(dev ? ['-D'] : []), ...packages]];\n case 'yarn': return ['yarn', ['add', ...(dev ? ['--dev'] : []), ...packages]];\n case 'bun': return ['bun', ['add', ...(dev ? ['--dev'] : []), ...packages]];\n default: return ['npm', ['install', ...(dev ? ['--save-dev'] : []), ...packages]];\n }\n}\n\nexport function writeRegistryItems(tree: ResolvedTree, options: WriteOptions): WriteResult {\n const { projectDir, aliases, components, overwrite, dryRun, log } = options;\n const result: WriteResult = { written: [], skipped: [], installedDeps: [] };\n const shouldOverwrite = overwrite ?? components.overwrite;\n\n for (const item of tree.items) {\n const targetBaseDir = getTargetDir(item.type, aliases);\n\n for (const file of item.files) {\n const fileName = basename(file.path);\n let targetPath: string;\n\n if (file.target) {\n targetPath = join(projectDir, file.target);\n } else if (item.type === 'registry:ui' || item.type === 'registry:component') {\n targetPath = join(projectDir, targetBaseDir, item.name, fileName);\n } else if (item.type === 'registry:type') {\n // Types keep their subdirectory structure: components/types/<filename>\n targetPath = join(projectDir, targetBaseDir, file.path);\n } else {\n targetPath = join(projectDir, targetBaseDir, fileName);\n }\n\n if (existsSync(targetPath) && !shouldOverwrite) {\n if (log) log(` Skipped (exists): ${targetPath}`);\n result.skipped.push(targetPath);\n continue;\n }\n\n let content = file.content;\n content = transformImports(content, { aliases, tsx: components.tsx });\n content = normalizeExtensions(content, components.tsx);\n\n if (dryRun) {\n if (log) log(` Would write: ${targetPath}`);\n result.written.push(targetPath);\n continue;\n }\n\n const dir = dirname(targetPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(targetPath, content, 'utf-8');\n if (log) log(` Written: ${targetPath}`);\n result.written.push(targetPath);\n }\n }\n\n // Install npm dependencies\n const depsToInstall = tree.dependencies.filter((dep) => {\n const pkgJsonPath = join(projectDir, 'package.json');\n if (existsSync(pkgJsonPath)) {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n return !Reflect.get(allDeps, dep);\n }\n return true;\n });\n\n if (depsToInstall.length > 0 && !dryRun) {\n const pm = detectPackageManager(projectDir);\n const [cmd, args] = getInstallArgs(pm, depsToInstall, false);\n if (log) log(` Installing: ${cmd} ${args.join(' ')}`);\n execFileSync(cmd, args, { cwd: projectDir, stdio: 'inherit' });\n result.installedDeps = depsToInstall;\n } else if (depsToInstall.length > 0 && dryRun) {\n if (log) log(` Would install: ${depsToInstall.join(', ')}`);\n result.installedDeps = depsToInstall;\n }\n\n return result;\n}\n","/**\r\n * Utility functions for @dsai-io/tools\r\n *\r\n * Common utilities used across the tools package.\r\n */\r\n\r\nimport { existsSync, statSync } from 'node:fs';\r\nimport { dirname, join, resolve } from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\n\r\nimport pc from 'picocolors';\r\n\r\n/**\r\n * Get the root directory of the @dsai-io/tools package\r\n *\r\n * @returns Absolute path to package root\r\n */\r\nexport function getPackageRoot(): string {\r\n const currentFile = fileURLToPath(import.meta.url);\r\n return resolve(dirname(currentFile), '..');\r\n}\r\n\r\n/**\r\n * Resolve a path relative to the current working directory\r\n *\r\n * @param segments - Path segments to join\r\n * @returns Absolute path\r\n */\r\nexport function resolvePath(...segments: string[]): string {\r\n return resolve(process.cwd(), ...segments);\r\n}\r\n\r\n/**\r\n * Check if a file or directory exists\r\n *\r\n * @param path - Path to check\r\n * @returns True if the path exists\r\n */\r\nexport function fileExists(targetPath: string): boolean {\r\n try {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n return existsSync(targetPath);\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a path is a directory\r\n *\r\n * @param path - Path to check\r\n * @returns True if the path is a directory\r\n */\r\nexport function isDirectory(targetPath: string): boolean {\r\n try {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(targetPath)) {\r\n return false;\r\n }\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n return statSync(targetPath).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Check if a path is a file\r\n *\r\n * @param path - Path to check\r\n * @returns True if the path is a file\r\n */\r\nexport function isFile(targetPath: string): boolean {\r\n try {\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (!existsSync(targetPath)) {\r\n return false;\r\n }\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n return statSync(targetPath).isFile();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Find package.json by traversing up from a starting directory\r\n *\r\n * @param startFrom - Directory to start searching from\r\n * @returns Path to package.json or null if not found\r\n */\r\nexport function findPackageJson(startFrom: string = process.cwd()): string | null {\r\n let current = resolve(startFrom);\r\n const root = dirname(current);\r\n\r\n while (current !== root) {\r\n const packagePath = join(current, 'package.json');\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n if (existsSync(packagePath)) {\r\n return packagePath;\r\n }\r\n current = dirname(current);\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Logger utility with colored output\r\n */\r\nexport const logger = {\r\n /**\r\n * Log an info message\r\n */\r\n info(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.info(pc.blue('ℹ'), message);\r\n },\r\n\r\n /**\r\n * Log a success message\r\n */\r\n success(message: string): void {\r\n // eslint-disable-next-line no-console\r\n console.info(pc.green('✔'), message);\r\n },\r\n\r\n /**\r\n * Log a warning message\r\n */\r\n warn(message: string): void {\r\n console.warn(pc.yellow('⚠'), message);\r\n },\r\n\r\n /**\r\n * Log an error message\r\n */\r\n error(message: string): void {\r\n console.error(pc.red('✖'), message);\r\n },\r\n\r\n /**\r\n * Log a debug message (only in verbose mode)\r\n */\r\n debug(message: string, verbose = false): void {\r\n if (verbose) {\r\n // eslint-disable-next-line no-console\r\n console.debug(pc.gray('⋯'), message);\r\n }\r\n },\r\n};\r\n\r\n/**\r\n * Format milliseconds to human-readable duration\r\n *\r\n * @param ms - Duration in milliseconds\r\n * @returns Formatted duration string\r\n */\r\nexport function formatDuration(ms: number): string {\r\n if (ms < 1000) {\r\n return `${ms}ms`;\r\n }\r\n if (ms < 60000) {\r\n return `${(ms / 1000).toFixed(2)}s`;\r\n }\r\n const minutes = Math.floor(ms / 60000);\r\n const seconds = ((ms % 60000) / 1000).toFixed(0);\r\n return `${minutes}m ${seconds}s`;\r\n}\r\n\r\n/**\r\n * Deep merge two objects\r\n *\r\n * @param target - Target object\r\n * @param source - Source object to merge\r\n * @returns Merged object\r\n */\r\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\r\n const output = { ...target };\r\n const keys = Object.keys(source) as Array<keyof T>;\r\n\r\n for (const key of keys) {\r\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\r\n const sourceValue = source[key];\r\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\r\n const targetValue = target[key];\r\n\r\n if (\r\n sourceValue &&\r\n typeof sourceValue === 'object' &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\r\n output[key] = deepMerge(\r\n targetValue as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n ) as T[keyof T];\r\n } else if (sourceValue !== undefined) {\r\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\r\n output[key] = sourceValue as T[keyof T];\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n"]}