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