@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.
- package/README.en.md +77 -608
- package/README.md +77 -685
- package/config/sxl-transform.config.yaml +120 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +411 -141
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts +6 -0
- package/dist/config/loader.js +160 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +847 -0
- package/dist/config/schema.js +123 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/color-modifiers.d.ts +31 -0
- package/dist/core/color-modifiers.js +289 -0
- package/dist/core/color-modifiers.js.map +1 -0
- package/dist/core/color-parser.d.ts +24 -0
- package/dist/core/color-parser.js +281 -0
- package/dist/core/color-parser.js.map +1 -0
- package/dist/core/debug-report.d.ts +11 -0
- package/dist/core/debug-report.js +161 -0
- package/dist/core/debug-report.js.map +1 -0
- package/dist/core/incremental.d.ts +18 -0
- package/dist/core/incremental.js +105 -0
- package/dist/core/incremental.js.map +1 -0
- package/dist/core/math.d.ts +3 -0
- package/dist/core/math.js +261 -0
- package/dist/core/math.js.map +1 -0
- package/dist/core/parser.d.ts +4 -3
- package/dist/core/parser.js +68 -172
- package/dist/core/parser.js.map +1 -1
- package/dist/core/resolver.d.ts +26 -0
- package/dist/core/resolver.js +431 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/token-loader.d.ts +11 -0
- package/dist/core/token-loader.js +380 -0
- package/dist/core/token-loader.js.map +1 -0
- package/dist/core/token-parser.d.ts +9 -0
- package/dist/core/token-parser.js +138 -0
- package/dist/core/token-parser.js.map +1 -0
- package/dist/core/token-types.d.ts +7 -0
- package/dist/core/token-types.js +132 -0
- package/dist/core/token-types.js.map +1 -0
- package/dist/core/types.d.ts +154 -63
- package/dist/core/writer.d.ts +18 -5
- package/dist/core/writer.js +545 -91
- package/dist/core/writer.js.map +1 -1
- package/dist/emit/css.d.ts +2 -0
- package/dist/emit/css.js +538 -0
- package/dist/emit/css.js.map +1 -0
- package/dist/emit/kotlin.d.ts +2 -0
- package/dist/emit/kotlin.js +406 -0
- package/dist/emit/kotlin.js.map +1 -0
- package/dist/emit/shared.d.ts +13 -0
- package/dist/emit/shared.js +127 -0
- package/dist/emit/shared.js.map +1 -0
- package/dist/emit/swift.d.ts +2 -0
- package/dist/emit/swift.js +432 -0
- package/dist/emit/swift.js.map +1 -0
- package/dist/emit/typography.d.ts +17 -0
- package/dist/emit/typography.js +132 -0
- package/dist/emit/typography.js.map +1 -0
- package/dist/emit/xml.d.ts +2 -0
- package/dist/emit/xml.js +311 -0
- package/dist/emit/xml.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/transformers/css.d.ts +1 -1
- package/dist/transformers/css.js +13 -482
- package/dist/transformers/css.js.map +1 -1
- package/dist/transformers/kotlin.d.ts +2 -2
- package/dist/transformers/kotlin.js +14 -442
- package/dist/transformers/kotlin.js.map +1 -1
- package/dist/transformers/swiftui.d.ts +2 -2
- package/dist/transformers/swiftui.js +14 -433
- package/dist/transformers/swiftui.js.map +1 -1
- package/dist/utils/color.d.ts +7 -5
- package/dist/utils/color.js +90 -86
- package/dist/utils/color.js.map +1 -1
- package/dist/utils/dimension.d.ts +8 -5
- package/dist/utils/dimension.js +54 -52
- package/dist/utils/dimension.js.map +1 -1
- package/dist/utils/naming.d.ts +10 -12
- package/dist/utils/naming.js +102 -44
- package/dist/utils/naming.js.map +1 -1
- package/package.json +30 -10
- package/config.example.json +0 -45
- package/dist/core/loader.d.ts +0 -8
- package/dist/core/loader.js +0 -105
- package/dist/core/loader.js.map +0 -1
- package/dist/transformers/vue3.d.ts +0 -28
- package/dist/transformers/vue3.js +0 -534
- package/dist/transformers/vue3.js.map +0 -1
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
const ALIAS_RE = /\{([^}]+)\}/g;
|
|
2
|
+
const MATH_OPERATORS = /[+\-*/%]/;
|
|
3
|
+
const FUNC_NAMES = [
|
|
4
|
+
"floor", "ceil", "round", "trunc",
|
|
5
|
+
"min", "max", "clamp",
|
|
6
|
+
"abs", "sign", "mod", "pow", "sqrt", "hypot",
|
|
7
|
+
"exp", "log", "log2", "log10",
|
|
8
|
+
"sin", "cos", "tan", "asin", "acos", "atan", "atan2",
|
|
9
|
+
];
|
|
10
|
+
const CONST_NAMES = {
|
|
11
|
+
pi: Math.PI,
|
|
12
|
+
e: Math.E,
|
|
13
|
+
};
|
|
14
|
+
const ALL_IDENTIFIERS = [...FUNC_NAMES, ...Object.keys(CONST_NAMES)];
|
|
15
|
+
const FUNC_RE = new RegExp(`\\b(${FUNC_NAMES.join("|")})\\s*\\(`, "i");
|
|
16
|
+
const SIMPLE_VALUE_RE = /^-?[\d.]+\s*(px|rem|%|em|pt|ms|s|vw|vh|vmin|vmax|ch|ex|cm|mm|in|pc|dp|sp)?$/i;
|
|
17
|
+
export function isMathExpression(value) {
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
if (/^\{[^}]+\}$/.test(trimmed))
|
|
20
|
+
return false;
|
|
21
|
+
if (SIMPLE_VALUE_RE.test(trimmed))
|
|
22
|
+
return false;
|
|
23
|
+
if (FUNC_RE.test(trimmed))
|
|
24
|
+
return true;
|
|
25
|
+
if (trimmed.includes("{")) {
|
|
26
|
+
const withoutAliases = trimmed.replace(ALIAS_RE, "0");
|
|
27
|
+
if (/(\d(?:\.\d+)?)\s*(px|rem|em|%|pt|ms|s|vw|vh|vmin|vmax|ch|ex|cm|mm|in|pc|dp|sp)\b/gi.test(withoutAliases)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (MATH_OPERATORS.test(withoutAliases))
|
|
31
|
+
return true;
|
|
32
|
+
const stripped = withoutAliases.replace(/\s+/g, "");
|
|
33
|
+
if (stripped !== "0" && stripped.length > 0)
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return MATH_OPERATORS.test(trimmed) && /\d/.test(trimmed);
|
|
37
|
+
}
|
|
38
|
+
function stripUnits(resolved, remBase) {
|
|
39
|
+
return resolved.replace(/(\d+(?:\.\d+)?)\s*(px|rem|em|%|pt|ms|s|vw|vh|vmin|vmax|ch|ex|cm|mm|in|pc|dp|sp)\b/gi, (_match, numStr, unit) => {
|
|
40
|
+
const n = parseFloat(numStr);
|
|
41
|
+
const lower = unit.toLowerCase();
|
|
42
|
+
if (lower === "rem" || lower === "em")
|
|
43
|
+
return String(n * remBase);
|
|
44
|
+
if (lower === "s")
|
|
45
|
+
return String(n * 1000);
|
|
46
|
+
return numStr;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function evaluateMathExpression(expr, resolve, remBase = 16) {
|
|
50
|
+
try {
|
|
51
|
+
let resolved = expr;
|
|
52
|
+
let hasUnresolved = false;
|
|
53
|
+
resolved = resolved.replace(ALIAS_RE, (_match, path) => {
|
|
54
|
+
const value = resolve(path);
|
|
55
|
+
if (value === null || Number.isNaN(value)) {
|
|
56
|
+
hasUnresolved = true;
|
|
57
|
+
return "NaN";
|
|
58
|
+
}
|
|
59
|
+
return value < 0 ? `(${value})` : String(value);
|
|
60
|
+
});
|
|
61
|
+
if (hasUnresolved)
|
|
62
|
+
return null;
|
|
63
|
+
resolved = stripUnits(resolved, remBase);
|
|
64
|
+
return safeEval(resolved);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function safeEval(expr) {
|
|
71
|
+
const tokens = tokenize(expr);
|
|
72
|
+
if (!tokens)
|
|
73
|
+
return null;
|
|
74
|
+
const parsedTokens = tokens;
|
|
75
|
+
let pos = 0;
|
|
76
|
+
function peek() {
|
|
77
|
+
return pos < parsedTokens.length ? parsedTokens[pos] : null;
|
|
78
|
+
}
|
|
79
|
+
function consume() {
|
|
80
|
+
return parsedTokens[pos++];
|
|
81
|
+
}
|
|
82
|
+
function parseExpression() {
|
|
83
|
+
let left = parseTerm();
|
|
84
|
+
if (left === null)
|
|
85
|
+
return null;
|
|
86
|
+
while (peek() === "+" || peek() === "-") {
|
|
87
|
+
const op = consume();
|
|
88
|
+
const right = parseTerm();
|
|
89
|
+
if (right === null)
|
|
90
|
+
return null;
|
|
91
|
+
left = op === "+" ? left + right : left - right;
|
|
92
|
+
}
|
|
93
|
+
return left;
|
|
94
|
+
}
|
|
95
|
+
function parseTerm() {
|
|
96
|
+
let left = parseFactor();
|
|
97
|
+
if (left === null)
|
|
98
|
+
return null;
|
|
99
|
+
while (peek() === "*" || peek() === "/" || peek() === "%") {
|
|
100
|
+
const op = consume();
|
|
101
|
+
const right = parseFactor();
|
|
102
|
+
if (right === null)
|
|
103
|
+
return null;
|
|
104
|
+
if (op === "/") {
|
|
105
|
+
if (right === 0)
|
|
106
|
+
return null;
|
|
107
|
+
left = left / right;
|
|
108
|
+
}
|
|
109
|
+
else if (op === "%") {
|
|
110
|
+
if (right === 0)
|
|
111
|
+
return null;
|
|
112
|
+
left = left % right;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
left = left * right;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return left;
|
|
119
|
+
}
|
|
120
|
+
function parseArgList() {
|
|
121
|
+
if (peek() !== "(")
|
|
122
|
+
return null;
|
|
123
|
+
consume();
|
|
124
|
+
const args = [];
|
|
125
|
+
if (peek() === ")") {
|
|
126
|
+
consume();
|
|
127
|
+
return args;
|
|
128
|
+
}
|
|
129
|
+
const first = parseExpression();
|
|
130
|
+
if (first === null)
|
|
131
|
+
return null;
|
|
132
|
+
args.push(first);
|
|
133
|
+
while (peek() === ",") {
|
|
134
|
+
consume();
|
|
135
|
+
const arg = parseExpression();
|
|
136
|
+
if (arg === null)
|
|
137
|
+
return null;
|
|
138
|
+
args.push(arg);
|
|
139
|
+
}
|
|
140
|
+
if (peek() !== ")")
|
|
141
|
+
return null;
|
|
142
|
+
consume();
|
|
143
|
+
return args;
|
|
144
|
+
}
|
|
145
|
+
function parseFactor() {
|
|
146
|
+
const token = peek();
|
|
147
|
+
if (token === null)
|
|
148
|
+
return null;
|
|
149
|
+
const lower = token.toLowerCase();
|
|
150
|
+
if (CONST_NAMES[lower] !== undefined) {
|
|
151
|
+
consume();
|
|
152
|
+
return CONST_NAMES[lower];
|
|
153
|
+
}
|
|
154
|
+
if (FUNC_NAMES.includes(lower)) {
|
|
155
|
+
const funcName = consume().toLowerCase();
|
|
156
|
+
const args = parseArgList();
|
|
157
|
+
if (args === null)
|
|
158
|
+
return null;
|
|
159
|
+
switch (funcName) {
|
|
160
|
+
case "floor": return args.length === 1 ? Math.floor(args[0]) : null;
|
|
161
|
+
case "ceil": return args.length === 1 ? Math.ceil(args[0]) : null;
|
|
162
|
+
case "trunc": return args.length === 1 ? Math.trunc(args[0]) : null;
|
|
163
|
+
case "round":
|
|
164
|
+
if (args.length === 1)
|
|
165
|
+
return Math.round(args[0]);
|
|
166
|
+
if (args.length === 2) {
|
|
167
|
+
const p = Math.pow(10, args[1]);
|
|
168
|
+
return Math.round(args[0] * p) / p;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
case "min": return args.length >= 1 ? Math.min(...args) : null;
|
|
172
|
+
case "max": return args.length >= 1 ? Math.max(...args) : null;
|
|
173
|
+
case "clamp": return args.length === 3 ? Math.min(Math.max(args[0], args[1]), args[2]) : null;
|
|
174
|
+
case "abs": return args.length === 1 ? Math.abs(args[0]) : null;
|
|
175
|
+
case "sign": return args.length === 1 ? Math.sign(args[0]) : null;
|
|
176
|
+
case "mod": return args.length === 2 && args[1] !== 0 ? ((args[0] % args[1]) + args[1]) % args[1] : null;
|
|
177
|
+
case "pow": return args.length === 2 ? Math.pow(args[0], args[1]) : null;
|
|
178
|
+
case "sqrt": return args.length === 1 ? Math.sqrt(args[0]) : null;
|
|
179
|
+
case "hypot": return args.length >= 1 ? Math.hypot(...args) : null;
|
|
180
|
+
case "exp": return args.length === 1 ? Math.exp(args[0]) : null;
|
|
181
|
+
case "log": return args.length === 1 ? Math.log(args[0]) : null;
|
|
182
|
+
case "log2": return args.length === 1 ? Math.log2(args[0]) : null;
|
|
183
|
+
case "log10": return args.length === 1 ? Math.log10(args[0]) : null;
|
|
184
|
+
case "sin": return args.length === 1 ? Math.sin(args[0]) : null;
|
|
185
|
+
case "cos": return args.length === 1 ? Math.cos(args[0]) : null;
|
|
186
|
+
case "tan": return args.length === 1 ? Math.tan(args[0]) : null;
|
|
187
|
+
case "asin": return args.length === 1 ? Math.asin(args[0]) : null;
|
|
188
|
+
case "acos": return args.length === 1 ? Math.acos(args[0]) : null;
|
|
189
|
+
case "atan": return args.length === 1 ? Math.atan(args[0]) : null;
|
|
190
|
+
case "atan2": return args.length === 2 ? Math.atan2(args[0], args[1]) : null;
|
|
191
|
+
default: return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (token === "(") {
|
|
195
|
+
consume();
|
|
196
|
+
const value = parseExpression();
|
|
197
|
+
if (peek() !== ")")
|
|
198
|
+
return null;
|
|
199
|
+
consume();
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
if (token === "-") {
|
|
203
|
+
consume();
|
|
204
|
+
const value = parseFactor();
|
|
205
|
+
return value === null ? null : -value;
|
|
206
|
+
}
|
|
207
|
+
const number = parseFloat(token);
|
|
208
|
+
if (Number.isNaN(number))
|
|
209
|
+
return null;
|
|
210
|
+
consume();
|
|
211
|
+
return number;
|
|
212
|
+
}
|
|
213
|
+
const result = parseExpression();
|
|
214
|
+
if (result === null)
|
|
215
|
+
return null;
|
|
216
|
+
if (pos !== parsedTokens.length)
|
|
217
|
+
return null;
|
|
218
|
+
return result;
|
|
219
|
+
}
|
|
220
|
+
function tokenize(expr) {
|
|
221
|
+
const source = expr.trim();
|
|
222
|
+
const tokens = [];
|
|
223
|
+
let i = 0;
|
|
224
|
+
while (i < source.length) {
|
|
225
|
+
if (source[i] === " " || source[i] === "\t") {
|
|
226
|
+
i += 1;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if ("+-*/%(),".includes(source[i])) {
|
|
230
|
+
tokens.push(source[i]);
|
|
231
|
+
i += 1;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (/[a-zA-Z_]/.test(source[i])) {
|
|
235
|
+
let name = "";
|
|
236
|
+
while (i < source.length && /[a-zA-Z_\d]/.test(source[i])) {
|
|
237
|
+
name += source[i];
|
|
238
|
+
i += 1;
|
|
239
|
+
}
|
|
240
|
+
const lower = name.toLowerCase();
|
|
241
|
+
if (!ALL_IDENTIFIERS.includes(lower))
|
|
242
|
+
return null;
|
|
243
|
+
tokens.push(lower);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (/[\d.]/.test(source[i])) {
|
|
247
|
+
let value = "";
|
|
248
|
+
while (i < source.length && /[\d.eE]/.test(source[i])) {
|
|
249
|
+
value += source[i];
|
|
250
|
+
i += 1;
|
|
251
|
+
}
|
|
252
|
+
if (!value || Number.isNaN(parseFloat(value)))
|
|
253
|
+
return null;
|
|
254
|
+
tokens.push(value);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
return tokens.length > 0 ? tokens : null;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/core/math.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACjC,KAAK,EAAE,KAAK,EAAE,OAAO;IACrB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;IAC5C,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;IAC7B,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;CACrD,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,EAAE,EAAE,IAAI,CAAC,EAAE;IACX,CAAC,EAAE,IAAI,CAAC,CAAC;CACV,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACrE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAEvE,MAAM,eAAe,GAAG,8EAA8E,CAAC;AAIvG,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEtD,IAAI,oFAAoF,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9G,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAC;QAErD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3D,CAAC;IAED,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,OAAe;IACnD,OAAO,QAAQ,CAAC,OAAO,CACrB,qFAAqF,EACrF,CAAC,MAAM,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QAClE,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,OAAuB,EACvB,OAAO,GAAG,EAAE;IAEZ,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,IAAI,aAAa;YAAE,OAAO,IAAI,CAAC;QAE/B,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,YAAY,GAAG,MAAM,CAAC;IAE5B,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,SAAS,IAAI;QACX,OAAO,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,SAAS,OAAO;QACd,OAAO,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,eAAe;QACtB,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/B,OAAO,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,SAAS;QAChB,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/B,OAAO,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC1D,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAEhC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC7B,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACtB,IAAI,KAAK,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC7B,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,YAAY;QACnB,IAAI,IAAI,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,EAAE,CAAC;QAEV,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,OAAO,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,EAAE,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,WAAW;QAClB,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;QACrB,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAElC,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;YACV,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAE/B,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,KAAK,OAAO;oBACV,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACrC,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/D,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC/D,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9F,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzG,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClE,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC7E,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,IAAI,EAAE,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;YAC5B,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,EAAE,CAAC;QACV,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,GAAG,KAAK,YAAY,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YAED,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC"}
|
package/dist/core/parser.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { FlatToken } from "./types.js";
|
|
1
|
+
import type { FlatToken } from "./types.js";
|
|
2
|
+
export type ValueMap = Map<string, FlatToken>;
|
|
2
3
|
export declare function parseTokenFile(json: Record<string, unknown>, filePath: string): FlatToken[];
|
|
3
|
-
export declare function buildValueMap(tokens: FlatToken[]):
|
|
4
|
-
export declare function resolveAllAliases(tokens: FlatToken[], lookup:
|
|
4
|
+
export declare function buildValueMap(tokens: FlatToken[]): ValueMap;
|
|
5
|
+
export declare function resolveAllAliases(tokens: FlatToken[], lookup: ValueMap): void;
|
|
5
6
|
export declare function evaluateMathExpressions(tokens: FlatToken[]): void;
|
package/dist/core/parser.js
CHANGED
|
@@ -1,186 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { parseTokenFile as parseTokenFileStrict, canonicalTokenPath } from "./token-parser.js";
|
|
2
|
+
import { resolveTokens } from "./resolver.js";
|
|
3
|
+
import { isMathExpression, evaluateMathExpression } from "./math.js";
|
|
4
|
+
function appendTokenLookup(map, token) {
|
|
5
|
+
const canonical = canonicalTokenPath(token.path);
|
|
6
|
+
const dot = canonical.replace(/\//g, ".");
|
|
7
|
+
const slash = canonical.replace(/\./g, "/");
|
|
8
|
+
map.set(token.path, token);
|
|
9
|
+
map.set(canonical, token);
|
|
10
|
+
map.set(dot, token);
|
|
11
|
+
map.set(slash, token);
|
|
3
12
|
}
|
|
4
|
-
function
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
continue;
|
|
12
|
-
const node = value;
|
|
13
|
-
const path = prefix ? `${prefix}.${key}` : key;
|
|
14
|
-
const nodeType = node.$type || groupType;
|
|
15
|
-
if ("$value" in node) {
|
|
16
|
-
const val = node.$value;
|
|
17
|
-
const isPureAlias = typeof val === "string" && /^\{[^{}]+\}$/.test(val.trim());
|
|
18
|
-
const aliasPath = isPureAlias ? val.slice(1, -1) : undefined;
|
|
19
|
-
const description = node.$description;
|
|
20
|
-
const extensions = node.$extensions;
|
|
21
|
-
tokens.push({
|
|
22
|
-
path,
|
|
23
|
-
name: key,
|
|
24
|
-
type: (nodeType || inferType(val)),
|
|
25
|
-
value: val,
|
|
26
|
-
isAlias: isPureAlias,
|
|
27
|
-
aliasPath,
|
|
28
|
-
description,
|
|
29
|
-
extensions,
|
|
30
|
-
sourceFile: filePath,
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
tokens.push(...collectTokens(node, nodeType, path, filePath));
|
|
35
|
-
}
|
|
13
|
+
function asLookupTokens(lookup) {
|
|
14
|
+
const dedup = new Map();
|
|
15
|
+
for (const token of lookup.values()) {
|
|
16
|
+
const key = canonicalTokenPath(token.path);
|
|
17
|
+
if (dedup.has(key))
|
|
18
|
+
dedup.delete(key);
|
|
19
|
+
dedup.set(key, token);
|
|
36
20
|
}
|
|
37
|
-
return
|
|
21
|
+
return [...dedup.values()];
|
|
38
22
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
return "boolean";
|
|
42
|
-
if (typeof value === "number")
|
|
43
|
-
return "number";
|
|
44
|
-
if (typeof value === "string") {
|
|
45
|
-
const v = value.trim();
|
|
46
|
-
if (/^#|^rgb|^hsl|^oklch|^lch|^color\(/.test(v))
|
|
47
|
-
return "color";
|
|
48
|
-
if (/^-?\d+(\.\d+)?(px|rem|em|%|pt|dp|sp)?$/.test(v))
|
|
49
|
-
return "dimension";
|
|
50
|
-
}
|
|
51
|
-
if (typeof value === "object" && value !== null) {
|
|
52
|
-
const obj = value;
|
|
53
|
-
if ("fontFamily" in obj)
|
|
54
|
-
return "typography";
|
|
55
|
-
if ("offsetX" in obj || "offsetY" in obj)
|
|
56
|
-
return "shadow";
|
|
57
|
-
if ("color" in obj && "width" in obj && "style" in obj)
|
|
58
|
-
return "border";
|
|
59
|
-
if ("stops" in obj)
|
|
60
|
-
return "gradient";
|
|
61
|
-
if ("blur" in obj)
|
|
62
|
-
return "blur";
|
|
63
|
-
}
|
|
64
|
-
return "string";
|
|
23
|
+
export function parseTokenFile(json, filePath) {
|
|
24
|
+
return parseTokenFileStrict(json, filePath).tokens;
|
|
65
25
|
}
|
|
66
26
|
export function buildValueMap(tokens) {
|
|
67
|
-
const
|
|
68
|
-
for (const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
return map;
|
|
27
|
+
const lookup = new Map();
|
|
28
|
+
for (const token of tokens)
|
|
29
|
+
appendTokenLookup(lookup, token);
|
|
30
|
+
return lookup;
|
|
73
31
|
}
|
|
74
32
|
export function resolveAllAliases(tokens, lookup) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
function resolveAlias(aliasPath, lookup, visited, maxDepth) {
|
|
88
|
-
if (maxDepth <= 0 || visited.has(aliasPath))
|
|
89
|
-
return `{${aliasPath}}`;
|
|
90
|
-
visited.add(aliasPath);
|
|
91
|
-
const normalized = aliasPath.replace(/\//g, ".");
|
|
92
|
-
const target = lookup.get(normalized) ?? lookup.get(aliasPath);
|
|
93
|
-
if (!target)
|
|
94
|
-
return `{${aliasPath}}`;
|
|
95
|
-
if (target.isAlias && target.aliasPath) {
|
|
96
|
-
return resolveAlias(target.aliasPath, lookup, visited, maxDepth - 1);
|
|
97
|
-
}
|
|
98
|
-
if (hasEmbeddedAliases(target.value)) {
|
|
99
|
-
return resolveEmbeddedAliases(target.value, lookup, visited);
|
|
100
|
-
}
|
|
101
|
-
return target.value;
|
|
102
|
-
}
|
|
103
|
-
function hasEmbeddedAliases(val) {
|
|
104
|
-
if (typeof val === "string")
|
|
105
|
-
return /\{[^{}]+\}/.test(val);
|
|
106
|
-
if (Array.isArray(val))
|
|
107
|
-
return val.some(hasEmbeddedAliases);
|
|
108
|
-
if (typeof val === "object" && val !== null) {
|
|
109
|
-
return Object.values(val).some(hasEmbeddedAliases);
|
|
33
|
+
const { tokens: resolvedTokens } = resolveTokens(tokens, {
|
|
34
|
+
remBase: 16,
|
|
35
|
+
maxDepth: 20,
|
|
36
|
+
unresolvedAlias: "ignore",
|
|
37
|
+
}, {
|
|
38
|
+
lookupTokens: asLookupTokens(lookup),
|
|
39
|
+
});
|
|
40
|
+
const resolvedByPath = new Map();
|
|
41
|
+
for (const token of resolvedTokens) {
|
|
42
|
+
resolvedByPath.set(canonicalTokenPath(token.path), token);
|
|
110
43
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return resolveAlias(ref, lookup, new Set(seen), 20);
|
|
119
|
-
}
|
|
120
|
-
return val.replace(/\{([^{}]+)\}/g, (_m, ref) => {
|
|
121
|
-
const resolved = resolveAlias(ref, lookup, new Set(seen), 20);
|
|
122
|
-
if (typeof resolved === "string")
|
|
123
|
-
return resolved;
|
|
124
|
-
if (typeof resolved === "number" || typeof resolved === "boolean")
|
|
125
|
-
return String(resolved);
|
|
126
|
-
try {
|
|
127
|
-
return JSON.stringify(resolved);
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
return `{${ref}}`;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
if (Array.isArray(val))
|
|
135
|
-
return val.map(item => resolveEmbeddedAliases(item, lookup, seen));
|
|
136
|
-
if (typeof val === "object" && val !== null) {
|
|
137
|
-
const result = {};
|
|
138
|
-
for (const [k, v] of Object.entries(val)) {
|
|
139
|
-
result[k] = resolveEmbeddedAliases(v, lookup, seen);
|
|
140
|
-
}
|
|
141
|
-
return result;
|
|
44
|
+
for (const token of tokens) {
|
|
45
|
+
const resolved = resolvedByPath.get(canonicalTokenPath(token.path));
|
|
46
|
+
if (!resolved)
|
|
47
|
+
continue;
|
|
48
|
+
token.resolvedValue = resolved.resolvedValue;
|
|
49
|
+
token.isAlias = resolved.isAlias;
|
|
50
|
+
token.aliasPath = resolved.aliasPath;
|
|
142
51
|
}
|
|
143
|
-
return val;
|
|
144
52
|
}
|
|
145
53
|
export function evaluateMathExpressions(tokens) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const unit = val.match(/(px|rem|em|%|pt|dp|sp)/)?.[1] || "";
|
|
173
|
-
return unit ? `${result}${unit}` : result;
|
|
174
|
-
}
|
|
175
|
-
catch { /* not math */ }
|
|
176
|
-
}
|
|
177
|
-
const roundMatch = val.match(/^round\((.+)\)$/);
|
|
178
|
-
if (roundMatch) {
|
|
179
|
-
const inner = tryEvalMath(roundMatch[1]);
|
|
180
|
-
const num = typeof inner === "number" ? inner : parseFloat(String(inner));
|
|
181
|
-
if (!isNaN(num))
|
|
182
|
-
return Math.round(num);
|
|
54
|
+
const lookup = buildValueMap(tokens);
|
|
55
|
+
const resolveAliasNumber = (aliasPath) => {
|
|
56
|
+
const alias = canonicalTokenPath(aliasPath);
|
|
57
|
+
const dot = alias.replace(/\//g, ".");
|
|
58
|
+
const slash = alias.replace(/\./g, "/");
|
|
59
|
+
const token = lookup.get(aliasPath) ?? lookup.get(alias) ?? lookup.get(dot) ?? lookup.get(slash);
|
|
60
|
+
if (!token)
|
|
61
|
+
return null;
|
|
62
|
+
const candidate = token.resolvedValue ?? token.value;
|
|
63
|
+
if (typeof candidate === "number" && Number.isFinite(candidate))
|
|
64
|
+
return candidate;
|
|
65
|
+
if (typeof candidate !== "string")
|
|
66
|
+
return null;
|
|
67
|
+
const parsed = Number(candidate);
|
|
68
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
69
|
+
};
|
|
70
|
+
for (const token of tokens) {
|
|
71
|
+
const candidate = token.resolvedValue ?? token.value;
|
|
72
|
+
if (typeof candidate !== "string")
|
|
73
|
+
continue;
|
|
74
|
+
if (!isMathExpression(candidate))
|
|
75
|
+
continue;
|
|
76
|
+
const evaluated = evaluateMathExpression(candidate, resolveAliasNumber, 16);
|
|
77
|
+
if (evaluated === null)
|
|
78
|
+
continue;
|
|
79
|
+
token.resolvedValue = evaluated;
|
|
183
80
|
}
|
|
184
|
-
return val;
|
|
185
81
|
}
|
|
186
82
|
//# sourceMappingURL=parser.js.map
|
package/dist/core/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Diagnostic, FlatToken } from "./types.js";
|
|
2
|
+
import type { FigmaRGBA } from "./color-parser.js";
|
|
3
|
+
import type { UnresolvedAliasAction } from "./types.js";
|
|
4
|
+
export type ResolveOptions = {
|
|
5
|
+
remBase: number;
|
|
6
|
+
maxDepth: number;
|
|
7
|
+
unresolvedAlias: UnresolvedAliasAction;
|
|
8
|
+
autoFixAliasSyntax?: boolean;
|
|
9
|
+
skipTokensWithIssues?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type ResolveResult = {
|
|
12
|
+
tokens: FlatToken[];
|
|
13
|
+
diagnostics: Diagnostic[];
|
|
14
|
+
lookup: Map<string, FlatToken>;
|
|
15
|
+
};
|
|
16
|
+
export type ResolveContext = {
|
|
17
|
+
lookupTokens?: FlatToken[];
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveTokens(tokens: FlatToken[], options: ResolveOptions, context?: ResolveContext): ResolveResult;
|
|
20
|
+
export declare function buildLookup(tokens: FlatToken[]): Map<string, FlatToken>;
|
|
21
|
+
export declare function parseNumericValue(raw: unknown, remBase: number, tokenType?: string): number | null;
|
|
22
|
+
export declare function parseColorValue(raw: unknown): FigmaRGBA | null;
|
|
23
|
+
export declare function shouldSkipTokenType(type: string, unsupported: {
|
|
24
|
+
default: "skip" | "warn" | "error";
|
|
25
|
+
types: Record<string, "skip" | "warn" | "error">;
|
|
26
|
+
}): "skip" | "warn" | "error";
|