From 86c0f7f9d6dc4ee116a950a57788a390cd0b1dfc Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sat, 1 May 2021 15:50:03 +0530 Subject: [PATCH] fix: Use yargs for cli argument parsing --- esbuild/index.js | 64 ++++++++++++++++++++++++++++++++---------------- esbuild/utils.js | 20 ++++++++++++++- package.json | 3 ++- yarn.lock | 29 +++++++++++++++++++--- 4 files changed, 90 insertions(+), 26 deletions(-) diff --git a/esbuild/index.js b/esbuild/index.js index 4c096b70c1..ba0df5a00c 100644 --- a/esbuild/index.js +++ b/esbuild/index.js @@ -3,6 +3,7 @@ let fs = require("fs"); let glob = require("fast-glob"); let esbuild = require("esbuild"); let vue = require("esbuild-vue"); +let yargs = require("yargs"); let cliui = require("cliui")(); let chalk = require("chalk"); let html_plugin = require("./frappe-html"); @@ -16,11 +17,35 @@ let { sites_path, get_app_path, get_public_path, - get_cli_arg + log, + log_warn, + log_error, } = require("./utils"); +let argv = yargs + .usage("Usage: node esbuild [options]") + .option("apps", { + type: "string", + description: "Run build for specific apps" + }) + .option("watch", { + type: "boolean", + description: "Run in watch mode and rebuild on file changes" + }) + .option("production", { + type: "boolean", + description: "Run build in production mode" + }) + .example( + "node esbuild --apps frappe,erpnext", + "Run build only for frappe and erpnext" + ) + .version(false).argv; + +const APPS = !argv.apps ? app_list : argv.apps.split(","); +const WATCH_MODE = Boolean(argv.watch); +const PRODUCTION = Boolean(argv.production); const TOTAL_BUILD_TIME = `${chalk.black.bgGreen(" DONE ")} Total Build Time`; -const WATCH_MODE = get_cli_arg("watch"); const NODE_PATHS = [].concat( // node_modules of apps directly importable app_list @@ -32,35 +57,30 @@ const NODE_PATHS = [].concat( .filter(fs.existsSync) ); -(async function() { - let apps = app_list; - let apps_arg = get_cli_arg("apps"); - if (apps_arg) { - apps = apps_arg.split(","); - } +execute(); +async function execute() { console.time(TOTAL_BUILD_TIME); - await clean_dist_folders(apps); + await clean_dist_folders(APPS); let result; try { - result = await build_assets_for_apps(apps); + result = await build_assets_for_apps(APPS); } catch (e) { - let error = chalk.white.bgRed(" ERROR "); - console.error(`${error} There were some problems during build`); - console.log(); - console.log(chalk.dim(e.stack)); + log_error("There were some problems during build"); + log(); + log(chalk.dim(e.stack)); } if (!WATCH_MODE) { log_built_assets(result.metafile); console.timeEnd(TOTAL_BUILD_TIME); - console.log(); - await write_meta_file(result.metafile); + log(); } else { - console.log("Watching for changes..."); + log("Watching for changes..."); } -})(); + await write_meta_file(result.metafile); +} function build_assets_for_apps(apps) { let { include_patterns, ignore_patterns } = get_files_to_build(apps); @@ -85,7 +105,7 @@ function build_assets_for_apps(apps) { output_name = path.join(app, "dist", output_name); if (Object.keys(file_map).includes(output_name)) { - console.warn( + log_warn( `Duplicate output file ${output_name} generated from ${file}` ); } @@ -133,10 +153,12 @@ function build_files({ files, outdir }) { sourcemap: true, bundle: true, metafile: true, - // minify: true, + minify: PRODUCTION, nodePaths: NODE_PATHS, define: { - "process.env.NODE_ENV": "'development'" + "process.env.NODE_ENV": JSON.stringify( + PRODUCTION ? "production" : "development" + ) }, plugins: [ html_plugin, diff --git a/esbuild/utils.js b/esbuild/utils.js index 3261f88c9a..c6418a4cdb 100644 --- a/esbuild/utils.js +++ b/esbuild/utils.js @@ -1,5 +1,6 @@ const path = require("path"); const fs = require("fs"); +const chalk = require("chalk"); const frappe_path = path.resolve(__dirname, ".."); const bench_path = path.resolve(frappe_path, "..", ".."); @@ -95,6 +96,20 @@ function get_cli_arg(name) { return value; } +function log_error(message, badge = "ERROR") { + badge = chalk.white.bgRed(` ${badge} `); + console.error(`${badge} ${message}`); +} + +function log_warn(message, badge = "WARN") { + badge = chalk.black.bgYellowBright(` ${badge} `); + console.warn(`${badge} ${message}`); +} + +function log(...args) { + console.log(...args); +} + module.exports = { app_list, bench_path, @@ -108,5 +123,8 @@ module.exports = { get_app_path, delete_file, run_serially, - get_cli_arg + get_cli_arg, + log, + log_warn, + log_error }; diff --git a/package.json b/package.json index d813c35f38..9b344e0afd 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,8 @@ "rollup-plugin-postcss": "^2.0.3", "rollup-plugin-terser": "^4.0.4", "rollup-plugin-vue": "4.2.0", - "svg-sprite": "^1.5.0" + "svg-sprite": "^1.5.0", + "yargs": "^16.2.0" }, "snyk": true } diff --git a/yarn.lock b/yarn.lock index 8ea5291bd4..6be658aa71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1391,7 +1391,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1531,7 +1531,7 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" -cliui@^7.0.4: +cliui@^7.0.2, cliui@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== @@ -3198,7 +3198,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -9495,6 +9495,11 @@ xtend@~4.0.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -9539,6 +9544,11 @@ yargs-parser@^15.0.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -9590,6 +9600,19 @@ yargs@^14.2: y18n "^4.0.0" yargs-parser "^15.0.0" +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"