@nlabs/lex 1.51.4 โ 1.51.6
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 +29 -5
|
@@ -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.6",
|
|
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({
|
|
@@ -155,26 +155,31 @@ const fontPath = `${sourceFullPath}/fonts/`;
|
|
|
155
155
|
const docPath = `${sourceFullPath}/docs/`;
|
|
156
156
|
|
|
157
157
|
const staticPathFull = pathResolve(process.cwd(), webpackStaticPath);
|
|
158
|
+
|
|
158
159
|
if(existsSync(staticPathFull)) {
|
|
159
160
|
staticPaths.push({
|
|
160
161
|
from: staticPathFull,
|
|
162
|
+
globOptions: {
|
|
163
|
+
ignore: ['**/.DS_Store']
|
|
164
|
+
},
|
|
165
|
+
noErrorOnMissing: true,
|
|
161
166
|
to: './'
|
|
162
167
|
});
|
|
163
168
|
watchIgnorePaths.push(staticPathFull);
|
|
164
169
|
}
|
|
165
170
|
|
|
166
171
|
if(existsSync(imagePath)) {
|
|
167
|
-
staticPaths.push({from: imagePath, to: './images/'});
|
|
172
|
+
staticPaths.push({from: imagePath, noErrorOnMissing: true, to: './images/'});
|
|
168
173
|
watchIgnorePaths.push(imagePath);
|
|
169
174
|
}
|
|
170
175
|
|
|
171
176
|
if(existsSync(fontPath)) {
|
|
172
|
-
staticPaths.push({from: fontPath, to: './fonts/'});
|
|
177
|
+
staticPaths.push({from: fontPath, noErrorOnMissing: true, to: './fonts/'});
|
|
173
178
|
watchIgnorePaths.push(fontPath);
|
|
174
179
|
}
|
|
175
180
|
|
|
176
181
|
if(existsSync(docPath)) {
|
|
177
|
-
staticPaths.push({from: docPath, to: './docs/'});
|
|
182
|
+
staticPaths.push({from: docPath, noErrorOnMissing: true, to: './docs/'});
|
|
178
183
|
}
|
|
179
184
|
|
|
180
185
|
if(staticPaths.length) {
|
|
@@ -731,5 +736,24 @@ export default (webpackEnv, webpackOptions) => {
|
|
|
731
736
|
}
|
|
732
737
|
}
|
|
733
738
|
|
|
734
|
-
|
|
739
|
+
const mergedConfig = merge(webpackConfig, webpackConfigFiltered);
|
|
740
|
+
|
|
741
|
+
// Filter out PostCSS plugin objects from webpack plugins array
|
|
742
|
+
// PostCSS plugins have 'postcssPlugin' property and should only be in postcssOptions
|
|
743
|
+
if (Array.isArray(mergedConfig.plugins)) {
|
|
744
|
+
mergedConfig.plugins = mergedConfig.plugins.filter((plugin) => {
|
|
745
|
+
// Keep webpack plugins (have 'apply' method or are instances with constructor)
|
|
746
|
+
if (typeof plugin === 'function' || (plugin && typeof plugin.apply === 'function')) {
|
|
747
|
+
return true;
|
|
748
|
+
}
|
|
749
|
+
// Filter out PostCSS plugin objects (have 'postcssPlugin' property)
|
|
750
|
+
if (plugin && typeof plugin === 'object' && 'postcssPlugin' in plugin) {
|
|
751
|
+
return false;
|
|
752
|
+
}
|
|
753
|
+
// Keep other valid webpack plugins
|
|
754
|
+
return true;
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
return mergedConfig;
|
|
735
759
|
};
|