dispersa 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/builders.cjs +1832 -0
  3. package/dist/builders.cjs.map +1 -0
  4. package/dist/builders.d.cts +228 -0
  5. package/dist/builders.d.ts +228 -0
  6. package/dist/builders.js +1824 -0
  7. package/dist/builders.js.map +1 -0
  8. package/dist/errors.cjs +110 -0
  9. package/dist/errors.cjs.map +1 -0
  10. package/dist/errors.d.cts +97 -0
  11. package/dist/errors.d.ts +97 -0
  12. package/dist/errors.js +99 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/filters.cjs +445 -0
  15. package/dist/filters.cjs.map +1 -0
  16. package/dist/filters.d.cts +86 -0
  17. package/dist/filters.d.ts +86 -0
  18. package/dist/filters.js +440 -0
  19. package/dist/filters.js.map +1 -0
  20. package/dist/index-CPB9Ea9U.d.ts +581 -0
  21. package/dist/index-DKf9WMQG.d.cts +581 -0
  22. package/dist/index.cjs +7843 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.cts +332 -0
  25. package/dist/index.d.ts +332 -0
  26. package/dist/index.js +7802 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/preprocessors.cjs +13 -0
  29. package/dist/preprocessors.cjs.map +1 -0
  30. package/dist/preprocessors.d.cts +17 -0
  31. package/dist/preprocessors.d.ts +17 -0
  32. package/dist/preprocessors.js +11 -0
  33. package/dist/preprocessors.js.map +1 -0
  34. package/dist/renderers.cjs +28 -0
  35. package/dist/renderers.cjs.map +1 -0
  36. package/dist/renderers.d.cts +43 -0
  37. package/dist/renderers.d.ts +43 -0
  38. package/dist/renderers.js +24 -0
  39. package/dist/renderers.js.map +1 -0
  40. package/dist/transforms.cjs +453 -0
  41. package/dist/transforms.cjs.map +1 -0
  42. package/dist/transforms.d.cts +138 -0
  43. package/dist/transforms.d.ts +138 -0
  44. package/dist/transforms.js +429 -0
  45. package/dist/transforms.js.map +1 -0
  46. package/dist/types-BDY1xBmD.d.cts +30 -0
  47. package/dist/types-C1GpiJ6q.d.cts +368 -0
  48. package/dist/types-C1GpiJ6q.d.ts +368 -0
  49. package/dist/types-Cl-1UYGD.d.ts +30 -0
  50. package/dist/types-DJH6_4U9.d.ts +430 -0
  51. package/dist/types-DM5faYUn.d.cts +43 -0
  52. package/dist/types-DbufGPrb.d.cts +430 -0
  53. package/dist/types-DdPWYkgh.d.ts +43 -0
  54. package/package.json +141 -0
