UNPKG

@nlabs/lex

Version:
142 lines (141 loc) 16.4 kB
/** * 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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