@sxl-studio/token-transformer 1.0.0 → 2.0.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 (93) hide show
  1. package/README.en.md +77 -608
  2. package/README.md +77 -685
  3. package/config/sxl-transform.config.yaml +120 -0
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.js +411 -141
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/loader.d.ts +6 -0
  8. package/dist/config/loader.js +160 -0
  9. package/dist/config/loader.js.map +1 -0
  10. package/dist/config/schema.d.ts +847 -0
  11. package/dist/config/schema.js +123 -0
  12. package/dist/config/schema.js.map +1 -0
  13. package/dist/core/color-modifiers.d.ts +31 -0
  14. package/dist/core/color-modifiers.js +289 -0
  15. package/dist/core/color-modifiers.js.map +1 -0
  16. package/dist/core/color-parser.d.ts +24 -0
  17. package/dist/core/color-parser.js +281 -0
  18. package/dist/core/color-parser.js.map +1 -0
  19. package/dist/core/debug-report.d.ts +11 -0
  20. package/dist/core/debug-report.js +161 -0
  21. package/dist/core/debug-report.js.map +1 -0
  22. package/dist/core/incremental.d.ts +18 -0
  23. package/dist/core/incremental.js +105 -0
  24. package/dist/core/incremental.js.map +1 -0
  25. package/dist/core/math.d.ts +3 -0
  26. package/dist/core/math.js +261 -0
  27. package/dist/core/math.js.map +1 -0
  28. package/dist/core/parser.d.ts +4 -3
  29. package/dist/core/parser.js +68 -172
  30. package/dist/core/parser.js.map +1 -1
  31. package/dist/core/resolver.d.ts +26 -0
  32. package/dist/core/resolver.js +431 -0
  33. package/dist/core/resolver.js.map +1 -0
  34. package/dist/core/token-loader.d.ts +11 -0
  35. package/dist/core/token-loader.js +380 -0
  36. package/dist/core/token-loader.js.map +1 -0
  37. package/dist/core/token-parser.d.ts +9 -0
  38. package/dist/core/token-parser.js +138 -0
  39. package/dist/core/token-parser.js.map +1 -0
  40. package/dist/core/token-types.d.ts +7 -0
  41. package/dist/core/token-types.js +132 -0
  42. package/dist/core/token-types.js.map +1 -0
  43. package/dist/core/types.d.ts +154 -63
  44. package/dist/core/writer.d.ts +18 -5
  45. package/dist/core/writer.js +545 -91
  46. package/dist/core/writer.js.map +1 -1
  47. package/dist/emit/css.d.ts +2 -0
  48. package/dist/emit/css.js +538 -0
  49. package/dist/emit/css.js.map +1 -0
  50. package/dist/emit/kotlin.d.ts +2 -0
  51. package/dist/emit/kotlin.js +406 -0
  52. package/dist/emit/kotlin.js.map +1 -0
  53. package/dist/emit/shared.d.ts +13 -0
  54. package/dist/emit/shared.js +127 -0
  55. package/dist/emit/shared.js.map +1 -0
  56. package/dist/emit/swift.d.ts +2 -0
  57. package/dist/emit/swift.js +432 -0
  58. package/dist/emit/swift.js.map +1 -0
  59. package/dist/emit/typography.d.ts +17 -0
  60. package/dist/emit/typography.js +132 -0
  61. package/dist/emit/typography.js.map +1 -0
  62. package/dist/emit/xml.d.ts +2 -0
  63. package/dist/emit/xml.js +311 -0
  64. package/dist/emit/xml.js.map +1 -0
  65. package/dist/index.d.ts +15 -6
  66. package/dist/index.js +13 -5
  67. package/dist/index.js.map +1 -1
  68. package/dist/transformers/css.d.ts +1 -1
  69. package/dist/transformers/css.js +13 -482
  70. package/dist/transformers/css.js.map +1 -1
  71. package/dist/transformers/kotlin.d.ts +2 -2
  72. package/dist/transformers/kotlin.js +14 -442
  73. package/dist/transformers/kotlin.js.map +1 -1
  74. package/dist/transformers/swiftui.d.ts +2 -2
  75. package/dist/transformers/swiftui.js +14 -433
  76. package/dist/transformers/swiftui.js.map +1 -1
  77. package/dist/utils/color.d.ts +7 -5
  78. package/dist/utils/color.js +90 -86
  79. package/dist/utils/color.js.map +1 -1
  80. package/dist/utils/dimension.d.ts +8 -5
  81. package/dist/utils/dimension.js +54 -52
  82. package/dist/utils/dimension.js.map +1 -1
  83. package/dist/utils/naming.d.ts +10 -12
  84. package/dist/utils/naming.js +102 -44
  85. package/dist/utils/naming.js.map +1 -1
  86. package/package.json +30 -10
  87. package/config.example.json +0 -45
  88. package/dist/core/loader.d.ts +0 -8
  89. package/dist/core/loader.js +0 -105
  90. package/dist/core/loader.js.map +0 -1
  91. package/dist/transformers/vue3.d.ts +0 -28
  92. package/dist/transformers/vue3.js +0 -534
  93. package/dist/transformers/vue3.js.map +0 -1
