UNPKG

@stylable/core

Version:

CSS for Components

178 lines 6.36 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.strategies = exports.validateAllowedNodesUntil = exports.groupValues = exports.listOptions = exports.getStringValue = exports.getFormatterArgs = exports.stringifyFunction = exports.getNamedArgs = exports.valueDiagnostics = void 0; const postcss_value_parser_1 = __importDefault(require("postcss-value-parser")); const diagnostics_1 = require("../diagnostics"); exports.valueDiagnostics = { INVALID_NAMED_PARAMS: (0, diagnostics_1.createDiagnosticReporter)('13001', 'error', () => `invalid named parameters (e.g. "func(name value, [name value, ...])")`), MISSING_REQUIRED_FORMATTER_ARG: (0, diagnostics_1.createDiagnosticReporter)('13002', 'error', (node, argIndex) => `${postcss_value_parser_1.default.stringify(node)}: argument at index ${argIndex} is empty`), }; function getNamedArgs(node) { const args = []; if (node.nodes.length) { args.push([]); node.nodes.forEach((node) => { if (node.type === 'div') { args.push([]); } else { const { sourceIndex: _sourceIndex, sourceEndIndex: _sourceEndIndex, ...clone } = node; args[args.length - 1].push(clone); } }); } // handle trailing comma return args.length && args[args.length - 1].length === 0 ? args.slice(0, -1) : args; } exports.getNamedArgs = getNamedArgs; function stringifyFunction(name, parsedNode, perserveQuotes = false) { return `${name}(${getFormatterArgs(parsedNode, false, undefined, perserveQuotes).join(', ')})`; } exports.stringifyFunction = stringifyFunction; function getFormatterArgs(node, allowComments = false, reportWarning, preserveQuotes = false) { const argsResult = []; let currentArg = ''; let argIndex = 0; for (const currentNode of node.nodes) { if (currentNode.type === 'div' && currentNode.value === ',') { checkEmptyArg(); argIndex++; argsResult.push(currentArg.trim()); currentArg = ''; } else if (currentNode.type === 'comment') { if (allowComments) { currentArg += currentNode.resolvedValue || postcss_value_parser_1.default.stringify(currentNode); } } else if (currentNode.type === 'string') { currentArg += preserveQuotes ? postcss_value_parser_1.default.stringify(currentNode) : currentNode.value; } else { currentArg += currentNode.resolvedValue || postcss_value_parser_1.default.stringify(currentNode); } } checkEmptyArg(); argsResult.push(currentArg.trim()); let i = argsResult.length; while (i--) { if (argsResult[i] === '') { argsResult.pop(); } else { return argsResult; } } return argsResult; function checkEmptyArg() { if (reportWarning && argsResult.length && currentArg.trim() === '') { reportWarning(exports.valueDiagnostics.MISSING_REQUIRED_FORMATTER_ARG(node, argIndex)); } } } exports.getFormatterArgs = getFormatterArgs; function getStringValue(nodes) { return postcss_value_parser_1.default.stringify(nodes, (node) => { if (node.resolvedValue !== undefined) { return node.resolvedValue; } else { // TODO: warn return undefined; } }); } exports.getStringValue = getStringValue; function listOptions(node) { return groupValues(node.nodes) .map((nodes) => postcss_value_parser_1.default.stringify(nodes, (n) => { if (n.type === 'div') { return null; } else if (n.type === 'string') { return n.value; } else { return undefined; } })) .filter((x) => typeof x === 'string'); } exports.listOptions = listOptions; function groupValues(nodes, divType = 'div') { const grouped = []; let current = []; nodes.forEach((n) => { if (n.type === divType) { grouped.push(current); current = []; } else { current.push(n); } }); const last = grouped[grouped.length - 1]; if ((last && last !== current && current.length) || (!last && current.length)) { grouped.push(current); } return grouped; } exports.groupValues = groupValues; function validateAllowedNodesUntil(node, i, untilType = 'div', allowed = ['comment']) { i = 1; let current = node.nodes[i]; while (current && current.type !== untilType) { if (!allowed.includes(current.type)) { return false; } i++; current = node.nodes[i]; } return true; } exports.validateAllowedNodesUntil = validateAllowedNodesUntil; exports.strategies = { named: (node, reportWarning) => { const named = {}; getNamedArgs(node).forEach((mixinArgsGroup) => { const argsDivider = mixinArgsGroup[1]; if (mixinArgsGroup.length < 3 || (argsDivider && argsDivider.type !== 'space')) { if (reportWarning) { const argValue = mixinArgsGroup[0]; reportWarning(exports.valueDiagnostics.INVALID_NAMED_PARAMS(), { word: argValue.value, }); } return; } named[mixinArgsGroup[0].value] = stringifyParam(mixinArgsGroup.slice(2)); }); return named; }, args: (node, reportWarning) => { return getFormatterArgs(node, true, reportWarning).map((value) => ({ value })); }, }; function stringifyParam(nodes) { return postcss_value_parser_1.default.stringify(nodes, (n) => { if (n.type === 'function') { return postcss_value_parser_1.default.stringify(n); } else if (n.type === 'div') { return null; } else if (n.type === 'string') { return n.value; } else { return undefined; } }); } //# sourceMappingURL=value.js.map