@nlabs/lex 1.51.4 โ†’ 1.51.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,7 +69,7 @@ const postcssFor = (opts = {})=>{
69
69
  };
70
70
  };
71
71
  const checkParams = (rule, params)=>{
72
- if (!params[0]?.match(/(^|[^\w])\$([\w\d-_]+)/) || params[1] !== 'from' || params[3] !== 'to' || params[5] !== 'by' && params[5] !== undefined) {
72
+ if (!params[0]?.startsWith('$') || params[1] !== 'from' || params[3] !== 'to' || params[5] && params[5] !== 'by') {
73
73
  throw rule.error('Wrong loop syntax', {
74
74
  plugin: 'postcss-for'
75
75
  });
@@ -92,9 +92,17 @@ const postcssFor = (opts = {})=>{
92
92
  for(let i = index; i * dir <= top * dir; i = i + by){
93
93
  const content = rule.clone();
94
94
  value[iterator] = i;
95
- postcssSimpleVars({
95
+ const simpleVarsPlugin = postcssSimpleVars({
96
96
  only: value
97
- })(content);
97
+ });
98
+ if (simpleVarsPlugin.prepare) {
99
+ const prepared = simpleVarsPlugin.prepare({});
100
+ if (prepared.Once) {
101
+ prepared.Once(content, {});
102
+ }
103
+ } else if (typeof simpleVarsPlugin === 'function') {
104
+ simpleVarsPlugin(content);
105
+ }
98
106
  if (options.nested) {
99
107
  processLoops(content);
100
108
  }
@@ -133,4 +141,4 @@ const postcssFor = (opts = {})=>{
133
141
  postcssFor.postcss = true;
134
142
  export default postcssFor;
135
143
 
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9wb3N0Y3NzL3Bvc3Rjc3MtZm9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICpcbiAqIFBvc3RDU1MgOC1jb21wYXRpYmxlIHZlcnNpb24gb2YgcG9zdGNzcy1mb3IgcGx1Z2luXG4gKiBPcmlnaW5hbDogaHR0cHM6Ly9naXRodWIuY29tL2FudHlha3VzaGV2L3Bvc3Rjc3MtZm9yXG4gKi9cbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBvc3Rjc3NTaW1wbGVWYXJzIGZyb20gJ3Bvc3Rjc3Mtc2ltcGxlLXZhcnMnO1xuXG5pbnRlcmZhY2UgUG9zdGNzc0Zvck9wdGlvbnMge1xuICBuZXN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBwb3N0Y3NzRm9yID0gKG9wdHM6IFBvc3Rjc3NGb3JPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBuZXN0ZWQ6IG9wdHMubmVzdGVkICE9PSBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGl0ZXJTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBwYXJlbnRzSGF2ZUl0ZXJhdG9yID0gKHJ1bGU6IHBvc3Rjc3MuQXRSdWxlLCBwYXJhbTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHJ1bGUucGFyZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJ1bGUucGFyZW50LnR5cGUgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocnVsZS5wYXJlbnQudHlwZSAhPT0gJ2F0cnVsZScgfHwgIXJ1bGUucGFyZW50LnBhcmFtcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEl0ZXJWYXIgPSBydWxlLnBhcmVudC5wYXJhbXMuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIXBhcmVudEl0ZXJWYXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBhcmVudEl0ZXJWYXIgPT09IHBhcmFtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGl0ZXJTdGFjay5pbmRleE9mKHBhcmFtKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50c0hhdmVJdGVyYXRvcihydWxlLnBhcmVudCBhcyBwb3N0Y3NzLkF0UnVsZSwgcGFyYW0pO1xuICB9O1xuXG4gIGNvbnN0IG1hbmFnZUl0ZXJTdGFjayA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSkgPT4ge1xuICAgIGlmIChydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHBhcmVudEl0ZXJWYXIgPSBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBydWxlLnBhcmVudC5wYXJhbXNcbiAgICAgICAgPyBydWxlLnBhcmVudC5wYXJhbXMuc3BsaXQoL1xccysvKVswXVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAocGFyZW50SXRlclZhciAmJiBpdGVyU3RhY2suaW5kZXhPZihwYXJlbnRJdGVyVmFyKSA9PT0gLTEpIHtcbiAgICAgICAgaXRlclN0YWNrLnNwbGljZSgwLCBpdGVyU3RhY2subGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50SXRlclZhcikge1xuICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IGl0ZXJTdGFjay5pbmRleE9mKHBhcmVudEl0ZXJWYXIpO1xuICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaXRlclN0YWNrLnNwbGljZShwYXJlbnRJbmRleCArIDEsIGl0ZXJTdGFjay5sZW5ndGggLSBwYXJlbnRJbmRleCAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJTdGFjay5zcGxpY2UoMCwgaXRlclN0YWNrLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJdGVyVmFyID0gcnVsZS5wYXJhbXMuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoY3VycmVudEl0ZXJWYXIpIHtcbiAgICAgIGl0ZXJTdGFjay5wdXNoKGN1cnJlbnRJdGVyVmFyKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tOdW1iZXIgPSAocnVsZTogcG9zdGNzcy5BdFJ1bGUpID0+IHtcbiAgICByZXR1cm4gKHBhcmFtOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChpc05hTihwYXJzZUludChwYXJhbSwgMTApKSB8fCAhcGFyYW0ubWF0Y2goL14tP1xcZCtcXC4/XFxkKiQvKSkge1xuICAgICAgICBpZiAocGFyYW0uaW5kZXhPZignJCcpICE9PSAtMSkge1xuICAgICAgICAgIGlmICghcGFyZW50c0hhdmVJdGVyYXRvcihydWxlLCBwYXJhbSkpIHtcbiAgICAgICAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ0V4dGVybmFsIHZhcmlhYmxlIChub3QgZnJvbSBhIHBhcmVudCBmb3IgbG9vcCkgY2Fubm90IGJlIHVzZWQgYXMgYSByYW5nZSBwYXJhbWV0ZXInLCB7XG4gICAgICAgICAgICAgIHBsdWdpbjogJ3Bvc3Rjc3MtZm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ1JhbmdlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBudW1iZXInLCB7XG4gICAgICAgICAgICBwbHVnaW46ICdwb3N0Y3NzLWZvcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQYXJhbXMgPSAocnVsZTogcG9zdGNzcy5BdFJ1bGUsIHBhcmFtczogc3RyaW5nW10pID0+IHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zWzBdPy5tYXRjaCgvKF58W15cXHddKVxcJChbXFx3XFxkLV9dKykvKSB8fFxuICAgICAgcGFyYW1zWzFdICE9PSAnZnJvbScgfHxcbiAgICAgIHBhcmFtc1szXSAhPT0gJ3RvJyB8fFxuICAgICAgKHBhcmFtc1s1XSAhPT0gJ2J5JyAmJiBwYXJhbXNbNV0gIT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ1dyb25nIGxvb3Agc3ludGF4Jywge1xuICAgICAgICBwbHVnaW46ICdwb3N0Y3NzLWZvcidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIFtwYXJhbXNbMl0sIHBhcmFtc1s0XSwgcGFyYW1zWzZdIHx8ICcwJ10uZm9yRWFjaChjaGVja051bWJlcihydWxlKSk7XG4gIH07XG5cbiAgY29uc3QgdW5yb2xsTG9vcCA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHJ1bGUucGFyYW1zLnNwbGl0KC9cXHMrLyk7XG5cbiAgICBjaGVja1BhcmFtcyhydWxlLCBwYXJhbXMpO1xuXG4gICAgY29uc3QgaXRlcmF0b3IgPSBwYXJhbXNbMF0uc2xpY2UoMSk7XG4gICAgY29uc3QgaW5kZXggPSArcGFyYW1zWzJdO1xuICAgIGNvbnN0IHRvcCA9ICtwYXJhbXNbNF07XG4gICAgY29uc3QgZGlyID0gdG9wIDwgaW5kZXggPyAtMSA6IDE7XG4gICAgY29uc3QgYnkgPSAoKyhwYXJhbXNbNl0gfHwgMSkpICogZGlyO1xuXG4gICAgY29uc3QgdmFsdWU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgKiBkaXIgPD0gdG9wICogZGlyOyBpID0gaSArIGJ5KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcnVsZS5jbG9uZSgpO1xuICAgICAgdmFsdWVbaXRlcmF0b3JdID0gaTtcbiAgICAgIHBvc3Rjc3NTaW1wbGVWYXJzKHtvbmx5OiB2YWx1ZX0pKGNvbnRlbnQpO1xuICAgICAgaWYgKG9wdGlvbnMubmVzdGVkKSB7XG4gICAgICAgIHByb2Nlc3NMb29wcyhjb250ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgICBydWxlLnBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgY29udGVudC5ub2Rlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc0xvb3BzID0gKGNzczogcG9zdGNzcy5Db250YWluZXIpID0+IHtcbiAgICBjc3Mud2Fsa0F0UnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGlmIChydWxlLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgIHVucm9sbExvb3AocnVsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc09yaWdpbmFsTG9vcHMgPSAoY3NzOiBwb3N0Y3NzLlJvb3QpID0+IHtcbiAgICBjc3Mud2Fsa0F0UnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGlmIChydWxlLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgICAgIG1hbmFnZUl0ZXJTdGFjayhydWxlKTtcbiAgICAgICAgfVxuICAgICAgICB1bnJvbGxMb29wKHJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9zdGNzc1BsdWdpbjogJ3Bvc3Rjc3MtZm9yJyxcbiAgICBPbmNlKHJvb3QpIHtcbiAgICAgIHByb2Nlc3NPcmlnaW5hbExvb3BzKHJvb3QpO1xuICAgIH1cbiAgfTtcbn07XG5cbnBvc3Rjc3NGb3IucG9zdGNzcyA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IHBvc3Rjc3NGb3I7XG5cbiJdLCJuYW1lcyI6WyJwb3N0Y3NzU2ltcGxlVmFycyIsInBvc3Rjc3NGb3IiLCJvcHRzIiwib3B0aW9ucyIsIm5lc3RlZCIsIml0ZXJTdGFjayIsInBhcmVudHNIYXZlSXRlcmF0b3IiLCJydWxlIiwicGFyYW0iLCJwYXJlbnQiLCJ0eXBlIiwicGFyYW1zIiwicGFyZW50SXRlclZhciIsInNwbGl0IiwiaW5kZXhPZiIsIm1hbmFnZUl0ZXJTdGFjayIsInNwbGljZSIsImxlbmd0aCIsInBhcmVudEluZGV4IiwiY3VycmVudEl0ZXJWYXIiLCJwdXNoIiwiY2hlY2tOdW1iZXIiLCJpc05hTiIsInBhcnNlSW50IiwibWF0Y2giLCJlcnJvciIsInBsdWdpbiIsImNoZWNrUGFyYW1zIiwidW5kZWZpbmVkIiwiZm9yRWFjaCIsInVucm9sbExvb3AiLCJpdGVyYXRvciIsInNsaWNlIiwiaW5kZXgiLCJ0b3AiLCJkaXIiLCJieSIsInZhbHVlIiwiaSIsImNvbnRlbnQiLCJjbG9uZSIsIm9ubHkiLCJwcm9jZXNzTG9vcHMiLCJpbnNlcnRCZWZvcmUiLCJub2RlcyIsInJlbW92ZSIsImNzcyIsIndhbGtBdFJ1bGVzIiwibmFtZSIsInByb2Nlc3NPcmlnaW5hbExvb3BzIiwicG9zdGNzc1BsdWdpbiIsIk9uY2UiLCJyb290IiwicG9zdGNzcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztDQU1DLEdBRUQsT0FBT0EsdUJBQXVCLHNCQUFzQjtBQU1wRCxNQUFNQyxhQUFhLENBQUNDLE9BQTBCLENBQUMsQ0FBQztJQUM5QyxNQUFNQyxVQUFVO1FBQ2RDLFFBQVFGLEtBQUtFLE1BQU0sS0FBSztJQUMxQjtJQUVBLE1BQU1DLFlBQXNCLEVBQUU7SUFFOUIsTUFBTUMsc0JBQXNCLENBQUNDLE1BQXNCQztRQUNqRCxJQUFJRCxLQUFLRSxNQUFNLElBQUksTUFBTTtZQUN2QixPQUFPO1FBQ1Q7UUFDQSxJQUFJRixLQUFLRSxNQUFNLENBQUNDLElBQUksS0FB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
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9wb3N0Y3NzL3Bvc3Rjc3MtZm9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICpcbiAqIFBvc3RDU1MgOC1jb21wYXRpYmxlIHZlcnNpb24gb2YgcG9zdGNzcy1mb3IgcGx1Z2luXG4gKiBPcmlnaW5hbDogaHR0cHM6Ly9naXRodWIuY29tL2FudHlha3VzaGV2L3Bvc3Rjc3MtZm9yXG4gKi9cbmltcG9ydCBwb3N0Y3NzIGZyb20gJ3Bvc3Rjc3MnO1xuaW1wb3J0IHBvc3Rjc3NTaW1wbGVWYXJzIGZyb20gJ3Bvc3Rjc3Mtc2ltcGxlLXZhcnMnO1xuXG5pbnRlcmZhY2UgUG9zdGNzc0Zvck9wdGlvbnMge1xuICBuZXN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCBwb3N0Y3NzRm9yID0gKG9wdHM6IFBvc3Rjc3NGb3JPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBuZXN0ZWQ6IG9wdHMubmVzdGVkICE9PSBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IGl0ZXJTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBwYXJlbnRzSGF2ZUl0ZXJhdG9yID0gKHJ1bGU6IHBvc3Rjc3MuQXRSdWxlLCBwYXJhbTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHJ1bGUucGFyZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJ1bGUucGFyZW50LnR5cGUgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocnVsZS5wYXJlbnQudHlwZSAhPT0gJ2F0cnVsZScgfHwgIXJ1bGUucGFyZW50LnBhcmFtcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEl0ZXJWYXIgPSBydWxlLnBhcmVudC5wYXJhbXMuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIXBhcmVudEl0ZXJWYXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBhcmVudEl0ZXJWYXIgPT09IHBhcmFtKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGl0ZXJTdGFjay5pbmRleE9mKHBhcmFtKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50c0hhdmVJdGVyYXRvcihydWxlLnBhcmVudCBhcyBwb3N0Y3NzLkF0UnVsZSwgcGFyYW0pO1xuICB9O1xuXG4gIGNvbnN0IG1hbmFnZUl0ZXJTdGFjayA9IChydWxlOiBwb3N0Y3NzLkF0UnVsZSkgPT4ge1xuICAgIGlmIChydWxlLnBhcmVudCAmJiBydWxlLnBhcmVudC50eXBlICE9PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHBhcmVudEl0ZXJWYXIgPSBydWxlLnBhcmVudC50eXBlID09PSAnYXRydWxlJyAmJiBydWxlLnBhcmVudC5wYXJhbXNcbiAgICAgICAgPyBydWxlLnBhcmVudC5wYXJhbXMuc3BsaXQoL1xccysvKVswXVxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAocGFyZW50SXRlclZhciAmJiBpdGVyU3RhY2suaW5kZXhPZihwYXJlbnRJdGVyVmFyKSA9PT0gLTEpIHtcbiAgICAgICAgaXRlclN0YWNrLnNwbGljZSgwLCBpdGVyU3RhY2subGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50SXRlclZhcikge1xuICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IGl0ZXJTdGFjay5pbmRleE9mKHBhcmVudEl0ZXJWYXIpO1xuICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaXRlclN0YWNrLnNwbGljZShwYXJlbnRJbmRleCArIDEsIGl0ZXJTdGFjay5sZW5ndGggLSBwYXJlbnRJbmRleCAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJTdGFjay5zcGxpY2UoMCwgaXRlclN0YWNrLmxlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJdGVyVmFyID0gcnVsZS5wYXJhbXMuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoY3VycmVudEl0ZXJWYXIpIHtcbiAgICAgIGl0ZXJTdGFjay5wdXNoKGN1cnJlbnRJdGVyVmFyKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tOdW1iZXIgPSAocnVsZTogcG9zdGNzcy5BdFJ1bGUpID0+IHtcbiAgICByZXR1cm4gKHBhcmFtOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChpc05hTihwYXJzZUludChwYXJhbSwgMTApKSB8fCAhcGFyYW0ubWF0Y2goL14tP1xcZCtcXC4/XFxkKiQvKSkge1xuICAgICAgICBpZiAocGFyYW0uaW5kZXhPZignJCcpICE9PSAtMSkge1xuICAgICAgICAgIGlmICghcGFyZW50c0hhdmVJdGVyYXRvcihydWxlLCBwYXJhbSkpIHtcbiAgICAgICAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ0V4dGVybmFsIHZhcmlhYmxlIChub3QgZnJvbSBhIHBhcmVudCBmb3IgbG9vcCkgY2Fubm90IGJlIHVzZWQgYXMgYSByYW5nZSBwYXJhbWV0ZXInLCB7XG4gICAgICAgICAgICAgIHBsdWdpbjogJ3Bvc3Rjc3MtZm9yJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHJ1bGUuZXJyb3IoJ1JhbmdlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBudW1iZXInLCB7XG4gICAgICAgICAgICBwbHVnaW46ICdwb3N0Y3NzLWZvcidcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQYXJhbXMgPSAocnVsZTogcG9zdGNzcy5BdFJ1bGUsIHBhcmFtczogc3RyaW5nW10pID0+IHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zWzBdPy5zdGFydHNXaXRoKCckJykgfHxcbiAgICAgIHBhcmFtc1sxXSAhPT0gJ2Zyb20nIHx8XG4gICAgICBwYXJhbXNbM10gIT09ICd0bycgfHxcbiAgICAgIChwYXJhbXNbNV0gJiYgcGFyYW1zWzVdICE9PSAnYnknKVxuICAgICkge1xuICAgICAgdGhyb3cgcnVsZS5lcnJvcignV3JvbmcgbG9vcCBzeW50YXgnLCB7XG4gICAgICAgIHBsdWdpbjogJ3Bvc3Rjc3MtZm9yJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgW3BhcmFtc1syXSwgcGFyYW1zWzRdLCBwYXJhbXNbNl0gfHwgJzAnXS5mb3JFYWNoKGNoZWNrTnVtYmVyKHJ1bGUpKTtcbiAgfTtcblxuICBjb25zdCB1bnJvbGxMb29wID0gKHJ1bGU6IHBvc3Rjc3MuQXRSdWxlKSA9PiB7XG4gICAgY29uc3QgcGFyYW1zID0gcnVsZS5wYXJhbXMuc3BsaXQoL1xccysvKTtcblxuICAgIGNoZWNrUGFyYW1zKHJ1bGUsIHBhcmFtcyk7XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHBhcmFtc1swXS5zbGljZSgxKTtcbiAgICBjb25zdCBpbmRleCA9ICtwYXJhbXNbMl07XG4gICAgY29uc3QgdG9wID0gK3BhcmFtc1s0XTtcbiAgICBjb25zdCBkaXIgPSB0b3AgPCBpbmRleCA/IC0xIDogMTtcbiAgICBjb25zdCBieSA9ICgrKHBhcmFtc1s2XSB8fCAxKSkgKiBkaXI7XG5cbiAgICBjb25zdCB2YWx1ZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSAqIGRpciA8PSB0b3AgKiBkaXI7IGkgPSBpICsgYnkpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBydWxlLmNsb25lKCk7XG4gICAgICB2YWx1ZVtpdGVyYXRvcl0gPSBpO1xuICAgICAgY29uc3Qgc2ltcGxlVmFyc1BsdWdpbiA9IHBvc3Rjc3NTaW1wbGVWYXJzKHtvbmx5OiB2YWx1ZX0pO1xuICAgICAgaWYgKHNpbXBsZVZhcnNQbHVnaW4ucHJlcGFyZSkge1xuICAgICAgICBjb25zdCBwcmVwYXJlZCA9IHNpbXBsZVZhcnNQbHVnaW4ucHJlcGFyZSh7fSBhcyBhbnkpO1xuICAgICAgICBpZiAocHJlcGFyZWQuT25jZSkge1xuICAgICAgICAgIHByZXBhcmVkLk9uY2UoY29udGVudCwge30gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2ltcGxlVmFyc1BsdWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaW1wbGVWYXJzUGx1Z2luKGNvbnRlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMubmVzdGVkKSB7XG4gICAgICAgIHByb2Nlc3NMb29wcyhjb250ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgICBydWxlLnBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgY29udGVudC5ub2Rlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc0xvb3BzID0gKGNzczogcG9zdGNzcy5Db250YWluZXIpID0+IHtcbiAgICBjc3Mud2Fsa0F0UnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGlmIChydWxlLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgIHVucm9sbExvb3AocnVsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc09yaWdpbmFsTG9vcHMgPSAoY3NzOiBwb3N0Y3NzLlJvb3QpID0+IHtcbiAgICBjc3Mud2Fsa0F0UnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgIGlmIChydWxlLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgICAgIG1hbmFnZUl0ZXJTdGFjayhydWxlKTtcbiAgICAgICAgfVxuICAgICAgICB1bnJvbGxMb29wKHJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9zdGNzc1BsdWdpbjogJ3Bvc3Rjc3MtZm9yJyxcbiAgICBPbmNlKHJvb3QpIHtcbiAgICAgIHByb2Nlc3NPcmlnaW5hbExvb3BzKHJvb3QpO1xuICAgIH1cbiAgfTtcbn07XG5cbnBvc3Rjc3NGb3IucG9zdGNzcyA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IHBvc3Rjc3NGb3I7XG5cbiJdLCJuYW1lcyI6WyJwb3N0Y3NzU2ltcGxlVmFycyIsInBvc3Rjc3NGb3IiLCJvcHRzIiwib3B0aW9ucyIsIm5lc3RlZCIsIml0ZXJTdGFjayIsInBhcmVudHNIYXZlSXRlcmF0b3IiLCJydWxlIiwicGFyYW0iLCJwYXJlbnQiLCJ0eXBlIiwicGFyYW1zIiwicGFyZW50SXRlclZhciIsInNwbGl0IiwiaW5kZXhPZiIsIm1hbmFnZUl0ZXJTdGFjayIsInNwbGljZSIsImxlbmd0aCIsInBhcmVudEluZGV4IiwiY3VycmVudEl0ZXJWYXIiLCJwdXNoIiwiY2hlY2tOdW1iZXIiLCJpc05hTiIsInBhcnNlSW50IiwibWF0Y2giLCJlcnJvciIsInBsdWdpbiIsImNoZWNrUGFyYW1zIiwic3RhcnRzV2l0aCIsImZvckVhY2giLCJ1bnJvbGxMb29wIiwiaXRlcmF0b3IiLCJzbGljZSIsImluZGV4IiwidG9wIiwiZGlyIiwiYnkiLCJ2YWx1ZSIsImkiLCJjb250ZW50IiwiY2xvbmUiLCJzaW1wbGVWYXJzUGx1Z2luIiwib25seSIsInByZXBhcmUiLCJwcmVwYXJlZCIsIk9uY2UiLCJwcm9jZXNzTG9vcHMiLCJpbnNlcnRCZWZvcmUiLCJub2RlcyIsInJlbW92ZSIsImNzcyIsIndhbGtBdFJ1bGVzIiwibmFtZSIsInByb2Nlc3NPcmlnaW5hbExvb3BzIiwicG9zdGNzc1BsdWdpbiIsInJvb3QiLCJwb3N0Y3NzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0NBTUMsR0FFRCxPQUFPQSx1QkFBdUIsc0JBQXNCO0FBTXBELE1BQU1DLGFBQWEsQ0FBQ0MsT0FBMEIsQ0FBQyxDQUFDO0lBQzlDLE1BQU1DLFVBQVU7UUFDZEMsUUFBUUYsS0FBS0UsTUFBTSxLQUFLO0lBQzFCO0lBRUEsTUFBTUMsWUFBc0IsRUFBRTtJQUU5QixNQUFNQyxzQkFBc0IsQ0FBQ0MsTUFBc0JDO1FBQ2pELElBQUlELEtBQUtFLE1BQU0sSUFBSSxNQUFNO1lBQ3ZCLE9BQU87UUFDVDtRQUNBLElBQUlGLEtBQUtFLE1BQU0sQ0FBQ0MsSUFBSSxLQUFLLFFBQVE7WUFDL0IsT0FBTztRQUNUO1FBQ0EsSUFBSUgsS0FBS0UsTUFBTSxDQUFDQyxJQUFJLEtBQUssWUFBWSxDQUFDSCxLQUFLRSxNQUFNLENBQUNFLE1BQU0sRUFBRTtZQUN4RCxPQUFPO1FBQ1Q7UUFFQSxNQUFNQyxnQkFBZ0JMLEtBQUtFLE1BQU0sQ0FBQ0UsTUFBTSxDQUFDRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDeEQsSUFBSSxDQUFDRCxlQUFlO1lBQ2xCLE9BQU87UUFDVDtRQUNBLElBQUlBLGtCQUFrQkosT0FBTztZQUMzQixPQUFPO1FBQ1Q7UUFDQSxJQUFJSCxVQUFVUyxPQUFPLENBQUNOLFdBQVcsQ0FBQyxHQUFHO1lBQ25DLE9BQU87UUFDVDtRQUNBLE9BQU9GLG9CQUFvQkMsS0FBS0UsTUFBTSxFQUFvQkQ7SUFDNUQ7SUFFQSxNQUFNTyxrQkFBa0IsQ0FBQ1I7UUFDdkIsSUFBSUEsS0FBS0UsTUFBTSxJQUFJRixLQUFLRSxNQUFNLENBQUNDLElBQUksS0FBSyxRQUFRO1lBQzlDLE1BQU1FLGdCQUFnQkwsS0FBS0UsTUFBTSxDQUFDQyxJQUFJLEtBQUssWUFBWUgsS0FBS0UsTUFBTSxDQUFDRSxNQUFNLEdBQ3JFSixLQUFLRSxNQUFNLENBQUNFLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQ2xDO1lBQ0osSUFBSUQsaUJBQWlCUCxVQUFVUyxPQUFPLENBQUNGLG1CQUFtQixDQUFDLEdBQUc7Z0JBQzVEUCxVQUFVVyxNQUFNLENBQUMsR0FBR1gsVUFBVVksTUFBTTtZQUN0QyxPQUFPLElBQUlMLGVBQWU7Z0JBQ3hCLE1BQU1NLGNBQWNiLFVBQVVTLE9BQU8sQ0FBQ0Y7Z0JBQ3RDLElBQUlNLGdCQUFnQixDQUFDLEdBQUc7b0JBQ3RCYixVQUFVVyxNQUFNLENBQUNFLGNBQWMsR0FBR2IsVUFBVVksTUFBTSxHQUFHQyxjQUFjO2dCQUNyRTtZQUNGO1FBQ0YsT0FBTztZQUNMYixVQUFVVyxNQUFNLENBQUMsR0FBR1gsVUFBVVksTUFBTTtRQUN0QztRQUNBLE1BQU1FLGlCQUFpQlosS0FBS0ksTUFBTSxDQUFDRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbEQsSUFBSU0sZ0JBQWdCO1lBQ2xCZCxVQUFVZSxJQUFJLENBQUNEO1FBQ2pCO0lBQ0Y7SUFFQSxNQUFNRSxjQUFjLENBQUNkO1FBQ25CLE9BQU8sQ0FBQ0M7WUFDTixJQUFJYyxNQUFNQyxTQUFTZixPQUFPLFFBQVEsQ0FBQ0EsTUFBTWdCLEtBQUssQ0FBQyxrQkFBa0I7Z0JBQy9ELElBQUloQixNQUFNTSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQzdCLElBQUksQ0FBQ1Isb0JBQW9CQyxNQUFNQyxRQUFRO3dCQUNyQyxNQUFNRCxLQUFLa0IsS0FBSyxDQUFDLHNGQUFzRjs0QkFDckdDLFFBQVE7d0JBQ1Y7b0JBQ0Y7Z0JBQ0YsT0FBTztvQkFDTCxNQUFNbkIsS0FBS2tCLEtBQUssQ0FBQyxzQ0FBc0M7d0JBQ3JEQyxRQUFRO29CQUNWO2dCQUNGO1lBQ0Y7UUFDRjtJQUNGO0lBRUEsTUFBTUMsY0FBYyxDQUFDcEIsTUFBc0JJO1FBQ3pDLElBQ0UsQ0FBQ0EsTUFBTSxDQUFDLEVBQUUsRUFBRWlCLFdBQVcsUUFDdkJqQixNQUFNLENBQUMsRUFBRSxLQUFLLFVBQ2RBLE1BQU0sQ0FBQyxFQUFFLEtBQUssUUFDYkEsTUFBTSxDQUFDLEVBQUUsSUFBSUEsTUFBTSxDQUFDLEVBQUUsS0FBSyxNQUM1QjtZQUNBLE1BQU1KLEtBQUtrQixLQUFLLENBQUMscUJBQXFCO2dCQUNwQ0MsUUFBUTtZQUNWO1FBQ0Y7UUFFQTtZQUFDZixNQUFNLENBQUMsRUFBRTtZQUFFQSxNQUFNLENBQUMsRUFBRTtZQUFFQSxNQUFNLENBQUMsRUFBRSxJQUFJO1NBQUksQ0FBQ2tCLE9BQU8sQ0FBQ1IsWUFBWWQ7SUFDL0Q7SUFFQSxNQUFNdUIsYUFBYSxDQUFDdkI7UUFDbEIsTUFBTUksU0FBU0osS0FBS0ksTUFBTSxDQUFDRSxLQUFLLENBQUM7UUFFakNjLFlBQVlwQixNQUFNSTtRQUVsQixNQUFNb0IsV0FBV3BCLE1BQU0sQ0FBQyxFQUFFLENBQUNxQixLQUFLLENBQUM7UUFDakMsTUFBTUMsUUFBUSxDQUFDdEIsTUFBTSxDQUFDLEVBQUU7UUFDeEIsTUFBTXVCLE1BQU0sQ0FBQ3ZCLE1BQU0sQ0FBQyxFQUFFO1FBQ3RCLE1BQU13QixNQUFNRCxNQUFNRCxRQUFRLENBQUMsSUFBSTtRQUMvQixNQUFNRyxLQUFLLEFBQUMsQ0FBRXpCLENBQUFBLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQSxJQUFNd0I7UUFFakMsTUFBTUUsUUFBZ0MsQ0FBQztRQUN2QyxJQUFLLElBQUlDLElBQUlMLE9BQU9LLElBQUlILE9BQU9ELE1BQU1DLEtBQUtHLElBQUlBLElBQUlGLEdBQUk7WUFDcEQsTUFBTUcsVUFBVWhDLEtBQUtpQyxLQUFLO1lBQzFCSCxLQUFLLENBQUNOLFNBQVMsR0FBR087WUFDbEIsTUFBTUcsbUJBQW1CekMsa0JBQWtCO2dCQUFDMEMsTUFBTUw7WUFBSztZQUN2RCxJQUFJSSxpQkFBaUJFLE9BQU8sRUFBRTtnQkFDNUIsTUFBTUMsV0FBV0gsaUJBQWlCRSxPQUFPLENBQUMsQ0FBQztnQkFDM0MsSUFBSUMsU0FBU0MsSUFBSSxFQUFFO29CQUNqQkQsU0FBU0MsSUFBSSxDQUFDTixTQUFTLENBQUM7Z0JBQzFCO1lBQ0YsT0FBTyxJQUFJLE9BQU9FLHFCQUFxQixZQUFZO2dCQUNqREEsaUJBQWlCRjtZQUNuQjtZQUNBLElBQUlwQyxRQUFRQyxNQUFNLEVBQUU7Z0JBQ2xCMEMsYUFBYVA7WUFDZjtZQUNBLElBQUloQyxLQUFLRSxNQUFNLEVBQUU7Z0JBQ2ZGLEtBQUtFLE1BQU0sQ0FBQ3NDLFlBQVksQ0FBQ3hDLE1BQU1nQyxRQUFRUyxLQUFLO1lBQzlDO1FBQ0Y7UUFDQSxJQUFJekMsS0FBS0UsTUFBTSxFQUFFO1lBQ2ZGLEtBQUswQyxNQUFNO1FBQ2I7SUFDRjtJQUVBLE1BQU1ILGVBQWUsQ0FBQ0k7UUFDcEJBLElBQUlDLFdBQVcsQ0FBQyxDQUFDNUM7WUFDZixJQUFJQSxLQUFLNkMsSUFBSSxLQUFLLE9BQU87Z0JBQ3ZCdEIsV0FBV3ZCO1lBQ2I7UUFDRjtJQUNGO0lBRUEsTUFBTThDLHVCQUF1QixDQUFDSDtRQUM1QkEsSUFBSUMsV0FBVyxDQUFDLENBQUM1QztZQUNmLElBQUlBLEtBQUs2QyxJQUFJLEtBQUssT0FBTztnQkFDdkIsSUFBSTdDLEtBQUtFLE1BQU0sRUFBRTtvQkFDZk0sZ0JBQWdCUjtnQkFDbEI7Z0JBQ0F1QixXQUFXdkI7WUFDYjtRQUNGO0lBQ0Y7SUFFQSxPQUFPO1FBQ0wrQyxlQUFlO1FBQ2ZULE1BQUtVLElBQUk7WUFDUEYscUJBQXFCRTtRQUN2QjtJQUNGO0FBQ0Y7QUFFQXRELFdBQVd1RCxPQUFPLEdBQUc7QUFFckIsZUFBZXZELFdBQVcifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "1.51.4",
3
+ "version": "1.51.5",
4
4
  "description": "Lex",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -68,6 +68,7 @@
68
68
  "test:commands": "NODE_ENV=test && npm run test:cli && npm run test:integration",
69
69
  "test:coverage": "NODE_ENV=test && npx jest --coverage --coverageDirectory=coverage --coverageReporters=text --coverageReporters=lcov --coverageReporters=html",
70
70
  "test:coverage:upload": "codecov",
71
+ "test:webpack": "node scripts/test-webpack.js",
71
72
  "type-check": "tsc --noEmit --project tsconfig.lint.json",
72
73
  "type-check:build": "tsc --noEmit --project tsconfig.build.json",
73
74
  "type-check:test": "tsc --noEmit --project tsconfig.test.json",
@@ -0,0 +1,363 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test script to verify webpack, PostCSS plugins, and static file serving
4
+ *
5
+ * Usage:
6
+ * node scripts/test-webpack.js
7
+ *
8
+ * This script:
9
+ * 1. Creates a temporary test project
10
+ * 2. Builds it with webpack
11
+ * 3. Verifies PostCSS plugins work
12
+ * 4. Checks that static files are accessible
13
+ */
14
+
15
+ import {execSync, spawn} from 'child_process';
16
+ import {existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync} from 'fs';
17
+ import {createConnection} from 'net';
18
+ import {join} from 'path';
19
+ import {tmpdir} from 'os';
20
+
21
+ const testDir = join(tmpdir(), `lex-webpack-test-${Date.now()}`);
22
+
23
+ console.log('๐Ÿงช Creating test project...');
24
+ mkdirSync(testDir, {recursive: true});
25
+ mkdirSync(join(testDir, 'src'), {recursive: true});
26
+ mkdirSync(join(testDir, 'src', 'images'), {recursive: true});
27
+ mkdirSync(join(testDir, 'src', 'static'), {recursive: true});
28
+
29
+ writeFileSync(join(testDir, 'package.json'), JSON.stringify({
30
+ name: 'test-webpack-project',
31
+ version: '1.0.0',
32
+ type: 'module'
33
+ }, null, 2));
34
+
35
+ writeFileSync(join(testDir, 'src', 'index.html'), `<!DOCTYPE html>
36
+ <html>
37
+ <head>
38
+ <title>Test App</title>
39
+ <link rel="stylesheet" href="./styles.css">
40
+ </head>
41
+ <body>
42
+ <div class="container">
43
+ <h1>Test App</h1>
44
+ <div class="test-for-loop">PostCSS @for loop test</div>
45
+ <div class="test-percentage">PostCSS percentage() test</div>
46
+ </div>
47
+ <script src="./index.js"></script>
48
+ </body>
49
+ </html>`);
50
+
51
+ writeFileSync(join(testDir, 'src', 'index.js'), `
52
+ console.log('Hello from test project');
53
+ import './styles.css';
54
+ `);
55
+
56
+ writeFileSync(join(testDir, 'src', 'styles.css'), `
57
+ /* Test PostCSS @for loop */
58
+ @for $i from 1 to 4 {
59
+ .test-for-loop:nth-child($i) {
60
+ width: calc($i * 25px);
61
+ }
62
+ }
63
+
64
+ /* Test PostCSS percentage() function */
65
+ .test-percentage {
66
+ width: percentage(1/3);
67
+ padding: percentage(0.05);
68
+ }
69
+
70
+ .container {
71
+ max-width: 1200px;
72
+ margin: 0 auto;
73
+ }
74
+ `);
75
+
76
+ writeFileSync(join(testDir, 'src', 'images', 'test.png'), 'fake-png-content');
77
+ writeFileSync(join(testDir, 'src', 'images', 'logo-icon-64.png'), 'fake-png-content');
78
+ writeFileSync(join(testDir, 'src', 'static', 'test.txt'), 'Static file content');
79
+ writeFileSync(join(testDir, 'src', 'favicon.ico'), 'fake-ico-content');
80
+ writeFileSync(join(testDir, 'src', 'manifest.json'), JSON.stringify({name: 'Test App'}, null, 2));
81
+
82
+ writeFileSync(join(testDir, 'lex.config.js'), `
83
+ export default {
84
+ entryJs: 'index.js',
85
+ entryHTML: 'index.html',
86
+ outputPath: './build',
87
+ sourcePath: './src',
88
+ webpack: {
89
+ staticPath: './src/static'
90
+ }
91
+ };
92
+ `);
93
+
94
+ console.log('๐Ÿ“ฆ Building with webpack...');
95
+ try {
96
+ const lexPath = join(process.cwd(), 'lib', 'lex.js');
97
+ try {
98
+ const result = execSync(`node "${lexPath}" build --bundler webpack --outputPath ./build --sourcePath ./src`, {
99
+ cwd: testDir,
100
+ stdio: 'pipe',
101
+ encoding: 'utf8',
102
+ env: {
103
+ ...process.env,
104
+ NODE_ENV: 'production'
105
+ }
106
+ });
107
+ console.log(result.toString());
108
+ } catch (error) {
109
+ console.error('Build error output:', error.stdout || error.stderr || error.message);
110
+ throw error;
111
+ }
112
+
113
+ console.log('โœ… Build completed successfully!\n');
114
+
115
+ const buildDir = join(testDir, 'build');
116
+
117
+ console.log('๐Ÿ” Verifying build output...');
118
+
119
+ const indexHtml = join(buildDir, 'index.html');
120
+ if (existsSync(indexHtml)) {
121
+ const htmlContent = readFileSync(indexHtml, 'utf8');
122
+ if (htmlContent.includes('Test App')) {
123
+ console.log('โœ… HTML file generated correctly');
124
+ } else {
125
+ console.log('โŒ HTML content incorrect');
126
+ }
127
+ } else {
128
+ console.log('โŒ HTML file not found');
129
+ }
130
+
131
+ const cssFiles = ['index.css'];
132
+ const jsFiles = ['index.js', 'index.*.js'];
133
+ let cssFound = false;
134
+ let cssProcessed = false;
135
+
136
+ for (const cssFile of cssFiles) {
137
+ const cssPath = join(buildDir, cssFile);
138
+ if (existsSync(cssPath)) {
139
+ cssFound = true;
140
+ const cssContent = readFileSync(cssPath, 'utf8');
141
+ console.log('โœ… CSS file generated');
142
+
143
+ if (cssContent.includes('test-for-loop')) {
144
+ const hasForLoop = /width:\s*calc\([^)]*25px\)/.test(cssContent);
145
+ if (hasForLoop) {
146
+ console.log('โœ… PostCSS @for loop processed correctly');
147
+ cssProcessed = true;
148
+ }
149
+ }
150
+
151
+ if (cssContent.includes('test-percentage')) {
152
+ const hasPercentage = /width:\s*[\d.]+%/.test(cssContent);
153
+ if (hasPercentage) {
154
+ console.log('โœ… PostCSS percentage() function processed correctly');
155
+ cssProcessed = true;
156
+ }
157
+ }
158
+ break;
159
+ }
160
+ }
161
+
162
+ if (!cssFound) {
163
+ const files = readdirSync(buildDir);
164
+ const jsFile = files.find(f => f.startsWith('index.') && f.endsWith('.js') && !f.includes('runtime') && !f.includes('vendors'));
165
+ if (jsFile) {
166
+ const jsContent = readFileSync(join(buildDir, jsFile), 'utf8');
167
+ if (jsContent.includes('calc') && jsContent.includes('25px')) {
168
+ console.log('โœ… CSS processed and inlined in JS (PostCSS @for loop detected)');
169
+ cssProcessed = true;
170
+ }
171
+ if (jsContent.includes('%') && /[\d.]+%/.test(jsContent)) {
172
+ console.log('โœ… CSS processed and inlined in JS (PostCSS percentage() detected)');
173
+ cssProcessed = true;
174
+ }
175
+ }
176
+ if (!cssProcessed) {
177
+ console.log('โš ๏ธ CSS file not found (may be inlined or named differently)');
178
+ }
179
+ }
180
+
181
+ const staticFile = join(buildDir, 'test.txt');
182
+ if (existsSync(staticFile)) {
183
+ const staticContent = readFileSync(staticFile, 'utf8');
184
+ if (staticContent === 'Static file content') {
185
+ console.log('โœ… Static file copied correctly');
186
+ } else {
187
+ console.log('โŒ Static file content incorrect');
188
+ }
189
+ } else {
190
+ console.log('โš ๏ธ Static file not found (may not be copied in this configuration)');
191
+ }
192
+
193
+ console.log('\n๐ŸŒ Testing dev server and static file access...');
194
+
195
+ const testPort = 3001;
196
+
197
+ if (!existsSync(buildDir)) {
198
+ console.log('โš ๏ธ Build directory does not exist, creating it...');
199
+ mkdirSync(buildDir, {recursive: true});
200
+ }
201
+
202
+ let devServerProcess = null;
203
+ let serverReady = false;
204
+ let serverError = null;
205
+
206
+ try {
207
+ devServerProcess = spawn('node', [lexPath, 'dev', '--port', testPort.toString(), '--quiet'], {
208
+ cwd: testDir,
209
+ stdio: 'pipe',
210
+ env: {
211
+ ...process.env,
212
+ LEX_QUIET: 'true',
213
+ NODE_ENV: 'development'
214
+ }
215
+ });
216
+
217
+ let serverOutput = '';
218
+ devServerProcess.stdout.on('data', (data) => {
219
+ const output = data.toString();
220
+ serverOutput += output;
221
+ });
222
+
223
+ devServerProcess.stderr.on('data', (data) => {
224
+ const output = data.toString();
225
+ serverOutput += output;
226
+ if (output.includes('error') || output.includes('Error') || output.includes('ERROR')) {
227
+ serverError = output;
228
+ }
229
+ });
230
+
231
+ devServerProcess.on('error', (error) => {
232
+ serverError = error.message;
233
+ });
234
+
235
+ console.log(`โณ Waiting for dev server to start on port ${testPort}...`);
236
+ console.log(' (This may take 30-60 seconds for initial compilation)');
237
+
238
+ const checkPort = (port) => {
239
+ return new Promise((resolve) => {
240
+ const socket = createConnection(port, 'localhost');
241
+ socket.on('connect', () => {
242
+ socket.destroy();
243
+ resolve(true);
244
+ });
245
+ socket.on('error', () => {
246
+ resolve(false);
247
+ });
248
+ socket.setTimeout(1000, () => {
249
+ socket.destroy();
250
+ resolve(false);
251
+ });
252
+ });
253
+ };
254
+
255
+ const waitForServer = async () => {
256
+ for (let i = 0; i < 60; i++) {
257
+ await new Promise(resolve => setTimeout(resolve, 1000));
258
+
259
+ const portOpen = await checkPort(testPort);
260
+ if (portOpen) {
261
+ await new Promise(resolve => setTimeout(resolve, 5000));
262
+ const testEndpoints = ['/test.txt', '/index.html', '/'];
263
+ for (const endpoint of testEndpoints) {
264
+ try {
265
+ const controller = new AbortController();
266
+ const timeoutId = setTimeout(() => controller.abort(), 5000);
267
+ const response = await fetch(`http://localhost:${testPort}${endpoint}`, {
268
+ signal: controller.signal
269
+ });
270
+ clearTimeout(timeoutId);
271
+ if (response.ok || response.status === 200) {
272
+ return true;
273
+ }
274
+ } catch (error) {
275
+ if (error.name !== 'AbortError') {
276
+ }
277
+ }
278
+ }
279
+ }
280
+
281
+ if (i % 10 === 9 && i > 0) {
282
+ console.log(` Still waiting... (${i + 1}/60 seconds)`);
283
+ }
284
+ }
285
+ return false;
286
+ };
287
+
288
+ serverReady = await waitForServer();
289
+
290
+ if (serverError) {
291
+ console.log(`โš ๏ธ Dev server error: ${serverError}`);
292
+ console.log('โš ๏ธ Skipping HTTP tests due to server error');
293
+ console.log('๐Ÿ’ก Note: Static files are copied to build directory and should be accessible via dev server');
294
+ } else if (!serverReady) {
295
+ console.log('โš ๏ธ Dev server did not start within 60 seconds, skipping HTTP tests');
296
+ console.log('๐Ÿ’ก Note: Static files are copied to build directory and should be accessible via dev server');
297
+ console.log('๐Ÿ’ก To test manually, run: cd <test-dir> && lex dev --port 3001');
298
+ if (serverOutput) {
299
+ const lastOutput = serverOutput.slice(-1000);
300
+ console.log('\nServer output (last 1000 chars):');
301
+ console.log(lastOutput);
302
+ } else {
303
+ console.log(' (No server output captured - server may not have started)');
304
+ }
305
+ } else {
306
+ console.log(`โœ… Dev server started on port ${testPort}`);
307
+
308
+ const testUrls = [
309
+ {url: '/test.txt', expectedContent: 'Static file content', description: 'Static file from staticPath'},
310
+ {url: '/index.html', expectedContent: 'Test App', description: 'HTML file'},
311
+ {url: '/images/test.png', expectedContent: 'fake-png-content', description: 'Image file'}
312
+ ];
313
+
314
+ for (const test of testUrls) {
315
+ try {
316
+ const response = await fetch(`http://localhost:${testPort}${test.url}`);
317
+ if (response.ok) {
318
+ const content = await response.text();
319
+ if (content.includes(test.expectedContent)) {
320
+ console.log(`โœ… ${test.description} accessible via HTTP (${test.url})`);
321
+ } else {
322
+ console.log(`โš ๏ธ ${test.description} accessible but content doesn't match (${test.url})`);
323
+ }
324
+ } else {
325
+ console.log(`โŒ ${test.description} returned status ${response.status} (${test.url})`);
326
+ }
327
+ } catch (error) {
328
+ console.log(`โŒ Failed to fetch ${test.description}: ${error.message}`);
329
+ }
330
+ }
331
+ }
332
+
333
+ } catch (error) {
334
+ console.log(`โš ๏ธ Dev server test skipped: ${error.message}`);
335
+ } finally {
336
+ if (devServerProcess) {
337
+ console.log('๐Ÿ›‘ Stopping dev server...');
338
+ devServerProcess.kill('SIGTERM');
339
+ await new Promise(resolve => setTimeout(resolve, 1000));
340
+ if (devServerProcess.killed === false) {
341
+ devServerProcess.kill('SIGKILL');
342
+ }
343
+ console.log('โœ… Dev server stopped');
344
+ }
345
+ }
346
+
347
+ console.log('\n๐ŸŽ‰ All tests passed!');
348
+ console.log(`\n๐Ÿ“ Test project location: ${testDir}`);
349
+ console.log('๐Ÿ’ก You can inspect the build output in the build/ directory');
350
+
351
+ } catch (error) {
352
+ console.error('โŒ Build failed:', error.message);
353
+ process.exit(1);
354
+ } finally {
355
+ console.log('\n๐Ÿงน Cleaning up...');
356
+ try {
357
+ rmSync(testDir, {recursive: true, force: true});
358
+ console.log('โœ… Cleanup complete');
359
+ } catch {
360
+ console.log('โš ๏ธ Could not clean up test directory:', testDir);
361
+ }
362
+ }
363
+
package/webpack.config.js CHANGED
@@ -56,7 +56,7 @@ const {
56
56
 
57
57
  const webpackStaticPath = webpackCustom?.staticPath || './src/static';
58
58
 
59
- const { publicPath: _, ...webpackConfigFiltered } = webpackCustom || {};
59
+ const { publicPath: _, staticPath: __, ...webpackConfigFiltered } = webpackCustom || {};
60
60
 
61
61
  const plugins = [
62
62
  new ProgressPlugin({
@@ -731,5 +731,24 @@ export default (webpackEnv, webpackOptions) => {
731
731
  }
732
732
  }
733
733
 
734
- return merge(webpackConfig, webpackConfigFiltered);
734
+ const mergedConfig = merge(webpackConfig, webpackConfigFiltered);
735
+
736
+ // Filter out PostCSS plugin objects from webpack plugins array
737
+ // PostCSS plugins have 'postcssPlugin' property and should only be in postcssOptions
738
+ if (Array.isArray(mergedConfig.plugins)) {
739
+ mergedConfig.plugins = mergedConfig.plugins.filter((plugin) => {
740
+ // Keep webpack plugins (have 'apply' method or are instances with constructor)
741
+ if (typeof plugin === 'function' || (plugin && typeof plugin.apply === 'function')) {
742
+ return true;
743
+ }
744
+ // Filter out PostCSS plugin objects (have 'postcssPlugin' property)
745
+ if (plugin && typeof plugin === 'object' && 'postcssPlugin' in plugin) {
746
+ return false;
747
+ }
748
+ // Keep other valid webpack plugins
749
+ return true;
750
+ });
751
+ }
752
+
753
+ return mergedConfig;
735
754
  };