UNPKG

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
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(); }); }); }