@4awpawz/buster
Version:
A configurable cache buster called Buster. Buster busts your browser cache problems.
66 lines (53 loc) • 2.22 kB
JavaScript
;
const path = require("path");
const { log, readFile, rename, writeFile } = require("../utils");
const manifestFileName = require("./manifestFileName");
const saveManifestToFile = async (manifest) => {
const writeableManifest = { manifest };
await writeFile(manifestFileName, JSON.stringify(writeableManifest, null, 2));
};
const fingerprintFileNames = async (manifest) => {
const filtered = manifest.filter(item => item.operation === 1 || item.operation === 3);
for (const item of filtered) {
await rename(item.source, `${path.dirname(item.source)}${path.sep}${item.hashFileName}`);
}
return filtered.length;
};
const replaceInFiles = async (manifest) => {
const options = {
files: [],
from: [],
to: []
};
manifest.filter(item => item.operation === 1).forEach(item => {
options.from.push(new RegExp(item.originalURL, "g"));
options.to.push(item.hashedURL);
});
manifest.filter(item => item.operation === 2).forEach(item => {
options.files.push(item.source);
});
manifest.filter(item => item.operation === 3).forEach(item => {
options.files.push(`${path.dirname(item.source)}${path.sep}${item.hashFileName}`);
options.from.push(new RegExp(item.originalURL, "g"));
options.to.push(item.hashedURL);
});
for (let i = 0; i < options.files.length; i++) {
let fileBuffer = await readFile(options.files[i], { encoding: "utf8", flag: "r+" });
for (let ii = 0; ii < options.from.length; ii++) {
fileBuffer = fileBuffer.replace(options.from[ii], options.to[ii]);
}
await writeFile(options.files[i], fileBuffer);
}
};
module.exports = async (manifest, opt) => {
if (opt.manifest) {
await saveManifestToFile(manifest);
log(`manifest file saved to ${manifestFileName}`);
}
log("fingerprinting file names");
const fingerprintedCount = await fingerprintFileNames(manifest);
log(`${fingerprintedCount} ${fingerprintedCount === 1 && "file has" || "files have"} been Fingerprinted`);
log("replacing file content");
await replaceInFiles(manifest);
log("files cache busted");
};