@@ -3,6 +3,7 @@ let fs = require("fs"); | |||||
let glob = require("fast-glob"); | let glob = require("fast-glob"); | ||||
let esbuild = require("esbuild"); | let esbuild = require("esbuild"); | ||||
let vue = require("esbuild-vue"); | let vue = require("esbuild-vue"); | ||||
let yargs = require("yargs"); | |||||
let cliui = require("cliui")(); | let cliui = require("cliui")(); | ||||
let chalk = require("chalk"); | let chalk = require("chalk"); | ||||
let html_plugin = require("./frappe-html"); | let html_plugin = require("./frappe-html"); | ||||
@@ -16,11 +17,35 @@ let { | |||||
sites_path, | sites_path, | ||||
get_app_path, | get_app_path, | ||||
get_public_path, | get_public_path, | ||||
get_cli_arg | |||||
log, | |||||
log_warn, | |||||
log_error, | |||||
} = require("./utils"); | } = 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 TOTAL_BUILD_TIME = `${chalk.black.bgGreen(" DONE ")} Total Build Time`; | ||||
const WATCH_MODE = get_cli_arg("watch"); | |||||
const NODE_PATHS = [].concat( | const NODE_PATHS = [].concat( | ||||
// node_modules of apps directly importable | // node_modules of apps directly importable | ||||
app_list | app_list | ||||
@@ -32,35 +57,30 @@ const NODE_PATHS = [].concat( | |||||
.filter(fs.existsSync) | .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); | console.time(TOTAL_BUILD_TIME); | ||||
await clean_dist_folders(apps); | |||||
await clean_dist_folders(APPS); | |||||
let result; | let result; | ||||
try { | try { | ||||
result = await build_assets_for_apps(apps); | |||||
result = await build_assets_for_apps(APPS); | |||||
} catch (e) { | } 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) { | if (!WATCH_MODE) { | ||||
log_built_assets(result.metafile); | log_built_assets(result.metafile); | ||||
console.timeEnd(TOTAL_BUILD_TIME); | console.timeEnd(TOTAL_BUILD_TIME); | ||||
console.log(); | |||||
await write_meta_file(result.metafile); | |||||
log(); | |||||
} else { | } else { | ||||
console.log("Watching for changes..."); | |||||
log("Watching for changes..."); | |||||
} | } | ||||
})(); | |||||
await write_meta_file(result.metafile); | |||||
} | |||||
function build_assets_for_apps(apps) { | function build_assets_for_apps(apps) { | ||||
let { include_patterns, ignore_patterns } = get_files_to_build(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); | output_name = path.join(app, "dist", output_name); | ||||
if (Object.keys(file_map).includes(output_name)) { | if (Object.keys(file_map).includes(output_name)) { | ||||
console.warn( | |||||
log_warn( | |||||
`Duplicate output file ${output_name} generated from ${file}` | `Duplicate output file ${output_name} generated from ${file}` | ||||
); | ); | ||||
} | } | ||||
@@ -133,10 +153,12 @@ function build_files({ files, outdir }) { | |||||
sourcemap: true, | sourcemap: true, | ||||
bundle: true, | bundle: true, | ||||
metafile: true, | metafile: true, | ||||
// minify: true, | |||||
minify: PRODUCTION, | |||||
nodePaths: NODE_PATHS, | nodePaths: NODE_PATHS, | ||||
define: { | define: { | ||||
"process.env.NODE_ENV": "'development'" | |||||
"process.env.NODE_ENV": JSON.stringify( | |||||
PRODUCTION ? "production" : "development" | |||||
) | |||||
}, | }, | ||||
plugins: [ | plugins: [ | ||||
html_plugin, | html_plugin, | ||||
@@ -1,5 +1,6 @@ | |||||
const path = require("path"); | const path = require("path"); | ||||
const fs = require("fs"); | const fs = require("fs"); | ||||
const chalk = require("chalk"); | |||||
const frappe_path = path.resolve(__dirname, ".."); | const frappe_path = path.resolve(__dirname, ".."); | ||||
const bench_path = path.resolve(frappe_path, "..", ".."); | const bench_path = path.resolve(frappe_path, "..", ".."); | ||||
@@ -95,6 +96,20 @@ function get_cli_arg(name) { | |||||
return value; | 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 = { | module.exports = { | ||||
app_list, | app_list, | ||||
bench_path, | bench_path, | ||||
@@ -108,5 +123,8 @@ module.exports = { | |||||
get_app_path, | get_app_path, | ||||
delete_file, | delete_file, | ||||
run_serially, | run_serially, | ||||
get_cli_arg | |||||
get_cli_arg, | |||||
log, | |||||
log_warn, | |||||
log_error | |||||
}; | }; |
@@ -74,7 +74,8 @@ | |||||
"rollup-plugin-postcss": "^2.0.3", | "rollup-plugin-postcss": "^2.0.3", | ||||
"rollup-plugin-terser": "^4.0.4", | "rollup-plugin-terser": "^4.0.4", | ||||
"rollup-plugin-vue": "4.2.0", | "rollup-plugin-vue": "4.2.0", | ||||
"svg-sprite": "^1.5.0" | |||||
"svg-sprite": "^1.5.0", | |||||
"yargs": "^16.2.0" | |||||
}, | }, | ||||
"snyk": true | "snyk": true | ||||
} | } |
@@ -1391,7 +1391,7 @@ chalk@^1.1.1, chalk@^1.1.3: | |||||
strip-ansi "^3.0.0" | strip-ansi "^3.0.0" | ||||
supports-color "^2.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" | version "2.4.2" | ||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" | ||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== | ||||
@@ -1531,7 +1531,7 @@ cliui@^5.0.0: | |||||
strip-ansi "^5.2.0" | strip-ansi "^5.2.0" | ||||
wrap-ansi "^5.1.0" | wrap-ansi "^5.1.0" | ||||
cliui@^7.0.4: | |||||
cliui@^7.0.2, cliui@^7.0.4: | |||||
version "7.0.4" | version "7.0.4" | ||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" | ||||
integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== | 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" | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" | ||||
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== | 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" | version "2.0.5" | ||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" | ||||
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== | 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" | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" | ||||
integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== | 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: | yallist@^2.1.2: | ||||
version "2.1.2" | version "2.1.2" | ||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" | 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" | camelcase "^5.0.0" | ||||
decamelize "^1.2.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: | yargs@^12.0.2: | ||||
version "12.0.5" | version "12.0.5" | ||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" | ||||
@@ -9590,6 +9600,19 @@ yargs@^14.2: | |||||
y18n "^4.0.0" | y18n "^4.0.0" | ||||
yargs-parser "^15.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: | yargs@~3.10.0: | ||||
version "3.10.0" | version "3.10.0" | ||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" | ||||