@gdjiami/cli
Version:
CLI for build front end project.
138 lines (137 loc) • 7.1 kB
JavaScript
;
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;