@@ -0,0 +1,445 @@
1
+ 'use strict';
2
+
3
+ // src/shared/constants.ts
4
+ var DEFAULT_MAX_ALIAS_DEPTH = 10;
5
+
6
+ // src/shared/errors/index.ts
7
+ var DispersaError = class extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "DispersaError";
11
+ if (typeof Error.captureStackTrace === "function") {
12
+ Error.captureStackTrace(this, this.constructor);
13
+ }
14
+ }
15
+ };
16
+ var TokenReferenceError = class _TokenReferenceError extends DispersaError {
17
+ constructor(referenceName, suggestions = [], message) {
18
+ const hint = _TokenReferenceError.formatHint(suggestions);
19
+ super(
20
+ message ?? `Token reference resolution failed: '${referenceName}'. Token does not exist.${hint}`
21
+ );
22
+ this.referenceName = referenceName;
23
+ this.suggestions = suggestions;
24
+ this.name = "TokenReferenceError";
25
+ }
26
+ static formatHint(suggestions) {
27
+ if (suggestions.length === 0) {
28
+ return "";
29
+ }
30
+ if (suggestions.length === 1) {
31
+ return ` Did you mean "${suggestions[0]}"?`;
32
+ }
33
+ const quoted = suggestions.map((s) => `"${s}"`);
34
+ const last = quoted.pop();
35
+ return ` Did you mean ${quoted.join(", ")} or ${last}?`;
36
+ }
37
+ };
38
+ var CircularReferenceError = class extends DispersaError {
39
+ constructor(tokenName, referencePath) {
40
+ super(
41
+ `Token resolution failed: '${tokenName}'. Circular reference detected in path: ${referencePath.join(" -> ")}`
42
+ );
43
+ this.tokenName = tokenName;
44
+ this.referencePath = referencePath;
45
+ this.name = "CircularReferenceError";
46
+ }
47
+ };
48
+ var ValidationError = class extends DispersaError {
49
+ constructor(message, errors) {
50
+ super(message);
51
+ this.errors = errors;
52
+ this.name = "ValidationError";
53
+ }
54
+ };
55
+
56
+ // src/shared/utils/string-similarity.ts
57
+ function levenshteinDistance(a, b) {
58
+ if (a === b) {
59
+ return 0;
60
+ }
61
+ if (a.length === 0) {
62
+ return b.length;
63
+ }
64
+ if (b.length === 0) {
65
+ return a.length;
66
+ }
67
+ if (a.length > b.length) {
68
+ [a, b] = [b, a];
69
+ }
70
+ const aLen = a.length;
71
+ const bLen = b.length;
72
+ let prev = Array.from({ length: aLen + 1 }, (_, i) => i);
73
+ for (let j = 1; j <= bLen; j++) {
74
+ const curr = [j];
75
+ for (let i = 1; i <= aLen; i++) {
76
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
77
+ curr[i] = Math.min(
78
+ curr[i - 1] + 1,
79
+ // insertion
80
+ prev[i] + 1,
81
+ // deletion
82
+ prev[i - 1] + cost
83
+ // substitution
84
+ );
85
+ }
86
+ prev = curr;
87
+ }
88
+ return prev[aLen];
89
+ }
90
+ var MIN_EDIT_DISTANCE = 2;
91
+ var SIMILARITY_THRESHOLD_FACTOR = 0.4;
92
+ function findSimilar(target, candidates, maxDistance, maxResults = 3) {
93
+ if (candidates.length === 0) {
94
+ return [];
95
+ }
96
+ const threshold = Math.max(MIN_EDIT_DISTANCE, Math.ceil(target.length * SIMILARITY_THRESHOLD_FACTOR));
97
+ const scored = candidates.map((candidate) => ({
98
+ value: candidate,
99
+ distance: levenshteinDistance(target.toLowerCase(), candidate.toLowerCase())
100
+ })).filter((entry) => entry.distance <= threshold && entry.distance > 0).sort((a, b) => a.distance - b.distance);
101
+ return scored.slice(0, maxResults).map((entry) => entry.value);
102
+ }
103
+
104
+ // src/shared/utils/token-utils.ts
105
+ function getPureAliasReferenceName(value) {
106
+ if (typeof value !== "string") {
107
+ return void 0;
108
+ }
109
+ const match = /^\{([^}]+)\}$/.exec(value);
110
+ return match?.[1]?.trim();
111
+ }
112
+
113
+ // src/shared/utils/validation-handler.ts
114
+ var ValidationHandler = class {
115
+ mode;
116
+ constructor(options) {
117
+ this.mode = options?.mode ?? "error";
118
+ }
119
+ /**
120
+ * Whether validation checks should run (mode is not 'off')
121
+ */
122
+ shouldValidate() {
123
+ return this.mode !== "off";
124
+ }
125
+ /**
126
+ * Whether the current mode is 'error' (strictest)
127
+ */
128
+ isStrict() {
129
+ return this.mode === "error";
130
+ }
131
+ /**
132
+ * Handle a validation issue: throw in 'error' mode, warn in 'warn' mode, ignore in 'off' mode
133
+ */
134
+ handleIssue(error) {
135
+ if (this.mode === "error") {
136
+ throw error;
137
+ }
138
+ if (this.mode === "warn") {
139
+ console.warn(error.message);
140
+ }
141
+ }
142
+ /**
143
+ * Emit a warning (in 'error' and 'warn' modes, skip in 'off')
144
+ */
145
+ warn(message) {
146
+ if (this.mode === "off") {
147
+ return;
148
+ }
149
+ console.warn(message);
150
+ }
151
+ };
152
+
153
+ // src/lib/resolution/alias-resolver.ts
154
+ var AliasResolver = class _AliasResolver {
155
+ options;
156
+ resolving;
157
+ validationHandler;
158
+ constructor(options = {}) {
159
+ this.options = {
160
+ maxDepth: DEFAULT_MAX_ALIAS_DEPTH,
161
+ ...options
162
+ };
163
+ this.resolving = /* @__PURE__ */ new Set();
164
+ this.validationHandler = new ValidationHandler(options.validation);
165
+ }
166
+ /**
167
+ * Resolve all aliases in a token collection
168
+ *
169
+ * Processes each token and resolves any alias references (e.g., `{token.name}`)
170
+ * to their actual values. Detects circular references and enforces maximum depth.
171
+ *
172
+ * @param tokens - Collection of tokens to resolve aliases in
173
+ * @returns New collection with all aliases resolved to their values
174
+ * @throws {CircularReferenceError} If circular reference detected
175
+ * @throws {TokenReferenceError} If referenced token not found (when validate enabled)
176
+ */
177
+ resolve(tokens) {
178
+ const result = {};
179
+ for (const [name, token] of Object.entries(tokens)) {
180
+ this.resolving.clear();
181
+ result[name] = this.resolveToken(name, token, tokens, 0);
182
+ }
183
+ return result;
184
+ }
185
+ /**
186
+ * Resolve aliases in a single token
187
+ */
188
+ resolveToken(name, token, allTokens, depth) {
189
+ this.assertMaxDepth(name, depth);
190
+ this.assertNotCircular(name);
191
+ this.resolving.add(name);
192
+ try {
193
+ const hadAlias = _AliasResolver.hasAliases(token.$value ?? "");
194
+ const pureAliasReferenceName = getPureAliasReferenceName(token.$value ?? "");
195
+ if (pureAliasReferenceName !== void 0) {
196
+ return this.resolvePureAliasToken(
197
+ name,
198
+ token,
199
+ allTokens,
200
+ depth,
201
+ hadAlias,
202
+ pureAliasReferenceName
203
+ );
204
+ }
205
+ return this.resolveInlineAliasToken(name, token, allTokens, depth, hadAlias);
206
+ } finally {
207
+ this.resolving.delete(name);
208
+ }
209
+ }
210
+ assertMaxDepth(name, depth) {
211
+ const maxDepth = this.options.maxDepth ?? DEFAULT_MAX_ALIAS_DEPTH;
212
+ if (depth <= maxDepth) {
213
+ return;
214
+ }
215
+ throw new ValidationError(`Maximum alias resolution depth exceeded for token: ${name}`, [
216
+ { message: `Maximum alias resolution depth exceeded for token: ${name}` }
217
+ ]);
218
+ }
219
+ assertNotCircular(name) {
220
+ if (!this.resolving.has(name)) {
221
+ return;
222
+ }
223
+ throw new CircularReferenceError(name, Array.from(this.resolving));
224
+ }
225
+ resolvePureAliasToken(name, token, allTokens, depth, hadAlias, referenceName) {
226
+ try {
227
+ const referencedToken = this.resolveReferenceToken(referenceName, allTokens, depth);
228
+ if (referencedToken === void 0) {
229
+ return this.withAliasMarker(token, token.$value, hadAlias);
230
+ }
231
+ const updatedType = this.getTypeAfterCompatibilityCheck(
232
+ token.$type,
233
+ referencedToken.$type,
234
+ name,
235
+ referenceName
236
+ );
237
+ return this.withAliasMarker(
238
+ {
239
+ ...token,
240
+ $type: updatedType
241
+ },
242
+ referencedToken.$value ?? "",
243
+ hadAlias
244
+ );
245
+ } catch (error) {
246
+ return this.handleAliasError(error, name, token, hadAlias);
247
+ }
248
+ }
249
+ resolveInlineAliasToken(name, token, allTokens, depth, hadAlias) {
250
+ try {
251
+ const resolvedValue = this.resolveValue(token.$value ?? "", allTokens, depth);
252
+ return this.withAliasMarker(token, resolvedValue, hadAlias);
253
+ } catch (error) {
254
+ return this.handleAliasError(error, name, token, hadAlias);
255
+ }
256
+ }
257
+ withAliasMarker(token, value, hadAlias) {
258
+ return {
259
+ ...token,
260
+ $value: value,
261
+ _isAlias: hadAlias
262
+ };
263
+ }
264
+ /**
265
+ * Resolve aliases in a value
266
+ */
267
+ resolveValue(value, allTokens, depth) {
268
+ if (typeof value === "string") {
269
+ return this.resolveStringValue(value, allTokens, depth);
270
+ }
271
+ if (Array.isArray(value)) {
272
+ return value.map((item) => this.resolveValue(item, allTokens, depth));
273
+ }
274
+ if (typeof value === "object" && value != null) {
275
+ const result = {};
276
+ for (const [key, val] of Object.entries(value)) {
277
+ result[key] = this.resolveValue(val, allTokens, depth);
278
+ }
279
+ return result;
280
+ }
281
+ return value;
282
+ }
283
+ /**
284
+ * Resolve aliases in a string value
285
+ */
286
+ resolveStringValue(value, allTokens, depth) {
287
+ const fullReferenceMatch = /^\{([^}]+)\}$/.exec(value);
288
+ if (fullReferenceMatch != null) {
289
+ const referenceName = fullReferenceMatch[1];
290
+ if (referenceName != null) {
291
+ return this.resolveReference(referenceName, allTokens, depth);
292
+ }
293
+ }
294
+ if (value.includes("{")) {
295
+ return value.replace(/\{([^}]+)\}/g, (_match, referenceName) => {
296
+ const resolved = this.resolveReference(referenceName, allTokens, depth);
297
+ if (typeof resolved === "string" || typeof resolved === "number" || typeof resolved === "boolean") {
298
+ return String(resolved);
299
+ }
300
+ return JSON.stringify(resolved);
301
+ });
302
+ }
303
+ return value;
304
+ }
305
+ /**
306
+ * Resolve a single reference (whole token only)
307
+ *
308
+ * Per DTCG spec, curly brace syntax only supports whole token references.
309
+ * Property-level references must use JSON Pointer syntax ($ref).
310
+ *
311
+ * Examples:
312
+ * - `{color.primary}` - whole token reference ✅
313
+ * - `{color.primary.components.0}` - NOT supported (use $ref with JSON Pointer) ❌
314
+ */
315
+ resolveReference(referenceName, allTokens, depth) {
316
+ const cleanName = referenceName.trim();
317
+ const referencedToken = allTokens[cleanName];
318
+ if (referencedToken == null) {
319
+ const suggestions = findSimilar(cleanName, Object.keys(allTokens));
320
+ this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions));
321
+ this.validationHandler.warn(`Unresolved token reference: "${cleanName}"`);
322
+ return `{${cleanName}}`;
323
+ }
324
+ const resolved = this.resolveToken(cleanName, referencedToken, allTokens, depth + 1);
325
+ return resolved.$value ?? "";
326
+ }
327
+ resolveReferenceToken(referenceName, allTokens, depth) {
328
+ const cleanName = referenceName.trim();
329
+ const referencedToken = allTokens[cleanName];
330
+ if (referencedToken == null) {
331
+ const suggestions = findSimilar(cleanName, Object.keys(allTokens));
332
+ this.validationHandler.handleIssue(new TokenReferenceError(cleanName, suggestions));
333
+ this.validationHandler.warn(`Unresolved token reference: "${cleanName}"`);
334
+ return void 0;
335
+ }
336
+ return this.resolveToken(cleanName, referencedToken, allTokens, depth + 1);
337
+ }
338
+ getTypeAfterCompatibilityCheck(declaredType, referencedType, tokenName, referenceName) {
339
+ const declared = typeof declaredType === "string" ? declaredType : void 0;
340
+ const referenced = typeof referencedType === "string" ? referencedType : void 0;
341
+ if (declared !== void 0 && referenced !== void 0 && declared !== referenced) {
342
+ this.handleTypeMismatch(tokenName, referenceName, declared, referenced);
343
+ return declaredType;
344
+ }
345
+ if (declared === void 0 && referenced !== void 0) {
346
+ return referenced;
347
+ }
348
+ return declaredType;
349
+ }
350
+ handleTypeMismatch(tokenName, referenceName, declaredType, referencedType) {
351
+ const message = `Alias type mismatch for "${tokenName}": declared "$type" is "${declaredType}" but referenced token "${referenceName}" has "$type" "${referencedType}".`;
352
+ this.validationHandler.handleIssue(new ValidationError(message, [{ message }]));
353
+ }
354
+ /**
355
+ * Check if a value contains aliases
356
+ */
357
+ static hasAliases(value) {
358
+ if (typeof value === "string") {
359
+ return value.includes("{") && value.includes("}");
360
+ }
361
+ if (Array.isArray(value)) {
362
+ return value.some((item) => _AliasResolver.hasAliases(item));
363
+ }
364
+ if (typeof value === "object" && value != null) {
365
+ return Object.values(value).some((val) => _AliasResolver.hasAliases(val));
366
+ }
367
+ return false;
368
+ }
369
+ /**
370
+ * Extract all alias references from a value
371
+ */
372
+ static extractReferences(value) {
373
+ const references = [];
374
+ if (typeof value === "string") {
375
+ const matches = value.matchAll(/\{([^}]+)\}/g);
376
+ for (const match of matches) {
377
+ const ref = match[1];
378
+ if (ref != null) {
379
+ references.push(ref.trim());
380
+ }
381
+ }
382
+ } else if (Array.isArray(value)) {
383
+ for (const item of value) {
384
+ references.push(..._AliasResolver.extractReferences(item));
385
+ }
386
+ } else if (typeof value === "object" && value != null) {
387
+ for (const val of Object.values(value)) {
388
+ references.push(..._AliasResolver.extractReferences(val));
389
+ }
390
+ }
391
+ return references;
392
+ }
393
+ handleAliasError(error, name, token, hadAlias) {
394
+ if (error instanceof Error) {
395
+ this.validationHandler.handleIssue(error);
396
+ } else {
397
+ this.validationHandler.handleIssue(new Error(String(error)));
398
+ }
399
+ const message = error instanceof Error ? error.message : String(error);
400
+ this.validationHandler.warn(`Alias resolution skipped for "${name}": ${message}`);
401
+ return {
402
+ ...token,
403
+ $value: token.$value,
404
+ _isAlias: hadAlias
405
+ };
406
+ }
407
+ };
408
+
409
+ // src/lib/processing/processors/filters/built-in.ts
410
+ function byType(type) {
411
+ return {
412
+ filter: (token) => token.$type === type
413
+ };
414
+ }
415
+ function byPath(pattern) {
416
+ const regex = typeof pattern === "string" ? new RegExp(`^${pattern}`) : pattern;
417
+ return {
418
+ filter: (token) => {
419
+ const fullPath = token.path.join(".");
420
+ return regex.test(fullPath);
421
+ }
422
+ };
423
+ }
424
+ function isAlias() {
425
+ return {
426
+ filter: (token) => AliasResolver.hasAliases(token.originalValue)
427
+ };
428
+ }
429
+ function isBase() {
430
+ return {
431
+ filter: (token) => !AliasResolver.hasAliases(token.originalValue)
432
+ };
433
+ }
434
+ /**
435
+ * @license
436
+ * Copyright (c) 2025 Dispersa Contributors
437
+ * SPDX-License-Identifier: MIT
438
+ */
439
+
440
+ exports.byPath = byPath;
441
+ exports.byType = byType;
442
+ exports.isAlias = isAlias;
443
+ exports.isBase = isBase;
444
+ //# sourceMappingURL=filters.cjs.map
445
+ //# sourceMappingURL=filters.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/lib/resolution/alias-resolver.ts","../src/lib/processing/processors/filters/built-in.ts"],"names":[],"mappings":"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","file":"filters.cjs","sourcesContent":["/**\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 Custom error classes for Dispersa\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\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 a color format cannot be parsed\n */\nexport class ColorParseError extends DispersaError {\n constructor(public colorValue: string) {\n super(`Color parsing failed: '${colorValue}'. Provide a valid CSS color or DTCG color object.`)\n this.name = 'ColorParseError'\n }\n}\n\n/**\n * Thrown when a dimension format is invalid\n */\nexport class DimensionFormatError extends DispersaError {\n constructor(public dimensionValue: string) {\n super(`Dimension parsing failed: '${dimensionValue}'. Provide a valid DTCG dimension object.`)\n this.name = 'DimensionFormatError'\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 * @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 { InternalResolvedTokens, ResolvedToken, ResolvedTokens } from '@lib/tokens/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 // CSS comment format: \"DEPRECATED: message\" or just \"DEPRECATED\"\n const msg = deprecationMsg ? ` ${deprecationMsg}` : ''\n return `DEPRECATED${msg}`\n } else {\n // Bracket format: \"[DEPRECATED: message]\" or \"[DEPRECATED]\"\n const msg = deprecationMsg ? `: ${deprecationMsg}` : ''\n const prefix = `[DEPRECATED${msg}]`\n return description ? `${prefix} ${description}` : prefix\n }\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 * 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","/**\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 type { InternalResolvedToken, InternalResolvedTokens, TokenValue } from '@lib/tokens/types'\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'\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 * @fileoverview Built-in token filters\n *\n * Provides commonly used filters for token selection. These filters can be\n * used in output configurations to control which tokens are included in output.\n */\n\nimport { AliasResolver } from '@lib/resolution/alias-resolver'\nimport type { TokenType } from '@lib/tokens/types'\n\nimport type { Filter } from './types'\n\n/**\n * Factory function to create a filter for a specific token type\n *\n * @param type - Token type to filter for\n * @returns Filter that includes only tokens of the specified type\n *\n * @example\n * ```typescript\n * const shadowFilter = byType('shadow')\n * dispersa.registerFilter(shadowFilter)\n *\n * outputs: [{\n * css({\n * name: 'css',\n * file: 'tokens.css',\n * preset: 'bundle',\n * filters: [shadowFilter],\n * }),\n * }]\n * ```\n */\nexport function byType(type: TokenType): Filter {\n return {\n filter: (token) => token.$type === type,\n }\n}\n\n/**\n * Factory function to create a filter based on path pattern\n *\n * @param pattern - Regular expression or string to match against token path\n * @returns Filter that includes only tokens matching the path pattern\n *\n * @example\n * ```typescript\n * // Filter tokens in 'color.semantic' namespace\n * const semanticColors = byPath(/^color\\.semantic/)\n * dispersa.registerFilter(semanticColors)\n *\n * // Filter tokens starting with 'spacing'\n * const spacingTokens = byPath('spacing')\n * dispersa.registerFilter(spacingTokens)\n * ```\n */\nexport function byPath(pattern: RegExp | string): Filter {\n const regex = typeof pattern === 'string' ? new RegExp(`^${pattern}`) : pattern\n return {\n filter: (token) => {\n const fullPath = token.path.join('.')\n return regex.test(fullPath)\n },\n }\n}\n\n\n/**\n * Filter to include only alias tokens (tokens that reference other tokens)\n *\n * Useful for shipping only semantic/alias tokens to consumers while keeping\n * base/primitive tokens internal to the design system.\n *\n * @example\n * ```typescript\n * {\n * name: 'web-semantic',\n * renderer: cssRenderer(),\n * options: { preset: 'bundle' },\n * filters: [isAlias()], // Only tokens that were originally references\n * transforms: [nameKebabCase()]\n * }\n * ```\n */\nexport function isAlias(): Filter {\n return {\n filter: (token) => AliasResolver.hasAliases(token.originalValue),\n }\n}\n\n/**\n * Filter to include only base tokens (tokens with direct values, not aliases)\n *\n * Useful for internal documentation or extracting only primitive/foundation tokens.\n *\n * @example\n * ```typescript\n * {\n * name: 'design-primitives',\n * renderer: jsonRenderer(),\n * options: { preset: 'standalone' },\n * filters: [isBase()], // Only tokens with direct values\n * }\n * ```\n */\nexport function isBase(): Filter {\n return {\n filter: (token) => !AliasResolver.hasAliases(token.originalValue),\n }\n}\n"]}
@@ -0,0 +1,86 @@
1
+ import { F as Filter } from './types-BDY1xBmD.cjs';
2
+ import { T as TokenType } from './types-C1GpiJ6q.cjs';
3
+
4
+ /**
5
+ * @fileoverview Built-in token filters
6
+ *
7
+ * Provides commonly used filters for token selection. These filters can be
8
+ * used in output configurations to control which tokens are included in output.
9
+ */
10
+
11
+ /**
12
+ * Factory function to create a filter for a specific token type
13
+ *
14
+ * @param type - Token type to filter for
15
+ * @returns Filter that includes only tokens of the specified type
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const shadowFilter = byType('shadow')
20
+ * dispersa.registerFilter(shadowFilter)
21
+ *
22
+ * outputs: [{
23
+ * css({
24
+ * name: 'css',
25
+ * file: 'tokens.css',
26
+ * preset: 'bundle',
27
+ * filters: [shadowFilter],
28
+ * }),
29
+ * }]
30
+ * ```
31
+ */
32
+ declare function byType(type: TokenType): Filter;
33
+ /**
34
+ * Factory function to create a filter based on path pattern
35
+ *
36
+ * @param pattern - Regular expression or string to match against token path
37
+ * @returns Filter that includes only tokens matching the path pattern
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * // Filter tokens in 'color.semantic' namespace
42
+ * const semanticColors = byPath(/^color\.semantic/)
43
+ * dispersa.registerFilter(semanticColors)
44
+ *
45
+ * // Filter tokens starting with 'spacing'
46
+ * const spacingTokens = byPath('spacing')
47
+ * dispersa.registerFilter(spacingTokens)
48
+ * ```
49
+ */
50
+ declare function byPath(pattern: RegExp | string): Filter;
51
+ /**
52
+ * Filter to include only alias tokens (tokens that reference other tokens)
53
+ *
54
+ * Useful for shipping only semantic/alias tokens to consumers while keeping
55
+ * base/primitive tokens internal to the design system.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * {
60
+ * name: 'web-semantic',
61
+ * renderer: cssRenderer(),
62
+ * options: { preset: 'bundle' },
63
+ * filters: [isAlias()], // Only tokens that were originally references
64
+ * transforms: [nameKebabCase()]
65
+ * }
66
+ * ```
67
+ */
68
+ declare function isAlias(): Filter;
69
+ /**
70
+ * Filter to include only base tokens (tokens with direct values, not aliases)
71
+ *
72
+ * Useful for internal documentation or extracting only primitive/foundation tokens.
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * {
77
+ * name: 'design-primitives',
78
+ * renderer: jsonRenderer(),
79
+ * options: { preset: 'standalone' },
80
+ * filters: [isBase()], // Only tokens with direct values
81
+ * }
82
+ * ```
83
+ */
84
+ declare function isBase(): Filter;
85
+
86
+ export { Filter, byPath, byType, isAlias, isBase };