mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
* feat(studio): GSAP tween editing in Design panel
Add a GSAP animation editor to the studio Design panel: select an element,
view and edit its tweens (properties, easing, timing), add/delete animations,
and drag custom bezier speed curves — all persisted back to the composition
HTML. Gated behind VITE_STUDIO_ENABLE_GSAP_PANEL.
Parsing of existing GSAP source now uses a recast + Babel AST parser instead of
regex, giving scope resolution, stable tween IDs, and round-trip preservation of
extras and unresolved raw values.
recast compiles to CommonJS that calls require("fs"), which breaks browser and
Vite SSR bundles. To contain it, @hyperframes/core is split into an isomorphic
layer and a Node-only AST layer:
- gsapSerialize.ts holds the recast-free helpers (serialization, keyframe
conversion, validation, shared types). htmlParser.ts is now fully isomorphic.
- parseGsapScript and the script-mutation helpers live in gsapParser.ts,
reachable only via the @hyperframes/core/gsap-parser subpath, loaded
server-side by the studio-api mutation routes and the linter via dynamic
import (recast stays external under SSR).
- The barrel and the gsap-constants subpath are recast-free, so studio browser
bundles never trace recast.
Adds AST parser unit + stress coverage and e2e helpers for the panel.
* fix(lint): await async lintHyperframeHtml in all callers
lintHyperframeHtml became async (gsap rules use dynamic import)
but lintProject and check-hyperframe-static weren't awaiting it,
causing typecheck failures and runtime crashes in CI.
Also wire LintRule type in gsap rules to fix fallow unused-type
finding, and suppress render.ts exported-for-tests symbols.
124 lines
4.8 KiB
JSON
124 lines
4.8 KiB
JSON
{
|
|
"$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/config-schema.json",
|
|
"entry": [
|
|
"packages/producer/src/**/*.test.ts",
|
|
"packages/aws-lambda/src/**/*.test.ts",
|
|
"packages/producer/src/regression-harness.ts",
|
|
"packages/producer/src/regression-harness-distributed.test.ts",
|
|
"packages/producer/src/regression-harness-lambda-local.ts",
|
|
"packages/producer/src/transparency-test.ts",
|
|
"packages/producer/src/parity-harness.ts",
|
|
"packages/producer/src/parity-fixtures.ts",
|
|
"packages/producer/src/perf-gate.ts",
|
|
"packages/producer/src/runtime-conformance.ts",
|
|
"packages/producer/src/benchmark.ts",
|
|
"packages/producer/scripts/generate-font-data.ts",
|
|
"packages/cli/scripts/generate-font-data.ts",
|
|
"packages/engine/scripts/test-fitTextFontSize-browser.ts",
|
|
"packages/aws-lambda/scripts/*.ts",
|
|
// Built as standalone IIFE for the browser-side sandbox runtime;
|
|
// referenced by file path (not import) in build-hyperframes-runtime-artifact.ts.
|
|
"packages/core/src/runtime/entry.ts",
|
|
// Worker entry points loaded dynamically by their *Pool.ts companions.
|
|
"packages/producer/src/services/pngDecodeBlitWorker.ts",
|
|
"packages/producer/src/services/shaderTransitionWorker.ts",
|
|
"scripts/*.{ts,mjs,js}",
|
|
"scripts/*/run.mjs",
|
|
],
|
|
"ignorePatterns": [
|
|
"docs/**",
|
|
"packages/producer/tests/**",
|
|
"packages/player/tests/**",
|
|
"packages/engine/tests/**",
|
|
"skills/**/test-corpus/**",
|
|
"skills/**/scripts/**",
|
|
"registry/**",
|
|
"examples/**",
|
|
".github/workflows/fixtures/**",
|
|
// Auto-generated TS client for the HeyGen cloud API. Regenerated by
|
|
// experiment-framework/scripts/generate_hyperframes_cli_client.py via
|
|
// the sync-hyperframes-codegen.yml workflow; complexity/dead-code
|
|
// findings on this file are not actionable from this repo.
|
|
"packages/cli/src/cloud/_gen/**",
|
|
],
|
|
"ignoreExports": [
|
|
// CLI command files: every command exports a const `examples` per the
|
|
// convention documented in CLAUDE.md. This is a namespace barrel, not a
|
|
// collision.
|
|
{ "file": "packages/cli/src/commands/*.ts", "exports": ["examples"] },
|
|
// Independent ML model managers each declare their own DEFAULT_MODEL /
|
|
// MODELS_DIR / ensureModel for their model namespace.
|
|
{
|
|
"file": "packages/cli/src/{background-removal,tts,whisper}/manager.ts",
|
|
"exports": ["DEFAULT_MODEL", "MODELS_DIR", "ensureModel"],
|
|
},
|
|
// `isPathInside` is documented as exported-for-tests only in fileServer.ts;
|
|
// it has different semantics (symlink resolution) from utils/paths.ts.
|
|
{
|
|
"file": "packages/producer/src/services/fileServer.ts",
|
|
"exports": ["isPathInside"],
|
|
},
|
|
// Studio telemetry: consumed by useRenderQueue.ts / StudioFeedbackBar.tsx
|
|
// (deep relative imports) but fallow's static analyzer doesn't trace
|
|
// them. Same path-resolution quirk — trackStudioSessionStart from the
|
|
// same file resolves fine.
|
|
{
|
|
"file": "packages/studio/src/telemetry/events.ts",
|
|
"exports": ["trackStudioRenderStart", "trackStudioFeedback"],
|
|
},
|
|
// domEditingLayers: these exports are consumed via the browser iframe
|
|
// runtime context (not traceable by static import analysis from the
|
|
// studio entry point) or re-exported through the domEditing barrel but
|
|
// have no downstream consumers yet.
|
|
{
|
|
"file": "packages/studio/src/components/editor/domEditingLayers.ts",
|
|
"exports": [
|
|
"isEditableTextLeaf",
|
|
"collectDomEditTextFields",
|
|
"buildElementLabel",
|
|
"refreshDomEditSelection",
|
|
],
|
|
},
|
|
// Exported for render.test.ts (exported-for-tests pattern).
|
|
{
|
|
"file": "packages/cli/src/commands/render.ts",
|
|
"exports": ["resolveBrowserGpuForCli", "renderLocal"],
|
|
},
|
|
],
|
|
"ignoreDependencies": [
|
|
// Runtime/dynamic deps not visible to static analysis: tsup `external`,
|
|
// dynamic require() resolution, peer/static-file consumption in tests,
|
|
// and bun-hoisted workspace devDeps (e.g. happy-dom in root package.json
|
|
// resolves for every workspace, so workspaces don't redeclare it).
|
|
"puppeteer",
|
|
"puppeteer-core",
|
|
"esbuild",
|
|
"giget",
|
|
"gsap",
|
|
"happy-dom",
|
|
"ffmpeg-static",
|
|
"ffprobe-static",
|
|
"@hyperframes/core",
|
|
"@hyperframes/studio",
|
|
"@hyperframes/producer",
|
|
"@fontsource/archivo-black",
|
|
"@fontsource/eb-garamond",
|
|
"@fontsource/ibm-plex-mono",
|
|
"@fontsource/inter",
|
|
"@fontsource/jetbrains-mono",
|
|
"@fontsource/league-gothic",
|
|
"@fontsource/montserrat",
|
|
"@fontsource/nunito",
|
|
"@fontsource/oswald",
|
|
"@fontsource/outfit",
|
|
"@fontsource/space-mono",
|
|
"@fontsource/lato",
|
|
"@fontsource/noto-sans-jp",
|
|
"@fontsource/open-sans",
|
|
"@fontsource/playfair-display",
|
|
"@fontsource/poppins",
|
|
"@fontsource/roboto",
|
|
"@fontsource/source-code-pro",
|
|
],
|
|
}
|