fix(catalog): resolve namespaced Nitro frames and empty scale declarations
CI / check (push) Successful in 1m36s
CI / deploy (push) Successful in 1m11s
CI / e2e (push) Successful in 22s

This commit is contained in:
Simo committed 2026-09-05 17:45:42 +02:00
1 parent cd75361b9f
commit dcb5f46eed
4 files changed
+77 -7

No files matched your search

+19 -5
View File
@@ -22,6 +22,18 @@ function halfOffsets(value: unknown): unknown {
]),
);
}
function emptyScaleDeclaration(viz: Record<string, unknown>): boolean {
return Object.entries(viz).every(([key, value]) => {
if (["size", "layerCount", "angle"].includes(key)) return true;
if (key === "directions")
return Object.values(object(value)).every(
(direction) => Object.keys(object(direction)).length === 0,
);
return (
value && typeof value === "object" && Object.keys(value).length === 0
);
});
}
export async function generateScale32(
input: Buffer,
): Promise<{ bundle: Buffer; before: string; after: string; count: number }> {
@@ -35,7 +47,9 @@ export async function generateScale32(
if (
Object.keys(assets).some((n) => isScale(n, 32)) ||
Object.keys(frames).some((n) => isScale(n, 32)) ||
visualizations.some((v) => object(v).size === 32)
visualizations.some(
(v) => object(v).size === 32 && !emptyScaleDeclaration(object(v)),
)
)
throw Error("Scale 32 already exists; original artwork is preserved");
const viz = visualizations.find((v) => object(v).size === 64);
@@ -62,13 +76,13 @@ export async function generateScale32(
(typeof asset[key] !== "number" || !Number.isFinite(asset[key]))
)
throw Error("Invalid sprite offset");
resolveNitroFrame(json, name);
const resolved = resolveNitroFrame(json, name);
if (typeof asset.source === "string" && asset.source !== name) {
if (!names.includes(asset.source))
throw Error("A sprite references artwork outside scale 64");
continue;
}
const frame = object(frames[name]),
const frame = resolved.frame,
rect = object(frame.frame);
let sprite = await sharp(png)
.extract({
@@ -105,7 +119,7 @@ export async function generateScale32(
if (!before) before = `data:image/png;base64,${sprite.toString("base64")}`;
images.push({
id: images.length,
name: scaleName(name),
name: scaleName(resolved.name),
width,
height,
pixels: await sharp(sprite)
@@ -152,7 +166,7 @@ export async function generateScale32(
}
json.assets = assets;
json.visualizations = [
...visualizations,
...visualizations.filter((v) => object(v).size !== 32),
{ ...object(halfOffsets(viz)), size: 32 },
];
json.spritesheet = {