@terrazzo/parser 0.1.3 → 0.2.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 (118) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +23 -0
  3. package/CONTRIBUTING.md +0 -12
  4. package/dist/build/index.d.ts +19 -0
  5. package/dist/build/index.js +165 -0
  6. package/dist/build/index.js.map +1 -0
  7. package/dist/config.d.ts +7 -0
  8. package/dist/config.js +269 -0
  9. package/dist/config.js.map +1 -0
  10. package/{index.d.ts → dist/index.d.ts} +1 -5
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/code-frame.d.ts +30 -0
  14. package/dist/lib/code-frame.js +108 -0
  15. package/dist/lib/code-frame.js.map +1 -0
  16. package/dist/lint/index.d.ts +11 -0
  17. package/dist/lint/index.js +102 -0
  18. package/dist/lint/index.js.map +1 -0
  19. package/dist/lint/plugin-core/index.d.ts +12 -0
  20. package/dist/lint/plugin-core/index.js +40 -0
  21. package/dist/lint/plugin-core/index.js.map +1 -0
  22. package/dist/lint/plugin-core/lib/docs.d.ts +1 -0
  23. package/dist/lint/plugin-core/lib/docs.js +4 -0
  24. package/dist/lint/plugin-core/lib/docs.js.map +1 -0
  25. package/dist/lint/plugin-core/rules/a11y-min-contrast.d.ts +39 -0
  26. package/dist/lint/plugin-core/rules/a11y-min-contrast.js +58 -0
  27. package/dist/lint/plugin-core/rules/a11y-min-contrast.js.map +1 -0
  28. package/dist/lint/plugin-core/rules/a11y-min-font-size.d.ts +13 -0
  29. package/dist/lint/plugin-core/rules/a11y-min-font-size.js +45 -0
  30. package/dist/lint/plugin-core/rules/a11y-min-font-size.js.map +1 -0
  31. package/dist/lint/plugin-core/rules/colorspace.d.ts +14 -0
  32. package/dist/lint/plugin-core/rules/colorspace.js +85 -0
  33. package/dist/lint/plugin-core/rules/colorspace.js.map +1 -0
  34. package/dist/lint/plugin-core/rules/consistent-naming.d.ts +11 -0
  35. package/dist/lint/plugin-core/rules/consistent-naming.js +49 -0
  36. package/dist/lint/plugin-core/rules/consistent-naming.js.map +1 -0
  37. package/dist/lint/plugin-core/rules/descriptions.d.ts +9 -0
  38. package/dist/lint/plugin-core/rules/descriptions.js +32 -0
  39. package/dist/lint/plugin-core/rules/descriptions.js.map +1 -0
  40. package/dist/lint/plugin-core/rules/duplicate-values.d.ts +9 -0
  41. package/dist/lint/plugin-core/rules/duplicate-values.js +65 -0
  42. package/dist/lint/plugin-core/rules/duplicate-values.js.map +1 -0
  43. package/dist/lint/plugin-core/rules/max-gamut.d.ts +14 -0
  44. package/dist/lint/plugin-core/rules/max-gamut.js +101 -0
  45. package/dist/lint/plugin-core/rules/max-gamut.js.map +1 -0
  46. package/dist/lint/plugin-core/rules/required-children.d.ts +18 -0
  47. package/dist/lint/plugin-core/rules/required-children.js +78 -0
  48. package/dist/lint/plugin-core/rules/required-children.js.map +1 -0
  49. package/dist/lint/plugin-core/rules/required-modes.d.ts +13 -0
  50. package/dist/lint/plugin-core/rules/required-modes.js +52 -0
  51. package/dist/lint/plugin-core/rules/required-modes.js.map +1 -0
  52. package/dist/lint/plugin-core/rules/required-typography-properties.d.ts +10 -0
  53. package/dist/lint/plugin-core/rules/required-typography-properties.js +38 -0
  54. package/dist/lint/plugin-core/rules/required-typography-properties.js.map +1 -0
  55. package/dist/logger.d.ts +76 -0
  56. package/dist/logger.js +123 -0
  57. package/dist/logger.js.map +1 -0
  58. package/dist/parse/alias.d.ts +51 -0
  59. package/dist/parse/alias.js +188 -0
  60. package/dist/parse/alias.js.map +1 -0
  61. package/dist/parse/index.d.ts +27 -0
  62. package/dist/parse/index.js +379 -0
  63. package/dist/parse/index.js.map +1 -0
  64. package/dist/parse/json.d.ts +36 -0
  65. package/dist/parse/json.js +88 -0
  66. package/dist/parse/json.js.map +1 -0
  67. package/dist/parse/normalize.d.ts +23 -0
  68. package/dist/parse/normalize.js +163 -0
  69. package/dist/parse/normalize.js.map +1 -0
  70. package/dist/parse/validate.d.ts +45 -0
  71. package/dist/parse/validate.js +601 -0
  72. package/dist/parse/validate.js.map +1 -0
  73. package/dist/types.d.ts +264 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +7 -7
  77. package/{build/index.js → src/build/index.ts} +47 -63
  78. package/src/config.ts +280 -0
  79. package/src/index.ts +18 -0
  80. package/{lib/code-frame.js → src/lib/code-frame.ts} +41 -8
  81. package/src/lint/index.ts +135 -0
  82. package/src/lint/plugin-core/index.ts +47 -0
  83. package/src/lint/plugin-core/lib/docs.ts +3 -0
  84. package/src/lint/plugin-core/rules/a11y-min-contrast.ts +91 -0
  85. package/src/lint/plugin-core/rules/a11y-min-font-size.ts +64 -0
  86. package/src/lint/plugin-core/rules/colorspace.ts +101 -0
  87. package/src/lint/plugin-core/rules/consistent-naming.ts +65 -0
  88. package/src/lint/plugin-core/rules/descriptions.ts +41 -0
  89. package/src/lint/plugin-core/rules/duplicate-values.ts +80 -0
  90. package/src/lint/plugin-core/rules/max-gamut.ts +121 -0
  91. package/src/lint/plugin-core/rules/required-children.ts +104 -0
  92. package/src/lint/plugin-core/rules/required-modes.ts +71 -0
  93. package/src/lint/plugin-core/rules/required-typography-properties.ts +53 -0
  94. package/{logger.js → src/logger.ts} +55 -16
  95. package/src/parse/alias.ts +224 -0
  96. package/src/parse/index.ts +457 -0
  97. package/src/parse/json.ts +106 -0
  98. package/{parse/normalize.js → src/parse/normalize.ts} +70 -24
  99. package/{parse/validate.js → src/parse/validate.ts} +154 -236
  100. package/src/types.ts +310 -0
  101. package/build/index.d.ts +0 -113
  102. package/config.d.ts +0 -64
  103. package/config.js +0 -206
  104. package/index.js +0 -35
  105. package/lib/code-frame.d.ts +0 -56
  106. package/lint/index.d.ts +0 -44
  107. package/lint/index.js +0 -59
  108. package/lint/plugin-core/index.d.ts +0 -3
  109. package/lint/plugin-core/index.js +0 -12
  110. package/lint/plugin-core/rules/duplicate-values.d.ts +0 -10
  111. package/lint/plugin-core/rules/duplicate-values.js +0 -68
  112. package/logger.d.ts +0 -71
  113. package/parse/index.d.ts +0 -45
  114. package/parse/index.js +0 -592
  115. package/parse/json.d.ts +0 -30
  116. package/parse/json.js +0 -94
  117. package/parse/normalize.d.ts +0 -3
  118. package/parse/validate.d.ts +0 -43
