@nlabs/lex
Version:
142 lines (141 loc) • 16.4 kB
JavaScript
/**
* Copyright (c) 2025-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*
* PostCSS 8-compatible version of postcss-for plugin
* Original: https://github.com/antyakushev/postcss-for
*/ import postcssSimpleVars from 'postcss-simple-vars';
const postcssFor = (opts = {})=>{
const options = {
nested: opts.nested !== false
};
const iterStack = [];
const parentsHaveIterator = (rule, param)=>{
if (rule.parent === null) {
return false;
}
if (rule.parent.type === 'root') {
return false;
}
if (rule.parent.type !== 'atrule' || !rule.parent.params) {
return false;
}
const parentIterVar = rule.parent.params.split(/\s+/)[0];
if (!parentIterVar) {
return false;
}
if (parentIterVar === param) {
return true;
}
if (iterStack.indexOf(param) !== -1) {
return true;
}
return parentsHaveIterator(rule.parent, param);
};
const manageIterStack = (rule)=>{
if (rule.parent && rule.parent.type !== 'root') {
const parentIterVar = rule.parent.type === 'atrule' && rule.parent.params ? rule.parent.params.split(/\s+/)[0] : null;
if (parentIterVar && iterStack.indexOf(parentIterVar) === -1) {
iterStack.splice(0, iterStack.length);
} else if (parentIterVar) {
const parentIndex = iterStack.indexOf(parentIterVar);
if (parentIndex !== -1) {
iterStack.splice(parentIndex + 1, iterStack.length - parentIndex - 1);
}
}
} else {
iterStack.splice(0, iterStack.length);
}
const currentIterVar = rule.params.split(/\s+/)[0];
if (currentIterVar) {
iterStack.push(currentIterVar);
}
};
const checkNumber = (rule)=>(param)=>{
if (isNaN(Number(param)) || !param.match(/^-?\d+\.?\d*$/)) {
if (param.indexOf('$') !== -1) {
if (!parentsHaveIterator(rule, param)) {
throw rule.error('External variable (not from a parent for loop) cannot be used as a range parameter', {
plugin: 'postcss-for'
});
}
} else {
throw rule.error('Range parameter should be a number', {
plugin: 'postcss-for'
});
}
}
};
const checkParams = (rule, params)=>{
if (!params[0]?.startsWith('$') || params[1] !== 'from' || params[3] !== 'to' || params[5] && params[5] !== 'by') {
throw rule.error('Wrong loop syntax', {
plugin: 'postcss-for'
});
}
[
params[2],
params[4],
params[6] || '0'
].forEach(checkNumber(rule));
};
const unrollLoop = (rule)=>{
const params = rule.params.split(/\s+/);
checkParams(rule, params);
const iterator = params[0].slice(1);
const index = +params[2];
const top = +params[4];
const dir = top < index ? -1 : 1;
const by = +(params[6] || 1) * dir;
const value = {};
for(let i = index; i * dir <= top * dir; i = i + by){
const content = rule.clone();
value[iterator] = i;
const simpleVarsPlugin = postcssSimpleVars({
only: value
});
if (simpleVarsPlugin.prepare) {
const prepared = simpleVarsPlugin.prepare({});
if (prepared.Once) {
prepared.Once(content, {});
}
} else if (typeof simpleVarsPlugin === 'function') {
simpleVarsPlugin(content);
}
if (options.nested) {
processLoops(content);
}
if (rule.parent) {
rule.parent.insertBefore(rule, content.nodes);
}
}
if (rule.parent) {
rule.remove();
}
};
const processLoops = (css)=>{
css.walkAtRules((rule)=>{
if (rule.name === 'for') {
unrollLoop(rule);
}
});
};
const processOriginalLoops = (css)=>{
css.walkAtRules((rule)=>{
if (rule.name === 'for') {
if (rule.parent) {
manageIterStack(rule);
}
unrollLoop(rule);
}
});
};
return {
Once (root) {
processOriginalLoops(root);
},
postcssPlugin: 'postcss-for'
};
};
postcssFor.postcss = true;
export default postcssFor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9wb3N0Y3NzL3Bvc3Rjc3MtZm9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICpcbiAqIFBvc3RDU1MgOC1jb21wYXRpYmxlIHZlcnNpb24gb2YgcG9zdGNzcy1mb3IgcGx1Z2luXG4gKiBPcmlnaW5hbDogaHR0cHM6Ly9naXRodWIuY29tL2FudHlha3VzaGV2L3Bvc3Rjc3MtZm9yXG4gKi9cbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBvc3Rjc3NTaW1wbGVWYXJzIGZyb20gJ3Bvc3Rjc3Mtc2ltcGxlLXZhcnMnO1xuXG5pbnRlcmZhY2UgUG9zdGNzc0Zvck9wdGlvbnMge1xuICBuZXN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBwb3N0Y3NzRm9yID0gKG9wdHM6IFBvc3Rjc3NGb3JPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBuZXN0ZWQ6IG9wdHMubmVzdGVkICE9PSBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGl0ZXJTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBwYXJlbnRzSGF2ZUl0ZXJhdG9yID0gKHJ1bGU6IHBvc3Rjc3MuQXRSdWxlLCBwYXJhbTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYocnVsZS5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYocnVsZS5wYXJlbnQudHlwZSA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmKHJ1bGUucGFyZW50LnR5cGUgIT09ICdhdHJ1bGUnIHx8ICFydWxlLnBhcmVudC5wYXJhbXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRJdGVyVmFyID0gcnVsZS5wYXJlbnQucGFyYW1zLnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYoIXBhcmVudEl0ZXJWYXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYocGFyZW50SXRlclZhciA9PT0gcGFyYW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZihpdGVyU3RhY2suaW5kZXhPZihwYXJhbSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudHNIYXZlSXRlcmF0b3IocnVsZS5wYXJlbnQgYXMgcG9zdGNzcy5BdFJ1bGUsIHBhcmFtKTtcbiAgfTtcblxuICBjb25zdCBtYW5hZ2VJdGVyU3RhY2sgPSAocnVsZTogcG9zdGNzcy5BdFJ1bGUpID0+IHtcbiAgICBpZihydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHBhcmVudEl0ZXJWYXIgPSBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBydWxlLnBhcmVudC5wYXJhbXNcbiAgICAgICAgPyBydWxlLnBhcmVudC5wYXJhbXMuc3BsaXQoL1xccysvKVswXVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZihwYXJlbnRJdGVyVmFyICYmIGl0ZXJTdGFjay5pbmRleE9mKHBhcmVudEl0ZXJWYXIpID09PSAtMSkge1xuICAgICAgICBpdGVyU3RhY2suc3BsaWNlKDAsIGl0ZXJTdGFjay5sZW5ndGgpO1xuICAgICAgfSBlbHNlIGlmKHBhcmVudEl0ZXJWYXIpIHtcbiAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBpdGVyU3RhY2suaW5kZXhPZihwYXJlbnRJdGVyVmFyKTtcbiAgICAgICAgaWYocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaXRlclN0YWNrLnNwbGljZShwYXJlbnRJbmRleCArIDEsIGl0ZXJTdGFjay5sZW5ndGggLSBwYXJlbnRJbmRleCAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJTdGFjay5zcGxpY2UoMCwgaXRlclN0YWNrLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJdGVyVmFyID0gcnVsZS5wYXJhbXMuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZihjdXJyZW50SXRlclZhcikge1xuICAgICAgaXRlclN0YWNrLnB1c2goY3VycmVudEl0ZXJWYXIpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjaGVja051bWJlciA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSkgPT4gKHBhcmFtOiBzdHJpbmcpID0+IHtcbiAgICBpZihpc05hTihOdW1iZXIocGFyYW0pKSB8fCAhcGFyYW0ubWF0Y2goL14tP1xcZCtcXC4/XFxkKiQvKSkge1xuICAgICAgaWYocGFyYW0uaW5kZXhPZignJCcpICE9PSAtMSkge1xuICAgICAgICBpZighcGFyZW50c0hhdmVJdGVyYXRvcihydWxlLCBwYXJhbSkpIHtcbiAgICAgICAgICB0aHJvdyBydWxlLmVycm9yKCdFeHRlcm5hbCB2YXJpYWJsZSAobm90IGZyb20gYSBwYXJlbnQgZm9yIGxvb3ApIGNhbm5vdCBiZSB1c2VkIGFzIGEgcmFuZ2UgcGFyYW1ldGVyJywge1xuICAgICAgICAgICAgcGx1Z2luOiAncG9zdGNzcy1mb3InXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ1JhbmdlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBudW1iZXInLCB7XG4gICAgICAgICAgcGx1Z2luOiAncG9zdGNzcy1mb3InXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBjaGVja1BhcmFtcyA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSwgcGFyYW1zOiBzdHJpbmdbXSkgPT4ge1xuICAgIGlmKFxuICAgICAgIXBhcmFtc1swXT8uc3RhcnRzV2l0aCgnJCcpIHx8XG4gICAgICBwYXJhbXNbMV0gIT09ICdmcm9tJyB8fFxuICAgICAgcGFyYW1zWzNdICE9PSAndG8nIHx8XG4gICAgICAocGFyYW1zWzVdICYmIHBhcmFtc1s1XSAhPT0gJ2J5JylcbiAgICApIHtcbiAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ1dyb25nIGxvb3Agc3ludGF4Jywge1xuICAgICAgICBwbHVnaW46ICdwb3N0Y3NzLWZvcidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIFtwYXJhbXNbMl0sIHBhcmFtc1s0XSwgcGFyYW1zWzZdIHx8ICcwJ10uZm9yRWFjaChjaGVja051bWJlcihydWxlKSk7XG4gIH07XG5cbiAgY29uc3QgdW5yb2xsTG9vcCA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHJ1bGUucGFyYW1zLnNwbGl0KC9cXHMrLyk7XG5cbiAgICBjaGVja1BhcmFtcyhydWxlLCBwYXJhbXMpO1xuXG4gICAgY29uc3QgaXRlcmF0b3IgPSBwYXJhbXNbMF0uc2xpY2UoMSk7XG4gICAgY29uc3QgaW5kZXggPSArcGFyYW1zWzJdO1xuICAgIGNvbnN0IHRvcCA9ICtwYXJhbXNbNF07XG4gICAgY29uc3QgZGlyID0gdG9wIDwgaW5kZXggPyAtMSA6IDE7XG4gICAgY29uc3QgYnkgPSAoKyhwYXJhbXNbNl0gfHwgMSkpICogZGlyO1xuXG4gICAgY29uc3QgdmFsdWU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IobGV0IGkgPSBpbmRleDsgaSAqIGRpciA8PSB0b3AgKiBkaXI7IGkgPSBpICsgYnkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBydWxlLmNsb25lKCk7XG4gICAgICB2YWx1ZVtpdGVyYXRvcl0gPSBpO1xuICAgICAgY29uc3Qgc2ltcGxlVmFyc1BsdWdpbiA9IHBvc3Rjc3NTaW1wbGVWYXJzKHtvbmx5OiB2YWx1ZX0pO1xuICAgICAgaWYoc2ltcGxlVmFyc1BsdWdpbi5wcmVwYXJlKSB7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkID0gc2ltcGxlVmFyc1BsdWdpbi5wcmVwYXJlKHt9IGFzIGFueSk7XG4gICAgICAgIGlmKHByZXBhcmVkLk9uY2UpIHtcbiAgICAgICAgICBwcmVwYXJlZC5PbmNlKGNvbnRlbnQsIHt9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih0eXBlb2Ygc2ltcGxlVmFyc1BsdWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaW1wbGVWYXJzUGx1Z2luKGNvbnRlbnQpO1xuICAgICAgfVxuICAgICAgaWYob3B0aW9ucy5uZXN0ZWQpIHtcbiAgICAgICAgcHJvY2Vzc0xvb3BzKGNvbnRlbnQpO1xuICAgICAgfVxuICAgICAgaWYocnVsZS5wYXJlbnQpIHtcbiAgICAgICAgcnVsZS5wYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIGNvbnRlbnQubm9kZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZihydWxlLnBhcmVudCkge1xuICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc0xvb3BzID0gKGNzczogcG9zdGNzcy5Db250YWluZXIpID0+IHtcbiAgICBjc3Mud2Fsa0F0UnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGlmKHJ1bGUubmFtZSA9PT0gJ2ZvcicpIHtcbiAgICAgICAgdW5yb2xsTG9vcChydWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBwcm9jZXNzT3JpZ2luYWxMb29wcyA9IChjc3M6IHBvc3Rjc3MuUm9vdCkgPT4ge1xuICAgIGNzcy53YWxrQXRSdWxlcygocnVsZSkgPT4ge1xuICAgICAgaWYocnVsZS5uYW1lID09PSAnZm9yJykge1xuICAgICAgICBpZihydWxlLnBhcmVudCkge1xuICAgICAgICAgIG1hbmFnZUl0ZXJTdGFjayhydWxlKTtcbiAgICAgICAgfVxuICAgICAgICB1bnJvbGxMb29wKHJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgT25jZShyb290KSB7XG4gICAgICBwcm9jZXNzT3JpZ2luYWxMb29wcyhyb290KTtcbiAgICB9LFxuICAgIHBvc3Rjc3NQbHVnaW46ICdwb3N0Y3NzLWZvcidcbiAgfTtcbn07XG5cbnBvc3Rjc3NGb3IucG9zdGNzcyA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IHBvc3Rjc3NGb3I7XG5cbiJdLCJuYW1lcyI6WyJwb3N0Y3NzU2ltcGxlVmFycyIsInBvc3Rjc3NGb3IiLCJvcHRzIiwib3B0aW9ucyIsIm5lc3RlZCIsIml0ZXJTdGFjayIsInBhcmVudHNIYXZlSXRlcmF0b3IiLCJydWxlIiwicGFyYW0iLCJwYXJlbnQiLCJ0eXBlIiwicGFyYW1zIiwicGFyZW50SXRlclZhciIsInNwbGl0IiwiaW5kZXhPZiIsIm1hbmFnZUl0ZXJTdGFjayIsInNwbGljZSIsImxlbmd0aCIsInBhcmVudEluZGV4IiwiY3VycmVudEl0ZXJWYXIiLCJwdXNoIiwiY2hlY2tOdW1iZXIiLCJpc05hTiIsIk51bWJlciIsIm1hdGNoIiwiZXJyb3IiLCJwbHVnaW4iLCJjaGVja1BhcmFtcyIsInN0YXJ0c1dpdGgiLCJmb3JFYWNoIiwidW5yb2xsTG9vcCIsIml0ZXJhdG9yIiwic2xpY2UiLCJpbmRleCIsInRvcCIsImRpciIsImJ5IiwidmFsdWUiLCJpIiwiY29udGVudCIsImNsb25lIiwic2ltcGxlVmFyc1BsdWdpbiIsIm9ubHkiLCJwcmVwYXJlIiwicHJlcGFyZWQiLCJPbmNlIiwicHJvY2Vzc0xvb3BzIiwiaW5zZXJ0QmVmb3JlIiwibm9kZXMiLCJyZW1vdmUiLCJjc3MiLCJ3YWxrQXRSdWxlcyIsIm5hbWUiLCJwcm9jZXNzT3JpZ2luYWxMb29wcyIsInJvb3QiLCJwb3N0Y3NzUGx1Z2luIiwicG9zdGNzcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztDQU1DLEdBRUQsT0FBT0EsdUJBQXVC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