webpack-assets-manifest
Version:
This Webpack plugin will generate a JSON file that matches the original filename with the hashed version.
69 lines (68 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.asArray = asArray;
exports.getSRIHash = getSRIHash;
exports.getSortedObject = getSortedObject;
exports.findMapKeysByValue = findMapKeysByValue;
exports.group = group;
exports.getLockFilename = getLockFilename;
exports.lock = lock;
exports.unlock = unlock;
const node_crypto_1 = require("node:crypto");
const node_os_1 = require("node:os");
const node_path_1 = require("node:path");
const lockfile_1 = require("lockfile");
const type_predicate_js_1 = require("./type-predicate.js");
function asArray(data) {
return Array.isArray(data) ? data : [data];
}
function getSRIHash(algorithm, content) {
return `${algorithm}-${(0, node_crypto_1.createHash)(algorithm).update(content, 'utf8').digest('base64')}`;
}
function getSortedObject(object, compareFunction) {
return Object.fromEntries(Object.entries(object).sort(compareFunction ? (left, right) => compareFunction(left[0], right[0]) : undefined));
}
function findMapKeysByValue(map) {
const entries = [...map.entries()];
return (searchValue) => entries.filter(([, value]) => value === searchValue).map(([name]) => name);
}
function group(data, getGroup, mapper) {
return data.reduce((obj, item) => {
const group = getGroup(item);
if ((0, type_predicate_js_1.isPropertyKey)(group)) {
(obj[group] ??= []).push(mapper ? mapper(item, group) : item);
}
return obj;
}, Object.create(null));
}
function getLockFilename(filename) {
const name = filename.replace(/[^\w]+/g, '-');
return (0, node_path_1.join)((0, node_os_1.tmpdir)(), `${name}.lock`);
}
function lock(filename) {
return new Promise((resolve, reject) => {
(0, lockfile_1.lock)(getLockFilename(filename), {
wait: 10000,
stale: 20000,
retries: 100,
retryWait: 100,
}, (error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
function unlock(filename) {
return new Promise((resolve, reject) => {
(0, lockfile_1.unlock)(getLockFilename(filename), (error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}