@terrazzo/parser 0.0.10 → 0.0.12
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 +10 -0
- package/README.md +1 -1
- package/build/index.d.ts +7 -7
- package/build/index.js +5 -5
- package/lint/index.d.ts +4 -2
- package/logger.d.ts +4 -2
- package/logger.js +4 -2
- package/package.json +3 -3
- package/parse/index.d.ts +11 -3
- package/parse/index.js +200 -113
- package/parse/normalize.js +8 -2
- package/parse/validate.d.ts +4 -3
- package/parse/validate.js +134 -107
package/parse/validate.js
CHANGED
|
@@ -4,12 +4,10 @@ import { getObjMembers } from './json.js';
|
|
|
4
4
|
|
|
5
5
|
const listFormat = new Intl.ListFormat('en-us', { type: 'disjunction' });
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* @typedef {import("@babel/code-frame").SourceLocation} SourceLocation
|
|
12
|
-
*/
|
|
7
|
+
/** @typedef {import("@humanwhocodes/momoa").AnyNode} AnyNode */
|
|
8
|
+
/** @typedef {import("@humanwhocodes/momoa").ObjectNode} ObjectNode */
|
|
9
|
+
/** @typedef {import("@humanwhocodes/momoa").ValueNode} ValueNode */
|
|
10
|
+
/** @typedef {import("@babel/code-frame").SourceLocation} SourceLocation */
|
|
13
11
|
|
|
14
12
|
export const VALID_COLORSPACES = new Set([
|
|
15
13
|
'adobe-rgb',
|
|
@@ -82,21 +80,21 @@ function isMaybeAlias(node) {
|
|
|
82
80
|
* @param {ValidateOptions} options
|
|
83
81
|
* @return {void}
|
|
84
82
|
*/
|
|
85
|
-
function validateMembersAs($value, properties, node, {
|
|
83
|
+
function validateMembersAs($value, properties, node, { filename, src, logger }) {
|
|
86
84
|
const members = getObjMembers($value);
|
|
87
85
|
for (const property in properties) {
|
|
88
86
|
const { validator, required } = properties[property];
|
|
89
87
|
if (!members[property]) {
|
|
90
88
|
if (required) {
|
|
91
|
-
logger.error({ message: `Missing required property "${property}"`, node: $value,
|
|
89
|
+
logger.error({ message: `Missing required property "${property}"`, filename, node: $value, src });
|
|
92
90
|
}
|
|
93
91
|
continue;
|
|
94
92
|
}
|
|
95
93
|
const value = members[property];
|
|
96
94
|
if (isMaybeAlias(value)) {
|
|
97
|
-
validateAlias(value, node, {
|
|
95
|
+
validateAlias(value, node, { filename, src, logger });
|
|
98
96
|
} else {
|
|
99
|
-
validator(value, node, {
|
|
97
|
+
validator(value, node, { filename, src, logger });
|
|
100
98
|
}
|
|
101
99
|
}
|
|
102
100
|
}
|
|
@@ -108,9 +106,9 @@ function validateMembersAs($value, properties, node, { source, logger }) {
|
|
|
108
106
|
* @param {ValidateOptions} options
|
|
109
107
|
* @return {void}
|
|
110
108
|
*/
|
|
111
|
-
export function validateAlias($value, node, {
|
|
109
|
+
export function validateAlias($value, node, { filename, src, logger }) {
|
|
112
110
|
if ($value.type !== 'String' || !isAlias($value.value)) {
|
|
113
|
-
logger.error({ message: `Invalid alias: ${print($value)}`, node: $value,
|
|
111
|
+
logger.error({ message: `Invalid alias: ${print($value)}`, filename, node: $value, src });
|
|
114
112
|
}
|
|
115
113
|
}
|
|
116
114
|
|
|
@@ -121,9 +119,9 @@ export function validateAlias($value, node, { source, logger }) {
|
|
|
121
119
|
* @param {ValidateOptions} options
|
|
122
120
|
* @return {void}
|
|
123
121
|
*/
|
|
124
|
-
export function validateBorder($value, node, {
|
|
122
|
+
export function validateBorder($value, node, { filename, src, logger }) {
|
|
125
123
|
if ($value.type !== 'Object') {
|
|
126
|
-
logger.error({ message: `Expected object, received ${$value.type}`, node: $value,
|
|
124
|
+
logger.error({ message: `Expected object, received ${$value.type}`, filename, node: $value, src });
|
|
127
125
|
return;
|
|
128
126
|
}
|
|
129
127
|
validateMembersAs(
|
|
@@ -134,7 +132,7 @@ export function validateBorder($value, node, { source, logger }) {
|
|
|
134
132
|
width: { validator: validateDimension, required: true },
|
|
135
133
|
},
|
|
136
134
|
node,
|
|
137
|
-
{
|
|
135
|
+
{ filename, src, logger },
|
|
138
136
|
);
|
|
139
137
|
}
|
|
140
138
|
|
|
@@ -145,16 +143,17 @@ export function validateBorder($value, node, { source, logger }) {
|
|
|
145
143
|
* @param {ValidateOptions} options
|
|
146
144
|
* @return {void}
|
|
147
145
|
*/
|
|
148
|
-
export function validateColor($value, node, {
|
|
146
|
+
export function validateColor($value, node, { filename, src, logger }) {
|
|
149
147
|
if ($value.type === 'String') {
|
|
150
148
|
// TODO: enable when object notation is finalized
|
|
151
149
|
// logger.warn({
|
|
150
|
+
// filename,
|
|
152
151
|
// message: 'String colors are no longer recommended; please use the object notation instead.',
|
|
153
152
|
// node: $value,
|
|
154
|
-
//
|
|
153
|
+
// src,
|
|
155
154
|
// });
|
|
156
155
|
if ($value.value === '') {
|
|
157
|
-
logger.error({ message: 'Expected color, received empty string', node: $value,
|
|
156
|
+
logger.error({ message: 'Expected color, received empty string', filename, node: $value, src });
|
|
158
157
|
}
|
|
159
158
|
} else if ($value.type === 'Object') {
|
|
160
159
|
validateMembersAs(
|
|
@@ -163,10 +162,10 @@ export function validateColor($value, node, { source, logger }) {
|
|
|
163
162
|
colorSpace: {
|
|
164
163
|
validator: (v) => {
|
|
165
164
|
if (v.type !== 'String') {
|
|
166
|
-
logger.error({ message: `Expected string, received ${print(v)}`, node: v,
|
|
165
|
+
logger.error({ message: `Expected string, received ${print(v)}`, filename, node: v, src });
|
|
167
166
|
}
|
|
168
167
|
if (!VALID_COLORSPACES.has(v.value)) {
|
|
169
|
-
logger.error({ message: `Unsupported colorspace ${print(v)}`, node: v,
|
|
168
|
+
logger.error({ message: `Unsupported colorspace ${print(v)}`, filename, node: v, src });
|
|
170
169
|
}
|
|
171
170
|
},
|
|
172
171
|
required: true,
|
|
@@ -174,14 +173,24 @@ export function validateColor($value, node, { source, logger }) {
|
|
|
174
173
|
channels: {
|
|
175
174
|
validator: (v, node) => {
|
|
176
175
|
if (v.type !== 'Array') {
|
|
177
|
-
logger.error({ message: `Expected array, received ${print(v)}`, node: v,
|
|
176
|
+
logger.error({ message: `Expected array, received ${print(v)}`, filename, node: v, src });
|
|
178
177
|
}
|
|
179
178
|
if (v.elements?.length !== 3) {
|
|
180
|
-
logger.error({
|
|
179
|
+
logger.error({
|
|
180
|
+
message: `Expected 3 channels, received ${v.elements?.length ?? 0}`,
|
|
181
|
+
filename,
|
|
182
|
+
node: v,
|
|
183
|
+
src,
|
|
184
|
+
});
|
|
181
185
|
}
|
|
182
186
|
for (const element of v.elements) {
|
|
183
187
|
if (element.value.type !== 'Number') {
|
|
184
|
-
logger.error({
|
|
188
|
+
logger.error({
|
|
189
|
+
message: `Expected number, received ${print(element.value)}`,
|
|
190
|
+
filename,
|
|
191
|
+
node: element,
|
|
192
|
+
src,
|
|
193
|
+
});
|
|
185
194
|
}
|
|
186
195
|
}
|
|
187
196
|
},
|
|
@@ -199,17 +208,17 @@ export function validateColor($value, node, { source, logger }) {
|
|
|
199
208
|
v.value.length === 7 + 1 ||
|
|
200
209
|
!/^#[a-f0-9]{3,8}$/i.test(v.value)
|
|
201
210
|
) {
|
|
202
|
-
logger.error({ message: `Invalid hex color ${print(v)}`, node: v,
|
|
211
|
+
logger.error({ message: `Invalid hex color ${print(v)}`, filename, node: v, src });
|
|
203
212
|
}
|
|
204
213
|
},
|
|
205
214
|
},
|
|
206
215
|
alpha: { validator: validateNumber },
|
|
207
216
|
},
|
|
208
217
|
node,
|
|
209
|
-
{
|
|
218
|
+
{ filename, src, logger },
|
|
210
219
|
);
|
|
211
220
|
} else {
|
|
212
|
-
logger.error({ message: `Expected object, received ${$value.type}`, node: $value,
|
|
221
|
+
logger.error({ message: `Expected object, received ${$value.type}`, filename, node: $value, src });
|
|
213
222
|
}
|
|
214
223
|
}
|
|
215
224
|
|
|
@@ -220,22 +229,24 @@ export function validateColor($value, node, { source, logger }) {
|
|
|
220
229
|
* @param {ValidateOptions} options
|
|
221
230
|
* @return {void}
|
|
222
231
|
*/
|
|
223
|
-
export function
|
|
232
|
+
export function validateCubicBezier($value, node, { filename, src, logger }) {
|
|
224
233
|
if ($value.type !== 'Array') {
|
|
225
|
-
logger.error({ message: `Expected array of strings, received ${print($value)}`, node: $value,
|
|
234
|
+
logger.error({ message: `Expected array of strings, received ${print($value)}`, filename, node: $value, src });
|
|
226
235
|
} else if (
|
|
227
236
|
!$value.elements.every((e) => e.value.type === 'Number' || (e.value.type === 'String' && isAlias(e.value.value)))
|
|
228
237
|
) {
|
|
229
238
|
logger.error({
|
|
230
239
|
message: 'Expected an array of 4 numbers, received some non-numbers',
|
|
240
|
+
filename,
|
|
231
241
|
node: $value,
|
|
232
|
-
|
|
242
|
+
src,
|
|
233
243
|
});
|
|
234
244
|
} else if ($value.elements.length !== 4) {
|
|
235
245
|
logger.error({
|
|
236
246
|
message: `Expected an array of 4 numbers, received ${$value.elements.length}`,
|
|
247
|
+
filename,
|
|
237
248
|
node: $value,
|
|
238
|
-
|
|
249
|
+
src,
|
|
239
250
|
});
|
|
240
251
|
}
|
|
241
252
|
}
|
|
@@ -247,18 +258,18 @@ export function validateCubicBézier($value, node, { source, logger }) {
|
|
|
247
258
|
* @param {ValidateOptions} options
|
|
248
259
|
* @return {void}
|
|
249
260
|
*/
|
|
250
|
-
export function validateDimension($value, node, {
|
|
261
|
+
export function validateDimension($value, node, { filename, src, logger }) {
|
|
251
262
|
if ($value.type === 'Number' && $value.value === 0) {
|
|
252
263
|
return; // `0` is a valid number
|
|
253
264
|
}
|
|
254
265
|
if ($value.type !== 'String') {
|
|
255
|
-
logger.error({ message: `Expected string, received ${$value.type}`, node: $value,
|
|
266
|
+
logger.error({ message: `Expected string, received ${$value.type}`, filename, node: $value, src });
|
|
256
267
|
} else if ($value.value === '') {
|
|
257
|
-
logger.error({ message: 'Expected dimension, received empty string', node: $value,
|
|
268
|
+
logger.error({ message: 'Expected dimension, received empty string', filename, node: $value, src });
|
|
258
269
|
} else if (String(Number($value.value)) === $value.value) {
|
|
259
|
-
logger.error({ message: 'Missing units', node: $value,
|
|
270
|
+
logger.error({ message: 'Missing units', filename, node: $value, src });
|
|
260
271
|
} else if (!/^[0-9]+/.test($value.value)) {
|
|
261
|
-
logger.error({ message: `Expected dimension with units, received ${print($value)}`, node: $value,
|
|
272
|
+
logger.error({ message: `Expected dimension with units, received ${print($value)}`, filename, node: $value, src });
|
|
262
273
|
}
|
|
263
274
|
}
|
|
264
275
|
|
|
@@ -269,18 +280,23 @@ export function validateDimension($value, node, { source, logger }) {
|
|
|
269
280
|
* @param {ValidateOptions} options
|
|
270
281
|
* @return {void}
|
|
271
282
|
*/
|
|
272
|
-
export function validateDuration($value, node, {
|
|
283
|
+
export function validateDuration($value, node, { filename, src, logger }) {
|
|
273
284
|
if ($value.type === 'Number' && $value.value === 0) {
|
|
274
285
|
return; // `0` is a valid number
|
|
275
286
|
}
|
|
276
287
|
if ($value.type !== 'String') {
|
|
277
|
-
logger.error({ message: `Expected string, received ${$value.type}`, node: $value,
|
|
288
|
+
logger.error({ message: `Expected string, received ${$value.type}`, filename, node: $value, src });
|
|
278
289
|
} else if ($value.value === '') {
|
|
279
|
-
logger.error({ message: 'Expected duration, received empty string', node: $value,
|
|
290
|
+
logger.error({ message: 'Expected duration, received empty string', filename, node: $value, src });
|
|
280
291
|
} else if (!/m?s$/.test($value.value)) {
|
|
281
|
-
logger.error({ message: 'Missing unit "ms" or "s"', node: $value,
|
|
292
|
+
logger.error({ message: 'Missing unit "ms" or "s"', filename, node: $value, src });
|
|
282
293
|
} else if (!/^[0-9]+/.test($value.value)) {
|
|
283
|
-
logger.error({
|
|
294
|
+
logger.error({
|
|
295
|
+
message: `Expected duration in \`ms\` or \`s\`, received ${print($value)}`,
|
|
296
|
+
filename,
|
|
297
|
+
node: $value,
|
|
298
|
+
src,
|
|
299
|
+
});
|
|
284
300
|
}
|
|
285
301
|
}
|
|
286
302
|
|
|
@@ -291,18 +307,24 @@ export function validateDuration($value, node, { source, logger }) {
|
|
|
291
307
|
* @param {ValidateOptions} options
|
|
292
308
|
* @return {void}
|
|
293
309
|
*/
|
|
294
|
-
export function validateFontFamily($value, node, {
|
|
310
|
+
export function validateFontFamily($value, node, { filename, src, logger }) {
|
|
295
311
|
if ($value.type !== 'String' && $value.type !== 'Array') {
|
|
296
|
-
logger.error({
|
|
312
|
+
logger.error({
|
|
313
|
+
message: `Expected string or array of strings, received ${$value.type}`,
|
|
314
|
+
filename,
|
|
315
|
+
node: $value,
|
|
316
|
+
src,
|
|
317
|
+
});
|
|
297
318
|
}
|
|
298
319
|
if ($value.type === 'String' && $value.value === '') {
|
|
299
|
-
logger.error({ message: 'Expected font family name, received empty string', node: $value,
|
|
320
|
+
logger.error({ message: 'Expected font family name, received empty string', filename, node: $value, src });
|
|
300
321
|
}
|
|
301
322
|
if ($value.type === 'Array' && !$value.elements.every((e) => e.value.type === 'String' && e.value.value !== '')) {
|
|
302
323
|
logger.error({
|
|
303
324
|
message: 'Expected an array of strings, received some non-strings or empty strings',
|
|
325
|
+
filename,
|
|
304
326
|
node: $value,
|
|
305
|
-
|
|
327
|
+
src,
|
|
306
328
|
});
|
|
307
329
|
}
|
|
308
330
|
}
|
|
@@ -314,23 +336,25 @@ export function validateFontFamily($value, node, { source, logger }) {
|
|
|
314
336
|
* @param {ValidateOptions} options
|
|
315
337
|
* @return {void}
|
|
316
338
|
*/
|
|
317
|
-
export function validateFontWeight($value, node, {
|
|
339
|
+
export function validateFontWeight($value, node, { filename, src, logger }) {
|
|
318
340
|
if ($value.type !== 'String' && $value.type !== 'Number') {
|
|
319
341
|
logger.error({
|
|
320
342
|
message: `Expected a font weight name or number 0–1000, received ${$value.type}`,
|
|
343
|
+
filename,
|
|
321
344
|
node: $value,
|
|
322
|
-
|
|
345
|
+
src,
|
|
323
346
|
});
|
|
324
347
|
}
|
|
325
348
|
if ($value.type === 'String' && !FONT_WEIGHT_VALUES.has($value.value)) {
|
|
326
349
|
logger.error({
|
|
327
350
|
message: `Unknown font weight ${print($value)}. Expected one of: ${listFormat.format([...FONT_WEIGHT_VALUES])}.`,
|
|
351
|
+
filename,
|
|
328
352
|
node: $value,
|
|
329
|
-
|
|
353
|
+
src,
|
|
330
354
|
});
|
|
331
355
|
}
|
|
332
356
|
if ($value.type === 'Number' && ($value.value < 0 || $value.value > 1000)) {
|
|
333
|
-
logger.error({ message: `Expected number 0–1000, received ${print($value)}`, node: $value,
|
|
357
|
+
logger.error({ message: `Expected number 0–1000, received ${print($value)}`, filename, node: $value, src });
|
|
334
358
|
}
|
|
335
359
|
}
|
|
336
360
|
|
|
@@ -341,9 +365,14 @@ export function validateFontWeight($value, node, { source, logger }) {
|
|
|
341
365
|
* @param {ValidateOptions} options
|
|
342
366
|
* @return {void}
|
|
343
367
|
*/
|
|
344
|
-
export function validateGradient($value, node, {
|
|
368
|
+
export function validateGradient($value, node, { filename, src, logger }) {
|
|
345
369
|
if ($value.type !== 'Array') {
|
|
346
|
-
logger.error({
|
|
370
|
+
logger.error({
|
|
371
|
+
message: `Expected array of gradient stops, received ${$value.type}`,
|
|
372
|
+
filename,
|
|
373
|
+
node: $value,
|
|
374
|
+
src,
|
|
375
|
+
});
|
|
347
376
|
return;
|
|
348
377
|
}
|
|
349
378
|
for (let i = 0; i < $value.elements.length; i++) {
|
|
@@ -351,8 +380,9 @@ export function validateGradient($value, node, { source, logger }) {
|
|
|
351
380
|
if (element.value.type !== 'Object') {
|
|
352
381
|
logger.error({
|
|
353
382
|
message: `Stop #${i + 1}: Expected gradient stop, received ${element.value.type}`,
|
|
383
|
+
filename,
|
|
354
384
|
node: element,
|
|
355
|
-
|
|
385
|
+
src,
|
|
356
386
|
});
|
|
357
387
|
break;
|
|
358
388
|
}
|
|
@@ -363,7 +393,7 @@ export function validateGradient($value, node, { source, logger }) {
|
|
|
363
393
|
position: { validator: validateNumber, required: true },
|
|
364
394
|
},
|
|
365
395
|
element,
|
|
366
|
-
{
|
|
396
|
+
{ filename, src, logger },
|
|
367
397
|
);
|
|
368
398
|
}
|
|
369
399
|
}
|
|
@@ -375,9 +405,9 @@ export function validateGradient($value, node, { source, logger }) {
|
|
|
375
405
|
* @param {ValidateOptions} options
|
|
376
406
|
* @return {void}
|
|
377
407
|
*/
|
|
378
|
-
export function validateNumber($value, node, {
|
|
408
|
+
export function validateNumber($value, node, { filename, src, logger }) {
|
|
379
409
|
if ($value.type !== 'Number') {
|
|
380
|
-
logger.error({ message: `Expected number, received ${$value.type}`, node: $value,
|
|
410
|
+
logger.error({ message: `Expected number, received ${$value.type}`, filename, node: $value, src });
|
|
381
411
|
}
|
|
382
412
|
}
|
|
383
413
|
|
|
@@ -388,9 +418,9 @@ export function validateNumber($value, node, { source, logger }) {
|
|
|
388
418
|
* @param {ValidateOptions} options
|
|
389
419
|
* @return {void}
|
|
390
420
|
*/
|
|
391
|
-
export function validateShadowLayer($value, node, {
|
|
421
|
+
export function validateShadowLayer($value, node, { filename, src, logger }) {
|
|
392
422
|
if ($value.type !== 'Object') {
|
|
393
|
-
logger.error({ message: `Expected Object, received ${$value.type}`, node: $value,
|
|
423
|
+
logger.error({ message: `Expected Object, received ${$value.type}`, filename, node: $value, src });
|
|
394
424
|
return;
|
|
395
425
|
}
|
|
396
426
|
validateMembersAs(
|
|
@@ -403,7 +433,7 @@ export function validateShadowLayer($value, node, { source, logger }) {
|
|
|
403
433
|
spread: { validator: validateDimension },
|
|
404
434
|
},
|
|
405
435
|
node,
|
|
406
|
-
{
|
|
436
|
+
{ filename, src, logger },
|
|
407
437
|
);
|
|
408
438
|
}
|
|
409
439
|
|
|
@@ -414,7 +444,7 @@ export function validateShadowLayer($value, node, { source, logger }) {
|
|
|
414
444
|
* @param {ValidateOptions} options
|
|
415
445
|
* @return {void}
|
|
416
446
|
*/
|
|
417
|
-
export function validateStrokeStyle($value, node, {
|
|
447
|
+
export function validateStrokeStyle($value, node, { filename, src, logger }) {
|
|
418
448
|
// note: strokeStyle’s values are NOT aliasable (unless by string, but that breaks validations)
|
|
419
449
|
if ($value.type === 'String') {
|
|
420
450
|
if (!STROKE_STYLE_VALUES.has($value.value)) {
|
|
@@ -422,19 +452,16 @@ export function validateStrokeStyle($value, node, { source, logger }) {
|
|
|
422
452
|
message: `Unknown stroke style ${print($value)}. Expected one of: ${listFormat.format([
|
|
423
453
|
...STROKE_STYLE_VALUES,
|
|
424
454
|
])}.`,
|
|
455
|
+
filename,
|
|
425
456
|
node: $value,
|
|
426
|
-
|
|
457
|
+
src,
|
|
427
458
|
});
|
|
428
459
|
}
|
|
429
460
|
} else if ($value.type === 'Object') {
|
|
430
461
|
const strokeMembers = getObjMembers($value);
|
|
431
462
|
for (const property of ['dashArray', 'lineCap']) {
|
|
432
463
|
if (!strokeMembers[property]) {
|
|
433
|
-
logger.error({
|
|
434
|
-
message: `Missing required property "${property}"`,
|
|
435
|
-
node: $value,
|
|
436
|
-
source,
|
|
437
|
-
});
|
|
464
|
+
logger.error({ message: `Missing required property "${property}"`, filename, node: $value, src });
|
|
438
465
|
}
|
|
439
466
|
}
|
|
440
467
|
const { lineCap, dashArray } = strokeMembers;
|
|
@@ -449,31 +476,24 @@ export function validateStrokeStyle($value, node, { source, logger }) {
|
|
|
449
476
|
for (const element of dashArray.elements) {
|
|
450
477
|
if (element.value.type === 'String' && element.value.value !== '') {
|
|
451
478
|
if (isMaybeAlias(element.value)) {
|
|
452
|
-
validateAlias(element.value, node, { logger,
|
|
479
|
+
validateAlias(element.value, node, { logger, src });
|
|
453
480
|
} else {
|
|
454
|
-
validateDimension(element.value, node, { logger,
|
|
481
|
+
validateDimension(element.value, node, { logger, src });
|
|
455
482
|
}
|
|
456
483
|
} else {
|
|
457
484
|
logger.error({
|
|
458
485
|
message: 'Expected array of strings, recieved some non-strings or empty strings.',
|
|
486
|
+
filename,
|
|
459
487
|
node: element,
|
|
460
|
-
|
|
488
|
+
src,
|
|
461
489
|
});
|
|
462
490
|
}
|
|
463
491
|
}
|
|
464
492
|
} else {
|
|
465
|
-
logger.error({
|
|
466
|
-
message: `Expected array of strings, received ${dashArray.type}`,
|
|
467
|
-
node: $value,
|
|
468
|
-
source,
|
|
469
|
-
});
|
|
493
|
+
logger.error({ message: `Expected array of strings, received ${dashArray.type}`, filename, node: $value, src });
|
|
470
494
|
}
|
|
471
495
|
} else {
|
|
472
|
-
logger.error({
|
|
473
|
-
message: `Expected string or object, received ${$value.type}`,
|
|
474
|
-
node: $value,
|
|
475
|
-
source,
|
|
476
|
-
});
|
|
496
|
+
logger.error({ message: `Expected string or object, received ${$value.type}`, filename, node: $value, src });
|
|
477
497
|
}
|
|
478
498
|
}
|
|
479
499
|
|
|
@@ -484,9 +504,9 @@ export function validateStrokeStyle($value, node, { source, logger }) {
|
|
|
484
504
|
* @param {ValidateOptions} options
|
|
485
505
|
* @return {void}
|
|
486
506
|
*/
|
|
487
|
-
export function validateTransition($value, node, {
|
|
507
|
+
export function validateTransition($value, node, { filename, src, logger }) {
|
|
488
508
|
if ($value.type !== 'Object') {
|
|
489
|
-
logger.error({ message: `Expected object, received ${$value.type}`, node: $value,
|
|
509
|
+
logger.error({ message: `Expected object, received ${$value.type}`, filename, node: $value, src });
|
|
490
510
|
return;
|
|
491
511
|
}
|
|
492
512
|
validateMembersAs(
|
|
@@ -494,10 +514,10 @@ export function validateTransition($value, node, { source, logger }) {
|
|
|
494
514
|
{
|
|
495
515
|
duration: { validator: validateDuration, required: true },
|
|
496
516
|
delay: { validator: validateDuration, required: false }, // note: spec says delay is required, but Terrazzo makes delay optional
|
|
497
|
-
timingFunction: { validator:
|
|
517
|
+
timingFunction: { validator: validateCubicBezier, required: true },
|
|
498
518
|
},
|
|
499
519
|
node,
|
|
500
|
-
{
|
|
520
|
+
{ filename, src, logger },
|
|
501
521
|
);
|
|
502
522
|
}
|
|
503
523
|
|
|
@@ -508,12 +528,13 @@ export function validateTransition($value, node, { source, logger }) {
|
|
|
508
528
|
* @param {ValidateOptions} options
|
|
509
529
|
* @return {void}
|
|
510
530
|
*/
|
|
511
|
-
export default function validate(node, {
|
|
531
|
+
export default function validate(node, { filename, src, logger }) {
|
|
512
532
|
if (node.type !== 'Member' && node.type !== 'Object') {
|
|
513
533
|
logger.error({
|
|
514
534
|
message: `Expected Object, received ${JSON.stringify(node.type)}`,
|
|
535
|
+
filename,
|
|
515
536
|
node,
|
|
516
|
-
|
|
537
|
+
src,
|
|
517
538
|
});
|
|
518
539
|
return;
|
|
519
540
|
}
|
|
@@ -523,62 +544,63 @@ export default function validate(node, { source, logger }) {
|
|
|
523
544
|
const $type = rootMembers.$type;
|
|
524
545
|
|
|
525
546
|
if (!$value) {
|
|
526
|
-
logger.error({ message: 'Token missing $value', node,
|
|
547
|
+
logger.error({ message: 'Token missing $value', filename, node, src });
|
|
527
548
|
return;
|
|
528
549
|
}
|
|
529
550
|
// If top-level value is a valid alias, this is valid (no need for $type)
|
|
530
551
|
// ⚠️ Important: ALL Object and Array nodes below will need to check for aliases within!
|
|
531
552
|
if (isMaybeAlias($value)) {
|
|
532
|
-
validateAlias($value, node, { logger,
|
|
553
|
+
validateAlias($value, node, { logger, src });
|
|
533
554
|
return;
|
|
534
555
|
}
|
|
535
556
|
|
|
536
557
|
if (!$type) {
|
|
537
|
-
logger.error({ message: 'Token missing $type', node,
|
|
558
|
+
logger.error({ message: 'Token missing $type', filename, node, src });
|
|
538
559
|
return;
|
|
539
560
|
}
|
|
540
561
|
|
|
541
562
|
switch ($type.value) {
|
|
542
563
|
case 'color': {
|
|
543
|
-
validateColor($value, node, { logger,
|
|
564
|
+
validateColor($value, node, { logger, src });
|
|
544
565
|
break;
|
|
545
566
|
}
|
|
546
567
|
case 'cubicBezier': {
|
|
547
|
-
|
|
568
|
+
validateCubicBezier($value, node, { logger, src });
|
|
548
569
|
break;
|
|
549
570
|
}
|
|
550
571
|
case 'dimension': {
|
|
551
|
-
validateDimension($value, node, { logger,
|
|
572
|
+
validateDimension($value, node, { logger, src });
|
|
552
573
|
break;
|
|
553
574
|
}
|
|
554
575
|
case 'duration': {
|
|
555
|
-
validateDuration($value, node, { logger,
|
|
576
|
+
validateDuration($value, node, { logger, src });
|
|
556
577
|
break;
|
|
557
578
|
}
|
|
558
579
|
case 'fontFamily': {
|
|
559
|
-
validateFontFamily($value, node, { logger,
|
|
580
|
+
validateFontFamily($value, node, { logger, src });
|
|
560
581
|
break;
|
|
561
582
|
}
|
|
562
583
|
case 'fontWeight': {
|
|
563
|
-
validateFontWeight($value, node, { logger,
|
|
584
|
+
validateFontWeight($value, node, { logger, src });
|
|
564
585
|
break;
|
|
565
586
|
}
|
|
566
587
|
case 'number': {
|
|
567
|
-
validateNumber($value, node, { logger,
|
|
588
|
+
validateNumber($value, node, { logger, src });
|
|
568
589
|
break;
|
|
569
590
|
}
|
|
570
591
|
case 'shadow': {
|
|
571
592
|
if ($value.type === 'Object') {
|
|
572
|
-
validateShadowLayer($value, node, { logger,
|
|
593
|
+
validateShadowLayer($value, node, { logger, src });
|
|
573
594
|
} else if ($value.type === 'Array') {
|
|
574
595
|
for (const element of $value.elements) {
|
|
575
|
-
validateShadowLayer(element.value, $value, { logger,
|
|
596
|
+
validateShadowLayer(element.value, $value, { logger, src });
|
|
576
597
|
}
|
|
577
598
|
} else {
|
|
578
599
|
logger.error({
|
|
579
600
|
message: `Expected shadow object or array of shadow objects, received ${$value.type}`,
|
|
601
|
+
filename,
|
|
580
602
|
node: $value,
|
|
581
|
-
|
|
603
|
+
src,
|
|
582
604
|
});
|
|
583
605
|
}
|
|
584
606
|
break;
|
|
@@ -587,49 +609,54 @@ export default function validate(node, { source, logger }) {
|
|
|
587
609
|
// extensions
|
|
588
610
|
case 'boolean': {
|
|
589
611
|
if ($value.type !== 'Boolean') {
|
|
590
|
-
logger.error({ message: `Expected boolean, received ${$value.type}`, node: $value,
|
|
612
|
+
logger.error({ message: `Expected boolean, received ${$value.type}`, filename, node: $value, src });
|
|
591
613
|
}
|
|
592
614
|
break;
|
|
593
615
|
}
|
|
594
616
|
case 'link': {
|
|
595
617
|
if ($value.type !== 'String') {
|
|
596
|
-
logger.error({ message: `Expected string, received ${$value.type}`, node: $value,
|
|
618
|
+
logger.error({ message: `Expected string, received ${$value.type}`, filename, node: $value, src });
|
|
597
619
|
} else if ($value.value === '') {
|
|
598
|
-
logger.error({ message: 'Expected URL, received empty string', node: $value,
|
|
620
|
+
logger.error({ message: 'Expected URL, received empty string', filename, node: $value, src });
|
|
599
621
|
}
|
|
600
622
|
break;
|
|
601
623
|
}
|
|
602
624
|
case 'string': {
|
|
603
625
|
if ($value.type !== 'String') {
|
|
604
|
-
logger.error({ message: `Expected string, received ${$value.type}`, node: $value,
|
|
626
|
+
logger.error({ message: `Expected string, received ${$value.type}`, filename, node: $value, src });
|
|
605
627
|
}
|
|
606
628
|
break;
|
|
607
629
|
}
|
|
608
630
|
|
|
609
631
|
// composite types
|
|
610
632
|
case 'border': {
|
|
611
|
-
validateBorder($value, node, {
|
|
633
|
+
validateBorder($value, node, { filename, src, logger });
|
|
612
634
|
break;
|
|
613
635
|
}
|
|
614
636
|
case 'gradient': {
|
|
615
|
-
validateGradient($value, node, {
|
|
637
|
+
validateGradient($value, node, { filename, src, logger });
|
|
616
638
|
break;
|
|
617
639
|
}
|
|
618
640
|
case 'strokeStyle': {
|
|
619
|
-
validateStrokeStyle($value, node, {
|
|
641
|
+
validateStrokeStyle($value, node, { filename, src, logger });
|
|
620
642
|
break;
|
|
621
643
|
}
|
|
622
644
|
case 'transition': {
|
|
623
|
-
validateTransition($value, node, {
|
|
645
|
+
validateTransition($value, node, { filename, src, logger });
|
|
624
646
|
break;
|
|
625
647
|
}
|
|
626
648
|
case 'typography': {
|
|
627
649
|
if ($value.type !== 'Object') {
|
|
628
|
-
logger.error({ message: `Expected object, received ${$value.type}`, node: $value,
|
|
650
|
+
logger.error({ message: `Expected object, received ${$value.type}`, filename, node: $value, src });
|
|
629
651
|
break;
|
|
630
652
|
}
|
|
631
653
|
if ($value.members.length === 0) {
|
|
632
|
-
logger.error({
|
|
654
|
+
logger.error({
|
|
655
|
+
message: 'Empty typography token. Must contain at least 1 property.',
|
|
656
|
+
filename,
|
|
657
|
+
node: $value,
|
|
658
|
+
src,
|
|
659
|
+
});
|
|
633
660
|
}
|
|
634
661
|
validateMembersAs(
|
|
635
662
|
$value,
|
|
@@ -638,7 +665,7 @@ export default function validate(node, { source, logger }) {
|
|
|
638
665
|
fontWeight: { validator: validateFontWeight },
|
|
639
666
|
},
|
|
640
667
|
node,
|
|
641
|
-
{
|
|
668
|
+
{ filename, src, logger },
|
|
642
669
|
);
|
|
643
670
|
break;
|
|
644
671
|
}
|