45 lines
1.4 KiB
JavaScript
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;
|
|
}
|