Files
image/node-hook/src/inventory.mjs
T

45 lines
1.4 KiB
JavaScript

import { basename, dirname, extname } from 'node:path/posix';
import { rename, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
export function buildLegacyInventory(paths) {
const inventory = {};
for (const fullPath of paths) {
if (!fullPath.startsWith('icons/')) {
continue;
}
const relative = fullPath.slice('icons/'.length);
const directory = dirname(relative);
const file = basename(relative);
const extension = extname(file);
const name = extension ? file.slice(0, -extension.length) : file;
inventory[directory] ??= {};
inventory[directory][name] = file;
}
return inventory;
}
async function atomicJson(path, value) {
const temporary = `${path}.tmp-${process.pid}`;
await writeFile(temporary, JSON.stringify(value), { encoding: 'utf8', mode: 0o644 });
await rename(temporary, path);
}
export async function writeInventories({ repositoryPath, paths, branch, commit, publicBases, generatedAt = new Date() }) {
const legacy = buildLegacyInventory(paths);
const versioned = {
version: 2,
branch,
commit,
generatedAt: generatedAt.toISOString(),
publicBases,
assets: paths.filter((path) => path.startsWith('game/') || path.startsWith('icons/')),
directories: legacy,
};
await atomicJson(join(repositoryPath, 'hook', 'list.json'), legacy);
await atomicJson(join(repositoryPath, 'hook', 'inventory.v2.json'), versioned);
return versioned;
}