UNPKG

@gdjiami/cli

Version:

CLI for build front end project.

138 lines (137 loc) 7.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); var webpack_1 = tslib_1.__importDefault(require("webpack")); var webpack_format_messages_1 = tslib_1.__importDefault(require("webpack-format-messages")); var sortBy_1 = tslib_1.__importDefault(require("lodash/sortBy")); var hash_sum_1 = tslib_1.__importDefault(require("hash-sum")); var utils_1 = require("../../utils"); var dll_config_1 = tslib_1.__importDefault(require("../../config/dll.config")); var chalk_1 = tslib_1.__importDefault(require("chalk")); function getPkgs(modules) { return tslib_1.__awaiter(this, void 0, void 0, function () { var pkgs, err_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, Promise.all(modules.map(function (m) { return utils_1.getModuleVersion(m).then(function (version) { if (version == null) { throw new Error("[DLL] Module " + m + " not found"); } return { name: m, version: version, }; }); }))]; case 1: pkgs = _a.sent(); return [2 /*return*/, pkgs]; case 2: err_1 = _a.sent(); utils_1.message.error(err_1.message); process.exit(1); return [2 /*return*/, []]; case 3: return [2 /*return*/]; } }); }); } function generateHash(pkgs, salt) { var key = sortBy_1.default(pkgs, ['name']) .map(function (m) { return m.name + ":" + m.version; }) .join('/'); return hash_sum_1.default(key + salt); } function shouldUpdateDll(hashFile, key) { return tslib_1.__awaiter(this, void 0, void 0, function () { var prevKey; return tslib_1.__generator(this, function (_a) { if (!fs_extra_1.default.existsSync(hashFile)) { return [2 /*return*/, true]; } prevKey = fs_extra_1.default.readFileSync(hashFile).toString(); return [2 /*return*/, prevKey !== key]; }); }); } function generateDll(environment, pkg, paths, argv) { return tslib_1.__awaiter(this, void 0, void 0, function () { var isElecton, config, modules, pkgs, now, salt, key, shouldUpdate, compiler; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: isElecton = argv.jmOptions.electron; config = dll_config_1.default(environment, pkg, paths, { jmOptions: argv.jmOptions }); if (isElecton) { utils_1.message.info('[DLL] Electron mode will use `optionalDependencies` as DLL input'); } if (argv.inspect) { utils_1.inspect(config, 'Webpack Configuration:'); return [2 /*return*/]; } modules = config.entry.dll; if (modules.length === 0) { utils_1.message.info('[DLL] No modules detected. skip'); return [2 /*return*/]; } return [4 /*yield*/, getPkgs(modules)]; case 1: pkgs = _a.sent(); now = new Date(); salt = pkg.version + "/" + now.getFullYear() + "-" + now.getMonth(); key = generateHash(pkgs, salt); return [4 /*yield*/, shouldUpdateDll(paths.appDllHash, key)]; case 2: shouldUpdate = _a.sent(); if (!shouldUpdate) { utils_1.message.info('[DLL] Nothing Changed. skip'); return [2 /*return*/]; } utils_1.message.info('[DLL] List of modules will be compiled: '); pkgs.forEach(function (i) { return console.log(" " + i.name + ": " + i.version); }); compiler = webpack_1.default(config); return [2 /*return*/, new Promise(function (res, rej) { compiler.run(function (err, stats) { if (err) { utils_1.message.error('[DLL] Failed to compile:'); console.error(err.stack || err); // @ts-ignore if (err.details) { // @ts-ignore console.error(err.details); } rej(err); return; } var messages = webpack_format_messages_1.default(stats); if (messages.errors.length) { utils_1.message.error('[DLL] Failed to compile.\n\n'); messages.errors.forEach(function (e) { return console.log(e); }); rej(new Error('[DLL] Failed to compile')); return; } if (messages.warnings.length) { utils_1.message.warn('[DLL] Compiled with warnings.\n\n'); messages.warnings.forEach(function (e) { return console.log(e); }); } else { utils_1.message.success('[DLL] Compiled successfully.'); } // 更新hash fs_extra_1.default.writeFileSync(paths.appDllHash, key); utils_1.message.success("[DLL] DLL compiled successfully, call " + chalk_1.default.cyan('jm start') + " Will automatically load dll to improve compilation speed, you can set " + chalk_1.default.red('DISABLE_DLL') + " to turn it off."); res(); }); }).catch(function (err) { fs_extra_1.default.emptyDirSync(paths.appCache); throw err; })]; } }); }); } exports.default = generateDll;