jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
302 lines • 18.9 kB
JavaScript
"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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