69 lines
2.2 KiB
JavaScript
69 lines
2.2 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.useCache = void 0;
|
||
|
const fs_1 = require("fs");
|
||
|
function collectStats(watchFiles, fsStatCache) {
|
||
|
return Promise.all(watchFiles.map(async (filename) => {
|
||
|
if (!fsStatCache.has(filename)) {
|
||
|
const stats = await fs_1.promises.stat(filename);
|
||
|
fsStatCache.set(filename, stats);
|
||
|
}
|
||
|
return fsStatCache.get(filename);
|
||
|
}));
|
||
|
}
|
||
|
function maxMtimeMs(stats) {
|
||
|
return stats.reduce((max, { mtimeMs }) => Math.max(max, mtimeMs), 0);
|
||
|
}
|
||
|
function getCache(options) {
|
||
|
var _a;
|
||
|
if ((_a = options.cache) !== null && _a !== void 0 ? _a : true) {
|
||
|
if (typeof options.cache === 'object') {
|
||
|
return options.cache;
|
||
|
}
|
||
|
else {
|
||
|
return new Map();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
function useCache(options = {}, fsStatCache, loadCallback) {
|
||
|
const cache = getCache(options);
|
||
|
if (cache) {
|
||
|
return async ({ path }) => {
|
||
|
try {
|
||
|
let cached = cache.get(path);
|
||
|
if (cached) {
|
||
|
let watchFiles = cached.result.watchFiles;
|
||
|
let stats = await collectStats(watchFiles, fsStatCache);
|
||
|
for (const { mtimeMs } of stats) {
|
||
|
if (mtimeMs > cached.mtimeMs) {
|
||
|
cached.result = await loadCallback(watchFiles[0]);
|
||
|
cached.mtimeMs = maxMtimeMs(stats);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
let result = await loadCallback(path);
|
||
|
cached = {
|
||
|
mtimeMs: maxMtimeMs(await collectStats(result.watchFiles, fsStatCache)),
|
||
|
result
|
||
|
};
|
||
|
cache.set(path, cached);
|
||
|
}
|
||
|
if (cached.result.errors) {
|
||
|
cache.delete(path);
|
||
|
}
|
||
|
return cached.result;
|
||
|
}
|
||
|
catch (error) {
|
||
|
cache.delete(path);
|
||
|
throw error;
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
else {
|
||
|
return ({ path }) => loadCallback(path);
|
||
|
}
|
||
|
}
|
||
|
exports.useCache = useCache;
|
||
|
//# sourceMappingURL=cache.js.map
|