dispersa 1.2.0 → 1.3.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.
Files changed (90) hide show
  1. package/README.md +1 -2
  2. package/dist/{builders.d.cts → builders-B7_pBy58.d.cts} +180 -6
  3. package/dist/{builders.d.ts → builders-BEoMaLal.d.ts} +180 -6
  4. package/dist/{types-8MLtztK3.d.ts → config-schemas-DnEBhIg0.d.cts} +1 -158
  5. package/dist/{types-BHBHRm0a.d.cts → config-schemas-DnEBhIg0.d.ts} +1 -158
  6. package/dist/dispersa-DF2ZkG2O.d.ts +567 -0
  7. package/dist/dispersa-DJeCN0cP.d.cts +567 -0
  8. package/dist/index.cjs +2117 -2098
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +7 -7
  11. package/dist/index.d.ts +7 -7
  12. package/dist/index.js +2117 -2098
  13. package/dist/index.js.map +1 -1
  14. package/dist/{lint.cjs → lint/index.cjs} +2 -2
  15. package/dist/lint/index.cjs.map +1 -0
  16. package/dist/{lint.d.ts → lint/index.d.cts} +8 -7
  17. package/dist/{lint.d.cts → lint/index.d.ts} +8 -7
  18. package/dist/{lint.js → lint/index.js} +2 -2
  19. package/dist/lint/index.js.map +1 -0
  20. package/dist/{renderers.d.ts → output-tree-BRbfWSmG.d.ts} +3 -10
  21. package/dist/{renderers.d.cts → output-tree-Hmi77EMv.d.cts} +3 -10
  22. package/dist/{builders.cjs → outputs/builders.cjs} +30 -30
  23. package/dist/outputs/builders.cjs.map +1 -0
  24. package/dist/outputs/builders.d.cts +7 -0
  25. package/dist/outputs/builders.d.ts +7 -0
  26. package/dist/{builders.js → outputs/builders.js} +30 -30
  27. package/dist/outputs/builders.js.map +1 -0
  28. package/dist/outputs/index.cjs +3750 -0
  29. package/dist/outputs/index.cjs.map +1 -0
  30. package/dist/outputs/index.d.cts +73 -0
  31. package/dist/outputs/index.d.ts +73 -0
  32. package/dist/outputs/index.js +3730 -0
  33. package/dist/outputs/index.js.map +1 -0
  34. package/dist/{filters.cjs → processing/filters/index.cjs} +24 -18
  35. package/dist/processing/filters/index.cjs.map +1 -0
  36. package/dist/processing/filters/index.d.cts +36 -0
  37. package/dist/processing/filters/index.d.ts +36 -0
  38. package/dist/{filters.js → processing/filters/index.js} +24 -18
  39. package/dist/processing/filters/index.js.map +1 -0
  40. package/dist/{preprocessors.cjs → processing/preprocessors/index.cjs} +3 -3
  41. package/dist/processing/preprocessors/index.cjs.map +1 -0
  42. package/dist/processing/preprocessors/index.d.cts +29 -0
  43. package/dist/processing/preprocessors/index.d.ts +29 -0
  44. package/dist/{preprocessors.js → processing/preprocessors/index.js} +3 -3
  45. package/dist/processing/preprocessors/index.js.map +1 -0
  46. package/dist/{transforms.cjs → processing/transforms/index.cjs} +2 -7
  47. package/dist/processing/transforms/index.cjs.map +1 -0
  48. package/dist/{transforms.d.ts → processing/transforms/index.d.cts} +2 -2
  49. package/dist/{transforms.d.cts → processing/transforms/index.d.ts} +2 -2
  50. package/dist/{transforms.js → processing/transforms/index.js} +2 -7
  51. package/dist/processing/transforms/index.js.map +1 -0
  52. package/dist/{errors.cjs → shared/errors/index.cjs} +12 -2
  53. package/dist/shared/errors/index.cjs.map +1 -0
  54. package/dist/{errors-qT4sJgSA.d.ts → shared/errors/index.d.cts} +11 -2
  55. package/dist/{errors-qT4sJgSA.d.cts → shared/errors/index.d.ts} +11 -2
  56. package/dist/{errors.js → shared/errors/index.js} +12 -3
  57. package/dist/shared/errors/index.js.map +1 -0
  58. package/dist/types-B0cI70Bt.d.cts +453 -0
  59. package/dist/types-BxDEUCos.d.ts +453 -0
  60. package/dist/types-DUc4vLZH.d.cts +36 -0
  61. package/dist/types-s3UoDRKl.d.ts +36 -0
  62. package/package.json +26 -36
  63. package/dist/android-CRDfSB3_.d.cts +0 -126
  64. package/dist/android-DANJjjPO.d.ts +0 -126
  65. package/dist/builders.cjs.map +0 -1
  66. package/dist/builders.js.map +0 -1
  67. package/dist/dispersa-BC1kDF5u.d.ts +0 -118
  68. package/dist/dispersa-DL3J_Pmz.d.cts +0 -118
  69. package/dist/errors.cjs.map +0 -1
  70. package/dist/errors.d.cts +0 -1
  71. package/dist/errors.d.ts +0 -1
  72. package/dist/errors.js.map +0 -1
  73. package/dist/filters.cjs.map +0 -1
  74. package/dist/filters.d.cts +0 -83
  75. package/dist/filters.d.ts +0 -83
  76. package/dist/filters.js.map +0 -1
  77. package/dist/index-Dajm5rvM.d.ts +0 -895
  78. package/dist/index-De6SjZYH.d.cts +0 -895
  79. package/dist/lint.cjs.map +0 -1
  80. package/dist/lint.js.map +0 -1
  81. package/dist/preprocessors.cjs.map +0 -1
  82. package/dist/preprocessors.d.cts +0 -17
  83. package/dist/preprocessors.d.ts +0 -17
  84. package/dist/preprocessors.js.map +0 -1
  85. package/dist/renderers.cjs +0 -28
  86. package/dist/renderers.cjs.map +0 -1
  87. package/dist/renderers.js +0 -24
  88. package/dist/renderers.js.map +0 -1
  89. package/dist/transforms.cjs.map +0 -1
  90. package/dist/transforms.js.map +0 -1
@@ -1,5 +1,24 @@
1
1
  'use strict';
2
2
 
3
+ // src/processing/filters/built-in/by-type.ts
4
+ function byType(type) {
5
+ return {
6
+ filter: (token) => token.$type === type
7
+ };
8
+ }
9
+
10
+ // src/processing/filters/built-in/by-path.ts
11
+ function byPath(pattern) {
12
+ if (typeof pattern === "string") {
13
+ return {
14
+ filter: (token) => token.path.join(".").startsWith(pattern)
15
+ };
16
+ }
17
+ return {
18
+ filter: (token) => pattern.test(token.path.join("."))
19
+ };
20
+ }
21
+
3
22
  // src/shared/constants.ts
4
23
  var DEFAULT_MAX_ALIAS_DEPTH = 10;
5
24
 
@@ -406,27 +425,14 @@ var AliasResolver = class _AliasResolver {
406
425
  }
407
426
  };
408
427
 
409
- // src/processing/filters/built-in/index.ts
410
- function byType(type) {
411
- return {
412
- filter: (token) => token.$type === type
413
- };
414
- }
415
- function byPath(pattern) {
416
- if (typeof pattern === "string") {
417
- return {
418
- filter: (token) => token.path.join(".").startsWith(pattern)
419
- };
420
- }
421
- return {
422
- filter: (token) => pattern.test(token.path.join("."))
423
- };
424
- }
428
+ // src/processing/filters/built-in/is-alias.ts
425
429
  function isAlias() {
426
430
  return {
427
431
  filter: (token) => AliasResolver.hasAliases(token.originalValue)
428
432
  };
429
433
  }
