If a 'loconfig.local.json' file is present (ignored by git), its settings will be merged with those in 'loconfig.json'. Useful for customizing localhost development (see example below).
Added:
- Utility 'config.js' to prepare build settings.
- Function 'merge()' for recursively merging objects and concatenating arrays.
Example:
```json
{
"paths": {
"url": "yourlocal.dev"
},
"server": {
"open": true,
"https": {
"key": "~/.config/valet/Certificates/{% paths.url %}.key",
"cert": "~/.config/valet/Certificates/{% paths.url %}.crt"
}
}
}
```
98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
import loconfig from '../utils/config.js';
|
|
import message from '../utils/message.js';
|
|
import notification from '../utils/notification.js';
|
|
import resolve from '../utils/template.js';
|
|
import esbuild from 'esbuild';
|
|
import { basename } from 'node:path';
|
|
|
|
/**
|
|
* @const {object} defaultESBuildOptions - The default shared ESBuild options.
|
|
* @const {object} developmentESBuildOptions - The predefined ESBuild options for development.
|
|
* @const {object} productionESBuildOptions - The predefined ESBuild options for production.
|
|
*/
|
|
export const defaultESBuildOptions = {
|
|
bundle: true,
|
|
color: true,
|
|
sourcemap: true,
|
|
target: [
|
|
'es2015',
|
|
],
|
|
};
|
|
export const developmentESBuildOptions = Object.assign({}, defaultESBuildOptions);
|
|
export const productionESBuildOptions = Object.assign({}, defaultESBuildOptions, {
|
|
logLevel: 'warning',
|
|
minify: true,
|
|
});
|
|
|
|
/**
|
|
* @const {object} developmentScriptsArgs - The predefined `compileScripts()` options for development.
|
|
* @const {object} productionScriptsArgs - The predefined `compileScripts()` options for production.
|
|
*/
|
|
export const developmentScriptsArgs = [
|
|
developmentESBuildOptions,
|
|
];
|
|
export const productionScriptsArgs = [
|
|
productionESBuildOptions,
|
|
];
|
|
|
|
/**
|
|
* Bundles and minifies main JavaScript files.
|
|
*
|
|
* @async
|
|
* @param {object} [esBuildOptions=null] - Customize the ESBuild build API options.
|
|
* If `null`, default production options are used.
|
|
* @return {Promise}
|
|
*/
|
|
export default async function compileScripts(esBuildOptions = null) {
|
|
if (esBuildOptions == null) {
|
|
esBuildOptions = productionESBuildOptions;
|
|
} else if (
|
|
esBuildOptions !== developmentESBuildOptions &&
|
|
esBuildOptions !== productionESBuildOptions
|
|
) {
|
|
esBuildOptions = Object.assign({}, defaultESBuildOptions, esBuildOptions);
|
|
}
|
|
|
|
loconfig.tasks.scripts.forEach(async ({
|
|
includes,
|
|
outdir = '',
|
|
outfile = '',
|
|
label = null
|
|
}) => {
|
|
if (!label) {
|
|
label = basename(outdir || outfile || 'undefined');
|
|
}
|
|
|
|
const timeLabel = `${label} compiled in`;
|
|
console.time(timeLabel);
|
|
|
|
try {
|
|
includes = resolve(includes);
|
|
|
|
if (outdir) {
|
|
outdir = resolve(outdir);
|
|
} else if (outfile) {
|
|
outfile = resolve(outfile);
|
|
} else {
|
|
throw new TypeError(
|
|
'Expected \'outdir\' or \'outfile\''
|
|
);
|
|
}
|
|
|
|
await esbuild.build(Object.assign({}, esBuildOptions, {
|
|
entryPoints: includes,
|
|
outdir,
|
|
outfile,
|
|
}));
|
|
|
|
message(`${label} compiled`, 'success', timeLabel);
|
|
} catch (err) {
|
|
// errors managments (already done in esbuild)
|
|
notification({
|
|
title: `${label} compilation failed 🚨`,
|
|
message: `${err.errors[0].text} in ${err.errors[0].location.file} line ${err.errors[0].location.line}`
|
|
});
|
|
}
|
|
});
|
|
};
|