mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-05 00:56:23 +00:00
* 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>
38 lines
1.2 KiB
TypeScript
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");
|
|
});
|
|
});
|