@@ -0,0 +1,380 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { glob } from "glob";
4
+ import { minimatch } from "minimatch";
5
+ import { canonicalTokenPath, parseTokenFile } from "./token-parser.js";
6
+ export async function scanSourceFiles(tokenDir, include, exclude) {
7
+ const discoveredFiles = await discoverTokenFiles(tokenDir, include, exclude);
8
+ const sourceFiles = {};
9
+ for (const filePath of discoveredFiles) {
10
+ const absolute = path.join(tokenDir, filePath);
11
+ const stats = await fs.stat(absolute);
12
+ sourceFiles[filePath] = {
13
+ size: stats.size,
14
+ mtimeMs: stats.mtimeMs,
15
+ };
16
+ }
17
+ return sourceFiles;
18
+ }
19
+ export async function loadTokenSets(config) {
20
+ const diagnostics = [];
21
+ const discoveredFiles = await discoverTokenFiles(config.source.tokenDir, config.source.include, config.source.exclude);
22
+ const filesIndex = new Map();
23
+ const sourceFiles = {};
24
+ for (const filePath of discoveredFiles) {
25
+ const absolute = path.join(config.source.tokenDir, filePath);
26
+ try {
27
+ const stats = await fs.stat(absolute);
28
+ sourceFiles[filePath] = {
29
+ size: stats.size,
30
+ mtimeMs: stats.mtimeMs,
31
+ };
32
+ const raw = await fs.readFile(absolute, "utf-8");
33
+ const parsed = JSON.parse(raw);
34
+ const parseResult = parseTokenFile(parsed, filePath);
35
+ diagnostics.push(...parseResult.diagnostics);
36
+ filesIndex.set(filePath, parseResult.tokens);
37
+ }
38
+ catch (error) {
39
+ diagnostics.push({
40
+ level: "error",
41
+ code: "TOKEN_FILE_PARSE_ERROR",
42
+ message: `Failed to parse ${filePath}: ${String(error)}`,
43
+ });
44
+ }
45
+ }
46
+ const projectConfig = await readProjectConfig(config.source.configFile, diagnostics);
47
+ const tokenSets = [];
48
+ for (const tokenSet of config.tokenSets) {
49
+ const tokens = [];
50
+ const resolverMap = new Map();
51
+ const selectorsResolved = [];
52
+ const seenEmit = new Map();
53
+ for (const selector of tokenSet.selectors) {
54
+ const resolution = await resolveSelectorFiles(config.source.tokenDir, selector, projectConfig, diagnostics);
55
+ selectorsResolved.push({
56
+ selector,
57
+ files: resolution.emitFiles,
58
+ resolverFiles: resolution.resolverFiles,
59
+ });
60
+ for (const filePath of resolution.emitFiles) {
61
+ const fileTokens = filesIndex.get(filePath) ?? [];
62
+ for (const token of fileTokens) {
63
+ const candidate = {
64
+ ...token,
65
+ sourceCollection: selector.collection,
66
+ sourceMode: selector.mode,
67
+ };
68
+ const merged = mergeTokenByPath(candidate, tokens, seenEmit, config.options.collisionStrategy, diagnostics);
69
+ if (merged)
70
+ tokens.push(merged);
71
+ }
72
+ }
73
+ for (const filePath of resolution.resolverFiles) {
74
+ const fileTokens = filesIndex.get(filePath) ?? [];
75
+ for (const token of fileTokens) {
76
+ const candidate = {
77
+ ...token,
78
+ sourceCollection: selector.collection,
79
+ sourceMode: selector.mode,
80
+ };
81
+ setResolverToken(resolverMap, candidate);
82
+ }
83
+ }
84
+ }
85
+ tokenSets.push({
86
+ id: tokenSet.id,
87
+ unresolvedAliases: tokenSet.unresolvedAliases,
88
+ tokens,
89
+ resolverTokens: [...resolverMap.values()],
90
+ selectors: selectorsResolved,
91
+ });
92
+ }
93
+ return { tokenSets, diagnostics, filesIndex, projectConfig, sourceFiles };
94
+ }
95
+ export async function discoverTokenFiles(tokenDir, include, exclude) {
96
+ const files = [];
97
+ const seen = new Set();
98
+ for (const pattern of include) {
99
+ const matched = await glob(pattern, {
100
+ cwd: tokenDir,
101
+ nodir: true,
102
+ dot: true,
103
+ posix: true,
104
+ ignore: exclude,
105
+ });
106
+ for (const file of matched) {
107
+ if (seen.has(file))
108
+ continue;
109
+ seen.add(file);
110
+ files.push(file);
111
+ }
112
+ }
113
+ return files;
114
+ }
115
+ async function readProjectConfig(configFilePath, diagnostics) {
116
+ try {
117
+ const raw = await fs.readFile(configFilePath, "utf-8");
118
+ return JSON.parse(raw);
119
+ }
120
+ catch (error) {
121
+ diagnostics.push({
122
+ level: "warn",
123
+ code: "PROJECT_CONFIG_UNAVAILABLE",
124
+ message: `Cannot read source config file ${configFilePath}: ${String(error)}`,
125
+ });
126
+ return null;
127
+ }
128
+ }
129
+ async function resolveSelectorFiles(tokenDir, selector, projectConfig, diagnostics) {
130
+ const orderedEmit = [];
131
+ const emitSeen = new Set();
132
+ const orderedResolver = [];
133
+ const resolverSeen = new Set();
134
+ const appendEmit = (filePath) => {
135
+ if (emitSeen.has(filePath))
136
+ return;
137
+ emitSeen.add(filePath);
138
+ orderedEmit.push(filePath);
139
+ };
140
+ const appendResolver = (filePath) => {
141
+ if (resolverSeen.has(filePath))
142
+ return;
143
+ resolverSeen.add(filePath);
144
+ orderedResolver.push(filePath);
145
+ };
146
+ if (selector.collection && selector.mode) {
147
+ const collection = projectConfig?.collections?.find((item) => item.name === selector.collection);
148
+ if (!collection) {
149
+ diagnostics.push({
150
+ level: "error",
151
+ code: "COLLECTION_NOT_FOUND",
152
+ message: `Selector references unknown collection "${selector.collection}"`,
153
+ });
154
+ }
155
+ else {
156
+ const mode = collection.modes.find((item) => item.name === selector.mode);
157
+ if (!mode) {
158
+ diagnostics.push({
159
+ level: "error",
160
+ code: "MODE_NOT_FOUND",
161
+ message: `Selector references unknown mode "${selector.mode}" in collection "${selector.collection}"`,
162
+ });
163
+ }
164
+ else {
165
+ if (selector.includeRefs !== false) {
166
+ const refFiles = collectReferencedFiles(collection, mode, projectConfig, selector, diagnostics);
167
+ for (const filePath of refFiles) {
168
+ appendResolver(filePath);
169
+ }
170
+ }
171
+ for (const [filePath, status] of Object.entries(mode.files)) {
172
+ if (status !== "enabled")
173
+ continue;
174
+ const normalizedFilePath = normalizeFilePath(filePath);
175
+ appendEmit(normalizedFilePath);
176
+ appendResolver(normalizedFilePath);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ const expansionPatterns = [
182
+ ...(selector.files ?? []),
183
+ ...(selector.include ?? []),
184
+ ];
185
+ for (const pattern of expansionPatterns) {
186
+ const matched = await glob(pattern, {
187
+ cwd: tokenDir,
188
+ nodir: true,
189
+ dot: true,
190
+ posix: true,
191
+ });
192
+ if (matched.length === 0) {
193
+ diagnostics.push({
194
+ level: "warn",
195
+ code: "SELECTOR_PATTERN_EMPTY",
196
+ message: `Selector pattern has no matches: "${pattern}"`,
197
+ });
198
+ }
199
+ for (const filePath of matched) {
200
+ const normalizedFilePath = normalizeFilePath(filePath);
201
+ appendEmit(normalizedFilePath);
202
+ appendResolver(normalizedFilePath);
203
+ }
204
+ }
205
+ const excluded = selector.exclude ?? [];
206
+ const emitFiles = applyExcludePatterns(orderedEmit, excluded);
207
+ const resolverFiles = applyExcludePatterns(orderedResolver, excluded);
208
+ return { emitFiles, resolverFiles };
209
+ }
210
+ function collectReferencedFiles(sourceCollection, sourceMode, projectConfig, selector, diagnostics) {
211
+ if (!projectConfig?.collections || projectConfig.collections.length === 0)
212
+ return [];
213
+ const collections = projectConfig.collections;
214
+ const files = [];
215
+ const fileSeen = new Set();
216
+ const modeVisited = new Set();
217
+ const appendFile = (filePath) => {
218
+ const normalized = normalizeFilePath(filePath);
219
+ if (fileSeen.has(normalized))
220
+ return;
221
+ fileSeen.add(normalized);
222
+ files.push(normalized);
223
+ };
224
+ const appendModeFiles = (mode) => {
225
+ for (const [filePath, status] of Object.entries(mode.files)) {
226
+ if (status !== "enabled")
227
+ continue;
228
+ appendFile(filePath);
229
+ }
230
+ };
231
+ const visit = (collection, mode) => {
232
+ const modeKey = `${collection.name}::${mode.name}`;
233
+ if (modeVisited.has(modeKey))
234
+ return;
235
+ modeVisited.add(modeKey);
236
+ const refs = [
237
+ ...(collection.ref ?? []),
238
+ ...(mode.ref ?? []),
239
+ ];
240
+ for (const ref of refs) {
241
+ if (ref.type !== "local") {
242
+ diagnostics.push({
243
+ level: "warn",
244
+ code: "SELECTOR_REF_UNSUPPORTED",
245
+ message: `Ref type "${ref.type}" is not supported in transformer for selector ` +
246
+ `"${selector.collection ?? "<files>"}:${selector.mode ?? "<none>"}"`,
247
+ });
248
+ continue;
249
+ }
250
+ const targetCollection = collections.find((item) => item.name === ref.collection);
251
+ if (!targetCollection) {
252
+ diagnostics.push({
253
+ level: "warn",
254
+ code: "SELECTOR_REF_COLLECTION_NOT_FOUND",
255
+ message: `Ref points to unknown collection "${ref.collection}" from ` +
256
+ `"${collection.name}/${mode.name}"`,
257
+ });
258
+ continue;
259
+ }
260
+ const targetMode = pickReferencedMode(targetCollection, mode.name, ref, selector, diagnostics, collection.name);
261
+ if (!targetMode)
262
+ continue;
263
+ visit(targetCollection, targetMode);
264
+ appendModeFiles(targetMode);
265
+ }
266
+ };
267
+ visit(sourceCollection, sourceMode);
268
+ return files;
269
+ }
270
+ function pickReferencedMode(collection, currentModeName, ref, selector, diagnostics, sourceCollectionName) {
271
+ const overrideModeName = selector.refModeMap?.[collection.name];
272
+ if (overrideModeName) {
273
+ const overrideMode = collection.modes.find((item) => item.name === overrideModeName && item.enabled !== false);
274
+ if (!overrideMode) {
275
+ diagnostics.push({
276
+ level: "error",
277
+ code: "SELECTOR_REF_MODE_OVERRIDE_NOT_FOUND",
278
+ message: `refModeMap for collection "${collection.name}" points to unknown/disabled mode "${overrideModeName}"`,
279
+ });
280
+ return null;
281
+ }
282
+ return overrideMode;
283
+ }
284
+ if (ref.mode) {
285
+ const explicitMode = collection.modes.find((item) => item.name === ref.mode && item.enabled !== false);
286
+ if (!explicitMode) {
287
+ diagnostics.push({
288
+ level: "error",
289
+ code: "SELECTOR_REF_MODE_NOT_FOUND",
290
+ message: `Ref from "${sourceCollectionName}" points to collection "${collection.name}" mode "${ref.mode}" ` +
291
+ "that does not exist or is disabled",
292
+ });
293
+ return null;
294
+ }
295
+ return explicitMode;
296
+ }
297
+ const sameMode = collection.modes.find((item) => item.name === currentModeName && item.enabled !== false);
298
+ if (sameMode)
299
+ return sameMode;
300
+ const firstEnabled = collection.modes.find((item) => item.enabled !== false);
301
+ if (!firstEnabled) {
302
+ diagnostics.push({
303
+ level: "warn",
304
+ code: "SELECTOR_REF_MODE_DISABLED",
305
+ message: `Collection "${collection.name}" has no enabled modes for ref from "${sourceCollectionName}"`,
306
+ });
307
+ return null;
308
+ }
309
+ diagnostics.push({
310
+ level: "warn",
311
+ code: "SELECTOR_REF_MODE_AMBIGUOUS",
312
+ message: `Ref "${sourceCollectionName}" -> "${collection.name}" has no mode. ` +
313
+ `Using first enabled mode "${firstEnabled.name}". Consider selector.refModeMap for deterministic output.`,
314
+ });
315
+ return firstEnabled;
316
+ }
317
+ function applyExcludePatterns(files, exclude) {
318
+ if (exclude.length === 0)
319
+ return files;
320
+ return files.filter((filePath) => !exclude.some((pattern) => minimatch(filePath, pattern, { dot: true })));
321
+ }
322
+ function setResolverToken(resolverMap, token) {
323
+ const key = canonicalTokenPath(token.path);
324
+ if (resolverMap.has(key)) {
325
+ resolverMap.delete(key);
326
+ }
327
+ resolverMap.set(key, token);
328
+ }
329
+ function normalizeFilePath(filePath) {
330
+ return filePath.replace(/\\/g, "/").replace(/^\.\//, "");
331
+ }
332
+ function mergeTokenByPath(token, out, seen, strategy, diagnostics) {
333
+ const basePath = token.path;
334
+ const index = seen.get(basePath) ?? 0;
335
+ if (index === 0) {
336
+ seen.set(basePath, 1);
337
+ return token;
338
+ }
339
+ seen.set(basePath, index + 1);
340
+ if (strategy === "error") {
341
+ diagnostics.push({
342
+ level: "error",
343
+ code: "TOKEN_PATH_COLLISION",
344
+ message: `Token path collision for "${basePath}" (${token.sourceFile}). ` +
345
+ "Use collisionStrategy != error to auto-namespace",
346
+ tokenPath: basePath,
347
+ });
348
+ return null;
349
+ }
350
+ if (strategy === "suffix") {
351
+ return {
352
+ ...token,
353
+ path: `${basePath}__dup_${index + 1}`,
354
+ };
355
+ }
356
+ if (strategy === "namespace-by-file") {
357
+ const ns = toSafeNamespace(path.basename(token.sourceFile, path.extname(token.sourceFile)));
358
+ return {
359
+ ...token,
360
+ path: `${ns}/${basePath}`,
361
+ };
362
+ }
363
+ const modeNs = toSafeNamespace(token.sourceMode ?? token.sourceCollection ?? path.basename(token.sourceFile, path.extname(token.sourceFile)));
364
+ return {
365
+ ...token,
366
+ path: `${modeNs}/${basePath}`,
367
+ };
368
+ }
369
+ function toSafeNamespace(value) {
370
+ return value
371
+ .replace(/\\/g, "/")
372
+ .split("/")
373
+ .filter(Boolean)
374
+ .join("-")
375
+ .replace(/[^a-zA-Z0-9-_]/g, "-")
376
+ .replace(/-+/g, "-")
377
+ .replace(/^-|-$/g, "")
378
+ .toLowerCase() || "tokens";
379
+ }
380
+ //# sourceMappingURL=token-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-loader.js","sourceRoot":"","sources":["../../src/core/token-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Diagnostic, FlatToken } from "./types.js";
2
+ type ParseResult = {
3
+ tokens: FlatToken[];
4
+ diagnostics: Diagnostic[];
5
+ };
6
+ export declare function parseTokenFile(json: Record<string, unknown>, filePath: string): ParseResult;
7
+ export declare function canonicalTokenPath(pathValue: string): string;
8
+ export declare function canonicalAliasPath(pathValue: string): string;
9
+ export {};
@@ -0,0 +1,138 @@
1
+ import { isTokenType, normalizeTokenTypeKey } from "./token-types.js";
2
+ function isDTCGKey(key) {
3
+ return key.startsWith("$");
4
+ }
5
+ function isTokenNode(node) {
6
+ return typeof node === "object" && node !== null && "$value" in node;
7
+ }
8
+ function parseAlias(value) {
9
+ if (typeof value !== "string")
10
+ return null;
11
+ const trimmed = value.trim();
12
+ if (!/^\{[^{}]+\}$/.test(trimmed))
13
+ return null;
14
+ const inner = trimmed.slice(1, -1).trim();
15
+ if (!inner)
16
+ return null;
17
+ return inner;
18
+ }
19
+ function mergeExtensions(parent, child) {
20
+ if (!parent && !child)
21
+ return undefined;
22
+ if (!parent)
23
+ return child;
24
+ if (!child)
25
+ return { ...parent };
26
+ return { ...parent, ...child };
27
+ }
28
+ function inferTypeFromValue(value) {
29
+ if (typeof value === "boolean")
30
+ return "boolean";
31
+ if (typeof value === "number")
32
+ return "number";
33
+ if (typeof value === "string") {
34
+ const trimmed = value.trim();
35
+ if (parseAlias(trimmed))
36
+ return null;
37
+ if (trimmed.startsWith("#") ||
38
+ trimmed.startsWith("rgb") ||
39
+ trimmed.startsWith("hsl") ||
40
+ trimmed.startsWith("oklch") ||
41
+ trimmed.startsWith("lch") ||
42
+ trimmed.startsWith("color(")) {
43
+ return "color";
44
+ }
45
+ if (/^-?\d*\.?\d+(px|rem|em|%|ms|s|dp|sp|pt)?$/i.test(trimmed)) {
46
+ return "dimension";
47
+ }
48
+ if (trimmed === "true" || trimmed === "false")
49
+ return "boolean";
50
+ }
51
+ if (Array.isArray(value)) {
52
+ if (value.length > 0 && typeof value[0] === "object")
53
+ return "shadow";
54
+ }
55
+ if (typeof value === "object" && value !== null) {
56
+ const obj = value;
57
+ if ("fontFamily" in obj)
58
+ return "typography";
59
+ if (("offsetX" in obj || "offsetY" in obj || "blur" in obj) && "color" in obj)
60
+ return "shadow";
61
+ if ("stops" in obj)
62
+ return "gradient";
63
+ if ("color" in obj && "width" in obj && "style" in obj)
64
+ return "border";
65
+ }
66
+ return null;
67
+ }
68
+ export function parseTokenFile(json, filePath) {
69
+ const diagnostics = [];
70
+ const tokens = [];
71
+ const rootType = typeof json.$type === "string" ? normalizeTokenTypeKey(json.$type) : undefined;
72
+ const rootExtensions = json.$extensions;
73
+ function walk(obj, pathParts, inheritedType, inheritedExtensions) {
74
+ const ownType = typeof obj.$type === "string" ? normalizeTokenTypeKey(obj.$type) : inheritedType;
75
+ const groupExtensions = mergeExtensions(inheritedExtensions, obj.$extensions);
76
+ for (const [key, value] of Object.entries(obj)) {
77
+ if (isDTCGKey(key))
78
+ continue;
79
+ if (typeof value !== "object" || value === null || Array.isArray(value))
80
+ continue;
81
+ const nextPath = [...pathParts, key];
82
+ const node = value;
83
+ if (isTokenNode(node)) {
84
+ let tokenType = typeof node.$type === "string"
85
+ ? normalizeTokenTypeKey(node.$type)
86
+ : ownType;
87
+ if (!tokenType) {
88
+ tokenType = inferTypeFromValue(node.$value) ?? undefined;
89
+ }
90
+ if (!tokenType && parseAlias(node.$value)) {
91
+ tokenType = "color";
92
+ }
93
+ if (!tokenType) {
94
+ diagnostics.push({
95
+ level: "error",
96
+ code: "TOKEN_TYPE_MISSING",
97
+ message: `${filePath}:${nextPath.join("/")} has no $type and cannot infer token type`,
98
+ tokenPath: nextPath.join("/"),
99
+ });
100
+ continue;
101
+ }
102
+ if (!isTokenType(tokenType)) {
103
+ diagnostics.push({
104
+ level: "error",
105
+ code: "TOKEN_TYPE_UNKNOWN",
106
+ message: `${filePath}:${nextPath.join("/")} has unknown $type "${tokenType}"`,
107
+ tokenPath: nextPath.join("/"),
108
+ });
109
+ continue;
110
+ }
111
+ const extensions = mergeExtensions(groupExtensions, node.$extensions);
112
+ const aliasPath = parseAlias(node.$value);
113
+ tokens.push({
114
+ path: nextPath.join("/"),
115
+ type: normalizeTokenTypeKey(tokenType),
116
+ value: node.$value,
117
+ description: typeof node.$description === "string" ? node.$description : undefined,
118
+ extensions,
119
+ id: typeof node.$id === "string" ? node.$id : undefined,
120
+ isAlias: aliasPath !== null,
121
+ aliasPath: aliasPath ?? undefined,
122
+ sourceFile: filePath,
123
+ });
124
+ continue;
125
+ }
126
+ walk(node, nextPath, ownType, groupExtensions);
127
+ }
128
+ }
129
+ walk(json, [], rootType, rootExtensions);
130
+ return { tokens, diagnostics };
131
+ }
132
+ export function canonicalTokenPath(pathValue) {
133
+ return pathValue.replace(/\\/g, "/").replace(/\./g, "/").replace(/\/+/g, "/");
134
+ }
135
+ export function canonicalAliasPath(pathValue) {
136
+ return canonicalTokenPath(pathValue);
137
+ }
138
+ //# sourceMappingURL=token-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-parser.js","sourceRoot":"","sources":["../../src/core/token-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const SIMPLE_TOKEN_TYPES: Set<string>;
2
+ export declare const COMPOSITE_TOKEN_TYPES: Set<string>;
3
+ export declare function normalizeTokenTypeKey(raw: string): string;
4
+ export declare function isSimpleType(type: string): boolean;
5
+ export declare function isCompositeType(type: string): boolean;
6
+ export declare function isTokenType(type: string): boolean;
7
+ export declare function shouldSkipByType(type: string): boolean;