Files
pgbackweb/scripts/build-js.mjs
2024-10-14 01:37:29 -06:00

108 lines
2.8 KiB
JavaScript

#!/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()