design-token-library 0.3.1 → 0.4.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/CHANGELOG.md +32 -0
- package/dist/lib/css-reflector.d.ts +32 -24
- package/dist/lib/css-reflector.js +10 -26
- package/dist/lib/css-reflector.js.map +1 -1
- package/dist/lib/equality.d.ts +16 -0
- package/dist/lib/equality.js +90 -0
- package/dist/lib/equality.js.map +1 -0
- package/dist/lib/graph.d.ts +58 -0
- package/dist/lib/graph.js +104 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/index.d.ts +4 -2
- package/dist/lib/index.js +2 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/library.d.ts +221 -10
- package/dist/lib/library.js +1256 -258
- package/dist/lib/library.js.map +1 -1
- package/dist/lib/notifier.d.ts +0 -15
- package/dist/lib/notifier.js +0 -23
- package/dist/lib/notifier.js.map +1 -1
- package/dist/lib/parse-document.d.ts +21 -0
- package/dist/lib/parse-document.js +31 -0
- package/dist/lib/parse-document.js.map +1 -0
- package/dist/lib/parse-expression.d.ts +45 -0
- package/dist/lib/parse-expression.js +148 -0
- package/dist/lib/parse-expression.js.map +1 -0
- package/dist/lib/parse-extension.d.ts +24 -0
- package/dist/lib/parse-extension.js +68 -0
- package/dist/lib/parse-extension.js.map +1 -0
- package/dist/lib/parse-resolve.d.ts +16 -0
- package/dist/lib/parse-resolve.js +281 -0
- package/dist/lib/parse-resolve.js.map +1 -0
- package/dist/lib/parse-value.d.ts +35 -0
- package/dist/lib/parse-value.js +330 -0
- package/dist/lib/parse-value.js.map +1 -0
- package/dist/lib/parse.d.ts +103 -0
- package/dist/lib/parse.js +562 -0
- package/dist/lib/parse.js.map +1 -0
- package/dist/lib/queue.d.ts +13 -2
- package/dist/lib/queue.js +18 -2
- package/dist/lib/queue.js.map +1 -1
- package/dist/lib/ref.d.ts +18 -1
- package/dist/lib/ref.js +22 -4
- package/dist/lib/ref.js.map +1 -1
- package/dist/lib/standard-values.d.ts +50 -0
- package/dist/lib/standard-values.js +73 -0
- package/dist/lib/standard-values.js.map +1 -0
- package/dist/lib/tsconfig.tsbuildinfo +1 -1
- package/dist/lib/utilities.d.ts +6 -0
- package/dist/lib/utilities.js +7 -1
- package/dist/lib/utilities.js.map +1 -1
- package/package.json +5 -2
- package/dist/lib/watcher.d.ts +0 -12
- package/dist/lib/watcher.js +0 -25
- package/dist/lib/watcher.js.map +0 -1
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
import { DesignToken } from "./design-token.js";
|
|
2
|
+
import { isChildName, isGroupNode, isObject, isReference, isTokenNode, label, referencePath, setOwn, } from "./parse-document.js";
|
|
3
|
+
import { EXTENSION, resolveExtension, } from "./parse-extension.js";
|
|
4
|
+
import { calledName, parseCall } from "./parse-expression.js";
|
|
5
|
+
import { resolveReferences, TooLarge, tooLarge } from "./parse-resolve.js";
|
|
6
|
+
import { isStandardType, readValue } from "./parse-value.js";
|
|
7
|
+
import { RECIPE } from "./recipe.js";
|
|
8
|
+
import { refTo } from "./ref.js";
|
|
9
|
+
/**
|
|
10
|
+
* Thrown by {@link (parse:1)} for a document with problems. It reports every
|
|
11
|
+
* problem found, not only the first.
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export class ParseError extends Error {
|
|
16
|
+
name = "ParseError";
|
|
17
|
+
issues;
|
|
18
|
+
constructor(issues) {
|
|
19
|
+
super(`Invalid design tokens document (${issues.length} ${issues.length === 1 ? "issue" : "issues"}):\n${issues
|
|
20
|
+
.map((issue) => ` ${issue.path || "(document)"}: ${issue.message}`)
|
|
21
|
+
.join("\n")}`);
|
|
22
|
+
this.issues = issues;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The recipes of `options.recipes` by name, which must be unique.
|
|
27
|
+
*/
|
|
28
|
+
const recipesByName = (recipes = {}) => {
|
|
29
|
+
const byName = new Map();
|
|
30
|
+
for (const [key, recipe] of Object.entries(recipes)) {
|
|
31
|
+
if (typeof recipe?.[RECIPE]?.name !== "string") {
|
|
32
|
+
throw new Error(`"${key}" in the recipes isn't a recipe. Make them with recipes().`);
|
|
33
|
+
}
|
|
34
|
+
const { name } = recipe[RECIPE];
|
|
35
|
+
const known = byName.get(name);
|
|
36
|
+
if (known !== undefined && known !== recipe) {
|
|
37
|
+
throw new Error(`Two different recipes are named "${name}", so a document can't call one of them by name.`);
|
|
38
|
+
}
|
|
39
|
+
byName.set(name, recipe);
|
|
40
|
+
}
|
|
41
|
+
return byName;
|
|
42
|
+
};
|
|
43
|
+
const TOKEN_PROPERTIES = [
|
|
44
|
+
"$value",
|
|
45
|
+
"$type",
|
|
46
|
+
"$description",
|
|
47
|
+
"$extensions",
|
|
48
|
+
"$deprecated",
|
|
49
|
+
];
|
|
50
|
+
const GROUP_PROPERTIES = [
|
|
51
|
+
"$type",
|
|
52
|
+
"$description",
|
|
53
|
+
"$extensions",
|
|
54
|
+
"$deprecated",
|
|
55
|
+
];
|
|
56
|
+
/**
|
|
57
|
+
* The child of a group of a library's tokens. A library's group is an
|
|
58
|
+
* object, its token an object with a `$value`, as in a document.
|
|
59
|
+
*/
|
|
60
|
+
const childOf = (group, key) => isGroupNode(group) && Object.hasOwn(group, key) ? group[key] : undefined;
|
|
61
|
+
/**
|
|
62
|
+
* The `$type` of a library's token or group, which is never its value.
|
|
63
|
+
*/
|
|
64
|
+
const typeIn = (node) => {
|
|
65
|
+
const type = isObject(node) ? Reflect.get(node, "$type") : undefined;
|
|
66
|
+
return typeof type === "string" ? type : undefined;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Every `$type` of the tokens and groups of a library. A token of a library
|
|
70
|
+
* is an accessor, which makes the token of an extension when it is read, so
|
|
71
|
+
* this is found only when a document needs it.
|
|
72
|
+
*/
|
|
73
|
+
const typesIn = (tokens) => {
|
|
74
|
+
const found = new Set();
|
|
75
|
+
const add = (node) => {
|
|
76
|
+
const type = typeIn(node);
|
|
77
|
+
if (type !== undefined) {
|
|
78
|
+
found.add(type);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const walk = (group) => {
|
|
82
|
+
add(group);
|
|
83
|
+
for (const key of Object.keys(group)) {
|
|
84
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(group, key);
|
|
85
|
+
if (!("value" in descriptor)) {
|
|
86
|
+
add(descriptor.get());
|
|
87
|
+
}
|
|
88
|
+
else if (isObject(descriptor.value)) {
|
|
89
|
+
walk(descriptor.value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
walk(tokens);
|
|
94
|
+
return found;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Checks a document and turns it into the {@link (Library:namespace).Config}
|
|
98
|
+
* a library is created from. Every problem is reported.
|
|
99
|
+
*/
|
|
100
|
+
const convert = (doc, base, compliant, customTypes, libraryTypes, recipes, report) => {
|
|
101
|
+
const types = new Map();
|
|
102
|
+
const chain = [];
|
|
103
|
+
const circular = new Set();
|
|
104
|
+
const knownType = (type) => isStandardType(type) ||
|
|
105
|
+
customTypes.has(type) ||
|
|
106
|
+
libraryTypes().has(type);
|
|
107
|
+
// The token or group of the library at a path.
|
|
108
|
+
const inBase = (path) => path.reduce(childOf, base);
|
|
109
|
+
// The $type a group gives its tokens: the library's, which an extension
|
|
110
|
+
// can't change, else the document's.
|
|
111
|
+
const groupType = (node, baseNode) => (isGroupNode(baseNode) ? typeIn(baseNode) : undefined) ??
|
|
112
|
+
(isGroupNode(node) ? typeIn(node) : undefined);
|
|
113
|
+
// Finds a token or group by path, in the document or the library it
|
|
114
|
+
// extends, with the type its groups give it.
|
|
115
|
+
const find = (path) => {
|
|
116
|
+
let node = doc;
|
|
117
|
+
let baseNode = base;
|
|
118
|
+
let inherited = groupType(node, baseNode);
|
|
119
|
+
for (const segment of path) {
|
|
120
|
+
if (!isChildName(segment)) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
node = childOf(node, segment);
|
|
124
|
+
baseNode = childOf(baseNode, segment);
|
|
125
|
+
if (node === undefined && baseNode === undefined) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
inherited = groupType(node, baseNode) ?? inherited;
|
|
129
|
+
}
|
|
130
|
+
if (isTokenNode(node)) {
|
|
131
|
+
return {
|
|
132
|
+
kind: "token",
|
|
133
|
+
node,
|
|
134
|
+
inherited,
|
|
135
|
+
library: isTokenNode(baseNode) ? typeIn(baseNode) : undefined,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (node === undefined && isTokenNode(baseNode)) {
|
|
139
|
+
return { kind: "library", type: typeIn(baseNode) };
|
|
140
|
+
}
|
|
141
|
+
return isObject(node) || isObject(baseNode)
|
|
142
|
+
? { kind: "group" }
|
|
143
|
+
: undefined;
|
|
144
|
+
};
|
|
145
|
+
// The type of a token: its own, else the type of the token it refers
|
|
146
|
+
// to, else the nearest group's.
|
|
147
|
+
const typeOf = (path) => {
|
|
148
|
+
const key = label(path);
|
|
149
|
+
if (types.has(key)) {
|
|
150
|
+
return types.get(key);
|
|
151
|
+
}
|
|
152
|
+
const found = find(path);
|
|
153
|
+
if (found?.kind === "library") {
|
|
154
|
+
return found.type;
|
|
155
|
+
}
|
|
156
|
+
if (found?.kind !== "token") {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
// A token of the library keeps its type.
|
|
160
|
+
if (found.library !== undefined) {
|
|
161
|
+
return found.library;
|
|
162
|
+
}
|
|
163
|
+
if (chain.includes(key)) {
|
|
164
|
+
// Reported by checkCycle.
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
chain.push(key);
|
|
168
|
+
const { node, inherited } = found;
|
|
169
|
+
let type;
|
|
170
|
+
if (typeof node.$type === "string") {
|
|
171
|
+
type = node.$type;
|
|
172
|
+
}
|
|
173
|
+
else if (isReference(node.$value)) {
|
|
174
|
+
type = typeOf(referencePath(node.$value));
|
|
175
|
+
}
|
|
176
|
+
type ??= inherited;
|
|
177
|
+
chain.pop();
|
|
178
|
+
types.set(key, type);
|
|
179
|
+
return type;
|
|
180
|
+
};
|
|
181
|
+
// Follows a token's chain of references to find a loop. A token with its
|
|
182
|
+
// own $type never needs the chain to find its type, so typeOf cannot
|
|
183
|
+
// find it.
|
|
184
|
+
const checkCycle = (path) => {
|
|
185
|
+
const visited = [];
|
|
186
|
+
let current = path;
|
|
187
|
+
while (current) {
|
|
188
|
+
const key = label(current);
|
|
189
|
+
if (visited.includes(key)) {
|
|
190
|
+
const loop = visited.slice(visited.indexOf(key));
|
|
191
|
+
if (!loop.some((member) => circular.has(member))) {
|
|
192
|
+
report(label(path), `Circular reference: ${[...loop, key].join(" → ")}.`);
|
|
193
|
+
}
|
|
194
|
+
for (const member of loop) {
|
|
195
|
+
circular.add(member);
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
visited.push(key);
|
|
200
|
+
const found = find(current);
|
|
201
|
+
current =
|
|
202
|
+
found?.kind === "token" && isReference(found.node.$value)
|
|
203
|
+
? referencePath(found.node.$value)
|
|
204
|
+
: undefined;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
// Reads a reference to a token, such as "{color.blue}", which must be of
|
|
208
|
+
// the `expected` type when there is one.
|
|
209
|
+
const reference = (value, expected, path) => isReference(value)
|
|
210
|
+
? refer(referencePath(value), expected, path)
|
|
211
|
+
: undefined;
|
|
212
|
+
// Makes the ref to the token at `target`, which must exist and be of the
|
|
213
|
+
// `expected` type when there is one.
|
|
214
|
+
const refer = (target, expected, path) => {
|
|
215
|
+
const value = `{${label(target)}}`;
|
|
216
|
+
const found = find(target);
|
|
217
|
+
if (!found) {
|
|
218
|
+
report(path, `references "${value}", which does not exist.`);
|
|
219
|
+
}
|
|
220
|
+
else if (found.kind === "group") {
|
|
221
|
+
report(path, `references "${value}", which is a group. A reference must name a token.`);
|
|
222
|
+
}
|
|
223
|
+
else if (expected !== undefined) {
|
|
224
|
+
const type = typeOf(target);
|
|
225
|
+
if (type !== undefined && type !== expected) {
|
|
226
|
+
report(path, `references "${value}", a ${type} token, where a ${expected} is needed.`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return refTo(target);
|
|
230
|
+
};
|
|
231
|
+
// The call of a string that looks like a call to a name that isn't a
|
|
232
|
+
// recipe, by its path, to explain why its value isn't valid.
|
|
233
|
+
const unknownCalls = new Map();
|
|
234
|
+
// The config value of an expression of a recipe call.
|
|
235
|
+
const evaluate = (expression, path) => {
|
|
236
|
+
switch (expression.kind) {
|
|
237
|
+
case "call": {
|
|
238
|
+
const recipe = recipes.get(expression.name);
|
|
239
|
+
if (recipe === undefined) {
|
|
240
|
+
report(path, `calls "${expression.name}", which is not one of the recipes.`);
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
return recipe(...expression.args.map((arg) => evaluate(arg, path)));
|
|
244
|
+
}
|
|
245
|
+
case "reference":
|
|
246
|
+
// A recipe decides what its arguments may be.
|
|
247
|
+
return refer(expression.path, undefined, path);
|
|
248
|
+
case "literal":
|
|
249
|
+
return expression.value;
|
|
250
|
+
case "array":
|
|
251
|
+
return expression.items.map((item) => evaluate(item, path));
|
|
252
|
+
case "object":
|
|
253
|
+
return Object.fromEntries(expression.entries.map(([key, value]) => [
|
|
254
|
+
key,
|
|
255
|
+
evaluate(value, path),
|
|
256
|
+
]));
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
// A string is a recipe call only when it calls one of the recipes, so a
|
|
260
|
+
// string value such as "calc(100% - 4px)" stays a string.
|
|
261
|
+
const callsRecipe = (value) => {
|
|
262
|
+
const name = typeof value === "string" ? calledName(value) : undefined;
|
|
263
|
+
return name !== undefined && recipes.has(name);
|
|
264
|
+
};
|
|
265
|
+
// Reads a recipe call, such as "darken({color.blue}, 0.2)".
|
|
266
|
+
const call = (value, path) => {
|
|
267
|
+
if (!callsRecipe(value)) {
|
|
268
|
+
const name = typeof value === "string" ? calledName(value) : undefined;
|
|
269
|
+
if (name !== undefined) {
|
|
270
|
+
unknownCalls.set(path, name);
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
const parsed = parseCall(value);
|
|
275
|
+
if ("error" in parsed) {
|
|
276
|
+
report(path, `is not a valid recipe call: ${parsed.error}`);
|
|
277
|
+
// Reported, so the reader of the position doesn't report it again.
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
280
|
+
return evaluate(parsed.call, path);
|
|
281
|
+
};
|
|
282
|
+
const context = {
|
|
283
|
+
report: (path, message) => {
|
|
284
|
+
const name = unknownCalls.get(path);
|
|
285
|
+
report(path, name === undefined
|
|
286
|
+
? message
|
|
287
|
+
: `${message} It looks like a recipe call, but "${name}" is not one of the recipes.`);
|
|
288
|
+
},
|
|
289
|
+
reference: (value, type, path) => reference(value, type, path) ?? call(value, path),
|
|
290
|
+
};
|
|
291
|
+
// A custom value isn't checked, but the references and recipe calls in
|
|
292
|
+
// it are read, at any depth.
|
|
293
|
+
const readCustom = (value, path) => {
|
|
294
|
+
const read = reference(value, undefined, path) ?? call(value, path);
|
|
295
|
+
if (read !== undefined) {
|
|
296
|
+
return read;
|
|
297
|
+
}
|
|
298
|
+
if (Array.isArray(value)) {
|
|
299
|
+
return value.map((item, index) => readCustom(item, `${path}[${index}]`));
|
|
300
|
+
}
|
|
301
|
+
if (isObject(value)) {
|
|
302
|
+
const result = {};
|
|
303
|
+
for (const key of Object.keys(value)) {
|
|
304
|
+
setOwn(result, key, readCustom(value[key], `${path}.${key}`));
|
|
305
|
+
}
|
|
306
|
+
return result;
|
|
307
|
+
}
|
|
308
|
+
return value;
|
|
309
|
+
};
|
|
310
|
+
const checkMetadata = (node, path, where) => {
|
|
311
|
+
if (node.$description !== undefined &&
|
|
312
|
+
typeof node.$description !== "string") {
|
|
313
|
+
report(`${path}.$description`, `must be a string.`);
|
|
314
|
+
}
|
|
315
|
+
if (node.$extensions !== undefined && !isObject(node.$extensions)) {
|
|
316
|
+
report(`${path}.$extensions`, `must be an object.`);
|
|
317
|
+
}
|
|
318
|
+
if (node.$deprecated !== undefined &&
|
|
319
|
+
typeof node.$deprecated !== "boolean" &&
|
|
320
|
+
typeof node.$deprecated !== "string") {
|
|
321
|
+
report(`${path}.$deprecated`, `must be true, false or a string.`);
|
|
322
|
+
}
|
|
323
|
+
if (node.$type !== undefined) {
|
|
324
|
+
if (typeof node.$type !== "string" || !knownType(node.$type)) {
|
|
325
|
+
report(`${path}.$type`, `${JSON.stringify(node.$type)} is not a type of ${where}. Expected one of ${[
|
|
326
|
+
...new Set([
|
|
327
|
+
...Object.values(DesignToken.Type),
|
|
328
|
+
...customTypes,
|
|
329
|
+
...libraryTypes(),
|
|
330
|
+
]),
|
|
331
|
+
].join(", ")}.`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
// A copy of the metadata, so the library doesn't share it with the
|
|
336
|
+
// document.
|
|
337
|
+
const metadataOf = (node, keys) => {
|
|
338
|
+
const result = {};
|
|
339
|
+
for (const key of keys) {
|
|
340
|
+
if (node[key] !== undefined) {
|
|
341
|
+
result[key] = structuredClone(node[key]);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return result;
|
|
345
|
+
};
|
|
346
|
+
// The type of a token in its DTCG form: its own or its group's, else, for
|
|
347
|
+
// an alias, the DTCG type of the token it names, as the format says. A
|
|
348
|
+
// token without the extension is the same in both forms.
|
|
349
|
+
const dtcgTypeOf = (path, seen = []) => {
|
|
350
|
+
const key = label(path);
|
|
351
|
+
const form = compliant.get(key);
|
|
352
|
+
if (form === undefined) {
|
|
353
|
+
return typeOf(path);
|
|
354
|
+
}
|
|
355
|
+
return form.type !== undefined ||
|
|
356
|
+
!isReference(form.value) ||
|
|
357
|
+
seen.includes(key)
|
|
358
|
+
? form.type
|
|
359
|
+
: dtcgTypeOf(referencePath(form.value), [...seen, key]);
|
|
360
|
+
};
|
|
361
|
+
// Checks the DTCG form of a token whose own form is in this library's
|
|
362
|
+
// extension. Its references only have to exist: they're of the DTCG
|
|
363
|
+
// form, and the types of the tokens are their own.
|
|
364
|
+
const checkCompliant = (form, here) => {
|
|
365
|
+
const where = `${here}.$value`;
|
|
366
|
+
const type = form.type ??
|
|
367
|
+
(isReference(form.value)
|
|
368
|
+
? dtcgTypeOf(referencePath(form.value))
|
|
369
|
+
: undefined);
|
|
370
|
+
if (type === undefined) {
|
|
371
|
+
report(here, `has no $type in its DTCG form, its own, its group's or the one of the token it references.`);
|
|
372
|
+
}
|
|
373
|
+
else if (!isStandardType(type)) {
|
|
374
|
+
report(`${here}.$type`, `${JSON.stringify(type)} is not a standard type, so the token's DTCG form isn't DTCG. Its own type goes in $extensions["${EXTENSION}"].$type.`);
|
|
375
|
+
}
|
|
376
|
+
else if (isReference(form.value)) {
|
|
377
|
+
reference(form.value, undefined, where);
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
readValue(type, form.value, where, {
|
|
381
|
+
report,
|
|
382
|
+
reference: (value, _type, path) => reference(value, undefined, path),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
const convertToken = (node, path) => {
|
|
387
|
+
const here = label(path);
|
|
388
|
+
for (const key of Object.keys(node)) {
|
|
389
|
+
if (!TOKEN_PROPERTIES.includes(key)) {
|
|
390
|
+
report(here, key.startsWith("$")
|
|
391
|
+
? `has an unsupported property "${key}". A token accepts ${TOKEN_PROPERTIES.join(", ")}.`
|
|
392
|
+
: `has a $value, so it is a token and cannot have a child "${key}".`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
checkMetadata(node, here, "a token");
|
|
396
|
+
const library = typeIn(inBase(path));
|
|
397
|
+
if (library !== undefined &&
|
|
398
|
+
typeof node.$type === "string" &&
|
|
399
|
+
node.$type !== library) {
|
|
400
|
+
report(`${here}.$type`, `is "${node.$type}", but the token is a ${library} in the library it extends, which can't be changed.`);
|
|
401
|
+
}
|
|
402
|
+
if (isReference(node.$value)) {
|
|
403
|
+
checkCycle(path);
|
|
404
|
+
}
|
|
405
|
+
const type = typeOf(path);
|
|
406
|
+
if (type === undefined) {
|
|
407
|
+
if (!circular.has(here)) {
|
|
408
|
+
report(here, `has no $type. A token takes its own $type, the type of the token it references, or the $type of the nearest group${callsRecipe(node.$value)
|
|
409
|
+
? ", not the type of a recipe's result"
|
|
410
|
+
: ""}.`);
|
|
411
|
+
}
|
|
412
|
+
return undefined;
|
|
413
|
+
}
|
|
414
|
+
if (!knownType(type)) {
|
|
415
|
+
if (typeof node.$type !== "string") {
|
|
416
|
+
report(here, `has the type ${JSON.stringify(type)}, which is not known.`);
|
|
417
|
+
}
|
|
418
|
+
return undefined;
|
|
419
|
+
}
|
|
420
|
+
const value = node.$value;
|
|
421
|
+
const where = `${here}.$value`;
|
|
422
|
+
let read;
|
|
423
|
+
if (isReference(value)) {
|
|
424
|
+
read = reference(value, type, where);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
read =
|
|
428
|
+
call(value, where) ??
|
|
429
|
+
(isStandardType(type)
|
|
430
|
+
? readValue(type, value, where, context)
|
|
431
|
+
: readCustom(value, where));
|
|
432
|
+
}
|
|
433
|
+
const form = compliant.get(here);
|
|
434
|
+
if (form !== undefined) {
|
|
435
|
+
checkCompliant(form, here);
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
$type: type,
|
|
439
|
+
$value: read,
|
|
440
|
+
...metadataOf(node, ["$description", "$extensions", "$deprecated"]),
|
|
441
|
+
};
|
|
442
|
+
};
|
|
443
|
+
const convertGroup = (node, path) => {
|
|
444
|
+
const here = label(path);
|
|
445
|
+
const result = metadataOf(node, GROUP_PROPERTIES);
|
|
446
|
+
const library = inBase(path);
|
|
447
|
+
checkMetadata(node, here, "a group");
|
|
448
|
+
// A group of the library keeps its type, and an extension doesn't
|
|
449
|
+
// restate it.
|
|
450
|
+
const libraryType = typeIn(library);
|
|
451
|
+
if (libraryType !== undefined && node.$type !== undefined) {
|
|
452
|
+
if (node.$type !== libraryType) {
|
|
453
|
+
report(`${here}.$type`, `is ${JSON.stringify(node.$type)}, but the group is of ${libraryType} in the library it extends, which can't be changed.`);
|
|
454
|
+
}
|
|
455
|
+
delete result.$type;
|
|
456
|
+
}
|
|
457
|
+
for (const key of Object.keys(node)) {
|
|
458
|
+
if (!isChildName(key)) {
|
|
459
|
+
if (!GROUP_PROPERTIES.includes(key)) {
|
|
460
|
+
report(here, `has an unsupported property "${key}". A group accepts ${GROUP_PROPERTIES.join(", ")}.`);
|
|
461
|
+
}
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
const child = node[key];
|
|
465
|
+
const childPath = [...path, key];
|
|
466
|
+
if (key === "") {
|
|
467
|
+
report(here, `has a child with an empty name.`);
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
if (key === "__proto__" || /[{}.]/.test(key)) {
|
|
471
|
+
report(label(childPath), `is not a valid name. A name cannot be "__proto__", or contain ".", "{" or "}".`);
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
if (!isObject(child)) {
|
|
475
|
+
report(label(childPath), `must be a token or a group (an object), but found ${JSON.stringify(child)}.`);
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
if (key === "$root" && path.length === 0) {
|
|
479
|
+
report(key, `$root is the token of a group, so it cannot be at the top level of a document.`);
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
const libraryChild = childOf(library, key);
|
|
483
|
+
if (isTokenNode(child) && isGroupNode(libraryChild)) {
|
|
484
|
+
report(label(childPath), `is a group in the library it extends, so it can't be a token.`);
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (!isTokenNode(child) && isTokenNode(libraryChild)) {
|
|
488
|
+
report(label(childPath), `is a token in the library it extends, so it can't be a group.`);
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (isTokenNode(child)) {
|
|
492
|
+
const token = convertToken(child, childPath);
|
|
493
|
+
if (token) {
|
|
494
|
+
setOwn(result, key, token);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
else if (key === "$root") {
|
|
498
|
+
report(label(childPath), `$root must be a token, so it needs a $value.`);
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
setOwn(result, key, convertGroup(child, childPath));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return result;
|
|
505
|
+
};
|
|
506
|
+
return convertGroup(doc, []);
|
|
507
|
+
};
|
|
508
|
+
export function parse(document, options = {}) {
|
|
509
|
+
const issues = [];
|
|
510
|
+
const report = (path, message) => issues.push({ path, message });
|
|
511
|
+
let doc = document;
|
|
512
|
+
if (typeof document === "string") {
|
|
513
|
+
try {
|
|
514
|
+
// A byte order mark, which some tools write, isn't JSON.
|
|
515
|
+
doc = JSON.parse(document.replace(/^\uFEFF/, ""));
|
|
516
|
+
}
|
|
517
|
+
catch (error) {
|
|
518
|
+
throw new ParseError([
|
|
519
|
+
{
|
|
520
|
+
path: "",
|
|
521
|
+
message: `is not valid JSON: ${error instanceof Error ? error.message : error}`,
|
|
522
|
+
},
|
|
523
|
+
]);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (!isObject(doc)) {
|
|
527
|
+
throw new ParseError([
|
|
528
|
+
{ path: "", message: "must be a JSON object, the root group." },
|
|
529
|
+
]);
|
|
530
|
+
}
|
|
531
|
+
try {
|
|
532
|
+
const resolved = resolveReferences(doc, report);
|
|
533
|
+
// A reference that fails stays as it was written, so what reads it
|
|
534
|
+
// next would report it again as something else.
|
|
535
|
+
if (issues.length > 0) {
|
|
536
|
+
throw new ParseError(issues);
|
|
537
|
+
}
|
|
538
|
+
const native = resolveExtension(resolved, report);
|
|
539
|
+
const base = options.extends?.tokens;
|
|
540
|
+
let libraryTypes;
|
|
541
|
+
const config = convert(native.doc, base, native.compliant, new Set(Object.keys(options.types ?? {})), () => (libraryTypes ??= base ? typesIn(base) : new Set()), recipesByName(options.recipes), report);
|
|
542
|
+
if (issues.length > 0) {
|
|
543
|
+
throw new ParseError(issues);
|
|
544
|
+
}
|
|
545
|
+
return config;
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
if (error instanceof TooLarge) {
|
|
549
|
+
throw new ParseError([...issues, tooLarge()]);
|
|
550
|
+
}
|
|
551
|
+
// The passes recurse, so a document nested deeper than the stack
|
|
552
|
+
// allows is a problem of the document, not of the library.
|
|
553
|
+
if (error instanceof RangeError && /call stack/i.test(error.message)) {
|
|
554
|
+
throw new ParseError([
|
|
555
|
+
...issues,
|
|
556
|
+
{ path: "", message: "is nested too deeply to read." },
|
|
557
|
+
]);
|
|
558
|
+
}
|
|
559
|
+
throw error;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/lib/parse.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/queue.d.ts
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { ISubscribable, Subscribable } from "./notifier.js";
|
|
2
|
-
export interface IQueue<T extends {}> extends ISubscribable<ReadonlyArray<
|
|
2
|
+
export interface IQueue<T extends {}, U = T> extends ISubscribable<ReadonlyArray<U>> {
|
|
3
3
|
add(target: T): void;
|
|
4
|
+
/**
|
|
5
|
+
* Whether the queue has a subscriber.
|
|
6
|
+
*/
|
|
7
|
+
readonly subscribed: boolean;
|
|
4
8
|
}
|
|
5
|
-
export declare class Queue<T extends {}> extends Subscribable<ReadonlyArray<
|
|
9
|
+
export declare class Queue<T extends {}, U = T> extends Subscribable<ReadonlyArray<U>> implements IQueue<T, U> {
|
|
10
|
+
private readonly prepare;
|
|
6
11
|
private targets;
|
|
7
12
|
private needsQueue;
|
|
13
|
+
/**
|
|
14
|
+
* @param prepare - Gives what to deliver, from the targets added since
|
|
15
|
+
* the last batch. An empty batch isn't delivered.
|
|
16
|
+
*/
|
|
17
|
+
constructor(prepare?: (targets: ReadonlySet<T>) => readonly U[]);
|
|
18
|
+
get subscribed(): boolean;
|
|
8
19
|
add(target: T): void;
|
|
9
20
|
private queue;
|
|
10
21
|
}
|
package/dist/lib/queue.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import { Subscribable } from "./notifier.js";
|
|
2
2
|
export class Queue extends Subscribable {
|
|
3
|
+
prepare;
|
|
3
4
|
targets = new Set();
|
|
4
5
|
needsQueue = true;
|
|
6
|
+
/**
|
|
7
|
+
* @param prepare - Gives what to deliver, from the targets added since
|
|
8
|
+
* the last batch. An empty batch isn't delivered.
|
|
9
|
+
*/
|
|
10
|
+
constructor(prepare = (targets) => Array.from(targets)) {
|
|
11
|
+
super();
|
|
12
|
+
this.prepare = prepare;
|
|
13
|
+
}
|
|
14
|
+
get subscribed() {
|
|
15
|
+
return this.subscribers.size > 0;
|
|
16
|
+
}
|
|
5
17
|
add(target) {
|
|
6
18
|
this.targets.add(target);
|
|
7
19
|
if (this.needsQueue) {
|
|
@@ -11,9 +23,13 @@ export class Queue extends Subscribable {
|
|
|
11
23
|
queue() {
|
|
12
24
|
this.needsQueue = false;
|
|
13
25
|
queueMicrotask(() => {
|
|
14
|
-
const
|
|
15
|
-
this.targets
|
|
26
|
+
const added = this.targets;
|
|
27
|
+
this.targets = new Set();
|
|
16
28
|
this.needsQueue = true;
|
|
29
|
+
const targets = Object.freeze(this.prepare(added));
|
|
30
|
+
if (targets.length === 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
17
33
|
// A throwing subscriber must not stop the others, so each error is
|
|
18
34
|
// re-thrown on its own, like a DOM event listener's.
|
|
19
35
|
for (const subscriber of this.subscribers) {
|
package/dist/lib/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,eAAe,CAAC;AAW5D,MAAM,OAAO,KACT,SAAQ,YAA8B;IAWjB;IARb,OAAO,GAAW,IAAI,GAAG,EAAE,CAAC;IAC5B,UAAU,GAAY,IAAI,CAAC;IAEnC;;;OAGG;IACH,YACqB,UAAqD,CAClE,OAAO,EACT,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAqB;QAE5C,KAAK,EAAE,CAAC;QAJS,YAAO,GAAP,OAAO,CAEoB;IAGhD,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IACrC,CAAC;IAEM,GAAG,CAAC,MAAS;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACL,CAAC;IAEO,KAAK;QACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,cAAc,CAAC,GAAG,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;YACX,CAAC;YAED,mEAAmE;YACnE,qDAAqD;YACrD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC;oBACD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,cAAc,CAAC,GAAG,EAAE;wBAChB,MAAM,KAAK,CAAC;oBAChB,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|