fec-builder
Version:
通用的前端构建工具,屏蔽业务无关的细节配置,开箱即用
158 lines (157 loc) • 5.22 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const immer_1 = require("immer");
const yargs_1 = __importDefault(require("yargs"));
const paths_1 = require("./utils/paths");
const build_env_1 = require("./utils/build-env");
const logger_1 = __importDefault(require("./utils/logger"));
const prepare_1 = __importDefault(require("./prepare"));
const clean_1 = __importDefault(require("./clean"));
const generate_1 = __importDefault(require("./generate"));
const upload_1 = __importDefault(require("./upload"));
const serve_1 = __importDefault(require("./serve"));
const build_conf_1 = require("./utils/build-conf");
const test_1 = __importDefault(require("./test"));
// 禁掉 auto freeze,否则有的插件改数据时会异常,
// 比如 postcss-loader 会去 delete options 上的 plugins 字段;
// 详情见 https://immerjs.github.io/immer/docs/freezing
immer_1.setAutoFreeze(false);
const options = {
BUILD_ROOT: {
alias: 'r',
desc: 'Root path of your project (which contains build-config.json)',
type: 'string',
default: process.cwd()
},
BUILD_ENV: {
alias: 'e',
desc: 'Environment for build, one of [ development, production ]',
type: 'string',
default: build_env_1.Env.Dev
},
PORT: {
alias: 'p',
desc: 'Port for dev server',
type: 'number',
default: 80
},
BUILD_CONFIG_FILE: {
alias: 'c',
desc: 'Path of build config file. If provided, it will be used superior to build-config.json under BUILD_ROOT',
type: 'string'
},
verbose: {
type: 'boolean',
desc: 'Output more info',
default: false
}
};
const commands = {
clean: {
desc: 'Clean result file',
handler: clean_1.default
},
generate: {
desc: 'Generate result file',
handler: generate_1.default
},
upload: {
desc: 'Upload result file',
handler: upload_1.default
},
test: {
desc: 'Run unit test cases',
handler: test_1.default
},
build: {
desc: 'Clean, generate & upload result file',
handler() {
return __awaiter(this, void 0, void 0, function* () {
yield clean_1.default();
yield generate_1.default();
yield upload_1.default();
});
}
},
serve: {
isDefault: true,
desc: 'Launch the dev server',
handler(args) {
return serve_1.default(args.PORT);
}
},
analyze: {
desc: 'Visually analyze bundle dependencies',
handler() {
return __awaiter(this, void 0, void 0, function* () {
build_conf_1.setNeedAnalyze(true);
yield generate_1.default();
});
}
}
};
function applyArgv(argv) {
if (argv.verbose) {
logger_1.default.level = 'debug';
}
if (argv.BUILD_ROOT) {
paths_1.setBuildRoot(argv.BUILD_ROOT);
}
if (argv.BUILD_CONFIG_FILE) {
paths_1.setBuildConfigFilePath(argv.BUILD_CONFIG_FILE);
}
if (argv.BUILD_ENV) {
const value = argv.BUILD_ENV;
if (!Object.values(build_env_1.Env).includes(value)) {
logger_1.default.warn('Invalid BUILD_ENV value:', value);
}
else {
build_env_1.setEnv(argv.BUILD_ENV);
}
}
}
function handleError(e) {
if (Array.isArray(e)) {
e.forEach(item => logger_1.default.error(item));
}
else {
e && logger_1.default.error(e);
}
logger_1.default.fatal('Encountered error, exit 1');
process.exit(1);
}
let parser = yargs_1.default(process.argv.slice(2));
Object.entries(options).forEach(([name, option]) => {
parser = parser.option(name, option);
});
Object.entries(commands).forEach(([name, { desc, handler, isDefault }]) => {
const command = isDefault ? [name, '*'] : name;
parser = parser.command(command, desc, () => { }, (argv) => __awaiter(void 0, void 0, void 0, function* () {
applyArgv(argv);
try {
yield prepare_1.default();
yield handler(argv);
}
catch (e) {
handleError(e);
}
}));
});
// enable --version
parser.version()
.help('h').alias('h', 'help')
.locale('en')
.argv;
;