@terrazzo/parser
Version:
Parser/validator for the Design Tokens Community Group (DTCG) standard.
74 lines • 2.79 kB
JavaScript
import { getObjMember } from '@terrazzo/json-schema-tools';
import { GRADIENT_REQUIRED_STOP_PROPERTIES, isAlias } from '@terrazzo/token-tools';
import { docsLink } from '../lib/docs.js';
export const VALID_GRADIENT = 'core/valid-gradient';
const ERROR_MISSING = 'ERROR_MISSING';
const ERROR_POSITION = 'ERROR_POSITION';
const ERROR_INVALID_PROP = 'ERROR_INVALID_PROP';
const rule = {
meta: {
messages: {
[ERROR_MISSING]: 'Must be an array of { color, position } objects.',
[ERROR_POSITION]: 'Expected number 0-1, received {{ value }}.',
[ERROR_INVALID_PROP]: 'Unknown property {{ key }}.',
},
docs: {
description: 'Require gradient tokens to follow the format.',
url: docsLink(VALID_GRADIENT),
},
},
defaultOptions: {},
create({ tokens, report }) {
for (const t of Object.values(tokens)) {
if (t.aliasOf || !t.originalValue || t.$type !== 'gradient') {
continue;
}
validateGradient(t.originalValue.$value, {
node: getObjMember(t.source.node, '$value'),
filename: t.source.filename,
report,
});
}
},
};
function validateGradient(value, { node, filename, report, }) {
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i++) {
const stop = value[i];
if (!stop || typeof stop !== 'object') {
report({ messageId: ERROR_MISSING, node, filename });
continue;
}
for (const property of GRADIENT_REQUIRED_STOP_PROPERTIES) {
if (!(property in stop)) {
report({ messageId: ERROR_MISSING, node: node.elements[i], filename });
}
}
for (const key of Object.keys(stop)) {
if (!GRADIENT_REQUIRED_STOP_PROPERTIES.includes(key)) {
report({
messageId: ERROR_INVALID_PROP,
data: { key: JSON.stringify(key) },
node: node.elements[i],
filename,
});
}
}
if ('position' in stop &&
typeof stop.position !== 'number' &&
!isAlias(stop.position)) {
report({
messageId: ERROR_POSITION,
data: { value: stop.position },
node: getObjMember(node.elements[i].value, 'position'),
filename,
});
}
}
}
else {
report({ messageId: ERROR_MISSING, node, filename });
}
}
export default rule;
//# sourceMappingURL=valid-gradient.js.map