dispersa 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/dist/builders.cjs +1835 -66
- package/dist/builders.cjs.map +1 -1
- package/dist/builders.d.cts +151 -2
- package/dist/builders.d.ts +151 -2
- package/dist/builders.js +1834 -68
- package/dist/builders.js.map +1 -1
- package/dist/cli/cli.d.ts +11 -0
- package/dist/cli/cli.js +201 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/config.d.ts +8 -0
- package/dist/cli/config.js +8 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +203 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/filters.cjs +8 -7
- package/dist/filters.cjs.map +1 -1
- package/dist/filters.js +8 -7
- package/dist/filters.js.map +1 -1
- package/dist/{index-CPB9Ea9U.d.ts → index-BP52gB00.d.ts} +179 -56
- package/dist/{index-DKf9WMQG.d.cts → index-CePv_bgv.d.cts} +179 -56
- package/dist/index.cjs +2029 -241
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2028 -243
- package/dist/index.js.map +1 -1
- package/dist/preprocessors.cjs.map +1 -1
- package/dist/preprocessors.js.map +1 -1
- package/dist/renderers.cjs.map +1 -1
- package/dist/renderers.d.cts +2 -2
- package/dist/renderers.d.ts +2 -2
- package/dist/renderers.js.map +1 -1
- package/dist/transforms.cjs +5 -5
- package/dist/transforms.cjs.map +1 -1
- package/dist/transforms.js +5 -5
- package/dist/transforms.js.map +1 -1
- package/package.json +18 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/preprocessors.ts"],"names":[],"mappings":";;;AAuBO,IAAM,gBAAgB","file":"preprocessors.cjs","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors subpath export\n * Import preprocessors from: dispersa/preprocessors\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from '@
|
|
1
|
+
{"version":3,"sources":["../src/preprocessors.ts"],"names":[],"mappings":";;;AAuBO,IAAM,gBAAgB","file":"preprocessors.cjs","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors subpath export\n * Import preprocessors from: dispersa/preprocessors\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from '@processing/processors/preprocessors/types'\n\n// ============================================================================\n// BUILT-IN PREPROCESSORS\n// ============================================================================\n\n// No built-in preprocessors currently - users can create custom ones inline.\n// Runtime marker to prevent an empty chunk warning during build.\nexport const preprocessors = [] as const\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/preprocessors.ts"],"names":[],"mappings":";AAuBO,IAAM,gBAAgB","file":"preprocessors.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors subpath export\n * Import preprocessors from: dispersa/preprocessors\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from '@
|
|
1
|
+
{"version":3,"sources":["../src/preprocessors.ts"],"names":[],"mappings":";AAuBO,IAAM,gBAAgB","file":"preprocessors.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors subpath export\n * Import preprocessors from: dispersa/preprocessors\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from '@processing/processors/preprocessors/types'\n\n// ============================================================================\n// BUILT-IN PREPROCESSORS\n// ============================================================================\n\n// No built-in preprocessors currently - users can create custom ones inline.\n// Runtime marker to prevent an empty chunk warning during build.\nexport const preprocessors = [] as const\n"]}
|
package/dist/renderers.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderers/types.ts","../src/renderers/output-tree.ts"],"names":[],"mappings":";;;AA8HO,SAAS,eAAwC,QAAA,EAAoC;AAC1F,EAAA,OAAO,QAAA;AACT;;;ACrGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF;AACF;AAQO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAwC;AACnE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,YAAA;AAE3C","file":"renderers.cjs","sourcesContent":["/**\n * @fileoverview Renderer system types for token output generation\n */\n\nimport type { ModifierInputs, OutputConfig, ResolverDocument } from '@config/index'\nimport type { ResolvedTokens } from '@lib/tokens/types'\n\n/**\n * Generic options object for renderers\n *\n * Each renderer can define its own specific options that extend this base type.\n */\nexport type FormatOptions = Record<string, unknown>\n\n/**\n * Data for a single permutation (combination of modifier values)\n */\nexport type PermutationData = {\n tokens: ResolvedTokens\n modifierInputs: ModifierInputs\n}\n\n/**\n * Metadata for renderers to reason about modifier dimensions.\n */\nexport type RenderMeta = {\n dimensions: string[]\n defaults: Record<string, string>\n basePermutation: ModifierInputs\n}\n\n/**\n * Context provided to renderer formatters.\n */\nexport type RenderContext<TOptions extends FormatOptions = FormatOptions> = {\n permutations: PermutationData[]\n output: OutputConfig<TOptions>\n resolver: ResolverDocument\n meta: RenderMeta\n buildPath?: string\n}\n\n/**\n * Multi-file output representation for renderers.\n */\nexport type OutputTree = {\n kind: 'outputTree'\n files: Record<string, string>\n}\n\nexport type RenderOutput = string | OutputTree\n\n/**\n * Output from a build operation\n */\nexport type BuildOutput = {\n name: string\n /** File path where output was written (undefined for in-memory mode) */\n path?: string\n content: string\n}\n\n/**\n * Renderer definition for converting tokens to output format\n *\n * Renderers implement a single `format()` method that can return either\n * a single string or an OutputTree for multi-file outputs.\n *\n * @example Simple renderer with format()\n * ```typescript\n * const scssRenderer: Renderer = {\n * format: (context) => {\n * const tokens = context.permutations[0]?.tokens ?? {}\n * return Object.entries(tokens)\n * .map(([name, token]) => `$${name}: ${token.$value};`)\n * .join('\\n')\n * },\n * }\n * ```\n */\nexport type Renderer<TOptions extends FormatOptions = FormatOptions> = {\n /**\n * Preset identifier (e.g., 'bundle', 'standalone', 'modifier')\n * Indicates which variant of the renderer this is\n */\n preset?: string\n\n /**\n * Convert tokens to output content.\n *\n * Renderers receive all resolved permutations and modifier metadata via context.\n * They can return either a single string (single output file) or an OutputTree\n * for multi-file outputs.\n */\n format: (\n context: RenderContext<TOptions>,\n options?: TOptions,\n ) => RenderOutput | Promise<RenderOutput>\n}\n\n/**\n * Helper for defining custom renderers with full type inference.\n *\n * Works like Vue's `defineComponent()` or Vite's `defineConfig()` --\n * an identity function that enables TypeScript to infer the options type\n * from the generic parameter, giving you autocomplete and type-checking\n * on both `context` and `options` inside `format()`.\n *\n * @example\n * ```typescript\n * import { defineRenderer } from 'dispersa/renderers'\n *\n * type MyOptions = { prefix: string; minify?: boolean }\n *\n * const myRenderer = defineRenderer<MyOptions>({\n * format(context, options) {\n * // options is typed as MyOptions | undefined\n * // context.output.options is typed as MyOptions | undefined\n * const prefix = options?.prefix ?? 'token'\n * return Object.entries(context.permutations[0]?.tokens ?? {})\n * .map(([name, token]) => `${prefix}-${name}: ${token.$value}`)\n * .join('\\n')\n * },\n * })\n * ```\n */\nexport function defineRenderer<T extends FormatOptions>(renderer: Renderer<T>): Renderer<T> {\n return renderer\n}\n\n/**\n * Function type for dynamically generating CSS selectors based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns CSS selector string (e.g., '[data-theme=\"dark\"]')\n */\nexport type SelectorFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Function type for dynamically generating media queries based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns Media query string (e.g., '(max-width: 768px)') or empty string for no media query\n */\nexport type MediaQueryFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Options for CSS custom properties renderer\n *\n * Controls how tokens are converted to CSS custom properties (CSS variables).\n *\n * **Note:** Token naming is controlled through transforms, not renderer options.\n * Use `nameKebabCase()` and `namePrefix()` for naming control.\n *\n * @example String-based selectors\n * ```typescript\n * css({\n * name: 'tokens',\n * file: 'tokens.css',\n * transforms: [nameKebabCase(), namePrefix('ds-')],\n * preset: 'bundle',\n * selector: ':root',\n * })\n * ```\n *\n * @example Function-based selectors\n * ```typescript\n * outputs: [{\n * renderer: cssRenderer(),\n * options: {\n * preset: 'bundle',\n * selector: (modifier, context, isBase, allInputs) => {\n * if (isBase) return ':root'\n * return `[data-${modifier}=\"${context}\"]`\n * },\n * mediaQuery: (modifier, context) => {\n * if (modifier === 'breakpoint' && context === 'mobile') {\n * return '(max-width: 768px)'\n * }\n * return ''\n * }\n * }\n * }]\n * ```\n */\nexport type CssRendererOptions = {\n preset?: 'bundle' | 'standalone' | 'modifier'\n selector?: string | SelectorFunction\n mediaQuery?: string | MediaQueryFunction\n minify?: boolean\n preserveReferences?: boolean\n}\n\n/**\n * Options for JSON renderer\n *\n * Controls the structure and formatting of JSON token output.\n *\n * @example\n * ```typescript\n * {\n * structure: 'flat',\n * minify: true,\n * includeMetadata: true\n * }\n * ```\n */\nexport type { JsonRendererOptions } from '@lib/validation/config-schemas'\n\n/**\n * Options for JavaScript module renderer\n *\n * Generates JavaScript modules for direct import in applications.\n * Aligned with JSON renderer options for consistency.\n *\n * @example\n * ```typescript\n * {\n * structure: 'nested',\n * minify: false,\n * moduleName: 'designTokens'\n * }\n * ```\n */\nexport type { JsModuleRendererOptions } from '@lib/validation/config-schemas'\n\n/**\n * Result of a token build operation\n *\n * Contains success status, generated output files, and any errors encountered.\n *\n * @example\n * ```typescript\n * const result = await dispersa.build(config)\n * if (result.success) {\n * result.outputs.forEach(output => {\n * console.log(`Generated ${output.name}: ${output.path}`)\n * })\n * } else {\n * console.error('Build errors:', result.errors)\n * }\n * ```\n */\n/**\n * Error code identifying the type of build error\n */\nexport type ErrorCode =\n | 'TOKEN_REFERENCE'\n | 'CIRCULAR_REFERENCE'\n | 'VALIDATION'\n | 'COLOR_PARSE'\n | 'DIMENSION_FORMAT'\n | 'FILE_OPERATION'\n | 'CONFIGURATION'\n | 'BASE_PERMUTATION'\n | 'MODIFIER'\n | 'UNKNOWN'\n\n/**\n * Structured error from a build operation\n *\n * Preserves typed context from the error hierarchy so consumers\n * can programmatically react to specific failure modes.\n */\nexport type BuildError = {\n /** Human-readable error message */\n message: string\n\n /** Machine-readable error code identifying the failure type */\n code: ErrorCode\n\n /** File path where the error occurred (for file operation errors) */\n path?: string\n\n /** Token path where the error occurred (e.g. 'color.primary') */\n tokenPath?: string\n\n /** Error severity */\n severity: 'error' | 'warning'\n\n /** Suggested alternatives (e.g. similar token names for TOKEN_REFERENCE errors) */\n suggestions?: string[]\n}\n\nexport type BuildResult = {\n /** Whether the build completed successfully */\n success: boolean\n\n /** Array of generated output files */\n outputs: BuildOutput[]\n\n /** Array of errors encountered during build (only present if success is false) */\n errors?: BuildError[]\n}\n","/**\n * @fileoverview Output tree helpers for custom renderers\n */\n\nimport type { OutputTree } from './types'\n\n/**\n * Create an {@link OutputTree} from a map of file paths to content strings.\n *\n * Use this when building a custom renderer that produces multiple output files\n * (e.g. one file per theme or permutation).\n *\n * @param files - Record mapping relative file paths to their string content\n * @returns An `OutputTree` that the build orchestrator can write to disk or return in-memory\n *\n * @example\n * ```typescript\n * import { defineRenderer, outputTree } from 'dispersa/renderers'\n *\n * const myRenderer = defineRenderer((context) => {\n * return outputTree({\n * 'light.css': '/* light tokens *\\/',\n * 'dark.css': '/* dark tokens *\\/',\n * })\n * })\n * ```\n */\nexport const outputTree = (files: Record<string, string>): OutputTree => {\n return {\n kind: 'outputTree',\n files,\n }\n}\n\n/**\n * Type guard that checks whether a value is an {@link OutputTree}.\n *\n * @param value - The value to check\n * @returns `true` if the value is an `OutputTree`\n */\nexport const isOutputTree = (value: unknown): value is OutputTree => {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { kind?: unknown }).kind === 'outputTree'\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderers/types.ts","../src/renderers/output-tree.ts"],"names":[],"mappings":";;;AA8HO,SAAS,eAAwC,QAAA,EAAoC;AAC1F,EAAA,OAAO,QAAA;AACT;;;ACrGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF;AACF;AAQO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAwC;AACnE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,YAAA;AAE3C","file":"renderers.cjs","sourcesContent":["/**\n * @fileoverview Renderer system types for token output generation\n */\n\nimport type { ModifierInputs, OutputConfig, ResolverDocument } from '@config/index'\nimport type { ResolvedTokens } from '@tokens/types'\n\n/**\n * Generic options object for renderers\n *\n * Each renderer can define its own specific options that extend this base type.\n */\nexport type FormatOptions = Record<string, unknown>\n\n/**\n * Data for a single permutation (combination of modifier values)\n */\nexport type PermutationData = {\n tokens: ResolvedTokens\n modifierInputs: ModifierInputs\n}\n\n/**\n * Metadata for renderers to reason about modifier dimensions.\n */\nexport type RenderMeta = {\n dimensions: string[]\n defaults: Record<string, string>\n basePermutation: ModifierInputs\n}\n\n/**\n * Context provided to renderer formatters.\n */\nexport type RenderContext<TOptions extends FormatOptions = FormatOptions> = {\n permutations: PermutationData[]\n output: OutputConfig<TOptions>\n resolver: ResolverDocument\n meta: RenderMeta\n buildPath?: string\n}\n\n/**\n * Multi-file output representation for renderers.\n */\nexport type OutputTree = {\n kind: 'outputTree'\n files: Record<string, string>\n}\n\nexport type RenderOutput = string | OutputTree\n\n/**\n * Output from a build operation\n */\nexport type BuildOutput = {\n name: string\n /** File path where output was written (undefined for in-memory mode) */\n path?: string\n content: string\n}\n\n/**\n * Renderer definition for converting tokens to output format\n *\n * Renderers implement a single `format()` method that can return either\n * a single string or an OutputTree for multi-file outputs.\n *\n * @example Simple renderer with format()\n * ```typescript\n * const scssRenderer: Renderer = {\n * format: (context) => {\n * const tokens = context.permutations[0]?.tokens ?? {}\n * return Object.entries(tokens)\n * .map(([name, token]) => `$${name}: ${token.$value};`)\n * .join('\\n')\n * },\n * }\n * ```\n */\nexport type Renderer<TOptions extends FormatOptions = FormatOptions> = {\n /**\n * Preset identifier (e.g., 'bundle', 'standalone', 'modifier')\n * Indicates which variant of the renderer this is\n */\n preset?: string\n\n /**\n * Convert tokens to output content.\n *\n * Renderers receive all resolved permutations and modifier metadata via context.\n * They can return either a single string (single output file) or an OutputTree\n * for multi-file outputs.\n */\n format: (\n context: RenderContext<TOptions>,\n options?: TOptions,\n ) => RenderOutput | Promise<RenderOutput>\n}\n\n/**\n * Helper for defining custom renderers with full type inference.\n *\n * Works like Vue's `defineComponent()` or Vite's `defineConfig()` --\n * an identity function that enables TypeScript to infer the options type\n * from the generic parameter, giving you autocomplete and type-checking\n * on both `context` and `options` inside `format()`.\n *\n * @example\n * ```typescript\n * import { defineRenderer } from 'dispersa/renderers'\n *\n * type MyOptions = { prefix: string; minify?: boolean }\n *\n * const myRenderer = defineRenderer<MyOptions>({\n * format(context, options) {\n * // options is typed as MyOptions | undefined\n * // context.output.options is typed as MyOptions | undefined\n * const prefix = options?.prefix ?? 'token'\n * return Object.entries(context.permutations[0]?.tokens ?? {})\n * .map(([name, token]) => `${prefix}-${name}: ${token.$value}`)\n * .join('\\n')\n * },\n * })\n * ```\n */\nexport function defineRenderer<T extends FormatOptions>(renderer: Renderer<T>): Renderer<T> {\n return renderer\n}\n\n/**\n * Function type for dynamically generating CSS selectors based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns CSS selector string (e.g., '[data-theme=\"dark\"]')\n */\nexport type SelectorFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Function type for dynamically generating media queries based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns Media query string (e.g., '(max-width: 768px)') or empty string for no media query\n */\nexport type MediaQueryFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Options for CSS custom properties renderer\n *\n * Controls how tokens are converted to CSS custom properties (CSS variables).\n *\n * **Note:** Token naming is controlled through transforms, not renderer options.\n * Use `nameKebabCase()` and `namePrefix()` for naming control.\n *\n * @example String-based selectors\n * ```typescript\n * css({\n * name: 'tokens',\n * file: 'tokens.css',\n * transforms: [nameKebabCase(), namePrefix('ds-')],\n * preset: 'bundle',\n * selector: ':root',\n * })\n * ```\n *\n * @example Function-based selectors\n * ```typescript\n * outputs: [{\n * renderer: cssRenderer(),\n * options: {\n * preset: 'bundle',\n * selector: (modifier, context, isBase, allInputs) => {\n * if (isBase) return ':root'\n * return `[data-${modifier}=\"${context}\"]`\n * },\n * mediaQuery: (modifier, context) => {\n * if (modifier === 'breakpoint' && context === 'mobile') {\n * return '(max-width: 768px)'\n * }\n * return ''\n * }\n * }\n * }]\n * ```\n */\nexport type CssRendererOptions = {\n preset?: 'bundle' | 'standalone' | 'modifier'\n selector?: string | SelectorFunction\n mediaQuery?: string | MediaQueryFunction\n minify?: boolean\n preserveReferences?: boolean\n}\n\n/**\n * Options for JSON renderer\n *\n * Controls the structure and formatting of JSON token output.\n *\n * @example\n * ```typescript\n * {\n * structure: 'flat',\n * minify: true,\n * includeMetadata: true\n * }\n * ```\n */\nexport type { JsonRendererOptions } from '@validation/config-schemas'\n\n/**\n * Options for JavaScript module renderer\n *\n * Generates JavaScript modules for direct import in applications.\n * Aligned with JSON renderer options for consistency.\n *\n * @example\n * ```typescript\n * {\n * structure: 'nested',\n * minify: false,\n * moduleName: 'designTokens'\n * }\n * ```\n */\nexport type { JsModuleRendererOptions } from '@validation/config-schemas'\n\n/**\n * Options for Tailwind CSS v4 renderer\n *\n * Generates CSS with @theme blocks for Tailwind v4+ design token integration.\n */\nexport type { TailwindRendererOptions } from './tailwind'\n\n/**\n * Options for iOS/SwiftUI renderer\n *\n * Generates Swift code targeting SwiftUI (iOS 17+, Swift 6).\n */\nexport type { IosRendererOptions } from './ios'\n\n/**\n * Options for Android/Jetpack Compose renderer\n *\n * Generates Kotlin code targeting Jetpack Compose with Material 3.\n *\n * @experimental This type is experimental. Properties and behavior may change.\n */\nexport type { AndroidRendererOptions } from './android'\n\n/**\n * Result of a token build operation\n *\n * Contains success status, generated output files, and any errors encountered.\n *\n * @example\n * ```typescript\n * const result = await dispersa.build(config)\n * if (result.success) {\n * result.outputs.forEach(output => {\n * console.log(`Generated ${output.name}: ${output.path}`)\n * })\n * } else {\n * console.error('Build errors:', result.errors)\n * }\n * ```\n */\n/**\n * Error code identifying the type of build error\n */\nexport type ErrorCode =\n | 'TOKEN_REFERENCE'\n | 'CIRCULAR_REFERENCE'\n | 'VALIDATION'\n | 'COLOR_PARSE'\n | 'DIMENSION_FORMAT'\n | 'FILE_OPERATION'\n | 'CONFIGURATION'\n | 'BASE_PERMUTATION'\n | 'MODIFIER'\n | 'UNKNOWN'\n\n/**\n * Structured error from a build operation\n *\n * Preserves typed context from the error hierarchy so consumers\n * can programmatically react to specific failure modes.\n */\nexport type BuildError = {\n /** Human-readable error message */\n message: string\n\n /** Machine-readable error code identifying the failure type */\n code: ErrorCode\n\n /** File path where the error occurred (for file operation errors) */\n path?: string\n\n /** Token path where the error occurred (e.g. 'color.primary') */\n tokenPath?: string\n\n /** Error severity */\n severity: 'error' | 'warning'\n\n /** Suggested alternatives (e.g. similar token names for TOKEN_REFERENCE errors) */\n suggestions?: string[]\n}\n\nexport type BuildResult = {\n /** Whether the build completed successfully */\n success: boolean\n\n /** Array of generated output files */\n outputs: BuildOutput[]\n\n /** Array of errors encountered during build (only present if success is false) */\n errors?: BuildError[]\n}\n","/**\n * @fileoverview Output tree helpers for custom renderers\n */\n\nimport type { OutputTree } from './types'\n\n/**\n * Create an {@link OutputTree} from a map of file paths to content strings.\n *\n * Use this when building a custom renderer that produces multiple output files\n * (e.g. one file per theme or permutation).\n *\n * @param files - Record mapping relative file paths to their string content\n * @returns An `OutputTree` that the build orchestrator can write to disk or return in-memory\n *\n * @example\n * ```typescript\n * import { defineRenderer, outputTree } from 'dispersa/renderers'\n *\n * const myRenderer = defineRenderer((context) => {\n * return outputTree({\n * 'light.css': '/* light tokens *\\/',\n * 'dark.css': '/* dark tokens *\\/',\n * })\n * })\n * ```\n */\nexport const outputTree = (files: Record<string, string>): OutputTree => {\n return {\n kind: 'outputTree',\n files,\n }\n}\n\n/**\n * Type guard that checks whether a value is an {@link OutputTree}.\n *\n * @param value - The value to check\n * @returns `true` if the value is an `OutputTree`\n */\nexport const isOutputTree = (value: unknown): value is OutputTree => {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { kind?: unknown }).kind === 'outputTree'\n )\n}\n"]}
|
package/dist/renderers.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as OutputTree } from './index-
|
|
2
|
-
export { c as BuildError, a as BuildResult, C as CssRendererOptions, E as ErrorCode, F as FormatOptions, h as RenderContext, i as RenderMeta, j as RenderOutput, g as Renderer, k as defineRenderer } from './index-
|
|
1
|
+
import { f as OutputTree } from './index-CePv_bgv.cjs';
|
|
2
|
+
export { A as AndroidRendererOptions, c as BuildError, a as BuildResult, C as CssRendererOptions, E as ErrorCode, F as FormatOptions, I as IosRendererOptions, e as MediaQueryFunction, P as PermutationData, h as RenderContext, i as RenderMeta, j as RenderOutput, g as Renderer, S as SelectorFunction, T as TailwindRendererOptions, k as defineRenderer } from './index-CePv_bgv.cjs';
|
|
3
3
|
export { J as JsModuleRendererOptions, a as JsonRendererOptions } from './types-DbufGPrb.cjs';
|
|
4
4
|
import './types-BDY1xBmD.cjs';
|
|
5
5
|
import './types-C1GpiJ6q.cjs';
|
package/dist/renderers.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { f as OutputTree } from './index-
|
|
2
|
-
export { c as BuildError, a as BuildResult, C as CssRendererOptions, E as ErrorCode, F as FormatOptions, h as RenderContext, i as RenderMeta, j as RenderOutput, g as Renderer, k as defineRenderer } from './index-
|
|
1
|
+
import { f as OutputTree } from './index-BP52gB00.js';
|
|
2
|
+
export { A as AndroidRendererOptions, c as BuildError, a as BuildResult, C as CssRendererOptions, E as ErrorCode, F as FormatOptions, I as IosRendererOptions, e as MediaQueryFunction, P as PermutationData, h as RenderContext, i as RenderMeta, j as RenderOutput, g as Renderer, S as SelectorFunction, T as TailwindRendererOptions, k as defineRenderer } from './index-BP52gB00.js';
|
|
3
3
|
export { J as JsModuleRendererOptions, a as JsonRendererOptions } from './types-DJH6_4U9.js';
|
|
4
4
|
import './types-Cl-1UYGD.js';
|
|
5
5
|
import './types-C1GpiJ6q.js';
|
package/dist/renderers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/renderers/types.ts","../src/renderers/output-tree.ts"],"names":[],"mappings":";AA8HO,SAAS,eAAwC,QAAA,EAAoC;AAC1F,EAAA,OAAO,QAAA;AACT;;;ACrGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF;AACF;AAQO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAwC;AACnE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,YAAA;AAE3C","file":"renderers.js","sourcesContent":["/**\n * @fileoverview Renderer system types for token output generation\n */\n\nimport type { ModifierInputs, OutputConfig, ResolverDocument } from '@config/index'\nimport type { ResolvedTokens } from '@lib/tokens/types'\n\n/**\n * Generic options object for renderers\n *\n * Each renderer can define its own specific options that extend this base type.\n */\nexport type FormatOptions = Record<string, unknown>\n\n/**\n * Data for a single permutation (combination of modifier values)\n */\nexport type PermutationData = {\n tokens: ResolvedTokens\n modifierInputs: ModifierInputs\n}\n\n/**\n * Metadata for renderers to reason about modifier dimensions.\n */\nexport type RenderMeta = {\n dimensions: string[]\n defaults: Record<string, string>\n basePermutation: ModifierInputs\n}\n\n/**\n * Context provided to renderer formatters.\n */\nexport type RenderContext<TOptions extends FormatOptions = FormatOptions> = {\n permutations: PermutationData[]\n output: OutputConfig<TOptions>\n resolver: ResolverDocument\n meta: RenderMeta\n buildPath?: string\n}\n\n/**\n * Multi-file output representation for renderers.\n */\nexport type OutputTree = {\n kind: 'outputTree'\n files: Record<string, string>\n}\n\nexport type RenderOutput = string | OutputTree\n\n/**\n * Output from a build operation\n */\nexport type BuildOutput = {\n name: string\n /** File path where output was written (undefined for in-memory mode) */\n path?: string\n content: string\n}\n\n/**\n * Renderer definition for converting tokens to output format\n *\n * Renderers implement a single `format()` method that can return either\n * a single string or an OutputTree for multi-file outputs.\n *\n * @example Simple renderer with format()\n * ```typescript\n * const scssRenderer: Renderer = {\n * format: (context) => {\n * const tokens = context.permutations[0]?.tokens ?? {}\n * return Object.entries(tokens)\n * .map(([name, token]) => `$${name}: ${token.$value};`)\n * .join('\\n')\n * },\n * }\n * ```\n */\nexport type Renderer<TOptions extends FormatOptions = FormatOptions> = {\n /**\n * Preset identifier (e.g., 'bundle', 'standalone', 'modifier')\n * Indicates which variant of the renderer this is\n */\n preset?: string\n\n /**\n * Convert tokens to output content.\n *\n * Renderers receive all resolved permutations and modifier metadata via context.\n * They can return either a single string (single output file) or an OutputTree\n * for multi-file outputs.\n */\n format: (\n context: RenderContext<TOptions>,\n options?: TOptions,\n ) => RenderOutput | Promise<RenderOutput>\n}\n\n/**\n * Helper for defining custom renderers with full type inference.\n *\n * Works like Vue's `defineComponent()` or Vite's `defineConfig()` --\n * an identity function that enables TypeScript to infer the options type\n * from the generic parameter, giving you autocomplete and type-checking\n * on both `context` and `options` inside `format()`.\n *\n * @example\n * ```typescript\n * import { defineRenderer } from 'dispersa/renderers'\n *\n * type MyOptions = { prefix: string; minify?: boolean }\n *\n * const myRenderer = defineRenderer<MyOptions>({\n * format(context, options) {\n * // options is typed as MyOptions | undefined\n * // context.output.options is typed as MyOptions | undefined\n * const prefix = options?.prefix ?? 'token'\n * return Object.entries(context.permutations[0]?.tokens ?? {})\n * .map(([name, token]) => `${prefix}-${name}: ${token.$value}`)\n * .join('\\n')\n * },\n * })\n * ```\n */\nexport function defineRenderer<T extends FormatOptions>(renderer: Renderer<T>): Renderer<T> {\n return renderer\n}\n\n/**\n * Function type for dynamically generating CSS selectors based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns CSS selector string (e.g., '[data-theme=\"dark\"]')\n */\nexport type SelectorFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Function type for dynamically generating media queries based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns Media query string (e.g., '(max-width: 768px)') or empty string for no media query\n */\nexport type MediaQueryFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Options for CSS custom properties renderer\n *\n * Controls how tokens are converted to CSS custom properties (CSS variables).\n *\n * **Note:** Token naming is controlled through transforms, not renderer options.\n * Use `nameKebabCase()` and `namePrefix()` for naming control.\n *\n * @example String-based selectors\n * ```typescript\n * css({\n * name: 'tokens',\n * file: 'tokens.css',\n * transforms: [nameKebabCase(), namePrefix('ds-')],\n * preset: 'bundle',\n * selector: ':root',\n * })\n * ```\n *\n * @example Function-based selectors\n * ```typescript\n * outputs: [{\n * renderer: cssRenderer(),\n * options: {\n * preset: 'bundle',\n * selector: (modifier, context, isBase, allInputs) => {\n * if (isBase) return ':root'\n * return `[data-${modifier}=\"${context}\"]`\n * },\n * mediaQuery: (modifier, context) => {\n * if (modifier === 'breakpoint' && context === 'mobile') {\n * return '(max-width: 768px)'\n * }\n * return ''\n * }\n * }\n * }]\n * ```\n */\nexport type CssRendererOptions = {\n preset?: 'bundle' | 'standalone' | 'modifier'\n selector?: string | SelectorFunction\n mediaQuery?: string | MediaQueryFunction\n minify?: boolean\n preserveReferences?: boolean\n}\n\n/**\n * Options for JSON renderer\n *\n * Controls the structure and formatting of JSON token output.\n *\n * @example\n * ```typescript\n * {\n * structure: 'flat',\n * minify: true,\n * includeMetadata: true\n * }\n * ```\n */\nexport type { JsonRendererOptions } from '@lib/validation/config-schemas'\n\n/**\n * Options for JavaScript module renderer\n *\n * Generates JavaScript modules for direct import in applications.\n * Aligned with JSON renderer options for consistency.\n *\n * @example\n * ```typescript\n * {\n * structure: 'nested',\n * minify: false,\n * moduleName: 'designTokens'\n * }\n * ```\n */\nexport type { JsModuleRendererOptions } from '@lib/validation/config-schemas'\n\n/**\n * Result of a token build operation\n *\n * Contains success status, generated output files, and any errors encountered.\n *\n * @example\n * ```typescript\n * const result = await dispersa.build(config)\n * if (result.success) {\n * result.outputs.forEach(output => {\n * console.log(`Generated ${output.name}: ${output.path}`)\n * })\n * } else {\n * console.error('Build errors:', result.errors)\n * }\n * ```\n */\n/**\n * Error code identifying the type of build error\n */\nexport type ErrorCode =\n | 'TOKEN_REFERENCE'\n | 'CIRCULAR_REFERENCE'\n | 'VALIDATION'\n | 'COLOR_PARSE'\n | 'DIMENSION_FORMAT'\n | 'FILE_OPERATION'\n | 'CONFIGURATION'\n | 'BASE_PERMUTATION'\n | 'MODIFIER'\n | 'UNKNOWN'\n\n/**\n * Structured error from a build operation\n *\n * Preserves typed context from the error hierarchy so consumers\n * can programmatically react to specific failure modes.\n */\nexport type BuildError = {\n /** Human-readable error message */\n message: string\n\n /** Machine-readable error code identifying the failure type */\n code: ErrorCode\n\n /** File path where the error occurred (for file operation errors) */\n path?: string\n\n /** Token path where the error occurred (e.g. 'color.primary') */\n tokenPath?: string\n\n /** Error severity */\n severity: 'error' | 'warning'\n\n /** Suggested alternatives (e.g. similar token names for TOKEN_REFERENCE errors) */\n suggestions?: string[]\n}\n\nexport type BuildResult = {\n /** Whether the build completed successfully */\n success: boolean\n\n /** Array of generated output files */\n outputs: BuildOutput[]\n\n /** Array of errors encountered during build (only present if success is false) */\n errors?: BuildError[]\n}\n","/**\n * @fileoverview Output tree helpers for custom renderers\n */\n\nimport type { OutputTree } from './types'\n\n/**\n * Create an {@link OutputTree} from a map of file paths to content strings.\n *\n * Use this when building a custom renderer that produces multiple output files\n * (e.g. one file per theme or permutation).\n *\n * @param files - Record mapping relative file paths to their string content\n * @returns An `OutputTree` that the build orchestrator can write to disk or return in-memory\n *\n * @example\n * ```typescript\n * import { defineRenderer, outputTree } from 'dispersa/renderers'\n *\n * const myRenderer = defineRenderer((context) => {\n * return outputTree({\n * 'light.css': '/* light tokens *\\/',\n * 'dark.css': '/* dark tokens *\\/',\n * })\n * })\n * ```\n */\nexport const outputTree = (files: Record<string, string>): OutputTree => {\n return {\n kind: 'outputTree',\n files,\n }\n}\n\n/**\n * Type guard that checks whether a value is an {@link OutputTree}.\n *\n * @param value - The value to check\n * @returns `true` if the value is an `OutputTree`\n */\nexport const isOutputTree = (value: unknown): value is OutputTree => {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { kind?: unknown }).kind === 'outputTree'\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/renderers/types.ts","../src/renderers/output-tree.ts"],"names":[],"mappings":";AA8HO,SAAS,eAAwC,QAAA,EAAoC;AAC1F,EAAA,OAAO,QAAA;AACT;;;ACrGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF;AACF;AAQO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAwC;AACnE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAA6B,IAAA,KAAS,YAAA;AAE3C","file":"renderers.js","sourcesContent":["/**\n * @fileoverview Renderer system types for token output generation\n */\n\nimport type { ModifierInputs, OutputConfig, ResolverDocument } from '@config/index'\nimport type { ResolvedTokens } from '@tokens/types'\n\n/**\n * Generic options object for renderers\n *\n * Each renderer can define its own specific options that extend this base type.\n */\nexport type FormatOptions = Record<string, unknown>\n\n/**\n * Data for a single permutation (combination of modifier values)\n */\nexport type PermutationData = {\n tokens: ResolvedTokens\n modifierInputs: ModifierInputs\n}\n\n/**\n * Metadata for renderers to reason about modifier dimensions.\n */\nexport type RenderMeta = {\n dimensions: string[]\n defaults: Record<string, string>\n basePermutation: ModifierInputs\n}\n\n/**\n * Context provided to renderer formatters.\n */\nexport type RenderContext<TOptions extends FormatOptions = FormatOptions> = {\n permutations: PermutationData[]\n output: OutputConfig<TOptions>\n resolver: ResolverDocument\n meta: RenderMeta\n buildPath?: string\n}\n\n/**\n * Multi-file output representation for renderers.\n */\nexport type OutputTree = {\n kind: 'outputTree'\n files: Record<string, string>\n}\n\nexport type RenderOutput = string | OutputTree\n\n/**\n * Output from a build operation\n */\nexport type BuildOutput = {\n name: string\n /** File path where output was written (undefined for in-memory mode) */\n path?: string\n content: string\n}\n\n/**\n * Renderer definition for converting tokens to output format\n *\n * Renderers implement a single `format()` method that can return either\n * a single string or an OutputTree for multi-file outputs.\n *\n * @example Simple renderer with format()\n * ```typescript\n * const scssRenderer: Renderer = {\n * format: (context) => {\n * const tokens = context.permutations[0]?.tokens ?? {}\n * return Object.entries(tokens)\n * .map(([name, token]) => `$${name}: ${token.$value};`)\n * .join('\\n')\n * },\n * }\n * ```\n */\nexport type Renderer<TOptions extends FormatOptions = FormatOptions> = {\n /**\n * Preset identifier (e.g., 'bundle', 'standalone', 'modifier')\n * Indicates which variant of the renderer this is\n */\n preset?: string\n\n /**\n * Convert tokens to output content.\n *\n * Renderers receive all resolved permutations and modifier metadata via context.\n * They can return either a single string (single output file) or an OutputTree\n * for multi-file outputs.\n */\n format: (\n context: RenderContext<TOptions>,\n options?: TOptions,\n ) => RenderOutput | Promise<RenderOutput>\n}\n\n/**\n * Helper for defining custom renderers with full type inference.\n *\n * Works like Vue's `defineComponent()` or Vite's `defineConfig()` --\n * an identity function that enables TypeScript to infer the options type\n * from the generic parameter, giving you autocomplete and type-checking\n * on both `context` and `options` inside `format()`.\n *\n * @example\n * ```typescript\n * import { defineRenderer } from 'dispersa/renderers'\n *\n * type MyOptions = { prefix: string; minify?: boolean }\n *\n * const myRenderer = defineRenderer<MyOptions>({\n * format(context, options) {\n * // options is typed as MyOptions | undefined\n * // context.output.options is typed as MyOptions | undefined\n * const prefix = options?.prefix ?? 'token'\n * return Object.entries(context.permutations[0]?.tokens ?? {})\n * .map(([name, token]) => `${prefix}-${name}: ${token.$value}`)\n * .join('\\n')\n * },\n * })\n * ```\n */\nexport function defineRenderer<T extends FormatOptions>(renderer: Renderer<T>): Renderer<T> {\n return renderer\n}\n\n/**\n * Function type for dynamically generating CSS selectors based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns CSS selector string (e.g., '[data-theme=\"dark\"]')\n */\nexport type SelectorFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Function type for dynamically generating media queries based on modifier context\n *\n * @param modifierName - Name of the modifier (e.g., 'theme', 'breakpoint')\n * @param context - Context value of the modifier (e.g., 'dark', 'mobile')\n * @param isBase - Whether this is the base permutation\n * @param allModifierInputs - All modifier inputs for this permutation\n * @returns Media query string (e.g., '(max-width: 768px)') or empty string for no media query\n */\nexport type MediaQueryFunction = (\n modifierName: string,\n context: string,\n isBase: boolean,\n allModifierInputs: Record<string, string>,\n) => string\n\n/**\n * Options for CSS custom properties renderer\n *\n * Controls how tokens are converted to CSS custom properties (CSS variables).\n *\n * **Note:** Token naming is controlled through transforms, not renderer options.\n * Use `nameKebabCase()` and `namePrefix()` for naming control.\n *\n * @example String-based selectors\n * ```typescript\n * css({\n * name: 'tokens',\n * file: 'tokens.css',\n * transforms: [nameKebabCase(), namePrefix('ds-')],\n * preset: 'bundle',\n * selector: ':root',\n * })\n * ```\n *\n * @example Function-based selectors\n * ```typescript\n * outputs: [{\n * renderer: cssRenderer(),\n * options: {\n * preset: 'bundle',\n * selector: (modifier, context, isBase, allInputs) => {\n * if (isBase) return ':root'\n * return `[data-${modifier}=\"${context}\"]`\n * },\n * mediaQuery: (modifier, context) => {\n * if (modifier === 'breakpoint' && context === 'mobile') {\n * return '(max-width: 768px)'\n * }\n * return ''\n * }\n * }\n * }]\n * ```\n */\nexport type CssRendererOptions = {\n preset?: 'bundle' | 'standalone' | 'modifier'\n selector?: string | SelectorFunction\n mediaQuery?: string | MediaQueryFunction\n minify?: boolean\n preserveReferences?: boolean\n}\n\n/**\n * Options for JSON renderer\n *\n * Controls the structure and formatting of JSON token output.\n *\n * @example\n * ```typescript\n * {\n * structure: 'flat',\n * minify: true,\n * includeMetadata: true\n * }\n * ```\n */\nexport type { JsonRendererOptions } from '@validation/config-schemas'\n\n/**\n * Options for JavaScript module renderer\n *\n * Generates JavaScript modules for direct import in applications.\n * Aligned with JSON renderer options for consistency.\n *\n * @example\n * ```typescript\n * {\n * structure: 'nested',\n * minify: false,\n * moduleName: 'designTokens'\n * }\n * ```\n */\nexport type { JsModuleRendererOptions } from '@validation/config-schemas'\n\n/**\n * Options for Tailwind CSS v4 renderer\n *\n * Generates CSS with @theme blocks for Tailwind v4+ design token integration.\n */\nexport type { TailwindRendererOptions } from './tailwind'\n\n/**\n * Options for iOS/SwiftUI renderer\n *\n * Generates Swift code targeting SwiftUI (iOS 17+, Swift 6).\n */\nexport type { IosRendererOptions } from './ios'\n\n/**\n * Options for Android/Jetpack Compose renderer\n *\n * Generates Kotlin code targeting Jetpack Compose with Material 3.\n *\n * @experimental This type is experimental. Properties and behavior may change.\n */\nexport type { AndroidRendererOptions } from './android'\n\n/**\n * Result of a token build operation\n *\n * Contains success status, generated output files, and any errors encountered.\n *\n * @example\n * ```typescript\n * const result = await dispersa.build(config)\n * if (result.success) {\n * result.outputs.forEach(output => {\n * console.log(`Generated ${output.name}: ${output.path}`)\n * })\n * } else {\n * console.error('Build errors:', result.errors)\n * }\n * ```\n */\n/**\n * Error code identifying the type of build error\n */\nexport type ErrorCode =\n | 'TOKEN_REFERENCE'\n | 'CIRCULAR_REFERENCE'\n | 'VALIDATION'\n | 'COLOR_PARSE'\n | 'DIMENSION_FORMAT'\n | 'FILE_OPERATION'\n | 'CONFIGURATION'\n | 'BASE_PERMUTATION'\n | 'MODIFIER'\n | 'UNKNOWN'\n\n/**\n * Structured error from a build operation\n *\n * Preserves typed context from the error hierarchy so consumers\n * can programmatically react to specific failure modes.\n */\nexport type BuildError = {\n /** Human-readable error message */\n message: string\n\n /** Machine-readable error code identifying the failure type */\n code: ErrorCode\n\n /** File path where the error occurred (for file operation errors) */\n path?: string\n\n /** Token path where the error occurred (e.g. 'color.primary') */\n tokenPath?: string\n\n /** Error severity */\n severity: 'error' | 'warning'\n\n /** Suggested alternatives (e.g. similar token names for TOKEN_REFERENCE errors) */\n suggestions?: string[]\n}\n\nexport type BuildResult = {\n /** Whether the build completed successfully */\n success: boolean\n\n /** Array of generated output files */\n outputs: BuildOutput[]\n\n /** Array of errors encountered during build (only present if success is false) */\n errors?: BuildError[]\n}\n","/**\n * @fileoverview Output tree helpers for custom renderers\n */\n\nimport type { OutputTree } from './types'\n\n/**\n * Create an {@link OutputTree} from a map of file paths to content strings.\n *\n * Use this when building a custom renderer that produces multiple output files\n * (e.g. one file per theme or permutation).\n *\n * @param files - Record mapping relative file paths to their string content\n * @returns An `OutputTree` that the build orchestrator can write to disk or return in-memory\n *\n * @example\n * ```typescript\n * import { defineRenderer, outputTree } from 'dispersa/renderers'\n *\n * const myRenderer = defineRenderer((context) => {\n * return outputTree({\n * 'light.css': '/* light tokens *\\/',\n * 'dark.css': '/* dark tokens *\\/',\n * })\n * })\n * ```\n */\nexport const outputTree = (files: Record<string, string>): OutputTree => {\n return {\n kind: 'outputTree',\n files,\n }\n}\n\n/**\n * Type guard that checks whether a value is an {@link OutputTree}.\n *\n * @param value - The value to check\n * @returns `true` if the value is an `OutputTree`\n */\nexport const isOutputTree = (value: unknown): value is OutputTree => {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { kind?: unknown }).kind === 'outputTree'\n )\n}\n"]}
|
package/dist/transforms.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var culori = require('culori');
|
|
4
4
|
var changeCase = require('change-case');
|
|
5
5
|
|
|
6
|
-
// src/
|
|
6
|
+
// src/processing/processors/transforms/built-in/color-transforms.ts
|
|
7
7
|
function isColorObject(value) {
|
|
8
8
|
return typeof value === "object" && value !== null && "colorSpace" in value && "components" in value;
|
|
9
9
|
}
|
|
@@ -114,7 +114,7 @@ function createModernColorTransform(mode) {
|
|
|
114
114
|
};
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
// src/
|
|
117
|
+
// src/processing/processors/transforms/built-in/color-transforms.ts
|
|
118
118
|
function colorToHex() {
|
|
119
119
|
return createColorTransform(colorObjectToHex);
|
|
120
120
|
}
|
|
@@ -164,7 +164,7 @@ function colorToColorFunction() {
|
|
|
164
164
|
// src/shared/constants.ts
|
|
165
165
|
var DEFAULT_BASE_FONT_SIZE_PX = 16;
|
|
166
166
|
|
|
167
|
-
// src/
|
|
167
|
+
// src/processing/processors/transforms/built-in/dimension-converter.ts
|
|
168
168
|
function isDimensionObject(value) {
|
|
169
169
|
return typeof value === "object" && value !== null && "value" in value && "unit" in value;
|
|
170
170
|
}
|
|
@@ -190,7 +190,7 @@ function convertDimension(value, toUnit, baseFontSize = DEFAULT_BASE_FONT_SIZE_P
|
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
// src/
|
|
193
|
+
// src/processing/processors/transforms/built-in/dimension-transforms.ts
|
|
194
194
|
function dimensionToPx() {
|
|
195
195
|
return {
|
|
196
196
|
matcher: (token) => token.$type === "dimension",
|
|
@@ -330,7 +330,7 @@ function nameCssVar() {
|
|
|
330
330
|
};
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
// src/
|
|
333
|
+
// src/processing/processors/transforms/built-in/other-transforms.ts
|
|
334
334
|
function fontWeightToNumber() {
|
|
335
335
|
return {
|
|
336
336
|
matcher: (token) => token.$type === "fontWeight",
|
package/dist/transforms.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/processing/processors/transforms/built-in/color-converter.ts","../src/lib/processing/processors/transforms/built-in/color-format.ts","../src/lib/processing/processors/transforms/built-in/color-transform-factory.ts","../src/lib/processing/processors/transforms/built-in/color-transforms.ts","../src/shared/constants.ts","../src/lib/processing/processors/transforms/built-in/dimension-converter.ts","../src/lib/processing/processors/transforms/built-in/dimension-transforms.ts","../src/lib/processing/processors/transforms/built-in/name-transforms.ts","../src/lib/processing/processors/transforms/built-in/other-transforms.ts"],"names":["formatHex8","formatHex","formatRgb","formatHsl","dtcgObjectToCulori","converter","formatCss","camelCase","kebabCase","snakeCase","pascalCase","constantCase"],"mappings":"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","file":"transforms.cjs","sourcesContent":["/**\n * @fileoverview Color format conversion utilities for DTCG 2025.10\n * Uses culori for accurate color science and conversions\n */\n\nimport type { ColorComponent, ColorSpace, ColorValueObject } from '@lib/tokens/types'\nimport {\n formatHex,\n formatHex8,\n type Color as CuloriColor,\n type Rgb,\n type Lrgb,\n type Hsl,\n type Hwb,\n type Lab,\n type Lch,\n type Oklab,\n type Oklch,\n type P3,\n type A98,\n type Prophoto,\n type Rec2020,\n type Xyz65,\n type Xyz50,\n} from 'culori'\n\n/**\n * Check if a color value is in DTCG object format\n */\nexport function isColorObject(value: unknown): value is ColorValueObject {\n return (\n typeof value === 'object' && value !== null && 'colorSpace' in value && 'components' in value\n )\n}\n\n/**\n * Convert a color component value to culori format\n * The \"none\" keyword becomes undefined (culori's representation of missing channels)\n */\nfunction componentToCulori(component: ColorComponent): number | undefined {\n return component === 'none' ? undefined : component\n}\n\n/**\n * Convert DTCG color object to culori color object\n * Handles all 14 DTCG color spaces and the \"none\" keyword\n */\nexport function dtcgObjectToCulori(color: ColorValueObject): CuloriColor {\n const [c1, c2, c3] = color.components.map(componentToCulori)\n const alpha = color.alpha !== undefined ? componentToCulori(color.alpha) : undefined\n\n // Normalize color space (case-insensitive, handle aliases)\n const colorSpace = color.colorSpace.toLowerCase() as Lowercase<ColorSpace>\n\n // Map DTCG color spaces to culori color objects with proper property names\n switch (colorSpace) {\n // RGB-based color spaces (components are R, G, B in 0-1 range)\n case 'srgb':\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n\n case 'srgb-linear':\n return { mode: 'lrgb', r: c1, g: c2, b: c3, alpha } as Lrgb\n\n case 'display-p3':\n return { mode: 'p3', r: c1, g: c2, b: c3, alpha } as P3\n\n case 'a98-rgb':\n return { mode: 'a98', r: c1, g: c2, b: c3, alpha } as A98\n\n case 'prophoto-rgb':\n return { mode: 'prophoto', r: c1, g: c2, b: c3, alpha } as Prophoto\n\n case 'rec2020':\n return { mode: 'rec2020', r: c1, g: c2, b: c3, alpha } as Rec2020\n\n // Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)\n case 'hsl':\n return { mode: 'hsl', h: c1, s: c2, l: c3, alpha } as Hsl\n\n case 'hwb':\n return { mode: 'hwb', h: c1, w: c2, b: c3, alpha } as Hwb\n\n // Lab color spaces (Lightness, a/b or Chroma/Hue)\n case 'lab':\n return { mode: 'lab', l: c1, a: c2, b: c3, alpha } as Lab\n\n case 'lch':\n return { mode: 'lch', l: c1, c: c2, h: c3, alpha } as Lch\n\n case 'oklab':\n return { mode: 'oklab', l: c1, a: c2, b: c3, alpha } as Oklab\n\n case 'oklch':\n return { mode: 'oklch', l: c1, c: c2, h: c3, alpha } as Oklch\n\n // XYZ color spaces\n case 'xyz-d65':\n return { mode: 'xyz65', x: c1, y: c2, z: c3, alpha } as Xyz65\n\n case 'xyz-d50':\n return { mode: 'xyz50', x: c1, y: c2, z: c3, alpha } as Xyz50\n\n // Fallback to sRGB if color space is not recognized\n default:\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n }\n}\n\n/**\n * Convert DTCG color object to hex string\n */\nexport function colorObjectToHex(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n const alpha = color.alpha ?? 1\n\n if (alpha < 1) {\n return formatHex8(culoriColor)\n }\n\n return formatHex(culoriColor)\n}\n","/**\n * @fileoverview Color format conversions that use culori's formatRgb / formatHsl\n * Split from color-converter to avoid pulling these into bundles that only need hex.\n */\n\nimport type { ColorValueObject } from '@lib/tokens/types'\nimport { formatRgb, formatHsl } from 'culori'\n\nimport { dtcgObjectToCulori } from './color-converter'\n\n/**\n * Convert DTCG color object to rgb/rgba string\n */\nexport function colorObjectToRgb(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatRgb(culoriColor)\n}\n\n/**\n * Convert DTCG color object to hsl/hsla string\n */\nexport function colorObjectToHsl(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatHsl(culoriColor)\n}\n","/**\n * @fileoverview Unified factory for creating color transforms\n * Handles both simple conversions and modern color space transformations\n */\n\nimport { ColorValue, ColorValueObject, ResolvedToken } from '@lib/tokens/types'\nimport { converter, formatCss, type Mode } from 'culori'\n\nimport { Transform } from '..'\n\nimport { dtcgObjectToCulori as convertDtcgToCulori, isColorObject } from './color-converter'\n\n/**\n * Convert DTCG color value to culori color object\n * Returns null if value is not a ColorValueObject (e.g., unresolved alias reference)\n */\nexport function dtcgObjectToCulori(value: ColorValue) {\n if (!isColorObject(value)) {\n return null\n }\n return convertDtcgToCulori(value)\n}\n\n/**\n * Create a simple color transform with direct string conversion\n * Used for basic color formats (hex, rgb, hsl)\n *\n * @param converter - Function to convert color object to string\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const hexTransform = createColorTransform('color:hex', colorObjectToHex)\n * ```\n */\nexport function createColorTransform(converter: (value: ColorValueObject) => string): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n if (!isColorObject(value)) {\n // String values should be alias references that get resolved before transforms\n return token\n }\n\n try {\n const converted = converter(value)\n return { ...token, $value: converted }\n } catch {\n // If conversion fails, return token unchanged\n return token\n }\n },\n }\n}\n\n/**\n * Create a modern color transform using culori converter\n * Used for CSS Color Module Level 4 color spaces (oklch, oklab, lch, lab, hwb)\n *\n * @param mode - Culori color mode to convert to\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const oklchTransform = createModernColorTransform('color:oklch', 'oklch')\n * ```\n */\nexport function createModernColorTransform(mode: Mode): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Convert to target color space\n const converted = converter(mode)(parsed)\n const formatted = formatCss(converted)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Built-in color value transforms with alpha channel support\n * Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms\n * Uses culori for accurate color conversions\n *\n * Note: Transforms only handle DTCG object format. String values are alias references\n * that must be resolved before transforms run.\n */\n\nimport type { ColorValue, ResolvedToken } from '@lib/tokens/types'\nimport { formatCss } from 'culori'\n\nimport type { Transform } from '../types'\n\nimport { colorObjectToHex } from './color-converter'\nimport { colorObjectToHsl, colorObjectToRgb } from './color-format'\nimport {\n createColorTransform,\n createModernColorTransform,\n dtcgObjectToCulori,\n} from './color-transform-factory'\n\n// ============================================================================\n// Standard Color Transforms (hex, rgb, hsl)\n// ============================================================================\n\n/**\n * Convert color to hex format (with alpha support via 8-digit hex)\n */\nexport function colorToHex(): Transform {\n return createColorTransform(colorObjectToHex)\n}\n\n/**\n * Convert color to rgb/rgba format (preserves alpha)\n */\nexport function colorToRgb(): Transform {\n return createColorTransform(colorObjectToRgb)\n}\n\n/**\n * Convert color to hsl/hsla format (preserves alpha)\n */\nexport function colorToHsl(): Transform {\n return createColorTransform(colorObjectToHsl)\n}\n\n// ============================================================================\n// Modern CSS Color Module Level 4 Transforms\n// ============================================================================\n\n/**\n * Convert color to oklch format (perceptual color space)\n */\nexport function colorToOklch(): Transform {\n return createModernColorTransform('oklch')\n}\n\n/**\n * Convert color to oklab format (perceptual color space)\n */\nexport function colorToOklab(): Transform {\n return createModernColorTransform('oklab')\n}\n\n/**\n * Convert color to lch format (CIELAB lightness-chroma-hue)\n */\nexport function colorToLch(): Transform {\n return createModernColorTransform('lch')\n}\n\n/**\n * Convert color to lab format (CIELAB)\n */\nexport function colorToLab(): Transform {\n return createModernColorTransform('lab')\n}\n\n/**\n * Convert color to hwb format (hue-whiteness-blackness)\n */\nexport function colorToHwb(): Transform {\n return createModernColorTransform('hwb')\n}\n\n/**\n * Convert color to CSS color() function format\n * Uses the original color space and formats as CSS color() function\n */\nexport function colorToColorFunction(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Format as color() function (preserves original color space)\n const formatted = formatCss(parsed)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Global constants\n */\n\n/**\n * Default maximum depth for alias resolution\n * Prevents infinite recursion in circular references\n */\nexport const DEFAULT_MAX_ALIAS_DEPTH = 10\n\n/**\n * Default base font size in pixels for rem/em conversions\n */\nexport const DEFAULT_BASE_FONT_SIZE_PX = 16\n","/**\n * @fileoverview Dimension format conversion utilities for DTCG 2025.10\n * Handles dimension object format { value: number, unit: string }\n */\n\nimport type { DimensionValue } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n/**\n * Check if a value is in dimension object format\n */\nexport function isDimensionObject(value: unknown): value is DimensionValue {\n return typeof value === 'object' && value !== null && 'value' in value && 'unit' in value\n}\n\n/**\n * Convert DTCG dimension object to CSS string\n */\nexport function dimensionObjectToString(dimension: DimensionValue): string {\n return `${dimension.value}${dimension.unit}`\n}\n\n/**\n * Convert a DTCG dimension object between units (px, rem).\n *\n * Converts via px as an intermediate: rem -> px -> target.\n * Returns the original value unchanged for unsupported unit combinations.\n *\n * @param value - Source dimension object\n * @param toUnit - Target CSS unit\n * @param baseFontSize - Base font size in px used for rem conversions\n */\nexport function convertDimension(\n value: DimensionValue,\n toUnit: DimensionValue['unit'],\n baseFontSize = DEFAULT_BASE_FONT_SIZE_PX,\n): DimensionValue {\n const fromUnit = value.unit\n let numValue = value.value\n\n // Convert to px first (as intermediate)\n if (fromUnit === 'rem') {\n numValue = numValue * baseFontSize\n } else if (fromUnit !== 'px' && fromUnit !== toUnit) {\n // If not px, rem, or em, and not already target unit, return as-is\n return value\n }\n\n // Convert from px to target unit\n if (toUnit === 'rem') {\n numValue = numValue / baseFontSize\n } else if (toUnit !== 'px') {\n // Can't convert to other units, return original\n return value\n }\n\n return {\n value: numValue,\n unit: toUnit,\n }\n}\n","/**\n * @fileoverview Built-in dimension value transforms\n * Handles DTCG 2025.10 object format { value: number, unit: string }\n * and converts to string format for output\n */\n\nimport type { DimensionValue, ResolvedToken } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n\nimport type { Transform } from '../types'\n\nimport { convertDimension, dimensionObjectToString, isDimensionObject } from './dimension-converter'\n/**\n * Convert dimension to px string format\n */\nexport function dimensionToPx(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to px\n if (isDimensionObject(value)) {\n const converted = convertDimension(value as DimensionValue, 'px', DEFAULT_BASE_FONT_SIZE_PX)\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Convert dimension to rem string format\n */\nexport function dimensionToRem(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to rem\n if (isDimensionObject(value)) {\n const converted = convertDimension(\n value as DimensionValue,\n 'rem',\n DEFAULT_BASE_FONT_SIZE_PX,\n )\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Unitless dimension (extract numeric value)\n */\nexport function dimensionToUnitless(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, parse out the number\n if (typeof value === 'string') {\n const num = parseFloat(value)\n return { ...token, $value: isNaN(num) ? value : num }\n }\n\n // Extract value from dimension object\n if (isDimensionObject(value)) {\n return { ...token, $value: (value as DimensionValue).value }\n }\n\n return token\n },\n }\n}\n","/**\n * @fileoverview Built-in name transforms using change-case library for robust case conversion\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\nimport { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert token name to camelCase\n */\nexport function nameCamelCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = camelCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to kebab-case\n */\nexport function nameKebabCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = kebabCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to snake_case\n */\nexport function nameSnakeCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = snakeCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to PascalCase\n */\nexport function namePascalCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = pascalCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to CONSTANT_CASE\n */\nexport function nameConstantCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = constantCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Add prefix to token name\n *\n * @example\n * ```typescript\n * // Add 'ds-' prefix to all token names\n * transforms: [namePrefix('ds-')]\n * // 'color.primary' becomes 'ds-color.primary'\n * ```\n */\nexport function namePrefix(prefix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${prefix}${token.name}`,\n }\n },\n }\n}\n\n/**\n * Add suffix to token name\n *\n * @example\n * ```typescript\n * // Add '-token' suffix to all token names\n * transforms: [nameSuffix('-token')]\n * // 'color.primary' becomes 'color.primary-token'\n * ```\n */\nexport function nameSuffix(suffix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${token.name}${suffix}`,\n }\n },\n }\n}\n\n/**\n * Convert token name to CSS custom property format (--name)\n */\nexport function nameCssVar(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const kebabName = token.path\n .map((part) => part.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase())\n .join('-')\n\n return {\n ...token,\n name: `--${kebabName}`,\n }\n },\n }\n}\n","/**\n * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert font weight to numeric value\n */\nexport function fontWeightToNumber(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'fontWeight',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n if (typeof value === 'number') {\n return token\n }\n\n if (typeof value === 'string') {\n const weightMap: Record<string, number> = {\n thin: 100,\n hairline: 100,\n 'extra-light': 200,\n 'ultra-light': 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n 'ultra-bold': 800,\n black: 900,\n heavy: 900,\n 'extra-black': 950,\n 'ultra-black': 950,\n }\n\n const weight = weightMap[value.toLowerCase()]\n if (weight !== undefined) {\n return { ...token, $value: weight }\n }\n }\n\n return token\n },\n }\n}\n\ntype DurationUnit = 'ms' | 's'\ntype ParsedDuration = { value: number; unit: DurationUnit }\n\n/** Parse a raw duration value (object or string form) into a normalized representation */\nfunction parseDuration(rawValue: unknown): ParsedDuration | null {\n if (\n typeof rawValue === 'object' &&\n rawValue !== null &&\n 'value' in rawValue &&\n 'unit' in rawValue\n ) {\n const unit = (rawValue as { unit: string }).unit\n const numeric = Number((rawValue as { value: unknown }).value)\n if (Number.isFinite(numeric) && (unit === 'ms' || unit === 's')) {\n return { value: numeric, unit }\n }\n return null\n }\n\n const str = typeof rawValue === 'string' || typeof rawValue === 'number' ? String(rawValue) : ''\n if (str.endsWith('ms')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 'ms' } : null\n }\n if (str.endsWith('s')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 's' } : null\n }\n\n return null\n}\n\n/** Convert a parsed duration to the target unit */\nfunction convertDurationUnit(parsed: ParsedDuration, target: DurationUnit): ParsedDuration {\n if (parsed.unit === target) {\n return parsed\n }\n return target === 'ms'\n ? { value: parsed.value * 1000, unit: 'ms' }\n : { value: parsed.value / 1000, unit: 's' }\n}\n\n/**\n * Convert duration to milliseconds\n */\nexport function durationToMs(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 'ms')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n\n/**\n * Convert duration to seconds\n */\nexport function durationToSeconds(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 's')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/processing/processors/transforms/built-in/color-converter.ts","../src/processing/processors/transforms/built-in/color-format.ts","../src/processing/processors/transforms/built-in/color-transform-factory.ts","../src/processing/processors/transforms/built-in/color-transforms.ts","../src/shared/constants.ts","../src/processing/processors/transforms/built-in/dimension-converter.ts","../src/processing/processors/transforms/built-in/dimension-transforms.ts","../src/processing/processors/transforms/built-in/name-transforms.ts","../src/processing/processors/transforms/built-in/other-transforms.ts"],"names":["formatHex8","formatHex","formatRgb","formatHsl","dtcgObjectToCulori","converter","formatCss","camelCase","kebabCase","snakeCase","pascalCase","constantCase"],"mappings":"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","file":"transforms.cjs","sourcesContent":["/**\n * @fileoverview Color format conversion utilities for DTCG 2025.10\n * Uses culori for accurate color science and conversions\n */\n\nimport type { ColorComponent, ColorSpace, ColorValueObject } from '@tokens/types'\nimport {\n formatHex,\n formatHex8,\n type Color as CuloriColor,\n type Rgb,\n type Lrgb,\n type Hsl,\n type Hwb,\n type Lab,\n type Lch,\n type Oklab,\n type Oklch,\n type P3,\n type A98,\n type Prophoto,\n type Rec2020,\n type Xyz65,\n type Xyz50,\n} from 'culori'\n\n/**\n * Check if a color value is in DTCG object format\n */\nexport function isColorObject(value: unknown): value is ColorValueObject {\n return (\n typeof value === 'object' && value !== null && 'colorSpace' in value && 'components' in value\n )\n}\n\n/**\n * Convert a color component value to culori format\n * The \"none\" keyword becomes undefined (culori's representation of missing channels)\n */\nfunction componentToCulori(component: ColorComponent): number | undefined {\n return component === 'none' ? undefined : component\n}\n\n/**\n * Convert DTCG color object to culori color object\n * Handles all 14 DTCG color spaces and the \"none\" keyword\n */\nexport function dtcgObjectToCulori(color: ColorValueObject): CuloriColor {\n const [c1, c2, c3] = color.components.map(componentToCulori)\n const alpha = color.alpha !== undefined ? componentToCulori(color.alpha) : undefined\n\n // Normalize color space (case-insensitive, handle aliases)\n const colorSpace = color.colorSpace.toLowerCase() as Lowercase<ColorSpace>\n\n // Map DTCG color spaces to culori color objects with proper property names\n switch (colorSpace) {\n // RGB-based color spaces (components are R, G, B in 0-1 range)\n case 'srgb':\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n\n case 'srgb-linear':\n return { mode: 'lrgb', r: c1, g: c2, b: c3, alpha } as Lrgb\n\n case 'display-p3':\n return { mode: 'p3', r: c1, g: c2, b: c3, alpha } as P3\n\n case 'a98-rgb':\n return { mode: 'a98', r: c1, g: c2, b: c3, alpha } as A98\n\n case 'prophoto-rgb':\n return { mode: 'prophoto', r: c1, g: c2, b: c3, alpha } as Prophoto\n\n case 'rec2020':\n return { mode: 'rec2020', r: c1, g: c2, b: c3, alpha } as Rec2020\n\n // Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)\n case 'hsl':\n return { mode: 'hsl', h: c1, s: c2, l: c3, alpha } as Hsl\n\n case 'hwb':\n return { mode: 'hwb', h: c1, w: c2, b: c3, alpha } as Hwb\n\n // Lab color spaces (Lightness, a/b or Chroma/Hue)\n case 'lab':\n return { mode: 'lab', l: c1, a: c2, b: c3, alpha } as Lab\n\n case 'lch':\n return { mode: 'lch', l: c1, c: c2, h: c3, alpha } as Lch\n\n case 'oklab':\n return { mode: 'oklab', l: c1, a: c2, b: c3, alpha } as Oklab\n\n case 'oklch':\n return { mode: 'oklch', l: c1, c: c2, h: c3, alpha } as Oklch\n\n // XYZ color spaces\n case 'xyz-d65':\n return { mode: 'xyz65', x: c1, y: c2, z: c3, alpha } as Xyz65\n\n case 'xyz-d50':\n return { mode: 'xyz50', x: c1, y: c2, z: c3, alpha } as Xyz50\n\n // Fallback to sRGB if color space is not recognized\n default:\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n }\n}\n\n/**\n * Convert DTCG color object to hex string\n */\nexport function colorObjectToHex(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n const alpha = color.alpha ?? 1\n\n if (alpha < 1) {\n return formatHex8(culoriColor)\n }\n\n return formatHex(culoriColor)\n}\n","/**\n * @fileoverview Color format conversions that use culori's formatRgb / formatHsl\n * Split from color-converter to avoid pulling these into bundles that only need hex.\n */\n\nimport type { ColorValueObject } from '@tokens/types'\nimport { formatRgb, formatHsl } from 'culori'\n\nimport { dtcgObjectToCulori } from './color-converter'\n\n/**\n * Convert DTCG color object to rgb/rgba string\n */\nexport function colorObjectToRgb(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatRgb(culoriColor)\n}\n\n/**\n * Convert DTCG color object to hsl/hsla string\n */\nexport function colorObjectToHsl(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatHsl(culoriColor)\n}\n","/**\n * @fileoverview Unified factory for creating color transforms\n * Handles both simple conversions and modern color space transformations\n */\n\nimport { ColorValue, ColorValueObject, ResolvedToken } from '@tokens/types'\nimport { converter, formatCss, type Mode } from 'culori'\n\nimport { Transform } from '..'\n\nimport { dtcgObjectToCulori as convertDtcgToCulori, isColorObject } from './color-converter'\n\n/**\n * Convert DTCG color value to culori color object\n * Returns null if value is not a ColorValueObject (e.g., unresolved alias reference)\n */\nexport function dtcgObjectToCulori(value: ColorValue) {\n if (!isColorObject(value)) {\n return null\n }\n return convertDtcgToCulori(value)\n}\n\n/**\n * Create a simple color transform with direct string conversion\n * Used for basic color formats (hex, rgb, hsl)\n *\n * @param converter - Function to convert color object to string\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const hexTransform = createColorTransform('color:hex', colorObjectToHex)\n * ```\n */\nexport function createColorTransform(converter: (value: ColorValueObject) => string): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n if (!isColorObject(value)) {\n // String values should be alias references that get resolved before transforms\n return token\n }\n\n try {\n const converted = converter(value)\n return { ...token, $value: converted }\n } catch {\n // If conversion fails, return token unchanged\n return token\n }\n },\n }\n}\n\n/**\n * Create a modern color transform using culori converter\n * Used for CSS Color Module Level 4 color spaces (oklch, oklab, lch, lab, hwb)\n *\n * @param mode - Culori color mode to convert to\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const oklchTransform = createModernColorTransform('color:oklch', 'oklch')\n * ```\n */\nexport function createModernColorTransform(mode: Mode): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Convert to target color space\n const converted = converter(mode)(parsed)\n const formatted = formatCss(converted)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Built-in color value transforms with alpha channel support\n * Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms\n * Uses culori for accurate color conversions\n *\n * Note: Transforms only handle DTCG object format. String values are alias references\n * that must be resolved before transforms run.\n */\n\nimport type { ColorValue, ResolvedToken } from '@tokens/types'\nimport { formatCss } from 'culori'\n\nimport type { Transform } from '../types'\n\nimport { colorObjectToHex } from './color-converter'\nimport { colorObjectToHsl, colorObjectToRgb } from './color-format'\nimport {\n createColorTransform,\n createModernColorTransform,\n dtcgObjectToCulori,\n} from './color-transform-factory'\n\n// ============================================================================\n// Standard Color Transforms (hex, rgb, hsl)\n// ============================================================================\n\n/**\n * Convert color to hex format (with alpha support via 8-digit hex)\n */\nexport function colorToHex(): Transform {\n return createColorTransform(colorObjectToHex)\n}\n\n/**\n * Convert color to rgb/rgba format (preserves alpha)\n */\nexport function colorToRgb(): Transform {\n return createColorTransform(colorObjectToRgb)\n}\n\n/**\n * Convert color to hsl/hsla format (preserves alpha)\n */\nexport function colorToHsl(): Transform {\n return createColorTransform(colorObjectToHsl)\n}\n\n// ============================================================================\n// Modern CSS Color Module Level 4 Transforms\n// ============================================================================\n\n/**\n * Convert color to oklch format (perceptual color space)\n */\nexport function colorToOklch(): Transform {\n return createModernColorTransform('oklch')\n}\n\n/**\n * Convert color to oklab format (perceptual color space)\n */\nexport function colorToOklab(): Transform {\n return createModernColorTransform('oklab')\n}\n\n/**\n * Convert color to lch format (CIELAB lightness-chroma-hue)\n */\nexport function colorToLch(): Transform {\n return createModernColorTransform('lch')\n}\n\n/**\n * Convert color to lab format (CIELAB)\n */\nexport function colorToLab(): Transform {\n return createModernColorTransform('lab')\n}\n\n/**\n * Convert color to hwb format (hue-whiteness-blackness)\n */\nexport function colorToHwb(): Transform {\n return createModernColorTransform('hwb')\n}\n\n/**\n * Convert color to CSS color() function format\n * Uses the original color space and formats as CSS color() function\n */\nexport function colorToColorFunction(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Format as color() function (preserves original color space)\n const formatted = formatCss(parsed)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Global constants\n */\n\n/**\n * Default maximum depth for alias resolution\n * Prevents infinite recursion in circular references\n */\nexport const DEFAULT_MAX_ALIAS_DEPTH = 10\n\n/**\n * Default base font size in pixels for rem/em conversions\n */\nexport const DEFAULT_BASE_FONT_SIZE_PX = 16\n","/**\n * @fileoverview Dimension format conversion utilities for DTCG 2025.10\n * Handles dimension object format { value: number, unit: string }\n */\n\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\nimport type { DimensionValue } from '@tokens/types'\n/**\n * Check if a value is in dimension object format\n */\nexport function isDimensionObject(value: unknown): value is DimensionValue {\n return typeof value === 'object' && value !== null && 'value' in value && 'unit' in value\n}\n\n/**\n * Convert DTCG dimension object to CSS string\n */\nexport function dimensionObjectToString(dimension: DimensionValue): string {\n return `${dimension.value}${dimension.unit}`\n}\n\n/**\n * Convert a DTCG dimension object between units (px, rem).\n *\n * Converts via px as an intermediate: rem -> px -> target.\n * Returns the original value unchanged for unsupported unit combinations.\n *\n * @param value - Source dimension object\n * @param toUnit - Target CSS unit\n * @param baseFontSize - Base font size in px used for rem conversions\n */\nexport function convertDimension(\n value: DimensionValue,\n toUnit: DimensionValue['unit'],\n baseFontSize = DEFAULT_BASE_FONT_SIZE_PX,\n): DimensionValue {\n const fromUnit = value.unit\n let numValue = value.value\n\n // Convert to px first (as intermediate)\n if (fromUnit === 'rem') {\n numValue = numValue * baseFontSize\n } else if (fromUnit !== 'px' && fromUnit !== toUnit) {\n // If not px, rem, or em, and not already target unit, return as-is\n return value\n }\n\n // Convert from px to target unit\n if (toUnit === 'rem') {\n numValue = numValue / baseFontSize\n } else if (toUnit !== 'px') {\n // Can't convert to other units, return original\n return value\n }\n\n return {\n value: numValue,\n unit: toUnit,\n }\n}\n","/**\n * @fileoverview Built-in dimension value transforms\n * Handles DTCG 2025.10 object format { value: number, unit: string }\n * and converts to string format for output\n */\n\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\nimport type { DimensionValue, ResolvedToken } from '@tokens/types'\n\nimport type { Transform } from '../types'\n\nimport { convertDimension, dimensionObjectToString, isDimensionObject } from './dimension-converter'\n/**\n * Convert dimension to px string format\n */\nexport function dimensionToPx(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to px\n if (isDimensionObject(value)) {\n const converted = convertDimension(value as DimensionValue, 'px', DEFAULT_BASE_FONT_SIZE_PX)\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Convert dimension to rem string format\n */\nexport function dimensionToRem(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to rem\n if (isDimensionObject(value)) {\n const converted = convertDimension(\n value as DimensionValue,\n 'rem',\n DEFAULT_BASE_FONT_SIZE_PX,\n )\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Unitless dimension (extract numeric value)\n */\nexport function dimensionToUnitless(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, parse out the number\n if (typeof value === 'string') {\n const num = parseFloat(value)\n return { ...token, $value: isNaN(num) ? value : num }\n }\n\n // Extract value from dimension object\n if (isDimensionObject(value)) {\n return { ...token, $value: (value as DimensionValue).value }\n }\n\n return token\n },\n }\n}\n","/**\n * @fileoverview Built-in name transforms using change-case library for robust case conversion\n */\n\nimport { ResolvedToken } from '@tokens/types'\nimport { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert token name to camelCase\n */\nexport function nameCamelCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = camelCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to kebab-case\n */\nexport function nameKebabCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = kebabCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to snake_case\n */\nexport function nameSnakeCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = snakeCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to PascalCase\n */\nexport function namePascalCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = pascalCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to CONSTANT_CASE\n */\nexport function nameConstantCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = constantCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Add prefix to token name\n *\n * @example\n * ```typescript\n * // Add 'ds-' prefix to all token names\n * transforms: [namePrefix('ds-')]\n * // 'color.primary' becomes 'ds-color.primary'\n * ```\n */\nexport function namePrefix(prefix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${prefix}${token.name}`,\n }\n },\n }\n}\n\n/**\n * Add suffix to token name\n *\n * @example\n * ```typescript\n * // Add '-token' suffix to all token names\n * transforms: [nameSuffix('-token')]\n * // 'color.primary' becomes 'color.primary-token'\n * ```\n */\nexport function nameSuffix(suffix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${token.name}${suffix}`,\n }\n },\n }\n}\n\n/**\n * Convert token name to CSS custom property format (--name)\n */\nexport function nameCssVar(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const kebabName = token.path\n .map((part) => part.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase())\n .join('-')\n\n return {\n ...token,\n name: `--${kebabName}`,\n }\n },\n }\n}\n","/**\n * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@tokens/types'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert font weight to numeric value\n */\nexport function fontWeightToNumber(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'fontWeight',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n if (typeof value === 'number') {\n return token\n }\n\n if (typeof value === 'string') {\n const weightMap: Record<string, number> = {\n thin: 100,\n hairline: 100,\n 'extra-light': 200,\n 'ultra-light': 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n 'ultra-bold': 800,\n black: 900,\n heavy: 900,\n 'extra-black': 950,\n 'ultra-black': 950,\n }\n\n const weight = weightMap[value.toLowerCase()]\n if (weight !== undefined) {\n return { ...token, $value: weight }\n }\n }\n\n return token\n },\n }\n}\n\ntype DurationUnit = 'ms' | 's'\ntype ParsedDuration = { value: number; unit: DurationUnit }\n\n/** Parse a raw duration value (object or string form) into a normalized representation */\nfunction parseDuration(rawValue: unknown): ParsedDuration | null {\n if (\n typeof rawValue === 'object' &&\n rawValue !== null &&\n 'value' in rawValue &&\n 'unit' in rawValue\n ) {\n const unit = (rawValue as { unit: string }).unit\n const numeric = Number((rawValue as { value: unknown }).value)\n if (Number.isFinite(numeric) && (unit === 'ms' || unit === 's')) {\n return { value: numeric, unit }\n }\n return null\n }\n\n const str = typeof rawValue === 'string' || typeof rawValue === 'number' ? String(rawValue) : ''\n if (str.endsWith('ms')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 'ms' } : null\n }\n if (str.endsWith('s')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 's' } : null\n }\n\n return null\n}\n\n/** Convert a parsed duration to the target unit */\nfunction convertDurationUnit(parsed: ParsedDuration, target: DurationUnit): ParsedDuration {\n if (parsed.unit === target) {\n return parsed\n }\n return target === 'ms'\n ? { value: parsed.value * 1000, unit: 'ms' }\n : { value: parsed.value / 1000, unit: 's' }\n}\n\n/**\n * Convert duration to milliseconds\n */\nexport function durationToMs(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 'ms')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n\n/**\n * Convert duration to seconds\n */\nexport function durationToSeconds(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 's')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n"]}
|
package/dist/transforms.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatCss, converter, formatHex8, formatHex, formatRgb, formatHsl } from 'culori';
|
|
2
2
|
import { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case';
|
|
3
3
|
|
|
4
|
-
// src/
|
|
4
|
+
// src/processing/processors/transforms/built-in/color-transforms.ts
|
|
5
5
|
function isColorObject(value) {
|
|
6
6
|
return typeof value === "object" && value !== null && "colorSpace" in value && "components" in value;
|
|
7
7
|
}
|
|
@@ -112,7 +112,7 @@ function createModernColorTransform(mode) {
|
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
// src/
|
|
115
|
+
// src/processing/processors/transforms/built-in/color-transforms.ts
|
|
116
116
|
function colorToHex() {
|
|
117
117
|
return createColorTransform(colorObjectToHex);
|
|
118
118
|
}
|
|
@@ -162,7 +162,7 @@ function colorToColorFunction() {
|
|
|
162
162
|
// src/shared/constants.ts
|
|
163
163
|
var DEFAULT_BASE_FONT_SIZE_PX = 16;
|
|
164
164
|
|
|
165
|
-
// src/
|
|
165
|
+
// src/processing/processors/transforms/built-in/dimension-converter.ts
|
|
166
166
|
function isDimensionObject(value) {
|
|
167
167
|
return typeof value === "object" && value !== null && "value" in value && "unit" in value;
|
|
168
168
|
}
|
|
@@ -188,7 +188,7 @@ function convertDimension(value, toUnit, baseFontSize = DEFAULT_BASE_FONT_SIZE_P
|
|
|
188
188
|
};
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
// src/
|
|
191
|
+
// src/processing/processors/transforms/built-in/dimension-transforms.ts
|
|
192
192
|
function dimensionToPx() {
|
|
193
193
|
return {
|
|
194
194
|
matcher: (token) => token.$type === "dimension",
|
|
@@ -328,7 +328,7 @@ function nameCssVar() {
|
|
|
328
328
|
};
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
-
// src/
|
|
331
|
+
// src/processing/processors/transforms/built-in/other-transforms.ts
|
|
332
332
|
function fontWeightToNumber() {
|
|
333
333
|
return {
|
|
334
334
|
matcher: (token) => token.$type === "fontWeight",
|
package/dist/transforms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/processing/processors/transforms/built-in/color-converter.ts","../src/lib/processing/processors/transforms/built-in/color-format.ts","../src/lib/processing/processors/transforms/built-in/color-transform-factory.ts","../src/lib/processing/processors/transforms/built-in/color-transforms.ts","../src/shared/constants.ts","../src/lib/processing/processors/transforms/built-in/dimension-converter.ts","../src/lib/processing/processors/transforms/built-in/dimension-transforms.ts","../src/lib/processing/processors/transforms/built-in/name-transforms.ts","../src/lib/processing/processors/transforms/built-in/other-transforms.ts"],"names":["dtcgObjectToCulori","converter","formatCss"],"mappings":"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","file":"transforms.js","sourcesContent":["/**\n * @fileoverview Color format conversion utilities for DTCG 2025.10\n * Uses culori for accurate color science and conversions\n */\n\nimport type { ColorComponent, ColorSpace, ColorValueObject } from '@lib/tokens/types'\nimport {\n formatHex,\n formatHex8,\n type Color as CuloriColor,\n type Rgb,\n type Lrgb,\n type Hsl,\n type Hwb,\n type Lab,\n type Lch,\n type Oklab,\n type Oklch,\n type P3,\n type A98,\n type Prophoto,\n type Rec2020,\n type Xyz65,\n type Xyz50,\n} from 'culori'\n\n/**\n * Check if a color value is in DTCG object format\n */\nexport function isColorObject(value: unknown): value is ColorValueObject {\n return (\n typeof value === 'object' && value !== null && 'colorSpace' in value && 'components' in value\n )\n}\n\n/**\n * Convert a color component value to culori format\n * The \"none\" keyword becomes undefined (culori's representation of missing channels)\n */\nfunction componentToCulori(component: ColorComponent): number | undefined {\n return component === 'none' ? undefined : component\n}\n\n/**\n * Convert DTCG color object to culori color object\n * Handles all 14 DTCG color spaces and the \"none\" keyword\n */\nexport function dtcgObjectToCulori(color: ColorValueObject): CuloriColor {\n const [c1, c2, c3] = color.components.map(componentToCulori)\n const alpha = color.alpha !== undefined ? componentToCulori(color.alpha) : undefined\n\n // Normalize color space (case-insensitive, handle aliases)\n const colorSpace = color.colorSpace.toLowerCase() as Lowercase<ColorSpace>\n\n // Map DTCG color spaces to culori color objects with proper property names\n switch (colorSpace) {\n // RGB-based color spaces (components are R, G, B in 0-1 range)\n case 'srgb':\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n\n case 'srgb-linear':\n return { mode: 'lrgb', r: c1, g: c2, b: c3, alpha } as Lrgb\n\n case 'display-p3':\n return { mode: 'p3', r: c1, g: c2, b: c3, alpha } as P3\n\n case 'a98-rgb':\n return { mode: 'a98', r: c1, g: c2, b: c3, alpha } as A98\n\n case 'prophoto-rgb':\n return { mode: 'prophoto', r: c1, g: c2, b: c3, alpha } as Prophoto\n\n case 'rec2020':\n return { mode: 'rec2020', r: c1, g: c2, b: c3, alpha } as Rec2020\n\n // Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)\n case 'hsl':\n return { mode: 'hsl', h: c1, s: c2, l: c3, alpha } as Hsl\n\n case 'hwb':\n return { mode: 'hwb', h: c1, w: c2, b: c3, alpha } as Hwb\n\n // Lab color spaces (Lightness, a/b or Chroma/Hue)\n case 'lab':\n return { mode: 'lab', l: c1, a: c2, b: c3, alpha } as Lab\n\n case 'lch':\n return { mode: 'lch', l: c1, c: c2, h: c3, alpha } as Lch\n\n case 'oklab':\n return { mode: 'oklab', l: c1, a: c2, b: c3, alpha } as Oklab\n\n case 'oklch':\n return { mode: 'oklch', l: c1, c: c2, h: c3, alpha } as Oklch\n\n // XYZ color spaces\n case 'xyz-d65':\n return { mode: 'xyz65', x: c1, y: c2, z: c3, alpha } as Xyz65\n\n case 'xyz-d50':\n return { mode: 'xyz50', x: c1, y: c2, z: c3, alpha } as Xyz50\n\n // Fallback to sRGB if color space is not recognized\n default:\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n }\n}\n\n/**\n * Convert DTCG color object to hex string\n */\nexport function colorObjectToHex(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n const alpha = color.alpha ?? 1\n\n if (alpha < 1) {\n return formatHex8(culoriColor)\n }\n\n return formatHex(culoriColor)\n}\n","/**\n * @fileoverview Color format conversions that use culori's formatRgb / formatHsl\n * Split from color-converter to avoid pulling these into bundles that only need hex.\n */\n\nimport type { ColorValueObject } from '@lib/tokens/types'\nimport { formatRgb, formatHsl } from 'culori'\n\nimport { dtcgObjectToCulori } from './color-converter'\n\n/**\n * Convert DTCG color object to rgb/rgba string\n */\nexport function colorObjectToRgb(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatRgb(culoriColor)\n}\n\n/**\n * Convert DTCG color object to hsl/hsla string\n */\nexport function colorObjectToHsl(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatHsl(culoriColor)\n}\n","/**\n * @fileoverview Unified factory for creating color transforms\n * Handles both simple conversions and modern color space transformations\n */\n\nimport { ColorValue, ColorValueObject, ResolvedToken } from '@lib/tokens/types'\nimport { converter, formatCss, type Mode } from 'culori'\n\nimport { Transform } from '..'\n\nimport { dtcgObjectToCulori as convertDtcgToCulori, isColorObject } from './color-converter'\n\n/**\n * Convert DTCG color value to culori color object\n * Returns null if value is not a ColorValueObject (e.g., unresolved alias reference)\n */\nexport function dtcgObjectToCulori(value: ColorValue) {\n if (!isColorObject(value)) {\n return null\n }\n return convertDtcgToCulori(value)\n}\n\n/**\n * Create a simple color transform with direct string conversion\n * Used for basic color formats (hex, rgb, hsl)\n *\n * @param converter - Function to convert color object to string\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const hexTransform = createColorTransform('color:hex', colorObjectToHex)\n * ```\n */\nexport function createColorTransform(converter: (value: ColorValueObject) => string): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n if (!isColorObject(value)) {\n // String values should be alias references that get resolved before transforms\n return token\n }\n\n try {\n const converted = converter(value)\n return { ...token, $value: converted }\n } catch {\n // If conversion fails, return token unchanged\n return token\n }\n },\n }\n}\n\n/**\n * Create a modern color transform using culori converter\n * Used for CSS Color Module Level 4 color spaces (oklch, oklab, lch, lab, hwb)\n *\n * @param mode - Culori color mode to convert to\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const oklchTransform = createModernColorTransform('color:oklch', 'oklch')\n * ```\n */\nexport function createModernColorTransform(mode: Mode): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Convert to target color space\n const converted = converter(mode)(parsed)\n const formatted = formatCss(converted)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Built-in color value transforms with alpha channel support\n * Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms\n * Uses culori for accurate color conversions\n *\n * Note: Transforms only handle DTCG object format. String values are alias references\n * that must be resolved before transforms run.\n */\n\nimport type { ColorValue, ResolvedToken } from '@lib/tokens/types'\nimport { formatCss } from 'culori'\n\nimport type { Transform } from '../types'\n\nimport { colorObjectToHex } from './color-converter'\nimport { colorObjectToHsl, colorObjectToRgb } from './color-format'\nimport {\n createColorTransform,\n createModernColorTransform,\n dtcgObjectToCulori,\n} from './color-transform-factory'\n\n// ============================================================================\n// Standard Color Transforms (hex, rgb, hsl)\n// ============================================================================\n\n/**\n * Convert color to hex format (with alpha support via 8-digit hex)\n */\nexport function colorToHex(): Transform {\n return createColorTransform(colorObjectToHex)\n}\n\n/**\n * Convert color to rgb/rgba format (preserves alpha)\n */\nexport function colorToRgb(): Transform {\n return createColorTransform(colorObjectToRgb)\n}\n\n/**\n * Convert color to hsl/hsla format (preserves alpha)\n */\nexport function colorToHsl(): Transform {\n return createColorTransform(colorObjectToHsl)\n}\n\n// ============================================================================\n// Modern CSS Color Module Level 4 Transforms\n// ============================================================================\n\n/**\n * Convert color to oklch format (perceptual color space)\n */\nexport function colorToOklch(): Transform {\n return createModernColorTransform('oklch')\n}\n\n/**\n * Convert color to oklab format (perceptual color space)\n */\nexport function colorToOklab(): Transform {\n return createModernColorTransform('oklab')\n}\n\n/**\n * Convert color to lch format (CIELAB lightness-chroma-hue)\n */\nexport function colorToLch(): Transform {\n return createModernColorTransform('lch')\n}\n\n/**\n * Convert color to lab format (CIELAB)\n */\nexport function colorToLab(): Transform {\n return createModernColorTransform('lab')\n}\n\n/**\n * Convert color to hwb format (hue-whiteness-blackness)\n */\nexport function colorToHwb(): Transform {\n return createModernColorTransform('hwb')\n}\n\n/**\n * Convert color to CSS color() function format\n * Uses the original color space and formats as CSS color() function\n */\nexport function colorToColorFunction(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Format as color() function (preserves original color space)\n const formatted = formatCss(parsed)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Global constants\n */\n\n/**\n * Default maximum depth for alias resolution\n * Prevents infinite recursion in circular references\n */\nexport const DEFAULT_MAX_ALIAS_DEPTH = 10\n\n/**\n * Default base font size in pixels for rem/em conversions\n */\nexport const DEFAULT_BASE_FONT_SIZE_PX = 16\n","/**\n * @fileoverview Dimension format conversion utilities for DTCG 2025.10\n * Handles dimension object format { value: number, unit: string }\n */\n\nimport type { DimensionValue } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n/**\n * Check if a value is in dimension object format\n */\nexport function isDimensionObject(value: unknown): value is DimensionValue {\n return typeof value === 'object' && value !== null && 'value' in value && 'unit' in value\n}\n\n/**\n * Convert DTCG dimension object to CSS string\n */\nexport function dimensionObjectToString(dimension: DimensionValue): string {\n return `${dimension.value}${dimension.unit}`\n}\n\n/**\n * Convert a DTCG dimension object between units (px, rem).\n *\n * Converts via px as an intermediate: rem -> px -> target.\n * Returns the original value unchanged for unsupported unit combinations.\n *\n * @param value - Source dimension object\n * @param toUnit - Target CSS unit\n * @param baseFontSize - Base font size in px used for rem conversions\n */\nexport function convertDimension(\n value: DimensionValue,\n toUnit: DimensionValue['unit'],\n baseFontSize = DEFAULT_BASE_FONT_SIZE_PX,\n): DimensionValue {\n const fromUnit = value.unit\n let numValue = value.value\n\n // Convert to px first (as intermediate)\n if (fromUnit === 'rem') {\n numValue = numValue * baseFontSize\n } else if (fromUnit !== 'px' && fromUnit !== toUnit) {\n // If not px, rem, or em, and not already target unit, return as-is\n return value\n }\n\n // Convert from px to target unit\n if (toUnit === 'rem') {\n numValue = numValue / baseFontSize\n } else if (toUnit !== 'px') {\n // Can't convert to other units, return original\n return value\n }\n\n return {\n value: numValue,\n unit: toUnit,\n }\n}\n","/**\n * @fileoverview Built-in dimension value transforms\n * Handles DTCG 2025.10 object format { value: number, unit: string }\n * and converts to string format for output\n */\n\nimport type { DimensionValue, ResolvedToken } from '@lib/tokens/types'\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\n\nimport type { Transform } from '../types'\n\nimport { convertDimension, dimensionObjectToString, isDimensionObject } from './dimension-converter'\n/**\n * Convert dimension to px string format\n */\nexport function dimensionToPx(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to px\n if (isDimensionObject(value)) {\n const converted = convertDimension(value as DimensionValue, 'px', DEFAULT_BASE_FONT_SIZE_PX)\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Convert dimension to rem string format\n */\nexport function dimensionToRem(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to rem\n if (isDimensionObject(value)) {\n const converted = convertDimension(\n value as DimensionValue,\n 'rem',\n DEFAULT_BASE_FONT_SIZE_PX,\n )\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Unitless dimension (extract numeric value)\n */\nexport function dimensionToUnitless(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, parse out the number\n if (typeof value === 'string') {\n const num = parseFloat(value)\n return { ...token, $value: isNaN(num) ? value : num }\n }\n\n // Extract value from dimension object\n if (isDimensionObject(value)) {\n return { ...token, $value: (value as DimensionValue).value }\n }\n\n return token\n },\n }\n}\n","/**\n * @fileoverview Built-in name transforms using change-case library for robust case conversion\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\nimport { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert token name to camelCase\n */\nexport function nameCamelCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = camelCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to kebab-case\n */\nexport function nameKebabCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = kebabCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to snake_case\n */\nexport function nameSnakeCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = snakeCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to PascalCase\n */\nexport function namePascalCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = pascalCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to CONSTANT_CASE\n */\nexport function nameConstantCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = constantCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Add prefix to token name\n *\n * @example\n * ```typescript\n * // Add 'ds-' prefix to all token names\n * transforms: [namePrefix('ds-')]\n * // 'color.primary' becomes 'ds-color.primary'\n * ```\n */\nexport function namePrefix(prefix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${prefix}${token.name}`,\n }\n },\n }\n}\n\n/**\n * Add suffix to token name\n *\n * @example\n * ```typescript\n * // Add '-token' suffix to all token names\n * transforms: [nameSuffix('-token')]\n * // 'color.primary' becomes 'color.primary-token'\n * ```\n */\nexport function nameSuffix(suffix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${token.name}${suffix}`,\n }\n },\n }\n}\n\n/**\n * Convert token name to CSS custom property format (--name)\n */\nexport function nameCssVar(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const kebabName = token.path\n .map((part) => part.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase())\n .join('-')\n\n return {\n ...token,\n name: `--${kebabName}`,\n }\n },\n }\n}\n","/**\n * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@lib/tokens/types'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert font weight to numeric value\n */\nexport function fontWeightToNumber(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'fontWeight',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n if (typeof value === 'number') {\n return token\n }\n\n if (typeof value === 'string') {\n const weightMap: Record<string, number> = {\n thin: 100,\n hairline: 100,\n 'extra-light': 200,\n 'ultra-light': 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n 'ultra-bold': 800,\n black: 900,\n heavy: 900,\n 'extra-black': 950,\n 'ultra-black': 950,\n }\n\n const weight = weightMap[value.toLowerCase()]\n if (weight !== undefined) {\n return { ...token, $value: weight }\n }\n }\n\n return token\n },\n }\n}\n\ntype DurationUnit = 'ms' | 's'\ntype ParsedDuration = { value: number; unit: DurationUnit }\n\n/** Parse a raw duration value (object or string form) into a normalized representation */\nfunction parseDuration(rawValue: unknown): ParsedDuration | null {\n if (\n typeof rawValue === 'object' &&\n rawValue !== null &&\n 'value' in rawValue &&\n 'unit' in rawValue\n ) {\n const unit = (rawValue as { unit: string }).unit\n const numeric = Number((rawValue as { value: unknown }).value)\n if (Number.isFinite(numeric) && (unit === 'ms' || unit === 's')) {\n return { value: numeric, unit }\n }\n return null\n }\n\n const str = typeof rawValue === 'string' || typeof rawValue === 'number' ? String(rawValue) : ''\n if (str.endsWith('ms')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 'ms' } : null\n }\n if (str.endsWith('s')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 's' } : null\n }\n\n return null\n}\n\n/** Convert a parsed duration to the target unit */\nfunction convertDurationUnit(parsed: ParsedDuration, target: DurationUnit): ParsedDuration {\n if (parsed.unit === target) {\n return parsed\n }\n return target === 'ms'\n ? { value: parsed.value * 1000, unit: 'ms' }\n : { value: parsed.value / 1000, unit: 's' }\n}\n\n/**\n * Convert duration to milliseconds\n */\nexport function durationToMs(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 'ms')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n\n/**\n * Convert duration to seconds\n */\nexport function durationToSeconds(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 's')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/processing/processors/transforms/built-in/color-converter.ts","../src/processing/processors/transforms/built-in/color-format.ts","../src/processing/processors/transforms/built-in/color-transform-factory.ts","../src/processing/processors/transforms/built-in/color-transforms.ts","../src/shared/constants.ts","../src/processing/processors/transforms/built-in/dimension-converter.ts","../src/processing/processors/transforms/built-in/dimension-transforms.ts","../src/processing/processors/transforms/built-in/name-transforms.ts","../src/processing/processors/transforms/built-in/other-transforms.ts"],"names":["dtcgObjectToCulori","converter","formatCss"],"mappings":"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","file":"transforms.js","sourcesContent":["/**\n * @fileoverview Color format conversion utilities for DTCG 2025.10\n * Uses culori for accurate color science and conversions\n */\n\nimport type { ColorComponent, ColorSpace, ColorValueObject } from '@tokens/types'\nimport {\n formatHex,\n formatHex8,\n type Color as CuloriColor,\n type Rgb,\n type Lrgb,\n type Hsl,\n type Hwb,\n type Lab,\n type Lch,\n type Oklab,\n type Oklch,\n type P3,\n type A98,\n type Prophoto,\n type Rec2020,\n type Xyz65,\n type Xyz50,\n} from 'culori'\n\n/**\n * Check if a color value is in DTCG object format\n */\nexport function isColorObject(value: unknown): value is ColorValueObject {\n return (\n typeof value === 'object' && value !== null && 'colorSpace' in value && 'components' in value\n )\n}\n\n/**\n * Convert a color component value to culori format\n * The \"none\" keyword becomes undefined (culori's representation of missing channels)\n */\nfunction componentToCulori(component: ColorComponent): number | undefined {\n return component === 'none' ? undefined : component\n}\n\n/**\n * Convert DTCG color object to culori color object\n * Handles all 14 DTCG color spaces and the \"none\" keyword\n */\nexport function dtcgObjectToCulori(color: ColorValueObject): CuloriColor {\n const [c1, c2, c3] = color.components.map(componentToCulori)\n const alpha = color.alpha !== undefined ? componentToCulori(color.alpha) : undefined\n\n // Normalize color space (case-insensitive, handle aliases)\n const colorSpace = color.colorSpace.toLowerCase() as Lowercase<ColorSpace>\n\n // Map DTCG color spaces to culori color objects with proper property names\n switch (colorSpace) {\n // RGB-based color spaces (components are R, G, B in 0-1 range)\n case 'srgb':\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n\n case 'srgb-linear':\n return { mode: 'lrgb', r: c1, g: c2, b: c3, alpha } as Lrgb\n\n case 'display-p3':\n return { mode: 'p3', r: c1, g: c2, b: c3, alpha } as P3\n\n case 'a98-rgb':\n return { mode: 'a98', r: c1, g: c2, b: c3, alpha } as A98\n\n case 'prophoto-rgb':\n return { mode: 'prophoto', r: c1, g: c2, b: c3, alpha } as Prophoto\n\n case 'rec2020':\n return { mode: 'rec2020', r: c1, g: c2, b: c3, alpha } as Rec2020\n\n // Cylindrical color spaces (Hue, Saturation/Whiteness, Lightness/Blackness)\n case 'hsl':\n return { mode: 'hsl', h: c1, s: c2, l: c3, alpha } as Hsl\n\n case 'hwb':\n return { mode: 'hwb', h: c1, w: c2, b: c3, alpha } as Hwb\n\n // Lab color spaces (Lightness, a/b or Chroma/Hue)\n case 'lab':\n return { mode: 'lab', l: c1, a: c2, b: c3, alpha } as Lab\n\n case 'lch':\n return { mode: 'lch', l: c1, c: c2, h: c3, alpha } as Lch\n\n case 'oklab':\n return { mode: 'oklab', l: c1, a: c2, b: c3, alpha } as Oklab\n\n case 'oklch':\n return { mode: 'oklch', l: c1, c: c2, h: c3, alpha } as Oklch\n\n // XYZ color spaces\n case 'xyz-d65':\n return { mode: 'xyz65', x: c1, y: c2, z: c3, alpha } as Xyz65\n\n case 'xyz-d50':\n return { mode: 'xyz50', x: c1, y: c2, z: c3, alpha } as Xyz50\n\n // Fallback to sRGB if color space is not recognized\n default:\n return { mode: 'rgb', r: c1, g: c2, b: c3, alpha } as Rgb\n }\n}\n\n/**\n * Convert DTCG color object to hex string\n */\nexport function colorObjectToHex(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n const alpha = color.alpha ?? 1\n\n if (alpha < 1) {\n return formatHex8(culoriColor)\n }\n\n return formatHex(culoriColor)\n}\n","/**\n * @fileoverview Color format conversions that use culori's formatRgb / formatHsl\n * Split from color-converter to avoid pulling these into bundles that only need hex.\n */\n\nimport type { ColorValueObject } from '@tokens/types'\nimport { formatRgb, formatHsl } from 'culori'\n\nimport { dtcgObjectToCulori } from './color-converter'\n\n/**\n * Convert DTCG color object to rgb/rgba string\n */\nexport function colorObjectToRgb(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatRgb(culoriColor)\n}\n\n/**\n * Convert DTCG color object to hsl/hsla string\n */\nexport function colorObjectToHsl(color: ColorValueObject): string {\n const culoriColor = dtcgObjectToCulori(color)\n return formatHsl(culoriColor)\n}\n","/**\n * @fileoverview Unified factory for creating color transforms\n * Handles both simple conversions and modern color space transformations\n */\n\nimport { ColorValue, ColorValueObject, ResolvedToken } from '@tokens/types'\nimport { converter, formatCss, type Mode } from 'culori'\n\nimport { Transform } from '..'\n\nimport { dtcgObjectToCulori as convertDtcgToCulori, isColorObject } from './color-converter'\n\n/**\n * Convert DTCG color value to culori color object\n * Returns null if value is not a ColorValueObject (e.g., unresolved alias reference)\n */\nexport function dtcgObjectToCulori(value: ColorValue) {\n if (!isColorObject(value)) {\n return null\n }\n return convertDtcgToCulori(value)\n}\n\n/**\n * Create a simple color transform with direct string conversion\n * Used for basic color formats (hex, rgb, hsl)\n *\n * @param converter - Function to convert color object to string\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const hexTransform = createColorTransform('color:hex', colorObjectToHex)\n * ```\n */\nexport function createColorTransform(converter: (value: ColorValueObject) => string): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n if (!isColorObject(value)) {\n // String values should be alias references that get resolved before transforms\n return token\n }\n\n try {\n const converted = converter(value)\n return { ...token, $value: converted }\n } catch {\n // If conversion fails, return token unchanged\n return token\n }\n },\n }\n}\n\n/**\n * Create a modern color transform using culori converter\n * Used for CSS Color Module Level 4 color spaces (oklch, oklab, lch, lab, hwb)\n *\n * @param mode - Culori color mode to convert to\n * @returns Transform object\n *\n * @example\n * ```typescript\n * const oklchTransform = createModernColorTransform('color:oklch', 'oklch')\n * ```\n */\nexport function createModernColorTransform(mode: Mode): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Convert to target color space\n const converted = converter(mode)(parsed)\n const formatted = formatCss(converted)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Built-in color value transforms with alpha channel support\n * Includes both standard (hex, rgb, hsl) and modern CSS Color Module Level 4 transforms\n * Uses culori for accurate color conversions\n *\n * Note: Transforms only handle DTCG object format. String values are alias references\n * that must be resolved before transforms run.\n */\n\nimport type { ColorValue, ResolvedToken } from '@tokens/types'\nimport { formatCss } from 'culori'\n\nimport type { Transform } from '../types'\n\nimport { colorObjectToHex } from './color-converter'\nimport { colorObjectToHsl, colorObjectToRgb } from './color-format'\nimport {\n createColorTransform,\n createModernColorTransform,\n dtcgObjectToCulori,\n} from './color-transform-factory'\n\n// ============================================================================\n// Standard Color Transforms (hex, rgb, hsl)\n// ============================================================================\n\n/**\n * Convert color to hex format (with alpha support via 8-digit hex)\n */\nexport function colorToHex(): Transform {\n return createColorTransform(colorObjectToHex)\n}\n\n/**\n * Convert color to rgb/rgba format (preserves alpha)\n */\nexport function colorToRgb(): Transform {\n return createColorTransform(colorObjectToRgb)\n}\n\n/**\n * Convert color to hsl/hsla format (preserves alpha)\n */\nexport function colorToHsl(): Transform {\n return createColorTransform(colorObjectToHsl)\n}\n\n// ============================================================================\n// Modern CSS Color Module Level 4 Transforms\n// ============================================================================\n\n/**\n * Convert color to oklch format (perceptual color space)\n */\nexport function colorToOklch(): Transform {\n return createModernColorTransform('oklch')\n}\n\n/**\n * Convert color to oklab format (perceptual color space)\n */\nexport function colorToOklab(): Transform {\n return createModernColorTransform('oklab')\n}\n\n/**\n * Convert color to lch format (CIELAB lightness-chroma-hue)\n */\nexport function colorToLch(): Transform {\n return createModernColorTransform('lch')\n}\n\n/**\n * Convert color to lab format (CIELAB)\n */\nexport function colorToLab(): Transform {\n return createModernColorTransform('lab')\n}\n\n/**\n * Convert color to hwb format (hue-whiteness-blackness)\n */\nexport function colorToHwb(): Transform {\n return createModernColorTransform('hwb')\n}\n\n/**\n * Convert color to CSS color() function format\n * Uses the original color space and formats as CSS color() function\n */\nexport function colorToColorFunction(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'color',\n transform: (token: ResolvedToken) => {\n const value = token.$value as ColorValue\n\n try {\n const parsed = dtcgObjectToCulori(value)\n\n if (parsed === null) {\n return token\n }\n\n // Format as color() function (preserves original color space)\n const formatted = formatCss(parsed)\n\n if (formatted === '') {\n return token\n }\n\n return { ...token, $value: formatted }\n } catch {\n // Gracefully fall back to original token on unsupported color values\n return token\n }\n },\n }\n}\n","/**\n * @fileoverview Global constants\n */\n\n/**\n * Default maximum depth for alias resolution\n * Prevents infinite recursion in circular references\n */\nexport const DEFAULT_MAX_ALIAS_DEPTH = 10\n\n/**\n * Default base font size in pixels for rem/em conversions\n */\nexport const DEFAULT_BASE_FONT_SIZE_PX = 16\n","/**\n * @fileoverview Dimension format conversion utilities for DTCG 2025.10\n * Handles dimension object format { value: number, unit: string }\n */\n\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\nimport type { DimensionValue } from '@tokens/types'\n/**\n * Check if a value is in dimension object format\n */\nexport function isDimensionObject(value: unknown): value is DimensionValue {\n return typeof value === 'object' && value !== null && 'value' in value && 'unit' in value\n}\n\n/**\n * Convert DTCG dimension object to CSS string\n */\nexport function dimensionObjectToString(dimension: DimensionValue): string {\n return `${dimension.value}${dimension.unit}`\n}\n\n/**\n * Convert a DTCG dimension object between units (px, rem).\n *\n * Converts via px as an intermediate: rem -> px -> target.\n * Returns the original value unchanged for unsupported unit combinations.\n *\n * @param value - Source dimension object\n * @param toUnit - Target CSS unit\n * @param baseFontSize - Base font size in px used for rem conversions\n */\nexport function convertDimension(\n value: DimensionValue,\n toUnit: DimensionValue['unit'],\n baseFontSize = DEFAULT_BASE_FONT_SIZE_PX,\n): DimensionValue {\n const fromUnit = value.unit\n let numValue = value.value\n\n // Convert to px first (as intermediate)\n if (fromUnit === 'rem') {\n numValue = numValue * baseFontSize\n } else if (fromUnit !== 'px' && fromUnit !== toUnit) {\n // If not px, rem, or em, and not already target unit, return as-is\n return value\n }\n\n // Convert from px to target unit\n if (toUnit === 'rem') {\n numValue = numValue / baseFontSize\n } else if (toUnit !== 'px') {\n // Can't convert to other units, return original\n return value\n }\n\n return {\n value: numValue,\n unit: toUnit,\n }\n}\n","/**\n * @fileoverview Built-in dimension value transforms\n * Handles DTCG 2025.10 object format { value: number, unit: string }\n * and converts to string format for output\n */\n\nimport { DEFAULT_BASE_FONT_SIZE_PX } from '@shared/constants'\nimport type { DimensionValue, ResolvedToken } from '@tokens/types'\n\nimport type { Transform } from '../types'\n\nimport { convertDimension, dimensionObjectToString, isDimensionObject } from './dimension-converter'\n/**\n * Convert dimension to px string format\n */\nexport function dimensionToPx(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to px\n if (isDimensionObject(value)) {\n const converted = convertDimension(value as DimensionValue, 'px', DEFAULT_BASE_FONT_SIZE_PX)\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Convert dimension to rem string format\n */\nexport function dimensionToRem(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, return as-is\n if (typeof value === 'string') {\n return token\n }\n\n // Convert dimension object to rem\n if (isDimensionObject(value)) {\n const converted = convertDimension(\n value as DimensionValue,\n 'rem',\n DEFAULT_BASE_FONT_SIZE_PX,\n )\n return { ...token, $value: dimensionObjectToString(converted) }\n }\n\n return token\n },\n }\n}\n\n/**\n * Unitless dimension (extract numeric value)\n */\nexport function dimensionToUnitless(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'dimension',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n // If already a string, parse out the number\n if (typeof value === 'string') {\n const num = parseFloat(value)\n return { ...token, $value: isNaN(num) ? value : num }\n }\n\n // Extract value from dimension object\n if (isDimensionObject(value)) {\n return { ...token, $value: (value as DimensionValue).value }\n }\n\n return token\n },\n }\n}\n","/**\n * @fileoverview Built-in name transforms using change-case library for robust case conversion\n */\n\nimport { ResolvedToken } from '@tokens/types'\nimport { camelCase, kebabCase, snakeCase, pascalCase, constantCase } from 'change-case'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert token name to camelCase\n */\nexport function nameCamelCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = camelCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to kebab-case\n */\nexport function nameKebabCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = kebabCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to snake_case\n */\nexport function nameSnakeCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = snakeCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to PascalCase\n */\nexport function namePascalCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = pascalCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Convert token name to CONSTANT_CASE\n */\nexport function nameConstantCase(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const name = constantCase(token.path.join(' '))\n return {\n ...token,\n name,\n }\n },\n }\n}\n\n/**\n * Add prefix to token name\n *\n * @example\n * ```typescript\n * // Add 'ds-' prefix to all token names\n * transforms: [namePrefix('ds-')]\n * // 'color.primary' becomes 'ds-color.primary'\n * ```\n */\nexport function namePrefix(prefix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${prefix}${token.name}`,\n }\n },\n }\n}\n\n/**\n * Add suffix to token name\n *\n * @example\n * ```typescript\n * // Add '-token' suffix to all token names\n * transforms: [nameSuffix('-token')]\n * // 'color.primary' becomes 'color.primary-token'\n * ```\n */\nexport function nameSuffix(suffix: string): Transform {\n return {\n transform: (token: ResolvedToken) => {\n return {\n ...token,\n name: `${token.name}${suffix}`,\n }\n },\n }\n}\n\n/**\n * Convert token name to CSS custom property format (--name)\n */\nexport function nameCssVar(): Transform {\n return {\n transform: (token: ResolvedToken) => {\n const kebabName = token.path\n .map((part) => part.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase())\n .join('-')\n\n return {\n ...token,\n name: `--${kebabName}`,\n }\n },\n }\n}\n","/**\n * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@tokens/types'\n\nimport type { Transform } from '../types'\n\n/**\n * Convert font weight to numeric value\n */\nexport function fontWeightToNumber(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'fontWeight',\n transform: (token: ResolvedToken) => {\n const value = token.$value\n\n if (typeof value === 'number') {\n return token\n }\n\n if (typeof value === 'string') {\n const weightMap: Record<string, number> = {\n thin: 100,\n hairline: 100,\n 'extra-light': 200,\n 'ultra-light': 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n 'semi-bold': 600,\n 'demi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n 'ultra-bold': 800,\n black: 900,\n heavy: 900,\n 'extra-black': 950,\n 'ultra-black': 950,\n }\n\n const weight = weightMap[value.toLowerCase()]\n if (weight !== undefined) {\n return { ...token, $value: weight }\n }\n }\n\n return token\n },\n }\n}\n\ntype DurationUnit = 'ms' | 's'\ntype ParsedDuration = { value: number; unit: DurationUnit }\n\n/** Parse a raw duration value (object or string form) into a normalized representation */\nfunction parseDuration(rawValue: unknown): ParsedDuration | null {\n if (\n typeof rawValue === 'object' &&\n rawValue !== null &&\n 'value' in rawValue &&\n 'unit' in rawValue\n ) {\n const unit = (rawValue as { unit: string }).unit\n const numeric = Number((rawValue as { value: unknown }).value)\n if (Number.isFinite(numeric) && (unit === 'ms' || unit === 's')) {\n return { value: numeric, unit }\n }\n return null\n }\n\n const str = typeof rawValue === 'string' || typeof rawValue === 'number' ? String(rawValue) : ''\n if (str.endsWith('ms')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 'ms' } : null\n }\n if (str.endsWith('s')) {\n const numeric = parseFloat(str)\n return Number.isFinite(numeric) ? { value: numeric, unit: 's' } : null\n }\n\n return null\n}\n\n/** Convert a parsed duration to the target unit */\nfunction convertDurationUnit(parsed: ParsedDuration, target: DurationUnit): ParsedDuration {\n if (parsed.unit === target) {\n return parsed\n }\n return target === 'ms'\n ? { value: parsed.value * 1000, unit: 'ms' }\n : { value: parsed.value / 1000, unit: 's' }\n}\n\n/**\n * Convert duration to milliseconds\n */\nexport function durationToMs(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 'ms')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n\n/**\n * Convert duration to seconds\n */\nexport function durationToSeconds(): Transform {\n return {\n matcher: (token: ResolvedToken) => token.$type === 'duration',\n transform: (token: ResolvedToken) => {\n const parsed = parseDuration(token.$value)\n if (!parsed) {\n return token\n }\n const converted = convertDurationUnit(parsed, 's')\n return { ...token, $value: { value: converted.value, unit: converted.unit } }\n },\n }\n}\n"]}
|