Skip to content

Commit ff0670e

Browse files
authored
Improve build times (joomla#42325)
1 parent 8cfb7f8 commit ff0670e

File tree

13 files changed

+726
-928
lines changed

13 files changed

+726
-928
lines changed

build/build-modules-js/error-pages.es6.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ const {
44
const Ini = require('ini');
55
const { dirname } = require('path');
66
const Recurs = require('recursive-readdir');
7-
const Postcss = require('postcss');
8-
const Autoprefixer = require('autoprefixer');
9-
const CssNano = require('cssnano');
10-
const { minify } = require('terser');
7+
const { transform } = require('esbuild');
8+
const LightningCSS = require('lightningcss');
119

1210
const RootPath = process.cwd();
1311
const dir = `${RootPath}/installation/language`;
@@ -35,10 +33,13 @@ module.exports.createErrorPages = async (options) => {
3533
let cssContent = await readFile(`${srcPath}/template.css`, { encoding: 'utf8' });
3634
let jsContent = await readFile(`${srcPath}/template.js`, { encoding: 'utf8' });
3735

38-
const cssMin = await Postcss([Autoprefixer, CssNano]).process(cssContent, { from: undefined });
36+
const { code } = LightningCSS.transform({
37+
code: Buffer.from(cssContent),
38+
minify: true,
39+
});
3940

40-
cssContent = cssMin.css;
41-
jsContent = await minify(jsContent);
41+
cssContent = code;
42+
jsContent = await transform(jsContent, { minify: true });
4243

4344
const processIni = async (file) => {
4445
const languageStrings = Ini.parse(await readFile(file, { encoding: 'utf8' }));

build/build-modules-js/init/exemptions/tinymce.es6.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
const {
22
existsSync, copy, readFile, writeFile, mkdir,
33
} = require('fs-extra');
4-
const CssNano = require('cssnano');
5-
const Postcss = require('postcss');
6-
const { minify } = require('terser');
4+
const LightningCSS = require('lightningcss');
5+
const { transform } = require('esbuild');
76

87
const { join } = require('path');
98

@@ -72,10 +71,13 @@ module.exports.tinyMCE = async (packageName, version) => {
7271
/* Create the Highlighter plugin */
7372
// Get the css
7473
let cssContent = await readFile('build/media_source/plg_editors_tinymce/js/plugins/highlighter/source.css', { encoding: 'utf8' });
75-
cssContent = await Postcss([CssNano()]).process(cssContent, { from: undefined });
74+
cssContent = LightningCSS.transform({
75+
code: Buffer.from(cssContent),
76+
minify: true,
77+
}).code;
7678
// Get the JS
7779
let jsContent = await readFile('build/media_source/plg_editors_tinymce/js/plugins/highlighter/source.es6.js', { encoding: 'utf8' });
78-
jsContent = await minify(jsContent, { sourceMap: false, format: { comments: false } });
80+
jsContent = await transform(jsContent, { minify: true });
7981
// Write the HTML file
8082
const htmlContent = `<!DOCTYPE html>
8183
<html>

build/build-modules-js/init/minify-vendor.es6.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { lstat, readFile, writeFile } = require('fs-extra');
22
const { sep, basename } = require('path');
33
const recursive = require('recursive-readdir');
4-
const { minify } = require('terser');
4+
const { transform } = require('esbuild');
55

66
const RootPath = process.cwd();
77

@@ -69,7 +69,7 @@ const minifyJS = async (file) => {
6969
if (isMinified || needsDotJS) {
7070
minified = content;
7171
} else {
72-
minified = (await minify(content, { sourceMap: false, format: { comments: false } })).code;
72+
minified = (await transform(content, { minify: true })).code;
7373
}
7474

7575
const newFile = needsDotJS ? file.replace('.min.js', '.js') : file.replace('.js', '.min.js');

build/build-modules-js/javascript/build-bootstrap-js.es6.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const {
22
readdir, readFile, writeFile, unlink,
33
} = require('fs').promises;
44
const { resolve } = require('path');
5-
const { minify } = require('terser');
5+
const { transform } = require('esbuild');
66
const rimraf = require('rimraf');
77
const rollup = require('rollup');
88
const { nodeResolve } = require('@rollup/plugin-node-resolve');
@@ -17,7 +17,7 @@ const outputFolder = 'media/vendor/bootstrap/js';
1717

1818
const createMinified = async (file) => {
1919
const initial = await readFile(resolve(outputFolder, file), { encoding: 'utf8' });
20-
const mini = await minify(initial.replace('./popper.js', `./popper.min.js?${bsVersion}`).replace('./dom.js', `./dom.min.js?${bsVersion}`), { sourceMap: false, format: { comments: false } });
20+
const mini = await transform(initial.replace('./popper.js', `./popper.min.js?${bsVersion}`).replace('./dom.js', `./dom.min.js?${bsVersion}`), { minify: true });
2121
await writeFile(resolve(outputFolder, file), initial.replace('./popper.js', `./popper.js?${bsVersion}`).replace('./dom.js', `./dom.js?${bsVersion}`), { encoding: 'utf8', mode: 0o644 });
2222
await writeFile(resolve(outputFolder, file.replace('.js', '.min.js')), mini.code, { encoding: 'utf8', mode: 0o644 });
2323
};
@@ -161,7 +161,7 @@ module.exports.bootstrapJs = async () => {
161161
try {
162162
await buildLegacy(inputFolder, 'index.es6.js');
163163
const es5File = await readFile(resolve(outputFolder, 'bootstrap-es5.js'), { encoding: 'utf8' });
164-
const mini = await minify(es5File, { sourceMap: false, format: { comments: false } });
164+
const mini = await transform(es5File, { minify: true });
165165
await writeFile(resolve(outputFolder, 'bootstrap-es5.min.js'), mini.code, { encoding: 'utf8', mode: 0o644 });
166166
// eslint-disable-next-line no-console
167167
console.log('✅ Legacy done!');

build/build-modules-js/javascript/compile-to-es2017.es6.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
const { access, writeFile } = require('fs').promises;
22
const { constants } = require('fs');
3-
const Autoprefixer = require('autoprefixer');
4-
const CssNano = require('cssnano');
53
const { basename, sep, resolve } = require('path');
64
const rollup = require('rollup');
75
const { nodeResolve } = require('@rollup/plugin-node-resolve');
86
const replace = require('@rollup/plugin-replace');
97
const { babel } = require('@rollup/plugin-babel');
10-
const Postcss = require('postcss');
8+
const LightningCSS = require('lightningcss');
119
const { renderSync } = require('sass-embedded');
1210
const { minifyJsCode } = require('./minify.es6.js');
1311
const { handleESMToLegacy } = require('./compile-to-es5.es6.js');
@@ -35,8 +33,11 @@ const getWcMinifiedCss = async (file) => {
3533
}
3634

3735
if (typeof compiled === 'object' && compiled.css) {
38-
return Postcss([Autoprefixer(), CssNano()])
39-
.process(compiled.css.toString(), { from: undefined });
36+
const { code } = LightningCSS.transform({
37+
code: Buffer.from(compiled.css.toString()),
38+
minify: true,
39+
});
40+
return code;
4041
}
4142
}
4243

build/build-modules-js/javascript/minify.es6.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { minify } = require('terser');
1+
const { transform } = require('esbuild');
22
const { readFile, writeFile } = require('fs-extra');
33
const { basename } = require('path');
44
/**
@@ -9,7 +9,7 @@ const { basename } = require('path');
99
*/
1010
const minifyFile = async (file) => {
1111
const fileContent = await readFile(file, { encoding: 'utf8' });
12-
const content = await minify(fileContent, { sourceMap: false, format: { comments: false } });
12+
const content = await transform(fileContent, { minify: true });
1313
await writeFile(file.replace('.js', '.min.js'), content.code, { encoding: 'utf8', mode: 0o644 });
1414
// eslint-disable-next-line no-console
1515
console.log(`✅ Legacy js file: ${basename(file)}: minified`);
@@ -21,7 +21,7 @@ const minifyFile = async (file) => {
2121
* @param code
2222
* @returns {Promise<void>}
2323
*/
24-
const minifyCode = async (code) => minify(code, { sourceMap: false, format: { comments: false } });
24+
const minifyCode = async (code) => transform(code, { minify: true });
2525

2626
module.exports.minifyJs = minifyFile;
2727
module.exports.minifyJsCode = minifyCode;

build/build-modules-js/stylesheets/handle-css.es6.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ const {
22
copy, readFile, writeFile, ensureDir,
33
} = require('fs-extra');
44
const { dirname, sep } = require('path');
5-
const Postcss = require('postcss');
6-
const Autoprefixer = require('autoprefixer');
7-
const CssNano = require('cssnano');
5+
const LightningCSS = require('lightningcss');
86

97
module.exports.handleCssFile = async (file) => {
108
const outputFile = file.replace(`${sep}build${sep}media_source${sep}`, `${sep}media${sep}`);
@@ -18,10 +16,13 @@ module.exports.handleCssFile = async (file) => {
1816
}
1917

2018
const content = await readFile(file, { encoding: 'utf8' });
21-
const cssMin = await Postcss([Autoprefixer, CssNano]).process(content, { from: undefined });
19+
const { code } = LightningCSS.transform({
20+
code: Buffer.from(content),
21+
minify: true,
22+
});
2223

2324
// Ensure the folder exists or create it
24-
await writeFile(outputFile.replace('.css', '.min.css'), cssMin.css.toString(), { encoding: 'utf8', mode: 0o644 });
25+
await writeFile(outputFile.replace('.css', '.min.css'), code, { encoding: 'utf8', mode: 0o644 });
2526

2627
// eslint-disable-next-line no-console
2728
console.log(`✅ CSS file copied/minified: ${file}`);

build/build-modules-js/stylesheets/handle-scss.es6.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
const Autoprefixer = require('autoprefixer');
2-
const CssNano = require('cssnano');
31
const rtlcss = require('rtlcss');
42
const { writeFile } = require('fs').promises;
53
const { ensureDir } = require('fs-extra');
64
const { dirname, sep } = require('path');
7-
const Postcss = require('postcss');
5+
const LightningCSS = require('lightningcss');
86
const Sass = require('sass-embedded');
97

108
module.exports.handleScssFile = async (file) => {
@@ -21,28 +19,34 @@ module.exports.handleScssFile = async (file) => {
2119
process.exit(1);
2220
}
2321

24-
const plugins = [Autoprefixer];
25-
if (cssFile.endsWith('-rtl.css')) plugins.push(rtlcss);
22+
let contents = LightningCSS.transform({
23+
code: Buffer.from(compiled.css.toString()),
24+
minify: false,
25+
}).code;
2626

27-
// Auto prefixing
28-
const cleaner = Postcss(plugins);
29-
const res = await cleaner.process(compiled.css.toString(), { from: undefined });
27+
if (cssFile.endsWith('-rtl.css')) {
28+
contents = rtlcss.process(contents);
29+
}
3030

3131
// Ensure the folder exists or create it
3232
await ensureDir(dirname(cssFile), {});
3333
await writeFile(
3434
cssFile,
35-
res.css,
35+
contents,
3636
{ encoding: 'utf8', mode: 0o644 },
3737
);
3838

39-
const cssMin = await Postcss([CssNano]).process(res.css, { from: undefined });
39+
const cssMin = LightningCSS.transform({
40+
code: Buffer.from(contents),
41+
minify: true,
42+
exclude: LightningCSS.Features.VendorPrefixes,
43+
});
4044

4145
// Ensure the folder exists or create it
4246
await ensureDir(dirname(cssFile.replace('.css', '.min.css')), {});
4347
await writeFile(
4448
cssFile.replace('.css', '.min.css'),
45-
cssMin.css,
49+
cssMin.code,
4650
{ encoding: 'utf8', mode: 0o644 },
4751
);
4852

build/build-modules-js/stylesheets/scss-transform.es6.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
const Autoprefixer = require('autoprefixer');
2-
const CssNano = require('cssnano');
31
const Fs = require('fs').promises;
42
const FsExtra = require('fs-extra');
53
const { dirname, sep } = require('path');
6-
const Postcss = require('postcss');
4+
const LightningCSS = require('lightningcss');
75
const Sass = require('sass-embedded');
86

97
module.exports.compile = async (file) => {
@@ -20,24 +18,30 @@ module.exports.compile = async (file) => {
2018
}
2119

2220
// Auto prefixing
23-
const cleaner = Postcss([Autoprefixer()]);
24-
const res = await cleaner.process(compiled.css.toString(), { from: undefined });
21+
const { code } = LightningCSS.transform({
22+
code: Buffer.from(compiled.css.toString()),
23+
minify: false,
24+
});
2525

2626
// Ensure the folder exists or create it
2727
await FsExtra.mkdirs(dirname(cssFile), {});
2828
await Fs.writeFile(
2929
cssFile,
30-
res.css.toString(),
30+
code,
3131
{ encoding: 'utf8', mode: 0o644 },
3232
);
3333

34-
const cssMin = await Postcss([CssNano]).process(res.css.toString(), { from: undefined });
34+
const cssMin = LightningCSS.transform({
35+
code: Buffer.from(code),
36+
minify: true,
37+
exclude: LightningCSS.Features.VendorPrefixes,
38+
});
3539

3640
// Ensure the folder exists or create it
3741
FsExtra.mkdirs(dirname(cssFile.replace('.css', '.min.css')), {});
3842
await Fs.writeFile(
3943
cssFile.replace('.css', '.min.css'),
40-
cssMin.css.toString(),
44+
cssMin.code,
4145
{ encoding: 'utf8', mode: 0o644 },
4246
);
4347

build/media_source/com_media/scss/components/_layout.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
padding-left: $col-gutter-width * .5;
3232
}
3333

34-
@media (min-width: var(--breakpoint-md)) {
34+
@media (min-width: 768px) {
3535
[class^="media-col"], [class*=" media-col"] {
3636
flex: 0 0 100%;
3737
max-width: 100%;

0 commit comments

Comments
 (0)