UNPKG

jgb-cli

Version:

```shell npm i -g jgb-cli #全局安装 ```

650 lines 48.4 kB
"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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