Files
hyperframes/packages/core/src/figma/parseFigmaRef.test.ts
T
Vance IngallsandClaude Fable 5 e92700acde feat(core): figma motion → GSAP translator + /figma skill v1 (#1869)
* feat(core): add figma motion easing mapping

* feat(core): translate figma motion doc to gsap timeline spec

* feat(core): emit paused GSAP timeline script from figma motion spec

* fix(core): restore type exports dropped from figma barrel in Task 8

* feat(skills): add /figma import skill + catalog wiring

Add the agent-facing /figma skill (asset + Figma Motion import via the
Figma MCP connector, built on @hyperframes/core/figma) and wire it into
the skill catalog across CLAUDE.md, README.md, docs/guides/skills.mdx,
and the hyperframes router's capability map. Bumps the skill count from
19 to 20 in CLAUDE.md and README.md.

* fix(core): use replaceAll for figma node-id dash-to-colon conversion

* style: format skills catalog tables

oxfmt-align the README and router SKILL.md tables after the /figma +
/hyperframes-keyframes merge left uneven column padding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(cli): add missing cache fields to telemetry test fixture

ExtractionPhaseBreakdown gained cachePublishFailures/cacheGcEvictions/
cacheGcBytesFreed/cacheAgedPartialsCleared; the studioRenderTelemetry
test fixture was never updated, breaking Typecheck on main and every PR
based on it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 15:45:07 -07:00

38 lines
1.2 KiB
TypeScript

// @vitest-environment node
import { describe, expect, it } from "vitest";
import { parseFigmaRef } from "./parseFigmaRef";
describe("parseFigmaRef", () => {
it("extracts fileKey + nodeId from a /design/ URL and converts node-id dashes to colons", () => {
const ref = parseFigmaRef(
"https://www.figma.com/design/JjiZQGiUKqbkPCs3sviEUF/Playground?node-id=92-573&t=x",
);
expect(ref.fileKey).toBe("JjiZQGiUKqbkPCs3sviEUF");
expect(ref.nodeId).toBe("92:573");
});
it("handles /file/ URLs without a node-id", () => {
const ref = parseFigmaRef("https://figma.com/file/ABC123/Name");
expect(ref.fileKey).toBe("ABC123");
expect(ref.nodeId).toBeUndefined();
});
it("accepts fileKey:nodeId shorthand", () => {
expect(parseFigmaRef("ABC123:1-2")).toEqual({ fileKey: "ABC123", nodeId: "1:2" });
});
it("accepts a bare fileKey", () => {
expect(parseFigmaRef("ABC123")).toEqual({ fileKey: "ABC123" });
});
it("throws on empty input", () => {
expect(() => parseFigmaRef(" ")).toThrow();
});
});
describe("normalizeNodeId multi-segment", () => {
it("converts every dash in a multi-segment node id", () => {
expect(parseFigmaRef("KEY:1-2-3").nodeId).toBe("1:2:3");
});
});