jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
650 lines • 48.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var Debug = require("debug");
var fg = require("fast-glob");
var fs = require("fs-extra");
var lib_1 = require("jgb-shared/lib");
var awaitEventEmitter_1 = require("jgb-shared/lib/awaitEventEmitter");
var Logger_1 = require("jgb-shared/lib/Logger");
var index_1 = require("jgb-shared/lib/utils/index");
var WorkerFarm_1 = require("jgb-shared/lib/workerfarm/WorkerFarm");
var Path = require("path");
var semver = require("semver");
var Compiler_1 = require("./Compiler");
var FSCache_1 = require("./FSCache");
var PromiseQueue_1 = require("./utils/PromiseQueue");
var Watcher_1 = require("./Watcher");
var platfromFile_1 = require("./utils/platfromFile");
var debug = Debug('core');
var Core = /** @class */ (function (_super) {
tslib_1.__extends(Core, _super);
function Core(options) {
var _this = _super.call(this) || this;
_this.currentDir = process.cwd();
_this.loadedAssets = new Map();
_this.watchedAssets = new Map();
/** 使用core来output资源 */
_this.useCoreOutput = true;
_this.hooks = options.hooks || [];
_this.options = _this.normalizeOptions(options);
_this.injectEnv();
if (options.rootDir) {
_this.currentDir = options.rootDir;
}
_this.entryFiles = _this.normalizeEntryFiles();
_this.compiler = new Compiler_1.default(_this.options);
_this.buildQueue = new PromiseQueue_1.default(_this.processAsset.bind(_this));
if (_this.options.cache) {
_this.cache = new FSCache_1.default(_this.options);
}
Logger_1.logger.setOptions(_this.options);
return _this;
}
Core.prototype.normalizeEntryFiles = function () {
var _this = this;
var entryFiles = this.options.entryFiles;
var files = []
.concat(!entryFiles || entryFiles.length === 0 ? 'app.*' : entryFiles)
.filter(Boolean)
.map(function (f) { return Path.resolve(_this.options.sourceDir, f); });
return fg.sync(files, {
onlyFiles: true,
unique: true,
}).filter(function (f) { return !platfromFile_1.isPlatformFile(f, _this.options.target); });
};
/**
* 注入所需的环境变量
*/
Core.prototype.injectEnv = function () {
process.env.JGB_ENV = this.options.target;
process.env.JGB_LOG_LEVEL = "" + this.options.logLevel;
process.env.JGB_VERSION = this.options.cliVersion;
};
Core.prototype.normalizeOptions = function (options) {
var rootDir = Path.resolve(options.rootDir || this.currentDir);
return tslib_1.__assign(tslib_1.__assign({}, options), { plugins: options.plugins, presets: options.presets, watch: !!options.watch, rootDir: rootDir, logLevel: isNaN(options.logLevel) ? 3 : options.logLevel, useLocalWorker: !!options.useLocalWorker, outDir: Path.resolve(options.outDir), npmDir: Path.resolve(options.npmDir), entryFiles: options.entryFiles, cache: !!options.cache, sourceDir: Path.resolve(options.sourceDir), alias: aliasResolve(options, rootDir), minify: !!options.minify, lib: options.lib, inlineSourceMap: !!options.inlineSourceMap, resolve: options.resolve, cliVersion: options.cliVersion });
};
Core.prototype.initHook = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var allHooks;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!this.hooks || this.hooks.length === 0) {
return [2 /*return*/];
}
allHooks = this.hooks.map(function (fn) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fn(this)];
case 1: return [2 /*return*/, _a.sent()];
}
}); }); });
return [4 /*yield*/, Promise.all(allHooks)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.init = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var sharedVersion, error_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.compiler.init(this.resolver)];
case 1:
_a.sent();
this.resolver = new lib_1.Resolver(this.options);
this.compiler.resolver = this.resolver;
_a.label = 2;
case 2:
_a.trys.push([2, 4, , 5]);
return [4 /*yield*/, this.resolver
.resolve('jgb-shared', process.cwd())
.then(function (jgbSharedInfo) { var _a, _b; return (_b = (_a = jgbSharedInfo) === null || _a === void 0 ? void 0 : _a.pkg) === null || _b === void 0 ? void 0 : _b.version; })];
case 3:
sharedVersion = _a.sent();
if (sharedVersion && !semver.gtr(sharedVersion, '~1.8.11')) {
this.useCoreOutput = false;
}
return [3 /*break*/, 5];
case 4:
error_1 = _a.sent();
return [3 /*break*/, 5];
case 5:
Logger_1.logger.info("use " + (this.useCoreOutput ? 'master' : 'worker') + " output");
return [2 /*return*/];
}
});
});
};
Core.prototype.start = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var startTime, _a, _b, entry, asset, e_1_1, error_2, endTime;
var e_1, _c;
return tslib_1.__generator(this, function (_d) {
switch (_d.label) {
case 0:
startTime = new Date();
if (this.farm) {
return [2 /*return*/];
}
Logger_1.logger.progress("\u7F16\u8BD1\u4E2D...");
_d.label = 1;
case 1:
_d.trys.push([1, 15, 18, 22]);
return [4 /*yield*/, this.initHook()];
case 2:
_d.sent();
return [4 /*yield*/, this.emit('before-init')];
case 3:
_d.sent();
return [4 /*yield*/, this.init()];
case 4:
_d.sent();
return [4 /*yield*/, this.emit('before-compiler')];
case 5:
_d.sent();
// another channce to modify entryFiles
this.entryFiles = this.normalizeEntryFiles();
if (this.options.watch) {
this.watcher = new Watcher_1.default();
this.watcher.on('change', this.onChange.bind(this));
}
this.farm = WorkerFarm_1.default.getShared(this.options, {
workerPath: require.resolve('./worker'),
core: this,
});
_d.label = 6;
case 6:
_d.trys.push([6, 11, 12, 13]);
_a = tslib_1.__values(new Set(this.entryFiles)), _b = _a.next();
_d.label = 7;
case 7:
if (!!_b.done) return [3 /*break*/, 10];
entry = _b.value;
return [4 /*yield*/, this.resolveAsset(entry)];
case 8:
asset = _d.sent();
this.buildQueue.add(asset);
_d.label = 9;
case 9:
_b = _a.next();
return [3 /*break*/, 7];
case 10: return [3 /*break*/, 13];
case 11:
e_1_1 = _d.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 13];
case 12:
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
return [7 /*endfinally*/];
case 13: return [4 /*yield*/, this.buildQueue.run()];
case 14:
_d.sent();
return [3 /*break*/, 22];
case 15:
error_2 = _d.sent();
if (error_2.fileName) {
Logger_1.logger.error("file: " + error_2.fileName);
}
Logger_1.logger.error(error_2.stack);
if (!!this.options.watch) return [3 /*break*/, 17];
return [4 /*yield*/, this.stop()];
case 16:
_d.sent();
process.exit(1);
_d.label = 17;
case 17: return [3 /*break*/, 22];
case 18:
endTime = new Date();
return [4 /*yield*/, this.emit('end-build')];
case 19:
_d.sent();
console.log("\u7F16\u8BD1\u8017\u65F6:" + (endTime.getTime() - startTime.getTime()) + "ms");
if (!!this.options.watch) return [3 /*break*/, 21];
return [4 /*yield*/, this.stop()];
case 20:
_d.sent();
_d.label = 21;
case 21: return [7 /*endfinally*/];
case 22: return [2 /*return*/];
}
});
});
};
Core.prototype.scan = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var jsonAsset, asset, _a, _b, entry, e_2_1;
var e_2, _c;
return tslib_1.__generator(this, function (_d) {
switch (_d.label) {
case 0:
if (this.farm) {
return [2 /*return*/];
}
return [4 /*yield*/, this.initHook()];
case 1:
_d.sent();
return [4 /*yield*/, this.emit('before-init')];
case 2:
_d.sent();
return [4 /*yield*/, this.init()];
case 3:
_d.sent();
return [4 /*yield*/, this.emit('before-compiler')];
case 4:
_d.sent();
// another channce to modify entryFiles
this.entryFiles = this.normalizeEntryFiles();
if (this.options.watch) {
this.watcher = new Watcher_1.default();
this.watcher.on('change', this.onChange.bind(this));
}
this.farm = WorkerFarm_1.default.getShared(this.options, {
workerPath: require.resolve('./worker'),
core: this,
});
jsonAsset = this.entryFiles.find(function (item) {
return new RegExp(/\.json$/).test(item);
});
asset = null;
_d.label = 5;
case 5:
_d.trys.push([5, 10, 11, 12]);
_a = tslib_1.__values(new Set([jsonAsset])), _b = _a.next();
_d.label = 6;
case 6:
if (!!_b.done) return [3 /*break*/, 9];
entry = _b.value;
return [4 /*yield*/, this.resolveAsset(entry)];
case 7:
asset = _d.sent();
_d.label = 8;
case 8:
_b = _a.next();
return [3 /*break*/, 6];
case 9: return [3 /*break*/, 12];
case 10:
e_2_1 = _d.sent();
e_2 = { error: e_2_1 };
return [3 /*break*/, 12];
case 11:
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_2) throw e_2.error; }
return [7 /*endfinally*/];
case 12: return [4 /*yield*/, this.loadAsset(asset)];
case 13:
_d.sent();
return [4 /*yield*/, this.stop()];
case 14:
_d.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.processAsset = function (asset, isRebuild) {
if (isRebuild === void 0) { isRebuild = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (isRebuild) {
asset.invalidate();
if (this.cache) {
this.cache.invalidate(asset.name);
}
}
return [4 /*yield*/, this.loadAsset(asset)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
Core.prototype.getAsset = function (name, parent) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var asset;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.resolveAsset(name, parent)];
case 1:
asset = _a.sent();
this.buildQueue.add(asset);
return [4 /*yield*/, this.buildQueue.run()];
case 2:
_a.sent();
return [2 /*return*/, asset];
}
});
});
};
Core.prototype.resolveAsset = function (name, parent) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var path;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.resolver.resolve(name, parent)];
case 1:
path = (_a.sent()).path;
return [4 /*yield*/, this.resolver.resolvePlatformModule(path)];
case 2:
path = _a.sent();
return [2 /*return*/, this.getLoadedAsset(path)];
}
});
});
};
Core.prototype.loadAsset = function (asset, cacheMiss) {
if (cacheMiss === void 0) { cacheMiss = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var processed, _a, usedTime, dependencies, dependencies_1, dependencies_1_1, dep, assetDep, e_3_1, error_3, generated, generated_1, generated_1_1, generate, code, ext, map, _b, distPath, ignore, e_4_1;
var e_3, _c, e_4, _d;
return tslib_1.__generator(this, function (_e) {
switch (_e.label) {
case 0:
if (asset.processed) {
return [2 /*return*/];
}
// logger.info(asset.name);
asset.processed = true;
asset.startTime = Date.now();
_a = this.cache;
if (!_a) return [3 /*break*/, 2];
return [4 /*yield*/, this.cache.read(asset.name)];
case 1:
_a = (_e.sent());
_e.label = 2;
case 2:
processed = _a;
if (!(cacheMiss ||
!processed ||
asset.shouldInvalidate(processed.cacheData))) return [3 /*break*/, 4];
return [4 /*yield*/, this.farm.run(asset.name, asset.distPath)];
case 3:
processed = _e.sent();
cacheMiss = true;
_e.label = 4;
case 4:
asset.endTime = Date.now();
usedTime = asset.endTime - asset.startTime;
debug(asset.name + " processd time: " + usedTime + "ms");
asset.id = processed.id;
asset.generated = processed.generated;
asset.hash = processed.hash;
dependencies = processed.dependencies;
_e.label = 5;
case 5:
_e.trys.push([5, 14, , 16]);
_e.label = 6;
case 6:
_e.trys.push([6, 11, 12, 13]);
dependencies_1 = tslib_1.__values(dependencies), dependencies_1_1 = dependencies_1.next();
_e.label = 7;
case 7:
if (!!dependencies_1_1.done) return [3 /*break*/, 10];
dep = dependencies_1_1.value;
// from cache dep
if (Array.isArray(dep) && dep.length > 1) {
dep = dep[1];
}
// This dependency is already included in the parent's generated output,
// so no need to load it. We map the name back to the parent asset so
// that changing it triggers a recompile of the parent.
if (dep.includedInParent) {
this.watch(dep.name, asset);
return [3 /*break*/, 9];
}
dep.parent = asset.name;
return [4 /*yield*/, this.resolveDep(asset, dep)];
case 8:
assetDep = _e.sent();
if (assetDep && fs.existsSync(assetDep.name)) {
if (dep.distPath) {
assetDep.distPath = dep.distPath;
}
this.buildQueue.add(assetDep);
dep.parent = asset.name;
dep.resolved = assetDep.name;
}
else {
throw new Error("Cannot found " + assetDep.name + " from " + asset.name);
}
_e.label = 9;
case 9:
dependencies_1_1 = dependencies_1.next();
return [3 /*break*/, 7];
case 10: return [3 /*break*/, 13];
case 11:
e_3_1 = _e.sent();
e_3 = { error: e_3_1 };
return [3 /*break*/, 13];
case 12:
try {
if (dependencies_1_1 && !dependencies_1_1.done && (_c = dependencies_1.return)) _c.call(dependencies_1);
}
finally { if (e_3) throw e_3.error; }
return [7 /*endfinally*/];
case 13: return [3 /*break*/, 16];
case 14:
error_3 = _e.sent();
if (cacheMiss) {
throw error_3;
}
// 缓存中的依赖可能失效,需要重新加载
asset.processed = false;
return [4 /*yield*/, this.loadAsset(asset, true)];
case 15:
_e.sent();
return [2 /*return*/];
case 16:
if (!this.useCoreOutput) return [3 /*break*/, 25];
generated = [].concat(asset.generated);
_e.label = 17;
case 17:
_e.trys.push([17, 23, 24, 25]);
generated_1 = tslib_1.__values(generated), generated_1_1 = generated_1.next();
_e.label = 18;
case 18:
if (!!generated_1_1.done) return [3 /*break*/, 22];
generate = generated_1_1.value;
return [4 /*yield*/, this.emit('before-output', generate, asset)];
case 19:
_e.sent();
code = generate.code, ext = generate.ext, map = generate.map;
return [4 /*yield*/, asset.output(code, ext, map, !cacheMiss)];
case 20:
_b = _e.sent(), distPath = _b.distPath, ignore = _b.ignore;
if (!ignore) {
Logger_1.logger.log("" + distPath, '编译', usedTime);
}
_e.label = 21;
case 21:
generated_1_1 = generated_1.next();
return [3 /*break*/, 18];
case 22: return [3 /*break*/, 25];
case 23:
e_4_1 = _e.sent();
e_4 = { error: e_4_1 };
return [3 /*break*/, 25];
case 24:
try {
if (generated_1_1 && !generated_1_1.done && (_d = generated_1.return)) _d.call(generated_1);
}
finally { if (e_4) throw e_4.error; }
return [7 /*endfinally*/];
case 25:
if (this.cache && cacheMiss) {
this.cache.write(asset.name, processed);
}
return [2 /*return*/];
}
});
});
};
Core.prototype.resolveDep = function (asset, dep) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var err_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
if (Array.isArray(dep) && dep.length === 2) {
dep = dep[1];
}
if (dep.resolved) {
return [2 /*return*/, this.getLoadedAsset(dep.resolved)];
}
return [4 /*yield*/, this.resolveAsset(dep.name, asset.name)];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_1 = _a.sent();
// If the dep is optional, return before we throw
if (dep.optional) {
return [2 /*return*/];
}
throw err_1;
case 3: return [2 /*return*/];
}
});
});
};
Core.prototype.getLoadedAsset = function (path) {
if (this.loadedAssets.has(path)) {
return this.loadedAssets.get(path);
}
var asset = this.compiler.getAsset(path);
if (this.loadedAssets.has(asset.name)) {
return this.loadedAssets.get(asset.name);
}
this.loadedAssets.set(path, asset);
this.watch(path, asset);
return asset;
};
Core.prototype.watch = function (path, asset) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!this.watcher) {
return [2 /*return*/];
}
return [4 /*yield*/, fs.realpath(path)];
case 1:
path = _a.sent();
if (!this.watchedAssets.has(path)) {
this.watcher.watch(path);
this.watchedAssets.set(path, new Set());
}
this.watchedAssets.get(path).add(asset);
return [2 /*return*/];
}
});
});
};
Core.prototype.stop = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
if (this.watcher) {
this.watcher.stop();
}
if (this.farm) {
this.farm.end();
}
Logger_1.logger.stopSpinner();
// fix sometimes won't stop
setTimeout(function () { return process.exit(); }, 1000);
return [2 /*return*/];
});
});
};
Core.prototype.unwatch = function (path, asset) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var watched;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fs.realpath(path)];
case 1:
path = _a.sent();
if (!this.watchedAssets.has(path)) {
return [2 /*return*/];
}
watched = this.watchedAssets.get(path);
watched.delete(asset);
if (watched.size === 0) {
this.watchedAssets.delete(path);
this.watcher.unwatch(path);
}
return [2 /*return*/];
}
});
});
};
Core.prototype.onChange = function (path) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var assets, assets_1, assets_1_1, asset;
var e_5, _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
assets = this.watchedAssets.get(path);
if (!assets) {
return [2 /*return*/];
}
try {
// Add the asset to the rebuild queue, and reset the timeout.
for (assets_1 = tslib_1.__values(assets), assets_1_1 = assets_1.next(); !assets_1_1.done; assets_1_1 = assets_1.next()) {
asset = assets_1_1.value;
this.buildQueue.add(asset, true);
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (assets_1_1 && !assets_1_1.done && (_a = assets_1.return)) _a.call(assets_1);
}
finally { if (e_5) throw e_5.error; }
}
return [4 /*yield*/, this.buildQueue.run()];
case 1:
_b.sent();
return [2 /*return*/];
}
});
});
};
return Core;
}(awaitEventEmitter_1.default));
exports.default = Core;
function aliasResolve(options, root) {
var alias = options.alias || {};
var newAlias = {};
Object.keys(alias).forEach(function (key) {
var aliasValues = index_1.normalizeAlias(alias[key]);
newAlias[key] = aliasValues.map(function (aliasValue) {
var aliasPath = aliasValue.path;
if (!Path.isAbsolute(aliasPath)) {
if (aliasPath.startsWith('.')) {
aliasValue.path = index_1.pathToUnixType(Path.resolve(root, aliasPath));
}
else {
aliasValue.path = index_1.pathToUnixType(Path.resolve(root, 'node_modules', aliasPath));
}
}
return aliasValue;
});
});
return newAlias;
}
exports.aliasResolve = aliasResolve;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUErQjtBQUMvQiw4QkFBZ0M7QUFDaEMsNkJBQStCO0FBQy9CLHNDQUErRDtBQUUvRCxzRUFBaUU7QUFDakUsZ0RBQStDO0FBQy9DLG9EQUE0RTtBQUM1RSxtRUFBOEQ7QUFDOUQsMkJBQTZCO0FBQzdCLCtCQUFpQztBQUNqQyx1Q0FBa0M7QUFDbEMscUNBQWdDO0FBRWhDLHFEQUFnRDtBQUNoRCxxQ0FBZ0M7QUFDaEMscURBQXNEO0FBRXRELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU1QjtJQUFrQyxnQ0FBaUI7SUFpQmpELGNBQVksT0FBcUI7UUFBakMsWUFDRSxpQkFBTyxTQWtCUjtRQW5DTyxnQkFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixrQkFBWSxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBUWhELG1CQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUkxQixzQkFBc0I7UUFDdEIsbUJBQWEsR0FBRyxJQUFJLENBQUM7UUFJbkIsS0FBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNqQyxLQUFJLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ25CLEtBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNuQztRQUVELEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFN0MsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGtCQUFRLENBQUMsS0FBSSxDQUFDLE9BQU8s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