@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.
- package/lib/utils/postcss/postcss-for.js +12 -4
- package/package.json +2 -1
- package/scripts/test-webpack.js +363 -0
- package/webpack.config.js +21 -2
|
@@ -69,7 +69,7 @@ const postcssFor = (opts = {})=>{
|
|
|
69
69
|
};
|
|
70
70
|
};
|
|
71
71
|
const checkParams = (rule, params)=>{
|
|
72
|
-
if (!params[0]?.
|
|
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
|
-
})
|
|
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+IHtcbiAgICAgIGlmIChydWxlLm5hbWUgPT09ICdmb3InKSB7XG4gICAgICAgIGlmIChydWxlLnBhcmVudCkge1xuICAgICAgICAgIG1hbmFnZUl0ZXJTdGFjayhydWxlKTtcbiAgICAgICAgfVxuICAgICAgICB1bnJvbGxMb29wKHJ1bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9zdGNzc1BsdWdpbjogJ3Bvc3Rjc3MtZm9yJyxcbiAgICBPbmNlKHJvb3QpIHtcbiAgICAgIHByb2Nlc3NPcmlnaW5hbExvb3BzKHJvb3QpO1xuICAgIH1cbiAgfTtcbn07XG5cbnBvc3Rjc3NGb3IucG9zdGNzcyA9IHRydWU7XG5cbmV4cG9ydCBkZWZhdWx0IHBvc3Rjc3NGb3I7XG5cbiJdLCJuYW1lcyI6WyJwb3N0Y3NzU2ltcGxlVmFycyIsInBvc3Rjc3NGb3IiLCJvcHRzIiwib3B0aW9ucyIsIm5lc3RlZCIsIml0ZXJTdGFjayIsInBhcmVudHNIYXZlSXRlcmF0b3IiLCJydWxlIiwicGFyYW0iLCJwYXJlbnQiLCJ0eXBlIiwicGFyYW1zIiwicGFyZW50SXRlclZhciIsInNwbGl0IiwiaW5kZXhPZiIsIm1hbmFnZUl0ZXJTdGFjayIsInNwbGljZSIsImxlbmd0aCIsInBhcmVudEluZGV4IiwiY3VycmVudEl0ZXJWYXIiLCJwdXNoIiwiY2hlY2tOdW1iZXIiLCJpc05hTiIsInBhcnNlSW50IiwibWF0Y2giLCJlcnJvciIsInBsdWdpbiIsImNoZWNrUGFyYW1zIiwic3RhcnRzV2l0aCIsImZvckVhY2giLCJ1bnJvbGxMb29wIiwiaXRlcmF0b3IiLCJzbGljZSIsImluZGV4IiwidG9wIiwiZGlyIiwiYnkiLCJ2YWx1ZSIsImkiLCJjb250ZW50IiwiY2xvbmUiLCJzaW1wbGVWYXJzUGx1Z2luIiwib25seSIsInByZXBhcmUiLCJwcmVwYXJlZCIsIk9uY2UiLCJwcm9jZXNzTG9vcHMiLCJpbnNlcnRCZWZvcmUiLCJub2RlcyIsInJlbW92ZSIsImNzcyIsIndhbGtBdFJ1bGVzIiwibmFtZSIsInByb2Nlc3NPcmlnaW5hbExvb3Bz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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlabs/lex",
|
|
3
|
-
"version": "1.51.
|
|
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
|
-
|
|
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
|
};
|