ko
Version:
build & lint library
71 lines (70 loc) • 2.76 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const promises_1 = __importDefault(require("fs/promises"));
const path_1 = __importDefault(require("path"));
class PurgeCacheWebpackPlugin {
constructor() {
this.WEBPACK_PLUGIN_NAME = 'PurgeCacheWebpackPlugin';
}
purgeCacheFiles(directory, maxAge, callback) {
promises_1.default.readdir(directory)
.then(files => {
const expiredPacks = [];
if (files.length === 0)
return callback();
for (const file of files) {
const pack = new Promise((resolve, reject) => {
const filePath = path_1.default.join(directory, file);
promises_1.default.stat(filePath)
.then(stats => {
if (stats.mtime.getTime() + maxAge < Date.now()) {
promises_1.default.unlink(filePath)
.then(() => {
resolve(true);
})
.catch(err => reject(err));
}
else {
resolve(true);
}
})
.catch(err => reject(err));
});
expiredPacks.push(pack);
}
Promise.allSettled(expiredPacks).then(results => {
const errors = results
.filter(result => result.status === 'rejected')
.map((result) => result.reason);
callback(errors);
});
})
.catch(err => {
callback([err]);
});
}
apply(compiler) {
compiler.hooks.done.tapAsync({ name: this.WEBPACK_PLUGIN_NAME }, (_, callback) => {
const { type, maxAge, cacheLocation } = compiler.options.cache;
if (type === 'filesystem') {
const logger = compiler.getInfrastructureLogger(this.WEBPACK_PLUGIN_NAME);
this.purgeCacheFiles(cacheLocation, maxAge, errors => {
if (errors?.length) {
errors.forEach(err => logger.warn(err.message));
}
else {
logger.info(`purge expired cache files completed`);
}
callback();
});
}
else {
callback();
}
});
}
}
exports.default = PurgeCacheWebpackPlugin;