47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
import { createHash } from 'node:crypto';
|
|
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
|
|
export const repositoryRoot = path.resolve(import.meta.dirname, '..');
|
|
|
|
export async function sha256(filePath) {
|
|
const contents = await readFile(filePath);
|
|
return createHash('sha256').update(contents).digest('hex');
|
|
}
|
|
|
|
export async function walk(directory, predicate = () => true) {
|
|
const output = [];
|
|
for (const entry of await readdir(directory)) {
|
|
const fullPath = path.join(directory, entry);
|
|
const details = await stat(fullPath);
|
|
if (details.isDirectory()) output.push(...(await walk(fullPath, predicate)));
|
|
else if (predicate(fullPath)) output.push(fullPath);
|
|
}
|
|
return output;
|
|
}
|
|
|
|
export function flatten(value, prefix = '', output = new Map()) {
|
|
if (Array.isArray(value)) {
|
|
value.forEach((entry, index) => flatten(entry, `${prefix}[${index}]`, output));
|
|
if (value.length === 0) output.set(prefix, value);
|
|
return output;
|
|
}
|
|
if (value && typeof value === 'object') {
|
|
for (const [key, entry] of Object.entries(value)) {
|
|
flatten(entry, prefix ? `${prefix}.${key}` : key, output);
|
|
}
|
|
return output;
|
|
}
|
|
output.set(prefix, value);
|
|
return output;
|
|
}
|
|
|
|
export function fail(messages) {
|
|
for (const message of messages) console.error(`ERROR: ${message}`);
|
|
process.exitCode = 1;
|
|
}
|
|
|
|
export function pass(message) {
|
|
console.log(`PASS: ${message}`);
|
|
}
|