434
+
435
+ // src/processing/filters/built-in/is-base.ts
430
436
  function isBase() {
431
437
  return {
432
438
  filter: (token) => !AliasResolver.hasAliases(token.originalValue)
@@ -442,5 +448,5 @@ exports.byPath = byPath;
442
448
  exports.byType = byType;
443
449
  exports.isAlias = isAlias;
444
450
  exports.isBase = isBase;
445
- //# sourceMappingURL=filters.cjs.map
446
- //# sourceMappingURL=filters.cjs.map
451
+ //# sourceMappingURL=index.cjs.map
452
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/processing/filters/built-in/by-type.ts","../../../src/processing/filters/built-in/by-path.ts","../../../src/shared/constants.ts","../../../src/shared/errors/index.ts","../../../src/shared/utils/string-similarity.ts","../../../src/shared/utils/token-utils.ts","../../../src/shared/utils/validation-handler.ts","../../../src/resolution/alias-resolver.ts","../../../src/processing/filters/built-in/is-alias.ts","../../../src/processing/filters/built-in/is-base.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport type { TokenType } from '@shared/token-types'\n\nimport type { Filter } from '../types'\n\nexport function byType(type: TokenType): Filter {\n return {\n filter: (token) => token.$type === type,\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport type { Filter } from '../types'\n\nexport function byPath(pattern: RegExp | string): Filter {\n if (typeof pattern === 'string') {\n return {\n filter: (token) => token.path.join('.').startsWith(pattern),\n }\n }\n\n return {\n filter: (token) => pattern.test(token.path.join('.')),\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 Error classes - Subpath export for dispersa/errors\n *\n * This is the public entry point when importing from 'dispersa/errors'.\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n *\n * @example\n * ```typescript\n * import { ValidationError, ConfigurationError } from 'dispersa/errors'\n *\n * throw new ValidationError('Invalid token', { message: 'Token missing $value' })\n * ```\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @fileoverview String similarity utilities for \"did you mean?\" suggestions\n *\n * Uses Levenshtein distance to find close matches when users reference\n * nonexistent tokens, modifiers, or contexts.\n */\n\n/**\n * Compute the Levenshtein edit distance between two strings.\n *\n * Uses the classic dynamic-programming algorithm with O(min(a,b)) space.\n *\n * @param a - First string\n * @param b - Second string\n * @returns Number of single-character edits (insert, delete, replace)\n */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) {\n return 0\n }\n if (a.length === 0) {\n return b.length\n }\n if (b.length === 0) {\n return a.length\n }\n\n // Ensure `a` is the shorter string for O(min(a,b)) space\n if (a.length > b.length) {\n ;[a, b] = [b, a]\n }\n\n const aLen = a.length\n const bLen = b.length\n\n // Single row of the DP matrix\n let prev = Array.from({ length: aLen + 1 }, (_, i) => i)\n\n for (let j = 1; j <= bLen; j++) {\n const curr = [j] as number[]\n for (let i = 1; i <= aLen; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n curr[i] = Math.min(\n curr[i - 1]! + 1, // insertion\n prev[i]! + 1, // deletion\n prev[i - 1]! + cost, // substitution\n )\n }\n prev = curr\n }\n\n return prev[aLen]!\n}\n\n/** Minimum edit distance threshold for \"did you mean?\" suggestions */\nconst MIN_EDIT_DISTANCE = 2\n\n/** Fraction of target string length used to auto-scale the max distance */\nconst SIMILARITY_THRESHOLD_FACTOR = 0.4\n\n/**\n * Find strings from `candidates` that are similar to `target`.\n *\n * Returns candidates sorted by distance (closest first), filtered to\n * those within `maxDistance`. A good default for maxDistance is roughly\n * 40% of the target length (minimum 2).\n *\n * @param target - The string the user typed\n * @param candidates - Available valid strings to match against\n * @param maxDistance - Maximum edit distance to consider (default: auto-scaled)\n * @returns Array of similar strings, closest first (at most `maxResults`)\n */\nexport function findSimilar(\n target: string,\n candidates: string[],\n maxDistance?: number,\n maxResults = 3,\n): string[] {\n if (candidates.length === 0) {\n return []\n }\n\n const threshold =\n maxDistance ??\n Math.max(MIN_EDIT_DISTANCE, Math.ceil(target.length * SIMILARITY_THRESHOLD_FACTOR))\n\n const scored = candidates\n .map((candidate) => ({\n value: candidate,\n distance: levenshteinDistance(target.toLowerCase(), candidate.toLowerCase()),\n }))\n .filter((entry) => entry.distance <= threshold && entry.distance > 0)\n .sort((a, b) => a.distance - b.distance)\n\n return scored.slice(0, maxResults).map((entry) => entry.value)\n}\n","/**\n * @fileoverview Token utility functions\n */\n\nimport type {\n InternalResolvedTokens,\n ResolvedToken,\n ResolvedTokens,\n TokenValue,\n} from '@shared/token-types'\n\n/**\n * Format deprecation message for a token\n *\n * Generates a standardized deprecation message that can be used in comments,\n * descriptions, or warnings. Handles both boolean and string deprecation values.\n *\n * @param token - Token with optional deprecation information\n * @param description - Optional existing description to prepend deprecation info to\n * @param format - Output format: 'comment' for CSS comments, 'bracket' for [DEPRECATED] prefix\n * @returns Formatted deprecation message or description with deprecation prefix\n *\n * @example\n * ```typescript\n * // CSS comment format\n * formatDeprecationMessage(token, '', 'comment')\n * // Returns: \"DEPRECATED: Use new-token instead\"\n *\n * // Bracket format\n * formatDeprecationMessage(token, 'Primary color', 'bracket')\n * // Returns: \"[DEPRECATED: Use new-token instead] Primary color\"\n * ```\n */\nexport function formatDeprecationMessage(\n token: ResolvedToken,\n description: string = '',\n format: 'comment' | 'bracket' = 'bracket',\n): string {\n if (token.$deprecated == null || token.$deprecated === false) {\n return description\n }\n\n const deprecationMsg = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n\n if (format === 'comment') {\n const msg = deprecationMsg ? ` ${deprecationMsg}` : ''\n return `DEPRECATED${msg}`\n }\n\n const msg = deprecationMsg ? `: ${deprecationMsg}` : ''\n const prefix = `[DEPRECATED${msg}]`\n return description ? `${prefix} ${description}` : prefix\n}\n\n/**\n * Strip internal metadata from tokens before public output\n */\nexport function stripInternalTokenMetadata(tokens: InternalResolvedTokens): ResolvedTokens {\n const cleaned: ResolvedTokens = {}\n\n for (const [name, token] of Object.entries(tokens)) {\n const { _isAlias: _alias, _sourceModifier: _source, _sourceSet: _sourceSet, ...rest } = token\n cleaned[name] = rest\n }\n\n return cleaned\n}\n\n/**\n * Get sorted token entries for deterministic output ordering\n */\nexport function getSortedTokenEntries(\n tokens: ResolvedTokens,\n): Array<[name: string, token: ResolvedToken]> {\n return Object.entries(tokens).sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n}\n\n/**\n * Build a nested object from resolved tokens using their path hierarchy.\n *\n * Shared between JSON and JS renderers that need to convert flat tokens\n * into nested structures matching the original token group hierarchy.\n *\n * @param tokens - Flat resolved tokens map\n * @param extractValue - Callback to extract the leaf value from each token\n * @returns Nested object mirroring the token path structure\n */\nexport function buildNestedTokenObject(\n tokens: ResolvedTokens,\n extractValue: (token: ResolvedToken) => unknown,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [, token] of getSortedTokenEntries(tokens)) {\n setNestedValue(result, token.path, extractValue(token))\n }\n return result\n}\n\nfunction setNestedValue(root: Record<string, unknown>, path: string[], value: unknown): void {\n let current = root\n\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i]\n if (part == null) {\n continue\n }\n if (!(part in current)) {\n current[part] = {}\n }\n current = current[part] as Record<string, unknown>\n }\n\n const lastPart = path[path.length - 1]\n if (lastPart != null) {\n current[lastPart] = value\n }\n}\n\n/**\n * Check if a value looks like a DTCG token (has `$value` or `$ref` property).\n *\n * This is the base structural check shared by parsers, validators, and resolvers.\n * Individual modules may wrap this in a type-guard to narrow to their own token types.\n */\nexport function isTokenLike(value: unknown): boolean {\n return typeof value === 'object' && value !== null && ('$value' in value || '$ref' in value)\n}\n\n/**\n * Extract a pure alias reference name from a string value.\n *\n * Returns the inner token name for \"{token.name}\" inputs and undefined otherwise.\n */\nexport function getPureAliasReferenceName(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const match = /^\\{([^}]+)\\}$/.exec(value)\n return match?.[1]?.trim()\n}\n\nconst ROOT_REF_PATTERN = /\\.\\$root\\}/g\n\n/**\n * Rewrite `{foo.$root}` → `{foo}` inside alias reference strings.\n * Handles plain string values and composite objects with nested references.\n */\nexport function rewriteRootReferences(value: TokenValue): TokenValue {\n if (typeof value === 'string') {\n return ROOT_REF_PATTERN.test(value)\n ? (value.replace(ROOT_REF_PATTERN, '}') as TokenValue)\n : value\n }\n\n if (Array.isArray(value)) {\n let changed = false\n const mapped = value.map((item) => {\n const rewritten = rewriteRootReferences(item as TokenValue)\n if (rewritten !== item) {\n changed = true\n }\n return rewritten\n })\n return changed ? (mapped as TokenValue) : value\n }\n\n if (typeof value === 'object' && value !== null) {\n let changed = false\n const result: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const rewritten = rewriteRootReferences(v as TokenValue)\n if (rewritten !== v) {\n changed = true\n }\n result[k] = rewritten\n }\n return changed ? (result as TokenValue) : value\n }\n\n return value\n}\n","/**\n * @fileoverview Shared validation handler for consistent validation mode behavior\n *\n * Provides a single source of truth for validation mode checking, error handling,\n * and warning dispatch across all Dispersa components.\n */\n\nimport type { ValidationMode, ValidationOptions } from '@shared/types/validation'\n\n/**\n * Centralized validation handler that all components share.\n *\n * Caches the warning handler and mode at construction time so that\n * repeated calls avoid re-reading options on every invocation.\n */\nexport class ValidationHandler {\n private mode: ValidationMode\n\n constructor(options?: ValidationOptions) {\n this.mode = options?.mode ?? 'error'\n }\n\n /**\n * Whether validation checks should run (mode is not 'off')\n */\n shouldValidate(): boolean {\n return this.mode !== 'off'\n }\n\n /**\n * Whether the current mode is 'error' (strictest)\n */\n isStrict(): boolean {\n return this.mode === 'error'\n }\n\n /**\n * Handle a validation issue: throw in 'error' mode, warn in 'warn' mode, ignore in 'off' mode\n */\n handleIssue(error: Error): void {\n if (this.mode === 'error') {\n throw error\n }\n if (this.mode === 'warn') {\n // eslint-disable-next-line no-console\n console.warn(error.message)\n }\n }\n\n /**\n * Emit a warning (in 'error' and 'warn' modes, skip in 'off')\n */\n warn(message: string): void {\n if (this.mode === 'off') {\n return\n }\n // eslint-disable-next-line no-console\n console.warn(message)\n }\n}\n","/**\n * @fileoverview Token alias resolver with circular reference detection\n * Resolves {tokenName} references in token values\n */\n\nimport { DEFAULT_MAX_ALIAS_DEPTH } from '@shared/constants'\nimport { CircularReferenceError, TokenReferenceError, ValidationError } from '@shared/errors/index'\nimport type { ValidationOptions } from '@shared/types/validation'\nimport { findSimilar } from '@shared/utils/string-similarity'\nimport { getPureAliasReferenceName } from '@shared/utils/token-utils'\nimport { ValidationHandler } from '@shared/utils/validation-handler'\nimport type { InternalResolvedToken, InternalResolvedTokens, TokenValue } from '@shared/token-types'\n\nexport type AliasResolutionOptions = {\n maxDepth?: number\n /**\n * Enable validation mode (throws errors on missing references)\n * When false, unresolved references are left as-is\n * Default: true\n */\n validation?: ValidationOptions\n}\n\nexport class AliasResolver {\n private options: AliasResolutionOptions\n private resolving: Set<string>\n private validationHandler: ValidationHandler\n\n constructor(options: AliasResolutionOptions = {}) {\n this.options = {\n maxDepth: DEFAULT_MAX_ALIAS_DEPTH,\n ...options,\n }\n this.resolving = new Set()\n this.validationHandler = new ValidationHandler(options.validation)\n }\n\n /**\n * Resolve all aliases in a token collection\n *\n * Processes each token and resolves any alias references (e.g., `{token.name}`)\n * to their actual values. Detects circular references and enforces maximum depth.\n *\n * @param tokens - Collection of tokens to resolve aliases in\n * @returns New collection with all aliases resolved to their values\n * @throws {CircularReferenceError} If circular reference detected\n * @throws {TokenReferenceError} If referenced token not found (when validate enabled)\n */\n resolve(tokens: InternalResolvedTokens): InternalResolvedTokens {\n const result: InternalResolvedTokens = {}\n\n for (const [name, token] of Object.entries(tokens)) {\n this.resolving.clear() // Clear for each top-level token\n result[name] = this.resolveToken(name, token, tokens, 0)\n }\n\n return result\n }\n\n /**\n * Resolve aliases in a single token\n */\n private resolveToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): InternalResolvedToken {\n this.assertMaxDepth(name, depth)\n this.assertNotCircular(name)\n\n this.resolving.add(name)\n try {\n const hadAlias = AliasResolver.hasAliases((token.$value ?? '') as TokenValue)\n const pureAliasReferenceName = getPureAliasReferenceName((token.$value ?? '') as TokenValue)\n\n if (pureAliasReferenceName !== undefined) {\n return this.resolvePureAliasToken(\n name,\n token,\n allTokens,\n depth,\n hadAlias,\n pureAliasReferenceName,\n )\n }\n\n return this.resolveInlineAliasToken(name, token, allTokens, depth, hadAlias)\n } finally {\n this.resolving.delete(name)\n }\n }\n\n private assertMaxDepth(name: string, depth: number): void {\n const maxDepth = this.options.maxDepth ?? DEFAULT_MAX_ALIAS_DEPTH\n if (depth <= maxDepth) {\n return\n }\n\n throw new ValidationError(`Maximum alias resolution depth exceeded for token: ${name}`, [\n { message: `Maximum alias resolution depth exceeded for token: ${name}` },\n ])\n }\n\n private assertNotCircular(name: string): void {\n if (!this.resolving.has(name)) {\n return\n }\n throw new CircularReferenceError(name, Array.from(this.resolving))\n }\n\n private resolvePureAliasToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n hadAlias: boolean,\n referenceName: string,\n ): InternalResolvedToken {\n try {\n const referencedToken = this.resolveReferenceToken(referenceName, allTokens, depth)\n if (referencedToken === undefined) {\n return this.withAliasMarker(token, token.$value, hadAlias)\n }\n\n const updatedType = this.getTypeAfterCompatibilityCheck(\n token.$type,\n referencedToken.$type,\n name,\n referenceName,\n )\n\n return this.withAliasMarker(\n {\n ...token,\n $type: updatedType,\n },\n (referencedToken.$value ?? '') as TokenValue,\n hadAlias,\n )\n } catch (error) {\n return this.handleAliasError(error, name, token, hadAlias)\n }\n }\n\n private resolveInlineAliasToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n hadAlias: boolean,\n ): InternalResolvedToken {\n try {\n const resolvedValue = this.resolveValue((token.$value ?? '') as TokenValue, allTokens, depth)\n return this.withAliasMarker(token, resolvedValue, hadAlias)\n } catch (error) {\n return this.handleAliasError(error, name, token, hadAlias)\n }\n }\n\n private withAliasMarker(\n token: InternalResolvedToken,\n value: TokenValue | undefined,\n hadAlias: boolean,\n ): InternalResolvedToken {\n return {\n ...token,\n $value: value,\n _isAlias: hadAlias,\n }\n }\n\n /**\n * Resolve aliases in a value\n */\n private resolveValue(\n value: TokenValue,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n if (typeof value === 'string') {\n return this.resolveStringValue(value, allTokens, depth)\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.resolveValue(item as TokenValue, allTokens, depth))\n }\n\n if (typeof value === 'object' && value != null) {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = this.resolveValue(val as TokenValue, allTokens, depth)\n }\n return result\n }\n\n return value\n }\n\n /**\n * Resolve aliases in a string value\n */\n private resolveStringValue(\n value: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n // Check if the entire value is an alias reference\n const fullReferenceMatch = /^\\{([^}]+)\\}$/.exec(value)\n if (fullReferenceMatch != null) {\n const referenceName = fullReferenceMatch[1]\n if (referenceName != null) {\n return this.resolveReference(referenceName, allTokens, depth)\n }\n }\n\n // Check for inline aliases (e.g., \"2px solid {color.primary}\")\n if (value.includes('{')) {\n return value.replace(/\\{([^}]+)\\}/g, (_match, referenceName: string) => {\n const resolved = this.resolveReference(referenceName, allTokens, depth)\n if (\n typeof resolved === 'string' ||\n typeof resolved === 'number' ||\n typeof resolved === 'boolean'\n ) {\n return String(resolved)\n }\n return JSON.stringify(resolved)\n })\n }\n\n return value\n }\n\n /**\n * Resolve a single reference (whole token only)\n *\n * Per DTCG spec, curly brace syntax only supports whole token references.\n * Property-level references must use JSON Pointer syntax ($ref).\n *\n * Examples:\n * - `{color.primary}` - whole token reference ✅\n * - `{color.primary.components.0}` - NOT supported (use $ref with JSON Pointer) ❌\n */\n private resolveReference(\n referenceName: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n const cleanName = referenceName.trim()\n\n // Look up the token by its full name (no property-level access)\n const referencedToken = allTokens[cleanName]\n\n if (referencedToken == null) {\n const suggestions = findSimilar(cleanName, Object.keys(allTokens))\n this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions))\n this.validationHandler.warn(`Unresolved token reference: \"${cleanName}\"`)\n return `{${cleanName}}`\n }\n\n // Recursively resolve the referenced token\n const resolved = this.resolveToken(cleanName, referencedToken, allTokens, depth + 1)\n\n return (resolved.$value ?? '') as TokenValue\n }\n\n private resolveReferenceToken(\n referenceName: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): InternalResolvedToken | undefined {\n const cleanName = referenceName.trim()\n const referencedToken = allTokens[cleanName]\n\n if (referencedToken == null) {\n const suggestions = findSimilar(cleanName, Object.keys(allTokens))\n this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions))\n this.validationHandler.warn(`Unresolved token reference: \"${cleanName}\"`)\n return undefined\n }\n\n return this.resolveToken(cleanName, referencedToken, allTokens, depth + 1)\n }\n\n private getTypeAfterCompatibilityCheck(\n declaredType: unknown,\n referencedType: unknown,\n tokenName: string,\n referenceName: string,\n ): InternalResolvedToken['$type'] {\n const declared = typeof declaredType === 'string' ? declaredType : undefined\n const referenced = typeof referencedType === 'string' ? referencedType : undefined\n\n if (declared !== undefined && referenced !== undefined && declared !== referenced) {\n this.handleTypeMismatch(tokenName, referenceName, declared, referenced)\n return declaredType as InternalResolvedToken['$type']\n }\n\n if (declared === undefined && referenced !== undefined) {\n return referenced as InternalResolvedToken['$type']\n }\n\n return declaredType as InternalResolvedToken['$type']\n }\n\n private handleTypeMismatch(\n tokenName: string,\n referenceName: string,\n declaredType: string,\n referencedType: string,\n ): void {\n const message =\n `Alias type mismatch for \"${tokenName}\": declared \"$type\" is \"${declaredType}\" ` +\n `but referenced token \"${referenceName}\" has \"$type\" \"${referencedType}\".`\n\n this.validationHandler.handleIssue(new ValidationError(message, [{ message }]))\n }\n\n /**\n * Check if a value contains aliases\n */\n static hasAliases(value: TokenValue): boolean {\n if (typeof value === 'string') {\n return value.includes('{') && value.includes('}')\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => AliasResolver.hasAliases(item as TokenValue))\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value).some((val) => AliasResolver.hasAliases(val as TokenValue))\n }\n\n return false\n }\n\n /**\n * Extract all alias references from a value\n */\n static extractReferences(value: TokenValue): string[] {\n const references: string[] = []\n\n if (typeof value === 'string') {\n const matches = value.matchAll(/\\{([^}]+)\\}/g)\n for (const match of matches) {\n const ref = match[1]\n if (ref != null) {\n references.push(ref.trim())\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n references.push(...AliasResolver.extractReferences(item as TokenValue))\n }\n } else if (typeof value === 'object' && value != null) {\n for (const val of Object.values(value)) {\n references.push(...AliasResolver.extractReferences(val as TokenValue))\n }\n }\n\n return references\n }\n\n private handleAliasError(\n error: unknown,\n name: string,\n token: InternalResolvedToken,\n hadAlias: boolean,\n ): InternalResolvedToken {\n if (error instanceof Error) {\n this.validationHandler.handleIssue(error)\n } else {\n this.validationHandler.handleIssue(new Error(String(error)))\n }\n\n const message = error instanceof Error ? error.message : String(error)\n this.validationHandler.warn(`Alias resolution skipped for \"${name}\": ${message}`)\n\n return {\n ...token,\n $value: token.$value,\n _isAlias: hadAlias,\n }\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { AliasResolver } from '@resolution/alias-resolver'\n\nimport type { Filter } from '../types'\n\nexport function isAlias(): Filter {\n return {\n filter: (token) => AliasResolver.hasAliases(token.originalValue),\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { AliasResolver } from '@resolution/alias-resolver'\n\nimport type { Filter } from '../types'\n\nexport function isBase(): Filter {\n return {\n filter: (token) => !AliasResolver.hasAliases(token.originalValue),\n }\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { F as Filter } from '../../types-CAdUV-fa.cjs';
2
+ import { c as TokenType } from '../../types-TQHV1MrY.cjs';
3
+
4
+ /**
5
+ * @license
6
+ * Copyright (c) 2025 Dispersa Contributors
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+
10
+ declare function byType(type: TokenType): Filter;
11
+
12
+ /**
13
+ * @license
14
+ * Copyright (c) 2025 Dispersa Contributors
15
+ * SPDX-License-Identifier: MIT
16
+ */
17
+
18
+ declare function byPath(pattern: RegExp | string): Filter;
19
+
20
+ /**
21
+ * @license
22
+ * Copyright (c) 2025 Dispersa Contributors
23
+ * SPDX-License-Identifier: MIT
24
+ */
25
+
26
+ declare function isAlias(): Filter;
27
+
28
+ /**
29
+ * @license
30
+ * Copyright (c) 2025 Dispersa Contributors
31
+ * SPDX-License-Identifier: MIT
32
+ */
33
+
34
+ declare function isBase(): Filter;
35
+
36
+ export { Filter, byPath, byType, isAlias, isBase };
@@ -0,0 +1,36 @@
1
+ import { F as Filter } from '../../types-ebxDimRz.js';
2
+ import { c as TokenType } from '../../types-TQHV1MrY.js';
3
+
4
+ /**
5
+ * @license
6
+ * Copyright (c) 2025 Dispersa Contributors
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+
10
+ declare function byType(type: TokenType): Filter;
11
+
12
+ /**
13
+ * @license
14
+ * Copyright (c) 2025 Dispersa Contributors
15
+ * SPDX-License-Identifier: MIT
16
+ */
17
+
18
+ declare function byPath(pattern: RegExp | string): Filter;
19
+
20
+ /**
21
+ * @license
22
+ * Copyright (c) 2025 Dispersa Contributors
23
+ * SPDX-License-Identifier: MIT
24
+ */
25
+
26
+ declare function isAlias(): Filter;
27
+
28
+ /**
29
+ * @license
30
+ * Copyright (c) 2025 Dispersa Contributors
31
+ * SPDX-License-Identifier: MIT
32
+ */
33
+
34
+ declare function isBase(): Filter;
35
+
36
+ export { Filter, byPath, byType, isAlias, isBase };
@@ -1,3 +1,22 @@
1
+ // src/processing/filters/built-in/by-type.ts
2
+ function byType(type) {
3
+ return {
4
+ filter: (token) => token.$type === type
5
+ };
6
+ }
7
+
8
+ // src/processing/filters/built-in/by-path.ts
9
+ function byPath(pattern) {
10
+ if (typeof pattern === "string") {
11
+ return {
12
+ filter: (token) => token.path.join(".").startsWith(pattern)
13
+ };
14
+ }
15
+ return {
16
+ filter: (token) => pattern.test(token.path.join("."))
17
+ };
18
+ }
19
+
1
20
  // src/shared/constants.ts
2
21
  var DEFAULT_MAX_ALIAS_DEPTH = 10;
3
22
 
@@ -404,27 +423,14 @@ var AliasResolver = class _AliasResolver {
404
423
  }
405
424
  };
406
425
 
407
- // src/processing/filters/built-in/index.ts
408
- function byType(type) {
409
- return {
410
- filter: (token) => token.$type === type
411
- };
412
- }
413
- function byPath(pattern) {
414
- if (typeof pattern === "string") {
415
- return {
416
- filter: (token) => token.path.join(".").startsWith(pattern)
417
- };
418
- }
419
- return {
420
- filter: (token) => pattern.test(token.path.join("."))
421
- };
422
- }
426
+ // src/processing/filters/built-in/is-alias.ts
423
427
  function isAlias() {
424
428
  return {
425
429
  filter: (token) => AliasResolver.hasAliases(token.originalValue)
426
430
  };
427
431
  }
432
+
433
+ // src/processing/filters/built-in/is-base.ts
428
434
  function isBase() {
429
435
  return {
430
436
  filter: (token) => !AliasResolver.hasAliases(token.originalValue)
@@ -437,5 +443,5 @@ function isBase() {
437
443
  */
438
444
 
439
445
  export { byPath, byType, isAlias, isBase };
440
- //# sourceMappingURL=filters.js.map
441
- //# sourceMappingURL=filters.js.map
446
+ //# sourceMappingURL=index.js.map
447
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/processing/filters/built-in/by-type.ts","../../../src/processing/filters/built-in/by-path.ts","../../../src/shared/constants.ts","../../../src/shared/errors/index.ts","../../../src/shared/utils/string-similarity.ts","../../../src/shared/utils/token-utils.ts","../../../src/shared/utils/validation-handler.ts","../../../src/resolution/alias-resolver.ts","../../../src/processing/filters/built-in/is-alias.ts","../../../src/processing/filters/built-in/is-base.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport type { TokenType } from '@shared/token-types'\n\nimport type { Filter } from '../types'\n\nexport function byType(type: TokenType): Filter {\n return {\n filter: (token) => token.$type === type,\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport type { Filter } from '../types'\n\nexport function byPath(pattern: RegExp | string): Filter {\n if (typeof pattern === 'string') {\n return {\n filter: (token) => token.path.join('.').startsWith(pattern),\n }\n }\n\n return {\n filter: (token) => pattern.test(token.path.join('.')),\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 Error classes - Subpath export for dispersa/errors\n *\n * This is the public entry point when importing from 'dispersa/errors'.\n *\n * Error classes are intentionally kept as simple value objects with no\n * imports from utility modules. Suggestion formatting is done at call\n * sites to keep the error hierarchy dependency-free.\n *\n * @example\n * ```typescript\n * import { ValidationError, ConfigurationError } from 'dispersa/errors'\n *\n * throw new ValidationError('Invalid token', { message: 'Token missing $value' })\n * ```\n */\n\n/**\n * Base error class for all Dispersa errors\n */\nexport class DispersaError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'DispersaError'\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n}\n\n/**\n * Thrown when a token reference cannot be resolved\n *\n * @param referenceName - The token name that could not be found\n * @param suggestions - Similar token names for \"did you mean?\" hints\n * @param message - Optional custom message (overrides auto-generated message)\n */\nexport class TokenReferenceError extends DispersaError {\n constructor(\n public referenceName: string,\n public suggestions: string[] = [],\n message?: string,\n ) {\n const hint = TokenReferenceError.formatHint(suggestions)\n super(\n message ??\n `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`,\n )\n this.name = 'TokenReferenceError'\n }\n\n private static formatHint(suggestions: string[]): string {\n if (suggestions.length === 0) {\n return ''\n }\n if (suggestions.length === 1) {\n return ` Did you mean \"${suggestions[0]}\"?`\n }\n const quoted = suggestions.map((s) => `\"${s}\"`)\n const last = quoted.pop()!\n return ` Did you mean ${quoted.join(', ')} or ${last}?`\n }\n}\n\n/**\n * Thrown when a circular reference is detected\n */\nexport class CircularReferenceError extends DispersaError {\n constructor(\n public tokenName: string,\n public referencePath: string[],\n ) {\n super(\n `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(' -> ')}`,\n )\n this.name = 'CircularReferenceError'\n }\n}\n\n/**\n * Thrown when validation fails\n */\nexport class ValidationError extends DispersaError {\n constructor(\n message: string,\n public errors: { message: string; path?: string }[],\n ) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when file operations fail\n */\nexport class FileOperationError extends DispersaError {\n constructor(\n public operation: 'read' | 'write',\n public filePath: string,\n public originalError: Error,\n ) {\n super(`Failed to ${operation} file: ${filePath}. ${originalError.message}`)\n this.name = 'FileOperationError'\n }\n}\n\n/**\n * Thrown when a build configuration is invalid\n */\nexport class ConfigurationError extends DispersaError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when base permutation cannot be determined\n */\nexport class BasePermutationError extends DispersaError {\n constructor(\n message = 'Base permutation determination failed. Define a default modifier in resolver.',\n ) {\n super(message)\n this.name = 'BasePermutationError'\n }\n}\n\n/**\n * Thrown when an unknown modifier or context is used\n *\n * @param modifierName - Name of the modifier that failed validation\n * @param contextValue - The invalid context value (if applicable)\n * @param availableValues - Valid options (context names or modifier names) for the error message\n */\nexport class ModifierError extends DispersaError {\n constructor(\n public modifierName: string,\n public contextValue?: string,\n public availableValues: string[] = [],\n ) {\n const available = availableValues.length > 0 ? ` Available: ${availableValues.join(', ')}.` : ''\n\n const message =\n contextValue != null && contextValue !== ''\n ? `Modifier validation failed: '${modifierName}'. Invalid context '${contextValue}'.${available}`\n : `Modifier validation failed: '${modifierName}'. Modifier not defined in resolver.${available}`\n super(message)\n this.name = 'ModifierError'\n }\n}\n\n/**\n * Thrown when lint errors are found and failOnError is true\n *\n * @param issues - Array of lint issues that caused the error\n */\nexport class LintError extends DispersaError {\n constructor(\n public issues: Array<{\n ruleId: string\n severity: 'error' | 'warn'\n message: string\n tokenName: string\n tokenPath: string[]\n }>,\n ) {\n const errorCount = issues.filter((i) => i.severity === 'error').length\n const warningCount = issues.filter((i) => i.severity === 'warn').length\n super(`Lint failed with ${errorCount} error(s) and ${warningCount} warning(s).`)\n this.name = 'LintError'\n }\n}\n","/**\n * @fileoverview String similarity utilities for \"did you mean?\" suggestions\n *\n * Uses Levenshtein distance to find close matches when users reference\n * nonexistent tokens, modifiers, or contexts.\n */\n\n/**\n * Compute the Levenshtein edit distance between two strings.\n *\n * Uses the classic dynamic-programming algorithm with O(min(a,b)) space.\n *\n * @param a - First string\n * @param b - Second string\n * @returns Number of single-character edits (insert, delete, replace)\n */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) {\n return 0\n }\n if (a.length === 0) {\n return b.length\n }\n if (b.length === 0) {\n return a.length\n }\n\n // Ensure `a` is the shorter string for O(min(a,b)) space\n if (a.length > b.length) {\n ;[a, b] = [b, a]\n }\n\n const aLen = a.length\n const bLen = b.length\n\n // Single row of the DP matrix\n let prev = Array.from({ length: aLen + 1 }, (_, i) => i)\n\n for (let j = 1; j <= bLen; j++) {\n const curr = [j] as number[]\n for (let i = 1; i <= aLen; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n curr[i] = Math.min(\n curr[i - 1]! + 1, // insertion\n prev[i]! + 1, // deletion\n prev[i - 1]! + cost, // substitution\n )\n }\n prev = curr\n }\n\n return prev[aLen]!\n}\n\n/** Minimum edit distance threshold for \"did you mean?\" suggestions */\nconst MIN_EDIT_DISTANCE = 2\n\n/** Fraction of target string length used to auto-scale the max distance */\nconst SIMILARITY_THRESHOLD_FACTOR = 0.4\n\n/**\n * Find strings from `candidates` that are similar to `target`.\n *\n * Returns candidates sorted by distance (closest first), filtered to\n * those within `maxDistance`. A good default for maxDistance is roughly\n * 40% of the target length (minimum 2).\n *\n * @param target - The string the user typed\n * @param candidates - Available valid strings to match against\n * @param maxDistance - Maximum edit distance to consider (default: auto-scaled)\n * @returns Array of similar strings, closest first (at most `maxResults`)\n */\nexport function findSimilar(\n target: string,\n candidates: string[],\n maxDistance?: number,\n maxResults = 3,\n): string[] {\n if (candidates.length === 0) {\n return []\n }\n\n const threshold =\n maxDistance ??\n Math.max(MIN_EDIT_DISTANCE, Math.ceil(target.length * SIMILARITY_THRESHOLD_FACTOR))\n\n const scored = candidates\n .map((candidate) => ({\n value: candidate,\n distance: levenshteinDistance(target.toLowerCase(), candidate.toLowerCase()),\n }))\n .filter((entry) => entry.distance <= threshold && entry.distance > 0)\n .sort((a, b) => a.distance - b.distance)\n\n return scored.slice(0, maxResults).map((entry) => entry.value)\n}\n","/**\n * @fileoverview Token utility functions\n */\n\nimport type {\n InternalResolvedTokens,\n ResolvedToken,\n ResolvedTokens,\n TokenValue,\n} from '@shared/token-types'\n\n/**\n * Format deprecation message for a token\n *\n * Generates a standardized deprecation message that can be used in comments,\n * descriptions, or warnings. Handles both boolean and string deprecation values.\n *\n * @param token - Token with optional deprecation information\n * @param description - Optional existing description to prepend deprecation info to\n * @param format - Output format: 'comment' for CSS comments, 'bracket' for [DEPRECATED] prefix\n * @returns Formatted deprecation message or description with deprecation prefix\n *\n * @example\n * ```typescript\n * // CSS comment format\n * formatDeprecationMessage(token, '', 'comment')\n * // Returns: \"DEPRECATED: Use new-token instead\"\n *\n * // Bracket format\n * formatDeprecationMessage(token, 'Primary color', 'bracket')\n * // Returns: \"[DEPRECATED: Use new-token instead] Primary color\"\n * ```\n */\nexport function formatDeprecationMessage(\n token: ResolvedToken,\n description: string = '',\n format: 'comment' | 'bracket' = 'bracket',\n): string {\n if (token.$deprecated == null || token.$deprecated === false) {\n return description\n }\n\n const deprecationMsg = typeof token.$deprecated === 'string' ? token.$deprecated : ''\n\n if (format === 'comment') {\n const msg = deprecationMsg ? ` ${deprecationMsg}` : ''\n return `DEPRECATED${msg}`\n }\n\n const msg = deprecationMsg ? `: ${deprecationMsg}` : ''\n const prefix = `[DEPRECATED${msg}]`\n return description ? `${prefix} ${description}` : prefix\n}\n\n/**\n * Strip internal metadata from tokens before public output\n */\nexport function stripInternalTokenMetadata(tokens: InternalResolvedTokens): ResolvedTokens {\n const cleaned: ResolvedTokens = {}\n\n for (const [name, token] of Object.entries(tokens)) {\n const { _isAlias: _alias, _sourceModifier: _source, _sourceSet: _sourceSet, ...rest } = token\n cleaned[name] = rest\n }\n\n return cleaned\n}\n\n/**\n * Get sorted token entries for deterministic output ordering\n */\nexport function getSortedTokenEntries(\n tokens: ResolvedTokens,\n): Array<[name: string, token: ResolvedToken]> {\n return Object.entries(tokens).sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n}\n\n/**\n * Build a nested object from resolved tokens using their path hierarchy.\n *\n * Shared between JSON and JS renderers that need to convert flat tokens\n * into nested structures matching the original token group hierarchy.\n *\n * @param tokens - Flat resolved tokens map\n * @param extractValue - Callback to extract the leaf value from each token\n * @returns Nested object mirroring the token path structure\n */\nexport function buildNestedTokenObject(\n tokens: ResolvedTokens,\n extractValue: (token: ResolvedToken) => unknown,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [, token] of getSortedTokenEntries(tokens)) {\n setNestedValue(result, token.path, extractValue(token))\n }\n return result\n}\n\nfunction setNestedValue(root: Record<string, unknown>, path: string[], value: unknown): void {\n let current = root\n\n for (let i = 0; i < path.length - 1; i++) {\n const part = path[i]\n if (part == null) {\n continue\n }\n if (!(part in current)) {\n current[part] = {}\n }\n current = current[part] as Record<string, unknown>\n }\n\n const lastPart = path[path.length - 1]\n if (lastPart != null) {\n current[lastPart] = value\n }\n}\n\n/**\n * Check if a value looks like a DTCG token (has `$value` or `$ref` property).\n *\n * This is the base structural check shared by parsers, validators, and resolvers.\n * Individual modules may wrap this in a type-guard to narrow to their own token types.\n */\nexport function isTokenLike(value: unknown): boolean {\n return typeof value === 'object' && value !== null && ('$value' in value || '$ref' in value)\n}\n\n/**\n * Extract a pure alias reference name from a string value.\n *\n * Returns the inner token name for \"{token.name}\" inputs and undefined otherwise.\n */\nexport function getPureAliasReferenceName(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const match = /^\\{([^}]+)\\}$/.exec(value)\n return match?.[1]?.trim()\n}\n\nconst ROOT_REF_PATTERN = /\\.\\$root\\}/g\n\n/**\n * Rewrite `{foo.$root}` → `{foo}` inside alias reference strings.\n * Handles plain string values and composite objects with nested references.\n */\nexport function rewriteRootReferences(value: TokenValue): TokenValue {\n if (typeof value === 'string') {\n return ROOT_REF_PATTERN.test(value)\n ? (value.replace(ROOT_REF_PATTERN, '}') as TokenValue)\n : value\n }\n\n if (Array.isArray(value)) {\n let changed = false\n const mapped = value.map((item) => {\n const rewritten = rewriteRootReferences(item as TokenValue)\n if (rewritten !== item) {\n changed = true\n }\n return rewritten\n })\n return changed ? (mapped as TokenValue) : value\n }\n\n if (typeof value === 'object' && value !== null) {\n let changed = false\n const result: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n const rewritten = rewriteRootReferences(v as TokenValue)\n if (rewritten !== v) {\n changed = true\n }\n result[k] = rewritten\n }\n return changed ? (result as TokenValue) : value\n }\n\n return value\n}\n","/**\n * @fileoverview Shared validation handler for consistent validation mode behavior\n *\n * Provides a single source of truth for validation mode checking, error handling,\n * and warning dispatch across all Dispersa components.\n */\n\nimport type { ValidationMode, ValidationOptions } from '@shared/types/validation'\n\n/**\n * Centralized validation handler that all components share.\n *\n * Caches the warning handler and mode at construction time so that\n * repeated calls avoid re-reading options on every invocation.\n */\nexport class ValidationHandler {\n private mode: ValidationMode\n\n constructor(options?: ValidationOptions) {\n this.mode = options?.mode ?? 'error'\n }\n\n /**\n * Whether validation checks should run (mode is not 'off')\n */\n shouldValidate(): boolean {\n return this.mode !== 'off'\n }\n\n /**\n * Whether the current mode is 'error' (strictest)\n */\n isStrict(): boolean {\n return this.mode === 'error'\n }\n\n /**\n * Handle a validation issue: throw in 'error' mode, warn in 'warn' mode, ignore in 'off' mode\n */\n handleIssue(error: Error): void {\n if (this.mode === 'error') {\n throw error\n }\n if (this.mode === 'warn') {\n // eslint-disable-next-line no-console\n console.warn(error.message)\n }\n }\n\n /**\n * Emit a warning (in 'error' and 'warn' modes, skip in 'off')\n */\n warn(message: string): void {\n if (this.mode === 'off') {\n return\n }\n // eslint-disable-next-line no-console\n console.warn(message)\n }\n}\n","/**\n * @fileoverview Token alias resolver with circular reference detection\n * Resolves {tokenName} references in token values\n */\n\nimport { DEFAULT_MAX_ALIAS_DEPTH } from '@shared/constants'\nimport { CircularReferenceError, TokenReferenceError, ValidationError } from '@shared/errors/index'\nimport type { ValidationOptions } from '@shared/types/validation'\nimport { findSimilar } from '@shared/utils/string-similarity'\nimport { getPureAliasReferenceName } from '@shared/utils/token-utils'\nimport { ValidationHandler } from '@shared/utils/validation-handler'\nimport type { InternalResolvedToken, InternalResolvedTokens, TokenValue } from '@shared/token-types'\n\nexport type AliasResolutionOptions = {\n maxDepth?: number\n /**\n * Enable validation mode (throws errors on missing references)\n * When false, unresolved references are left as-is\n * Default: true\n */\n validation?: ValidationOptions\n}\n\nexport class AliasResolver {\n private options: AliasResolutionOptions\n private resolving: Set<string>\n private validationHandler: ValidationHandler\n\n constructor(options: AliasResolutionOptions = {}) {\n this.options = {\n maxDepth: DEFAULT_MAX_ALIAS_DEPTH,\n ...options,\n }\n this.resolving = new Set()\n this.validationHandler = new ValidationHandler(options.validation)\n }\n\n /**\n * Resolve all aliases in a token collection\n *\n * Processes each token and resolves any alias references (e.g., `{token.name}`)\n * to their actual values. Detects circular references and enforces maximum depth.\n *\n * @param tokens - Collection of tokens to resolve aliases in\n * @returns New collection with all aliases resolved to their values\n * @throws {CircularReferenceError} If circular reference detected\n * @throws {TokenReferenceError} If referenced token not found (when validate enabled)\n */\n resolve(tokens: InternalResolvedTokens): InternalResolvedTokens {\n const result: InternalResolvedTokens = {}\n\n for (const [name, token] of Object.entries(tokens)) {\n this.resolving.clear() // Clear for each top-level token\n result[name] = this.resolveToken(name, token, tokens, 0)\n }\n\n return result\n }\n\n /**\n * Resolve aliases in a single token\n */\n private resolveToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): InternalResolvedToken {\n this.assertMaxDepth(name, depth)\n this.assertNotCircular(name)\n\n this.resolving.add(name)\n try {\n const hadAlias = AliasResolver.hasAliases((token.$value ?? '') as TokenValue)\n const pureAliasReferenceName = getPureAliasReferenceName((token.$value ?? '') as TokenValue)\n\n if (pureAliasReferenceName !== undefined) {\n return this.resolvePureAliasToken(\n name,\n token,\n allTokens,\n depth,\n hadAlias,\n pureAliasReferenceName,\n )\n }\n\n return this.resolveInlineAliasToken(name, token, allTokens, depth, hadAlias)\n } finally {\n this.resolving.delete(name)\n }\n }\n\n private assertMaxDepth(name: string, depth: number): void {\n const maxDepth = this.options.maxDepth ?? DEFAULT_MAX_ALIAS_DEPTH\n if (depth <= maxDepth) {\n return\n }\n\n throw new ValidationError(`Maximum alias resolution depth exceeded for token: ${name}`, [\n { message: `Maximum alias resolution depth exceeded for token: ${name}` },\n ])\n }\n\n private assertNotCircular(name: string): void {\n if (!this.resolving.has(name)) {\n return\n }\n throw new CircularReferenceError(name, Array.from(this.resolving))\n }\n\n private resolvePureAliasToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n hadAlias: boolean,\n referenceName: string,\n ): InternalResolvedToken {\n try {\n const referencedToken = this.resolveReferenceToken(referenceName, allTokens, depth)\n if (referencedToken === undefined) {\n return this.withAliasMarker(token, token.$value, hadAlias)\n }\n\n const updatedType = this.getTypeAfterCompatibilityCheck(\n token.$type,\n referencedToken.$type,\n name,\n referenceName,\n )\n\n return this.withAliasMarker(\n {\n ...token,\n $type: updatedType,\n },\n (referencedToken.$value ?? '') as TokenValue,\n hadAlias,\n )\n } catch (error) {\n return this.handleAliasError(error, name, token, hadAlias)\n }\n }\n\n private resolveInlineAliasToken(\n name: string,\n token: InternalResolvedToken,\n allTokens: InternalResolvedTokens,\n depth: number,\n hadAlias: boolean,\n ): InternalResolvedToken {\n try {\n const resolvedValue = this.resolveValue((token.$value ?? '') as TokenValue, allTokens, depth)\n return this.withAliasMarker(token, resolvedValue, hadAlias)\n } catch (error) {\n return this.handleAliasError(error, name, token, hadAlias)\n }\n }\n\n private withAliasMarker(\n token: InternalResolvedToken,\n value: TokenValue | undefined,\n hadAlias: boolean,\n ): InternalResolvedToken {\n return {\n ...token,\n $value: value,\n _isAlias: hadAlias,\n }\n }\n\n /**\n * Resolve aliases in a value\n */\n private resolveValue(\n value: TokenValue,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n if (typeof value === 'string') {\n return this.resolveStringValue(value, allTokens, depth)\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.resolveValue(item as TokenValue, allTokens, depth))\n }\n\n if (typeof value === 'object' && value != null) {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = this.resolveValue(val as TokenValue, allTokens, depth)\n }\n return result\n }\n\n return value\n }\n\n /**\n * Resolve aliases in a string value\n */\n private resolveStringValue(\n value: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n // Check if the entire value is an alias reference\n const fullReferenceMatch = /^\\{([^}]+)\\}$/.exec(value)\n if (fullReferenceMatch != null) {\n const referenceName = fullReferenceMatch[1]\n if (referenceName != null) {\n return this.resolveReference(referenceName, allTokens, depth)\n }\n }\n\n // Check for inline aliases (e.g., \"2px solid {color.primary}\")\n if (value.includes('{')) {\n return value.replace(/\\{([^}]+)\\}/g, (_match, referenceName: string) => {\n const resolved = this.resolveReference(referenceName, allTokens, depth)\n if (\n typeof resolved === 'string' ||\n typeof resolved === 'number' ||\n typeof resolved === 'boolean'\n ) {\n return String(resolved)\n }\n return JSON.stringify(resolved)\n })\n }\n\n return value\n }\n\n /**\n * Resolve a single reference (whole token only)\n *\n * Per DTCG spec, curly brace syntax only supports whole token references.\n * Property-level references must use JSON Pointer syntax ($ref).\n *\n * Examples:\n * - `{color.primary}` - whole token reference ✅\n * - `{color.primary.components.0}` - NOT supported (use $ref with JSON Pointer) ❌\n */\n private resolveReference(\n referenceName: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): TokenValue {\n const cleanName = referenceName.trim()\n\n // Look up the token by its full name (no property-level access)\n const referencedToken = allTokens[cleanName]\n\n if (referencedToken == null) {\n const suggestions = findSimilar(cleanName, Object.keys(allTokens))\n this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions))\n this.validationHandler.warn(`Unresolved token reference: \"${cleanName}\"`)\n return `{${cleanName}}`\n }\n\n // Recursively resolve the referenced token\n const resolved = this.resolveToken(cleanName, referencedToken, allTokens, depth + 1)\n\n return (resolved.$value ?? '') as TokenValue\n }\n\n private resolveReferenceToken(\n referenceName: string,\n allTokens: InternalResolvedTokens,\n depth: number,\n ): InternalResolvedToken | undefined {\n const cleanName = referenceName.trim()\n const referencedToken = allTokens[cleanName]\n\n if (referencedToken == null) {\n const suggestions = findSimilar(cleanName, Object.keys(allTokens))\n this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions))\n this.validationHandler.warn(`Unresolved token reference: \"${cleanName}\"`)\n return undefined\n }\n\n return this.resolveToken(cleanName, referencedToken, allTokens, depth + 1)\n }\n\n private getTypeAfterCompatibilityCheck(\n declaredType: unknown,\n referencedType: unknown,\n tokenName: string,\n referenceName: string,\n ): InternalResolvedToken['$type'] {\n const declared = typeof declaredType === 'string' ? declaredType : undefined\n const referenced = typeof referencedType === 'string' ? referencedType : undefined\n\n if (declared !== undefined && referenced !== undefined && declared !== referenced) {\n this.handleTypeMismatch(tokenName, referenceName, declared, referenced)\n return declaredType as InternalResolvedToken['$type']\n }\n\n if (declared === undefined && referenced !== undefined) {\n return referenced as InternalResolvedToken['$type']\n }\n\n return declaredType as InternalResolvedToken['$type']\n }\n\n private handleTypeMismatch(\n tokenName: string,\n referenceName: string,\n declaredType: string,\n referencedType: string,\n ): void {\n const message =\n `Alias type mismatch for \"${tokenName}\": declared \"$type\" is \"${declaredType}\" ` +\n `but referenced token \"${referenceName}\" has \"$type\" \"${referencedType}\".`\n\n this.validationHandler.handleIssue(new ValidationError(message, [{ message }]))\n }\n\n /**\n * Check if a value contains aliases\n */\n static hasAliases(value: TokenValue): boolean {\n if (typeof value === 'string') {\n return value.includes('{') && value.includes('}')\n }\n\n if (Array.isArray(value)) {\n return value.some((item) => AliasResolver.hasAliases(item as TokenValue))\n }\n\n if (typeof value === 'object' && value != null) {\n return Object.values(value).some((val) => AliasResolver.hasAliases(val as TokenValue))\n }\n\n return false\n }\n\n /**\n * Extract all alias references from a value\n */\n static extractReferences(value: TokenValue): string[] {\n const references: string[] = []\n\n if (typeof value === 'string') {\n const matches = value.matchAll(/\\{([^}]+)\\}/g)\n for (const match of matches) {\n const ref = match[1]\n if (ref != null) {\n references.push(ref.trim())\n }\n }\n } else if (Array.isArray(value)) {\n for (const item of value) {\n references.push(...AliasResolver.extractReferences(item as TokenValue))\n }\n } else if (typeof value === 'object' && value != null) {\n for (const val of Object.values(value)) {\n references.push(...AliasResolver.extractReferences(val as TokenValue))\n }\n }\n\n return references\n }\n\n private handleAliasError(\n error: unknown,\n name: string,\n token: InternalResolvedToken,\n hadAlias: boolean,\n ): InternalResolvedToken {\n if (error instanceof Error) {\n this.validationHandler.handleIssue(error)\n } else {\n this.validationHandler.handleIssue(new Error(String(error)))\n }\n\n const message = error instanceof Error ? error.message : String(error)\n this.validationHandler.warn(`Alias resolution skipped for \"${name}\": ${message}`)\n\n return {\n ...token,\n $value: token.$value,\n _isAlias: hadAlias,\n }\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { AliasResolver } from '@resolution/alias-resolver'\n\nimport type { Filter } from '../types'\n\nexport function isAlias(): Filter {\n return {\n filter: (token) => AliasResolver.hasAliases(token.originalValue),\n }\n}\n","/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\nimport { AliasResolver } from '@resolution/alias-resolver'\n\nimport type { Filter } from '../types'\n\nexport function isBase(): Filter {\n return {\n filter: (token) => !AliasResolver.hasAliases(token.originalValue),\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- // src/preprocessors.ts
3
+ // src/processing/preprocessors/index.ts
4
4
  var preprocessors = [];
5
5
  /**
6
6
  * @license
@@ -9,5 +9,5 @@ var preprocessors = [];
9
9
  */
10
10
 
11
11
  exports.preprocessors = preprocessors;
12
- //# sourceMappingURL=preprocessors.cjs.map
13
- //# sourceMappingURL=preprocessors.cjs.map
12
+ //# sourceMappingURL=index.cjs.map
13
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/processing/preprocessors/index.ts"],"names":[],"mappings":";;;AAkCO,IAAM,gBAAgB","file":"index.cjs","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors - Subpath export for dispersa/preprocessors\n *\n * This is the public entry point when importing from 'dispersa/preprocessors'.\n *\n * @example\n * ```typescript\n * import { type Preprocessor } from 'dispersa/preprocessors'\n *\n * const myPreprocessor: Preprocessor = {\n * name: 'myPreprocessor',\n * preprocess: async (tokens) => { ... },\n * }\n * ```\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from './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"]}
@@ -0,0 +1,29 @@
1
+ export { P as Preprocessor } from '../../types-DUc4vLZH.cjs';
2
+ import '../../types-TQHV1MrY.cjs';
3
+ import '../../config-schemas-DnEBhIg0.cjs';
4
+ import 'json-schema-to-ts';
5
+
6
+ /**
7
+ * @license
8
+ * Copyright (c) 2025 Dispersa Contributors
9
+ * SPDX-License-Identifier: MIT
10
+ */
11
+ /**
12
+ * @fileoverview Preprocessors - Subpath export for dispersa/preprocessors
13
+ *
14
+ * This is the public entry point when importing from 'dispersa/preprocessors'.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { type Preprocessor } from 'dispersa/preprocessors'
19
+ *
20
+ * const myPreprocessor: Preprocessor = {
21
+ * name: 'myPreprocessor',
22
+ * preprocess: async (tokens) => { ... },
23
+ * }
24
+ * ```
25
+ */
26
+
27
+ declare const preprocessors: readonly [];
28
+
29
+ export { preprocessors };
@@ -0,0 +1,29 @@
1
+ export { P as Preprocessor } from '../../types-s3UoDRKl.js';
2
+ import '../../types-TQHV1MrY.js';
3
+ import '../../config-schemas-DnEBhIg0.js';
4
+ import 'json-schema-to-ts';
5
+
6
+ /**
7
+ * @license
8
+ * Copyright (c) 2025 Dispersa Contributors
9
+ * SPDX-License-Identifier: MIT
10
+ */
11
+ /**
12
+ * @fileoverview Preprocessors - Subpath export for dispersa/preprocessors
13
+ *
14
+ * This is the public entry point when importing from 'dispersa/preprocessors'.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { type Preprocessor } from 'dispersa/preprocessors'
19
+ *
20
+ * const myPreprocessor: Preprocessor = {
21
+ * name: 'myPreprocessor',
22
+ * preprocess: async (tokens) => { ... },
23
+ * }
24
+ * ```
25
+ */
26
+
27
+ declare const preprocessors: readonly [];
28
+
29
+ export { preprocessors };
@@ -1,4 +1,4 @@
1
- // src/preprocessors.ts
1
+ // src/processing/preprocessors/index.ts
2
2
  var preprocessors = [];
3
3
  /**
4
4
  * @license
@@ -7,5 +7,5 @@ var preprocessors = [];
7
7
  */
8
8
 
9
9
  export { preprocessors };
10
- //# sourceMappingURL=preprocessors.js.map
11
- //# sourceMappingURL=preprocessors.js.map
10
+ //# sourceMappingURL=index.js.map
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/processing/preprocessors/index.ts"],"names":[],"mappings":";AAkCO,IAAM,gBAAgB","file":"index.js","sourcesContent":["/**\n * @license\n * Copyright (c) 2025 Dispersa Contributors\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * @fileoverview Preprocessors - Subpath export for dispersa/preprocessors\n *\n * This is the public entry point when importing from 'dispersa/preprocessors'.\n *\n * @example\n * ```typescript\n * import { type Preprocessor } from 'dispersa/preprocessors'\n *\n * const myPreprocessor: Preprocessor = {\n * name: 'myPreprocessor',\n * preprocess: async (tokens) => { ... },\n * }\n * ```\n */\n\n// ============================================================================\n// PREPROCESSOR TYPE\n// ============================================================================\n\nexport type { Preprocessor } from './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"]}
@@ -409,11 +409,6 @@ function durationToSeconds() {
409
409
  }
410
410
  };
411
411
  }
412
- /**
413
- * @license
414
- * Copyright (c) 2025 Dispersa Contributors
415
- * SPDX-License-Identifier: MIT
416
- */
417
412
 
418
413
  exports.colorToColorFunction = colorToColorFunction;
419
414
  exports.colorToHex = colorToHex;
@@ -437,5 +432,5 @@ exports.namePascalCase = namePascalCase;
437
432
  exports.namePrefix = namePrefix;
438
433
  exports.nameSnakeCase = nameSnakeCase;
439
434
  exports.nameSuffix = nameSuffix;
440
- //# sourceMappingURL=transforms.cjs.map
441
- //# sourceMappingURL=transforms.cjs.map
435
+ //# sourceMappingURL=index.cjs.map
436
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/processing/transforms/built-in/color-converter.ts","../../../src/processing/transforms/built-in/color-format.ts","../../../src/processing/transforms/built-in/color-transform-factory.ts","../../../src/processing/transforms/built-in/color-transforms.ts","../../../src/shared/constants.ts","../../../src/processing/transforms/built-in/dimension-converter.ts","../../../src/processing/transforms/built-in/dimension-transforms.ts","../../../src/processing/transforms/built-in/name-transforms.ts","../../../src/processing/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":"index.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 '@shared/token-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 '@shared/token-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 '@shared/token-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 '@shared/token-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 '@shared/token-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 '@shared/token-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 '@shared/token-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 * @fileoverview Other built-in value transforms\n */\n\nimport { ResolvedToken } from '@shared/token-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,5 +1,5 @@
1
- import { T as Transform } from './types-DztXKlka.js';
2
- import './types-TQHV1MrY.js';
1
+ import { T as Transform } from '../../types-BltzwVYK.cjs';
2
+ import '../../types-TQHV1MrY.cjs';
3
3
 
4
4
  /**
5
5
  * @fileoverview Built-in color value transforms with alpha channel support