UNPKG

@node-elion/builder

Version:

Super scalable enterprise Node.js server library

153 lines (147 loc) 4.54 kB
#!/usr/bin/env node const path = require("path"); const { merge } = require("lodash"); const build = require("./utils/buildLog.util"); const safeObjectRequire = (configPath) => { if (!configPath) return {}; // eslint-disable-next-line global-require,import/no-dynamic-require const pathSource = require(require.resolve(configPath)); if (typeof pathSource !== "object") throw new Error("passed plugins-config-file file should be an object"); return pathSource; }; function parsePluginsConfig(baseObject, inlineConfig) { const makeNestedObject = (leftArray) => leftArray.length === 1 ? { [leftArray[0].split("=")[0]]: leftArray[0] .split("=") .slice(1) .join("="), } : { [leftArray[0]]: makeNestedObject(leftArray.slice(1)), }; return inlineConfig.reduce( (acc, item) => merge(acc, makeNestedObject(item.split("."))), baseObject, ); } const baseBuildParams = { entry: { alias: "e", description: "Entry point", default: "src/index.js", type: "string", }, "assets-folder": { alias: "a", description: "Assets folder", default: null, type: "string", }, plugin: { alias: "p", description: "Builder plugins", default: [], type: "array", }, "plugin-config": { alias: "l", desc: "Builder plugin options", default: [], type: "array", }, "plugins-config-file": { alias: "c", desc: "Builder plugins config file", default: "", type: "string", }, }; // noinspection BadExpressionStatementJS require("yargs")( ![...process.argv].slice(2).length ? ["--help"] : process.argv.slice(2), ) .scriptName("elion-builder") .version("default") .usage("$0 <cmd> [args]") .command( "start", "Start Development Server", { debug: { alias: "d", description: "pass Inspect argument (--inspect) to started process", default: false, type: "boolean", }, argument: { alias: "g", description: "pass argument to started process (max_old_space_size=4096)", default: [], type: "array", }, "build-folder": { alias: "b", description: 'Folder where built files will be placed (you can pass "tmp" folder for this)', default: ".devbuild", type: "string", }, ...baseBuildParams, }, async (args) => build({ buildFolder: args.b, buildType: "development", entry: path.resolve(process.cwd(), args.entry), assetsFolder: args.a, debug: args.debug, startArguments: args.g || [], watch: true, webpackStats: false, plugins: args.plugin, pluginsConfig: parsePluginsConfig( safeObjectRequire(args.c), args.l, ), }), ) .command( "build", "Build Project Components", { "build-folder": { alias: "b", description: "Folder where built files will be placed", default: "build", type: "string", }, "keep-classnames": { description: "Keep classnames in production build", default: false, type: "boolean", }, ...baseBuildParams, }, async (args) => build({ buildFolder: args.b, buildType: "production", entry: path.resolve(process.cwd(), args.entry), assetsFolder: args.a, debug: false, watch: false, webpackStats: true, plugins: args.plugin, pluginsConfig: parsePluginsConfig( safeObjectRequire(args.c), args.l, ), keepClassNames: args["keep-classnames"], }), ) .help().argv;