fix: more features
- basic watch mode - Node paths include all app node_modules and app folders - rename output directory to "dist" - output files in flat directories: dist/js and dist/css
This commit is contained in:
parent
18763076f4
commit
0076e99ae1
3 changed files with 83 additions and 17 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -9,7 +9,7 @@ locale
|
|||
dist/
|
||||
# build/
|
||||
frappe/docs/current
|
||||
frappe/public/build
|
||||
frappe/public/dist
|
||||
.vscode
|
||||
node_modules
|
||||
.kdev4/
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,24 @@ function get_apps_list() {
|
|||
.filter(Boolean);
|
||||
}
|
||||
|
||||
function get_cli_arg(name) {
|
||||
let args = process.argv.slice(2);
|
||||
|
||||
for (let i in args) {
|
||||
let arg = args[i];
|
||||
let value = null;
|
||||
if (arg == `--${name}`) {
|
||||
value = true;
|
||||
}
|
||||
if (args[i + 1]) {
|
||||
value = args[i + 1];
|
||||
}
|
||||
if (value) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
app_list,
|
||||
bench_path,
|
||||
|
|
@ -106,5 +124,6 @@ module.exports = {
|
|||
get_app_path,
|
||||
delete_file,
|
||||
run_serially,
|
||||
get_options_for_scss
|
||||
get_options_for_scss,
|
||||
get_cli_arg
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue