diff --git a/.gitignore b/.gitignore index 08d9876242..1ff3122d70 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ locale dist/ # build/ frappe/docs/current -frappe/public/build +frappe/public/dist .vscode node_modules .kdev4/ diff --git a/esbuild/index.js b/esbuild/index.js index 742f3ca2cc..56e44130b2 100644 --- a/esbuild/index.js +++ b/esbuild/index.js @@ -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"); } } diff --git a/esbuild/utils.js b/esbuild/utils.js index 6cecebcf59..90807ab127 100644 --- a/esbuild/utils.js +++ b/esbuild/utils.js @@ -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 };