mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-11 23:00:03 +00:00
fix(cli): default render fps to the composition's data-fps
* fix(cli): default render fps to the composition's data-fps
hyperframes render hard-coded fps to 30 when --fps was omitted, ignoring a
data-fps declared on the composition root — so a composition authored at
data-fps="24" silently rendered at 30fps unless the user knew to pass --fps 24.
The runtime already honors data-fps; the CLI now matches it.
Precedence: explicit --fps > composition root data-fps > 30. New pure
readCompositionFps() extracts the root data-fps via linkedom (mirrors the
runtime's root resolution: [data-composition-id][data-root=true], else the
outermost [data-composition-id]); render validates it through parseFps and
falls back to 30 on an absent/invalid value. Unit-tested.
* fix(cli): honor composition data-fps on cloud renders and --composition targets
The local render command read data-fps from project.dir/index.html even when
--composition rendered a different file, and the lambda/cloudrun render paths
ignored data-fps entirely (hardcoded ?? 30). Both are the same silently-wrong-
fps bug on other render entry points:
- render.ts resolves the entry file first, then reads data-fps from the file
actually being rendered (falling back to index.html).
- lambda render/render-batch and cloudrun render/render-batch default fps from
the composition's data-fps, accepted only when it is one of the cloud-allowed
values {24,30,60}, else the existing 30 default. Explicit --fps still wins.
* fix(cli): drop citty fps default so data-fps resolution actually runs
The fps arg had default: "30", so citty set args.fps="30" on omission and
resolveDefaultFpsArg short-circuited (explicitFps never null) — reverting the
command to always-30 and making the whole data-fps feature a no-op (caught in
review). Remove the arg default; the "30" fallback already lives at
parseFps(fpsArg ?? "30"). Adds a regression guard asserting the arg has no
default.
* test(cli): read citty args through a plain record in the fps-default guard
The regression guard accessed cmd.args.fps directly, but citty types args as
Resolvable<ArgsDef> so .fps failed typecheck in CI. Read it through a plain
record cast.
This commit is contained in:
@@ -506,4 +506,21 @@ describe("checkRenderResolutionPreflight", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("render fps arg definition", () => {
|
||||
it("declares no citty default for --fps (so data-fps resolution can run)", async () => {
|
||||
// Regression guard: a `default: "30"` here makes citty set args.fps="30"
|
||||
// on omission, which short-circuits resolveDefaultFpsArg (explicitFps is
|
||||
// never null) and silently reverts the command to always-30 — the exact
|
||||
// no-op caught in review. The "30" fallback must live at the
|
||||
// parseFps(fpsArg ?? "30") call, not on the arg.
|
||||
const cmd = (await import("./render.js")).default;
|
||||
// citty types `args` as Resolvable (it could be a promise/factory); in
|
||||
// practice it's the literal object, so read it through a plain record.
|
||||
const args = cmd.args as unknown as Record<string, { default?: unknown } | undefined>;
|
||||
const fpsArg = args.fps;
|
||||
expect(fpsArg).toBeDefined();
|
||||
expect(fpsArg?.default).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
// Variables-helper tests live in `../utils/variables.test.ts`.
|
||||
|
||||
Reference in New Issue
Block a user