import loconfig from '../../loconfig.json'; import message from '../utils/message.js'; import notification from '../utils/notification.js'; import template 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 = '' }) => { const filename = basename(outdir || outfile || 'undefined'); const timeLabel = `${filename} compiled in`; console.time(timeLabel); try { includes = includes.map((path) => template(path)); if (outdir) { outdir = template(outdir); } else if (outfile) { outfile = template(outfile); } else { throw new TypeError( 'Expected \'outdir\' or \'outfile\'' ); } await esbuild.build(Object.assign({}, esBuildOptions, { entryPoints: includes, outdir, outfile, })); message(`${filename} compiled`, 'success', timeLabel); } catch (err) { // errors managments (already done in esbuild) notification({ title: `${filename} compilation failed 🚨`, message: `${err.errors[0].text} in ${err.errors[0].location.file} line ${err.errors[0].location.line}` }); } }); };