UNPKG

@terrazzo/parser

Version:

Parser/validator for the Design Tokens Community Group (DTCG) standard.

74 lines 2.79 kB
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