@@ -1,4 +1,5 @@
let path = require("path");
let fs = require("fs");
let glob = require("fast-glob");
let esbuild = require("esbuild");
let html_plugin = require("./esbuild-plugin-html");
@@ -6,9 +7,27 @@ let vue = require("esbuild-vue");
let postCssPlugin = require("esbuild-plugin-postcss2").default;
let ignore_assets = require("./ignore-assets");
let sass_options = require("./sass_options");
let { app_list, get_public_path, run_serially } = require("./utils");
let {
app_list,
get_app_path,
get_public_path,
run_serially,
bench_path,
get_cli_arg
} = require("./utils");
const TOTAL_BUILD_TIME = "Total Build Time";
const WATCH_MODE = get_cli_arg("watch");
const NODE_PATHS = [].concat(
// node_modules of apps directly importable
app_list
.map(app => path.resolve(get_app_path(app), "../node_modules"))
.filter(fs.existsSync),
// import js file of any app if you provide the full path
app_list
.map(app => path.resolve(get_app_path(app), ".."))
.filter(fs.existsSync)
);
(async function() {
console.time(TOTAL_BUILD_TIME);
@@ -29,14 +48,36 @@ function run_build_for_app(app) {
);
let ignore_patterns = [
path.resolve(public_path, "node_modules"),
path.resolve(public_path, "build ")
path.resolve(public_path, "dist ")
];
return glob(include_patterns, { ignore: ignore_patterns }).then(files => {
// console.log(`\nBuilding assets for ${app}...`);
let dist_path = path.resolve(public_path, "dist");
let file_map = {};
for (let file of files) {
let extension = path.extname(file);
let output_name = path.basename(file, extension);
if (
[".css", ".scss", ".less", ".sass", ".styl"].includes(extension)
) {
output_name = path.join("css", output_name);
} else if ([".js", ".ts"].includes(extension)) {
output_name = path.join("js", output_name);
}
if (Object.keys(file_map).includes(output_name)) {
console.warn(
`Duplicate output file ${output_name} generated from ${file}`
);
}
file_map[output_name] = file;
}
return build_files({
files,
outdir: path.resolve(public_path, "build"),
files: file_map ,
outdir: dist_path ,
outbase: public_path
});
});
@@ -51,7 +92,8 @@ function build_files({ files, outdir, outbase }) {
sourcemap: true,
bundle: true,
metafile: true,
minify: true,
// minify: true,
nodePaths: NODE_PATHS,
define: {
"process.env.NODE_ENV": "'development'"
},
@@ -63,17 +105,20 @@ function build_files({ files, outdir, outbase }) {
plugins: [require("autoprefixer")],
sassOptions: sass_options
})
]
],
// watch: {
// onRebuild(error, result) {
// if (error) console.error("watch build failed:", error);
// else {
// console.log("watch build succeeded:");
// log_build_meta(result.metafile);
// }
// }
// }
watch: WATCH_MODE
? {
onRebuild(error, result) {
if (error)
console.error("watch build failed:", error);
else {
console.log("\n\nwatch build succeeded:");
log_build_meta(result.metafile);
}
}
}
: null
})
.then(result => {
log_build_meta(result.metafile);
@@ -87,6 +132,8 @@ function log_build_meta(metafile) {
for (let outfile in metafile.outputs) {
if (outfile.endsWith(".map")) continue;
let data = metafile.outputs[outfile];
outfile = path.resolve(outfile);
outfile = path.relative(path.resolve(bench_path, "apps"), outfile);
console.log(outfile, data.bytes / 1000 + " Kb");
}
}