diff --git a/packages/cli/src/commands/figma/asset.test.ts b/packages/cli/src/commands/figma/asset.test.ts index 6e0e1d44d..9afdca47e 100644 --- a/packages/cli/src/commands/figma/asset.test.ts +++ b/packages/cli/src/commands/figma/asset.test.ts @@ -9,7 +9,7 @@ import { runAssetImportMany, type AssetImportDeps, } from "./asset.js"; -import type { FigmaClient } from "@hyperframes/core/figma"; +import { FigmaClientError, type FigmaClient } from "@hyperframes/core/figma"; const dirs: string[] = []; function scratch(): string { @@ -179,6 +179,24 @@ describe("runAssetImport", () => { expect(new Set(results.map((r) => r.record.id)).size).toBe(3); }); + it("labels a batch-miss RENDER_FAILED with the images endpoint (telemetry parity with client.ts)", async () => { + const dir = scratch(); + const missClient = fakeClient({ + renderNodes: (fileKey, nodeIds) => + Promise.resolve(nodeIds.map((nodeId) => ({ nodeId, url: null, ext: "png" }))), + }); + const err = await runAssetImportMany( + ["KEY:1-2"], + { format: "png" }, + deps(dir, { client: missClient }), + ).catch((e: unknown) => e); + expect(err).toBeInstanceOf(FigmaClientError); + if (err instanceof FigmaClientError) { + expect(err.code).toBe("RENDER_FAILED"); + expect(err.endpoint).toBe("images"); + } + }); + it("gatherAssetRefs splits bare comma-joined ids but keeps URLs whole", () => { // bare tokens comma-split expect(gatherAssetRefs(["KEY:1-2,KEY:3-4"])).toEqual(["KEY:1-2", "KEY:3-4"]); diff --git a/packages/cli/src/commands/figma/asset.ts b/packages/cli/src/commands/figma/asset.ts index d1a307ea3..5d5c76a23 100644 --- a/packages/cli/src/commands/figma/asset.ts +++ b/packages/cli/src/commands/figma/asset.ts @@ -209,6 +209,8 @@ export async function runAssetImportMany( throw new FigmaClientError( "RENDER_FAILED", `figma could not render node ${nodeId} as ${opts.format}`, + undefined, + "images", ); slots[i] = await freezeAndRecord( fileKey,