#!/usr/bin/env node /** * This script is responsible for creating the final build of all the project's * JavaScript. * * 1. Creates a prebuild of internal/view/static/js/app.js * 2. Creates a prebuild of all *.inc.js files in internal/view/web * 3. Combines the two prebuilds into a final build, minifies it, and stores * it in internal/view/static/build/app.min.js * * This script generates temporal files in the tmp directory. */ import path from 'path' import fse from 'fs-extra' import * as esbuild from 'esbuild' import { fileURLToPath } from 'url' import { glob } from 'glob' // Obtains the project's root directory const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const rootDir = path.join(__dirname, '..') async function prebuildApp () { const entryFile = path.join(rootDir, './internal/view/static/js/app.js') const outFile = path.join(rootDir, './tmp/prebuild-app.js') try { await esbuild.build({ entryPoints: [entryFile], bundle: true, minify: false, outfile: outFile, format: 'iife' }) } catch (error) { console.error('Error prebuilding app.js:', error) } } async function prebuildIncludedFiles () { const alpineGlob = path.join(rootDir, './internal/view/web/**/*.inc.js') const tempFile = path.join(rootDir, './tmp/prebuild-incs.js') try { const alpineFiles = await glob(alpineGlob) let outFileContent = `// This file is auto-generated by ${__filename}. DO NOT EDIT.\n\n` for (const file of alpineFiles) { const content = await fse.readFile(file, 'utf-8') outFileContent += content + '\n' } await fse.outputFile(tempFile, outFileContent) } catch (error) { console.error('Error prebuilding *.inc.js files:', error) } } async function mergePrebuilds () { const prebuilds = [ path.join(rootDir, './tmp/prebuild-app.js'), path.join(rootDir, './tmp/prebuild-incs.js') ] const outFile = path.join(rootDir, './tmp/prebuild.js') try { let outFileContent = '' for (const file of prebuilds) { const content = await fse.readFile(file, 'utf-8') outFileContent += content + '\n\n' } await fse.outputFile(outFile, outFileContent) } catch (error) { console.error('Error combining prebuilds:', error) } } async function build () { const entryFile = path.join(rootDir, './tmp/prebuild.js') const outFile = path.join(rootDir, './internal/view/static/build/app.min.js') try { await esbuild.build({ entryPoints: [entryFile], bundle: true, minify: true, outfile: outFile, format: 'iife' }) console.log('JavaScript builded successfully') } catch (error) { console.error('Error creating JavaScript build:', error) } } await prebuildApp() await prebuildIncludedFiles() await mergePrebuilds() await build()