@@ -0,0 +1,379 @@
1
+ import { evaluate, parse as parseJSON, print } from '@humanwhocodes/momoa';
2
+ import { isTokenMatch, pluralize, splitID } from '@terrazzo/token-tools';
3
+ import lintRunner from '../lint/index.js';
4
+ import Logger from '../logger.js';
5
+ import { applyAliases } from './alias.js';
6
+ import { getObjMembers, injectObjMembers, maybeJSONString, traverse } from './json.js';
7
+ import normalize from './normalize.js';
8
+ import validate from './validate.js';
9
+ export * from './validate.js';
10
+ /** Parse */
11
+ export default async function parse(input, { logger = new Logger(), skipLint = false, config = {}, continueOnError = false, yamlToMomoa, } = {}) {
12
+ let tokens = {};
13
+ // note: only keeps track of sources with locations on disk; in-memory sources are discarded
14
+ // (it’s only for reporting line numbers, which doesn’t mean as much for dynamic sources)
15
+ const sources = {};
16
+ if (!Array.isArray(input)) {
17
+ logger.error({ group: 'parser', label: 'init', message: 'Input must be an array of input objects.' });
18
+ }
19
+ for (let i = 0; i < input.length; i++) {
20
+ if (!input[i] || typeof input[i] !== 'object') {
21
+ logger.error({ group: 'parser', label: 'init', message: `Input (${i}) must be an object.` });
22
+ }
23
+ if (!input[i].src || (typeof input[i].src !== 'string' && typeof input[i].src !== 'object')) {
24
+ logger.error({
25
+ group: 'parser',
26
+ label: 'init',
27
+ message: `Input (${i}) missing "src" with a JSON/YAML string, or JSON object.`,
28
+ });
29
+ }
30
+ if (input[i].filename && !(input[i].filename instanceof URL)) {
31
+ logger.error({
32
+ group: 'parser',
33
+ label: 'init',
34
+ message: `Input (${i}) "filename" must be a URL (remote or file URL).`,
35
+ });
36
+ }
37
+ const result = await parseSingle(input[i].src, {
38
+ filename: input[i].filename,
39
+ logger,
40
+ config,
41
+ skipLint,
42
+ continueOnError,
43
+ yamlToMomoa,
44
+ });
45
+ tokens = Object.assign(tokens, result.tokens);
46
+ if (input[i].filename) {
47
+ sources[input[i].filename.protocol === 'file:' ? input[i].filename.href : input[i].filename.href] = {
48
+ filename: input[i].filename,
49
+ src: result.src,
50
+ document: result.document,
51
+ };
52
+ }
53
+ }
54
+ const totalStart = performance.now();
55
+ // 5. Resolve aliases and populate groups
56
+ for (const [id, token] of Object.entries(tokens)) {
57
+ if (!Object.hasOwn(tokens, id)) {
58
+ continue;
59
+ }
60
+ applyAliases(token, {
61
+ tokens,
62
+ filename: sources[token.source.loc]?.filename,
63
+ src: sources[token.source.loc]?.src,
64
+ node: token.source.node,
65
+ logger,
66
+ });
67
+ token.mode['.'].$value = token.$value;
68
+ if (token.aliasOf) {
69
+ token.mode['.'].aliasOf = token.aliasOf;
70
+ }
71
+ if (token.partialAliasOf) {
72
+ token.mode['.'].partialAliasOf = token.partialAliasOf;
73
+ }
74
+ const { group: parentGroup } = splitID(id);
75
+ if (parentGroup) {
76
+ for (const siblingID of Object.keys(tokens)) {
77
+ const { group: siblingGroup } = splitID(siblingID);
78
+ if (siblingGroup?.startsWith(parentGroup)) {
79
+ token.group.tokens.push(siblingID);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ // 6. resolve mode aliases
85
+ const modesStart = performance.now();
86
+ logger.debug({
87
+ group: 'parser',
88
+ label: 'modes',
89
+ message: 'Start mode resolution',
90
+ });
91
+ for (const [id, token] of Object.entries(tokens)) {
92
+ if (!Object.hasOwn(tokens, id)) {
93
+ continue;
94
+ }
95
+ for (const [mode, modeValue] of Object.entries(token.mode)) {
96
+ if (mode === '.') {
97
+ continue; // skip shadow of root value
98
+ }
99
+ applyAliases(modeValue, {
100
+ tokens,
101
+ node: modeValue.source.node,
102
+ logger,
103
+ src: sources[token.source.loc]?.src,
104
+ });
105
+ }
106
+ }
107
+ logger.debug({
108
+ group: 'parser',
109
+ label: 'modes',
110
+ message: 'Finish token modes',
111
+ timing: performance.now() - modesStart,
112
+ });
113
+ logger.debug({
114
+ group: 'parser',
115
+ label: 'core',
116
+ message: 'Finish all parser tasks',
117
+ timing: performance.now() - totalStart,
118
+ });
119
+ if (continueOnError) {
120
+ const { errorCount } = logger.stats();
121
+ if (errorCount > 0) {
122
+ logger.error({
123
+ message: `Parser encountered ${errorCount} ${pluralize(errorCount, 'error', 'errors')}. Exiting.`,
124
+ });
125
+ }
126
+ }
127
+ return {
128
+ tokens,
129
+ sources: Object.values(sources),
130
+ };
131
+ }
132
+ /** Parse a single input */
133
+ async function parseSingle(input, { filename, logger, config, skipLint, continueOnError = false, yamlToMomoa, // optional dependency, declared here so the parser itself doesn’t have to load a heavy dep in-browser
134
+ }) {
135
+ // 1. Build AST
136
+ let src;
137
+ if (typeof input === 'string') {
138
+ src = input;
139
+ }
140
+ const startParsing = performance.now();
141
+ logger.debug({ group: 'parser', label: 'parse', message: 'Start tokens parsing' });
142
+ let document = {};
143
+ if (typeof input === 'string' && !maybeJSONString(input)) {
144
+ if (yamlToMomoa) {
145
+ try {
146
+ document = yamlToMomoa(input); // if string, but not JSON, attempt YAML
147
+ }
148
+ catch (err) {
149
+ logger.error({ message: String(err), filename, src: input, continueOnError });
150
+ }
151
+ }
152
+ else {
153
+ logger.error({
154
+ group: 'parser',
155
+ message: `Install \`yaml-to-momoa\` package to parse YAML, and pass in as option, e.g.:
156
+
157
+ import { parse } from '@terrazzo/parser';
158
+ import yamlToMomoa from 'yaml-to-momoa';
159
+
160
+ parse(yamlString, { yamlToMomoa });`,
161
+ continueOnError: false, // fail here; no point in continuing
162
+ });
163
+ }
164
+ }
165
+ else {
166
+ document = parseJSON(typeof input === 'string' ? input : JSON.stringify(input, undefined, 2), // everything else: assert it’s JSON-serializable
167
+ {
168
+ mode: 'jsonc',
169
+ ranges: true,
170
+ tokens: true,
171
+ });
172
+ }
173
+ if (!src) {
174
+ src = print(document, { indent: 2 });
175
+ }
176
+ logger.debug({
177
+ group: 'parser',
178
+ label: 'parse',
179
+ message: 'Finish tokens parsing',
180
+ timing: performance.now() - startParsing,
181
+ });
182
+ const tokens = {};
183
+ // 2. Walk AST once to validate tokens
184
+ const startValidation = performance.now();
185
+ logger.debug({ group: 'parser', label: 'validate', message: 'Start tokens validation' });
186
+ const $typeInheritance = {};
187
+ traverse(document, {
188
+ enter(node, parent, path) {
189
+ if (node.type === 'Member' && node.value.type === 'Object' && node.value.members) {
190
+ const members = getObjMembers(node.value);
191
+ // keep track of $types
192
+ if (members.$type && members.$type.type === 'String' && !members.$value) {
193
+ // @ts-ignore
194
+ $typeInheritance[path.join('.') || '.'] = node.value.members.find((m) => m.name.value === '$type');
195
+ }
196
+ const id = path.join('.');
197
+ if (members.$value) {
198
+ const extensions = members.$extensions ? getObjMembers(members.$extensions) : undefined;
199
+ const sourceNode = structuredClone(node);
200
+ // get parent type by taking the closest-scoped $type (length === closer)
201
+ let parent$type;
202
+ let longestPath = '';
203
+ for (const [k, v] of Object.entries($typeInheritance)) {
204
+ if (k === '.' || id.startsWith(k)) {
205
+ if (k.length > longestPath.length) {
206
+ parent$type = v;
207
+ longestPath = k;
208
+ }
209
+ }
210
+ }
211
+ if (parent$type && !members.$type) {
212
+ sourceNode.value = injectObjMembers(
213
+ // @ts-ignore
214
+ sourceNode.value, [parent$type]);
215
+ }
216
+ validate(sourceNode, { filename, src, logger });
217
+ // All tokens must be valid, so we want to validate it up till this
218
+ // point. However, if we are ignoring this token (or respecting
219
+ // $deprecated, we can omit it from the output.
220
+ const $deprecated = members.$deprecated && evaluate(members.$deprecated);
221
+ if ((config.ignore.deprecated && $deprecated) ||
222
+ (config.ignore.tokens && isTokenMatch(id, config.ignore.tokens))) {
223
+ return;
224
+ }
225
+ const group = { id: splitID(id).group, tokens: [] };
226
+ if (parent$type) {
227
+ group.$type =
228
+ // @ts-ignore
229
+ parent$type.value.value;
230
+ }
231
+ // note: this will also include sibling tokens, so be selective about only accessing group-specific properties
232
+ const groupMembers = getObjMembers(
233
+ // @ts-ignore
234
+ parent);
235
+ if (groupMembers.$description) {
236
+ group.$description = evaluate(groupMembers.$description);
237
+ }
238
+ if (groupMembers.$extensions) {
239
+ group.$extensions = evaluate(groupMembers.$extensions);
240
+ }
241
+ const token = {
242
+ // @ts-ignore
243
+ $type: members.$type?.value ?? parent$type?.value.value,
244
+ // @ts-ignore
245
+ $value: evaluate(members.$value),
246
+ id,
247
+ // @ts-ignore
248
+ mode: {},
249
+ // @ts-ignore
250
+ originalValue: evaluate(node.value),
251
+ group,
252
+ source: {
253
+ loc: filename ? filename.href : undefined,
254
+ // @ts-ignore
255
+ node: sourceNode.value,
256
+ },
257
+ };
258
+ // @ts-ignore
259
+ if (members.$description?.value) {
260
+ // @ts-ignore
261
+ token.$description = members.$description.value;
262
+ }
263
+ // handle modes
264
+ // note that circular refs are avoided here, such as not duplicating `modes`
265
+ const modeValues = extensions?.mode
266
+ ? getObjMembers(
267
+ // @ts-ignore
268
+ extensions.mode)
269
+ : {};
270
+ for (const mode of ['.', ...Object.keys(modeValues)]) {
271
+ token.mode[mode] = {
272
+ id: token.id,
273
+ // @ts-ignore
274
+ $type: token.$type,
275
+ // @ts-ignore
276
+ $value: mode === '.' ? token.$value : evaluate(modeValues[mode]),
277
+ source: {
278
+ loc: filename ? filename.href : undefined,
279
+ // @ts-ignore
280
+ node: mode === '.' ? structuredClone(token.source.node) : modeValues[mode],
281
+ },
282
+ };
283
+ if (token.$description) {
284
+ token.mode[mode].$description = token.$description;
285
+ }
286
+ }
287
+ tokens[id] = token;
288
+ }
289
+ else if (!id.includes('.$value') && members.value) {
290
+ logger.warn({ message: `Group ${id} has "value". Did you mean "$value"?`, filename, node, src });
291
+ }
292
+ }
293
+ // edge case: if $type appears at root of tokens.json, collect it
294
+ if (node.type === 'Document' && node.body.type === 'Object' && node.body.members) {
295
+ const members = getObjMembers(node.body);
296
+ if (members.$type && members.$type.type === 'String' && !members.$value) {
297
+ // @ts-ignore
298
+ $typeInheritance['.'] = node.body.members.find((m) => m.name.value === '$type');
299
+ }
300
+ }
301
+ },
302
+ });
303
+ logger.debug({
304
+ group: 'parser',
305
+ label: 'validate',
306
+ message: 'Finish tokens validation',
307
+ timing: performance.now() - startValidation,
308
+ });
309
+ // 3. normalize values
310
+ const normalizeStart = performance.now();
311
+ logger.debug({
312
+ group: 'parser',
313
+ label: 'normalize',
314
+ message: 'Start token normalization',
315
+ });
316
+ for (const [id, token] of Object.entries(tokens)) {
317
+ try {
318
+ tokens[id].$value = normalize(token);
319
+ }
320
+ catch (err) {
321
+ let { node } = token.source;
322
+ const members = getObjMembers(node);
323
+ if (members.$value) {
324
+ node = members.$value;
325
+ }
326
+ logger.error({ message: err.message, filename, src, node, continueOnError });
327
+ }
328
+ for (const [mode, modeValue] of Object.entries(token.mode)) {
329
+ if (mode === '.') {
330
+ continue;
331
+ }
332
+ try {
333
+ tokens[id].mode[mode].$value = normalize(modeValue);
334
+ }
335
+ catch (err) {
336
+ let { node } = token.source;
337
+ const members = getObjMembers(node);
338
+ if (members.$value) {
339
+ node = members.$value;
340
+ }
341
+ logger.error({
342
+ message: err.message,
343
+ filename,
344
+ src,
345
+ node: modeValue.source.node,
346
+ continueOnError,
347
+ });
348
+ }
349
+ }
350
+ }
351
+ // 4. Execute lint runner with loaded plugins
352
+ if (!skipLint && config?.plugins?.length) {
353
+ const lintStart = performance.now();
354
+ logger.debug({
355
+ group: 'parser',
356
+ label: 'validate',
357
+ message: 'Start token linting',
358
+ });
359
+ await lintRunner({ tokens, src, config, logger });
360
+ logger.debug({
361
+ group: 'parser',
362
+ label: 'validate',
363
+ message: 'Finish token linting',
364
+ timing: performance.now() - lintStart,
365
+ });
366
+ }
367
+ logger.debug({
368
+ group: 'parser',
369
+ label: 'normalize',
370
+ message: 'Finish token normalization',
371
+ timing: performance.now() - normalizeStart,
372
+ });
373
+ return {
374
+ tokens,
375
+ document,
376
+ src,
377
+ };
378
+ }
379
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parse/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { AnyNode, MemberNode, ObjectNode, ValueNode } from '@humanwhocodes/momoa';
2
+ export interface Visitor {
3
+ enter?: (node: AnyNode, parent: AnyNode | undefined, path: string[]) => void;
4
+ exit?: (node: AnyNode, parent: AnyNode | undefined, path: string[]) => void;
5
+ }
6
+ export declare const CHILD_KEYS: {
7
+ Document: readonly ["body"];
8
+ Object: readonly ["members"];
9
+ Member: readonly ["name", "value"];
10
+ Element: readonly ["value"];
11
+ Array: readonly ["elements"];
12
+ String: readonly [];
13
+ Number: readonly [];
14
+ Boolean: readonly [];
15
+ Null: readonly [];
16
+ Identifier: readonly [];
17
+ NaN: readonly [];
18
+ Infinity: readonly [];
19
+ };
20
+ /** Determines if a given value is an AST node. */
21
+ export declare function isNode(value: unknown): boolean;
22
+ /** Get ObjectNode members as object */
23
+ export declare function getObjMembers(node: ObjectNode): Record<string | number, ValueNode>;
24
+ /**
25
+ * Inject members to ObjectNode and return a clone
26
+ * @param {ObjectNode} node
27
+ * @param {MemberNode[]} members
28
+ * @return {ObjectNode}
29
+ */
30
+ export declare function injectObjMembers(node: ObjectNode, members?: MemberNode[]): ObjectNode;
31
+ /**
32
+ * Variation of Momoa’s traverse(), which keeps track of global path
33
+ */
34
+ export declare function traverse(root: AnyNode, visitor: Visitor): void;
35
+ /** Determine if an input is likely a JSON string */
36
+ export declare function maybeJSONString(input: string): boolean;
@@ -0,0 +1,88 @@
1
+ export const CHILD_KEYS = {
2
+ Document: ['body'],
3
+ Object: ['members'],
4
+ Member: ['name', 'value'],
5
+ Element: ['value'],
6
+ Array: ['elements'],
7
+ String: [],
8
+ Number: [],
9
+ Boolean: [],
10
+ Null: [],
11
+ Identifier: [],
12
+ NaN: [],
13
+ Infinity: [],
14
+ };
15
+ /** Determines if a given value is an AST node. */
16
+ export function isNode(value) {
17
+ return !!value && typeof value === 'object' && 'type' in value && typeof value.type === 'string';
18
+ }
19
+ /** Get ObjectNode members as object */
20
+ export function getObjMembers(node) {
21
+ const members = {};
22
+ if (node.type !== 'Object') {
23
+ return members;
24
+ }
25
+ for (const m of node.members) {
26
+ if (m.name.type !== 'String') {
27
+ continue;
28
+ }
29
+ members[m.name.value] = m.value;
30
+ }
31
+ return members;
32
+ }
33
+ /**
34
+ * Inject members to ObjectNode and return a clone
35
+ * @param {ObjectNode} node
36
+ * @param {MemberNode[]} members
37
+ * @return {ObjectNode}
38
+ */
39
+ export function injectObjMembers(node, members = []) {
40
+ if (node.type !== 'Object') {
41
+ return node;
42
+ }
43
+ const newNode = structuredClone(node);
44
+ newNode.members.push(...members);
45
+ return newNode;
46
+ }
47
+ /**
48
+ * Variation of Momoa’s traverse(), which keeps track of global path
49
+ */
50
+ export function traverse(root, visitor) {
51
+ /**
52
+ * Recursively visits a node.
53
+ * @param {AnyNode} node The node to visit.
54
+ * @param {AnyNode} [parent] The parent of the node to visit.
55
+ * @return {void}
56
+ */
57
+ function visitNode(node, parent, path = []) {
58
+ const nextPath = [...path];
59
+ if (node.type === 'Member') {
60
+ const { name } = node;
61
+ nextPath.push('value' in name ? name.value : String(name));
62
+ }
63
+ visitor.enter?.(node, parent, nextPath);
64
+ const childNode = CHILD_KEYS[node.type];
65
+ for (const key of childNode ?? []) {
66
+ const value = node[key];
67
+ if (value && typeof value === 'object') {
68
+ if (Array.isArray(value)) {
69
+ for (let i = 0; i < value.length; i++) {
70
+ visitNode(
71
+ // @ts-expect-error this is safe
72
+ value[i], node, key === 'elements' ? [...nextPath, String(i)] : nextPath);
73
+ }
74
+ }
75
+ else if (isNode(value)) {
76
+ visitNode(value, node, nextPath);
77
+ }
78
+ }
79
+ }
80
+ visitor.exit?.(node, parent, nextPath);
81
+ }
82
+ visitNode(root, undefined, []);
83
+ }
84
+ /** Determine if an input is likely a JSON string */
85
+ export function maybeJSONString(input) {
86
+ return typeof input === 'string' && input.trim().startsWith('{');
87
+ }
88
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/parse/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Token } from '@terrazzo/token-tools';
2
+ export declare const FONT_WEIGHT_MAP: {
3
+ thin: number;
4
+ hairline: number;
5
+ 'extra-light': number;
6
+ 'ultra-light': number;
7
+ light: number;
8
+ normal: number;
9
+ regular: number;
10
+ book: number;
11
+ medium: number;
12
+ 'semi-bold': number;
13
+ 'demi-bold': number;
14
+ bold: number;
15
+ 'extra-bold': number;
16
+ 'ultra-bold': number;
17
+ black: number;
18
+ heavy: number;
19
+ 'extra-black': number;
20
+ 'ultra-black': number;
21
+ };
22
+ /** Fill in defaults, and return predictable shapes for tokens */
23
+ export default function normalizeValue<T extends Token>(token: T): T['$value'];