UNPKG

jgb-cli

Version:

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

302 lines 18.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var fs = require("fs"); var fsExtra = require("fs-extra"); var Logger_1 = require("jgb-shared/lib/Logger"); var utils_1 = require("jgb-shared/lib/utils"); var mkdir = require("mkdirp"); var path = require("path"); var util_1 = require("util"); var VError = require("verror"); var pkg = require("../package.json"); // These keys can affect the output, so if they differ, the cache should not match var OPTION_KEYS = [ 'alias', 'target', 'source', 'presets', 'plugins', 'minify', 'outDir', 'sourceDir', 'rootDir', ]; var mkdirp = util_1.promisify(mkdir); var statp = util_1.promisify(fs.stat); var FSCache = /** @class */ (function () { function FSCache(options) { this.invalidated = new Set(); this.dir = path.resolve(options.cacheDir || ".cache/" + (options.target || 'wx')); var hash = OPTION_KEYS.reduce(function (p, k) { return ((p[k] = options[k]), p); }, { version: pkg.version, }); this.optionsHash = utils_1.objectHash(hash); this.ensureDirExists(); } FSCache.prototype.ensureDirExists = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var task; var _this = this; return tslib_1.__generator(this, function (_a) { if (this.dirExistsPromise) { return [2 /*return*/, this.dirExistsPromise]; } task = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var i; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, mkdirp(this.dir)]; case 1: _a.sent(); i = 0; _a.label = 2; case 2: if (!(i < 256)) return [3 /*break*/, 5]; return [4 /*yield*/, mkdirp(path.join(this.dir, ('00' + i.toString(16)).slice(-2)))]; case 3: _a.sent(); _a.label = 4; case 4: i++; return [3 /*break*/, 2]; case 5: return [2 /*return*/]; } }); }); }; this.dirExistsPromise = task(); return [2 /*return*/]; }); }); }; FSCache.prototype.getCacheFile = function (filename) { return tslib_1.__awaiter(this, void 0, void 0, function () { var hash, _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = utils_1.md5; return [4 /*yield*/, this.optionsHash]; case 1: hash = _a.apply(void 0, [(_b.sent()) + filename]); return [2 /*return*/, path.join(this.dir, hash.slice(0, 2), hash.slice(2) + '.json')]; } }); }); }; FSCache.prototype.getLastModified = function (filename) { return tslib_1.__awaiter(this, void 0, void 0, function () { var stat; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, statp(filename)]; case 1: stat = _a.sent(); return [2 /*return*/, stat.isFile() ? stat.mtime.getTime() : Date.now()]; } }); }); }; FSCache.prototype.writeDepMtimes = function (data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var dependencies, _a, _b, dep, _c, error_1, e_1_1; var e_1, _d; return tslib_1.__generator(this, function (_e) { switch (_e.label) { case 0: dependencies = data.dependencies; if (dependencies instanceof Map) { // @ts-ignore dependencies = dependencies.values(); } _e.label = 1; case 1: _e.trys.push([1, 8, 9, 10]); _a = tslib_1.__values(new Set(dependencies)), _b = _a.next(); _e.label = 2; case 2: if (!!_b.done) return [3 /*break*/, 7]; dep = _b.value; if (!(dep && dep.includedInParent)) return [3 /*break*/, 6]; _e.label = 3; case 3: _e.trys.push([3, 5, , 6]); _c = dep; return [4 /*yield*/, this.getLastModified(dep.name)]; case 4: _c.mtime = _e.sent(); return [3 /*break*/, 6]; case 5: error_1 = _e.sent(); Logger_1.logger.error(VError.fullStack(error_1)); return [3 /*break*/, 6]; case 6: _b = _a.next(); return [3 /*break*/, 2]; case 7: return [3 /*break*/, 10]; case 8: e_1_1 = _e.sent(); e_1 = { error: e_1_1 }; return [3 /*break*/, 10]; case 9: try { if (_b && !_b.done && (_d = _a.return)) _d.call(_a); } finally { if (e_1) throw e_1.error; } return [7 /*endfinally*/]; case 10: return [2 /*return*/]; } }); }); }; FSCache.prototype.write = function (filename, data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, _b, err_1; return tslib_1.__generator(this, function (_c) { switch (_c.label) { case 0: _c.trys.push([0, 5, , 6]); return [4 /*yield*/, this.ensureDirExists()]; case 1: _c.sent(); return [4 /*yield*/, this.writeDepMtimes(data)]; case 2: _c.sent(); _b = (_a = fsExtra).writeFile; return [4 /*yield*/, this.getCacheFile(filename)]; case 3: // debugger; return [4 /*yield*/, _b.apply(_a, [_c.sent(), JSON.stringify(data)])]; case 4: // debugger; _c.sent(); this.invalidated.delete(filename); return [3 /*break*/, 6]; case 5: err_1 = _c.sent(); err_1.name = 'FSCache Error write cache'; Logger_1.logger.error(VError.fullStack(err_1)); return [3 /*break*/, 6]; case 6: return [2 /*return*/]; } }); }); }; FSCache.prototype.checkDepMtimes = function (data) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, _b, dep, e_2_1; var e_2, _c; return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: if (!Array.isArray(data.dependencies)) return [3 /*break*/, 8]; _d.label = 1; case 1: _d.trys.push([1, 6, 7, 8]); _a = tslib_1.__values(new Set(data.dependencies)), _b = _a.next(); _d.label = 2; case 2: if (!!_b.done) return [3 /*break*/, 5]; dep = _b.value; if (!(dep && dep.includedInParent)) return [3 /*break*/, 4]; return [4 /*yield*/, this.getLastModified(dep.name)]; case 3: if ((_d.sent()) > dep.mtime) { return [2 /*return*/, false]; } _d.label = 4; case 4: _b = _a.next(); return [3 /*break*/, 2]; case 5: return [3 /*break*/, 8]; case 6: e_2_1 = _d.sent(); e_2 = { error: e_2_1 }; return [3 /*break*/, 8]; case 7: try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_2) throw e_2.error; } return [7 /*endfinally*/]; case 8: return [2 /*return*/, true]; } }); }); }; FSCache.prototype.read = function (filename) { return tslib_1.__awaiter(this, void 0, void 0, function () { var cacheFile, stats, cacheStats, json, data, err_2; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (this.invalidated.has(filename)) { return [2 /*return*/, null]; } return [4 /*yield*/, this.getCacheFile(filename)]; case 1: cacheFile = _a.sent(); _a.label = 2; case 2: _a.trys.push([2, 7, , 8]); return [4 /*yield*/, statp(filename)]; case 3: stats = _a.sent(); return [4 /*yield*/, statp(cacheFile)]; case 4: cacheStats = _a.sent(); if (stats.mtime > cacheStats.mtime) { return [2 /*return*/, null]; } return [4 /*yield*/, util_1.promisify(fs.readFile)(cacheFile, { encoding: 'utf-8', })]; case 5: json = _a.sent(); data = JSON.parse(json); return [4 /*yield*/, this.checkDepMtimes(data)]; case 6: if (!(_a.sent())) { return [2 /*return*/, null]; } return [2 /*return*/, data]; case 7: err_2 = _a.sent(); // logger.error(`cannot found ${filename}'s cacheFile: ${cacheFile}`); return [2 /*return*/, null]; case 8: return [2 /*return*/]; } }); }); }; FSCache.prototype.invalidate = function (filename) { this.invalidated.add(filename); }; FSCache.prototype.delete = function (filename) { return tslib_1.__awaiter(this, void 0, void 0, function () { var cacheFile, err_3; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 3, , 4]); return [4 /*yield*/, this.getCacheFile(filename)]; case 1: cacheFile = _a.sent(); return [4 /*yield*/, util_1.promisify(fs.unlink)(cacheFile)]; case 2: _a.sent(); this.invalidated.delete(filename); return [3 /*break*/, 4]; case 3: err_3 = _a.sent(); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }; return FSCache; }()); exports.default = FSCache; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRlNDYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9GU0NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVCQUF5QjtBQUN6QixrQ0FBb0M7QUFFcEMsZ0RBQStDO0FBQy9DLDhDQUF1RDtBQUN2RCw4QkFBZ0M7QUFDaEMsMkJBQTZCO0FBRTdCLDZCQUFpQztBQUNqQywrQkFBaUM7QUFDakMscUNBQXVDO0FBSXZDLGtGQUFrRjtBQUNsRixJQUFNLFdBQVcsR0FBaUI7SUFDaEMsT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVc7SUFDWCxTQUFTO0NBQ1YsQ0FBQztBQUVGLElBQU0sTUFBTSxHQUFHLGdCQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEMsSUFBTSxLQUFLLEdBQUcsZ0JBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFakM7SUFNRSxpQkFBWSxPQUFxQjtRQUhqQyxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFJdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNyQixPQUFPLENBQUMsUUFBUSxJQUFJLGFBQVUsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUUsQ0FDdkQsQ0FBQztRQUNGLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFNLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBeEIsQ0FBd0IsRUFBRTtZQUN2RSxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxrQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBD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