Merge pull request #938 from heygen-com/chore/fallow-config-and-cleanup

chore: add fallow config and fix high-signal findings
This commit is contained in:
James Russo
2026-05-18 16:52:18 -04:00
committed by GitHub
14 changed files with 138 additions and 76 deletions
+92
View File
@@ -0,0 +1,92 @@
{
"$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/**",
],
"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"],
},
],
"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",
],
}
+10 -27
View File
@@ -21,7 +21,7 @@
},
"packages/aws-lambda": {
"name": "@hyperframes/aws-lambda",
"version": "0.0.1",
"version": "0.6.22",
"dependencies": {
"@aws-sdk/client-s3": "^3.700.0",
"@aws-sdk/client-sfn": "^3.700.0",
@@ -53,7 +53,7 @@
},
"packages/cli": {
"name": "@hyperframes/cli",
"version": "0.6.15",
"version": "0.6.22",
"bin": {
"hyperframes": "./dist/cli.js",
},
@@ -66,7 +66,6 @@
"esbuild": "^0.25.12",
"giget": "^3.2.0",
"hono": "^4.0.0",
"mime-types": "^3.0.2",
"onnxruntime-node": "^1.20.0",
"open": "^10.0.0",
"postcss": "^8.5.8",
@@ -97,7 +96,7 @@
},
"packages/core": {
"name": "@hyperframes/core",
"version": "0.6.15",
"version": "0.6.22",
"dependencies": {
"@chenglou/pretext": "^0.0.5",
"postcss": "^8.5.8",
@@ -124,7 +123,7 @@
},
"packages/engine": {
"name": "@hyperframes/engine",
"version": "0.6.15",
"version": "0.6.22",
"dependencies": {
"@hono/node-server": "^1.13.0",
"@hyperframes/core": "workspace:^",
@@ -142,7 +141,7 @@
},
"packages/player": {
"name": "@hyperframes/player",
"version": "0.6.15",
"version": "0.6.22",
"devDependencies": {
"@types/bun": "^1.1.0",
"gsap": "^3.12.5",
@@ -154,7 +153,7 @@
},
"packages/producer": {
"name": "@hyperframes/producer",
"version": "0.6.15",
"version": "0.6.22",
"dependencies": {
"@fontsource/archivo-black": "^5.2.8",
"@fontsource/eb-garamond": "^5.2.7",
@@ -194,7 +193,7 @@
},
"packages/shader-transitions": {
"name": "@hyperframes/shader-transitions",
"version": "0.6.15",
"version": "0.6.22",
"dependencies": {
"html2canvas": "^1.4.1",
},
@@ -206,7 +205,7 @@
},
"packages/studio": {
"name": "@hyperframes/studio",
"version": "0.6.15",
"version": "0.6.22",
"dependencies": {
"@codemirror/autocomplete": "^6.20.1",
"@codemirror/commands": "^6.10.3",
@@ -221,8 +220,6 @@
"@hyperframes/core": "workspace:*",
"@hyperframes/player": "workspace:*",
"@phosphor-icons/react": "^2.1.10",
"codemirror": "^6.0.1",
"motion": "^12.38.0",
},
"devDependencies": {
"@hyperframes/producer": "workspace:*",
@@ -1106,8 +1103,6 @@
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
"codemirror": ["codemirror@6.0.2", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw=="],
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
@@ -1292,8 +1287,6 @@
"fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
"framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="],
"fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
@@ -1498,9 +1491,9 @@
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
"mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
"mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
@@ -1514,12 +1507,6 @@
"mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
"motion": ["motion@12.38.0", "", { "dependencies": { "framer-motion": "^12.38.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w=="],
"motion-dom": ["motion-dom@12.38.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA=="],
"motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
@@ -1904,8 +1891,6 @@
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"aws-cdk-lib/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
"aws-cdk-lib/yaml": ["yaml@1.10.3", "", {}, "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA=="],
"chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
@@ -1990,8 +1975,6 @@
"@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
"aws-cdk-lib/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
"gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
"glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
+1 -2
View File
@@ -18,7 +18,7 @@
"test": "vitest run",
"dev": "tsx src/cli.ts",
"build": "bun run build:fonts && tsup && bun run build:runtime && bun run build:copy",
"build:fonts": "node -e \"const fs=require('fs');if(!fs.existsSync('../producer/src/services/fontData.generated.ts')){const {execSync}=require('child_process');execSync('cd ../producer && tsx scripts/generate-font-data.ts',{stdio:'inherit'})}else{console.log('[build:fonts] skipped — fontData.generated.ts already exists')}\"",
"build:fonts": "node scripts/build-fonts.mjs",
"build:runtime": "tsx scripts/build-runtime.ts",
"build:copy": "node scripts/build-copy.mjs",
"typecheck": "tsc --noEmit"
@@ -32,7 +32,6 @@
"esbuild": "^0.25.12",
"giget": "^3.2.0",
"hono": "^4.0.0",
"mime-types": "^3.0.2",
"onnxruntime-node": "^1.20.0",
"open": "^10.0.0",
"postcss": "^8.5.8",
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env node
import { existsSync } from "node:fs";
import { execSync } from "node:child_process";
const target = "../producer/src/services/fontData.generated.ts";
if (existsSync(target)) {
console.log("[build:fonts] skipped — fontData.generated.ts already exists");
process.exit(0);
}
execSync("cd ../producer && tsx scripts/generate-font-data.ts", {
stdio: "inherit",
});
-22
View File
@@ -1,22 +0,0 @@
export const MIME_TYPES: Record<string, string> = {
".html": "text/html",
".css": "text/css",
".js": "application/javascript",
".json": "application/json",
".svg": "image/svg+xml",
".png": "image/png",
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".gif": "image/gif",
".webp": "image/webp",
".mp4": "video/mp4",
".mov": "video/quicktime",
".webm": "video/webm",
".mp3": "audio/mpeg",
".wav": "audio/wav",
".ogg": "audio/ogg",
".woff2": "font/woff2",
".woff": "font/woff",
".ttf": "font/ttf",
".ico": "image/x-icon",
};
-1
View File
@@ -47,7 +47,6 @@ var __dirname = __hf_dirname(__filename);`,
"hono",
"hono/*",
"@hono/node-server",
"mime-types",
"adm-zip",
"esbuild",
"giget",
+1 -7
View File
@@ -1,4 +1,4 @@
import type { Keyframe, KeyframeProperties } from "../core.types";
import type { Keyframe, KeyframeProperties, ValidationResult } from "../core.types";
export type GsapMethod = "set" | "to" | "from" | "fromTo";
@@ -344,12 +344,6 @@ export function getAnimationsForElement(
return animations.filter((a) => a.targetSelector === selector);
}
export interface ValidationResult {
valid: boolean;
errors: string[];
warnings: string[];
}
const FORBIDDEN_GSAP_PATTERNS: Array<{ pattern: RegExp; message: string }> = [
{ pattern: /\.call\s*\(/, message: "call() method not allowed" },
{
+1 -1
View File
@@ -17,7 +17,7 @@ import {
gsapAnimationsToKeyframes,
getAnimationsForElement,
} from "./gsapParser";
import type { ValidationResult } from "./gsapParser";
import type { ValidationResult } from "../core.types";
const MEDIA_TYPES = new Set<string>(["video", "image", "audio"]);
+1 -1
View File
@@ -32,7 +32,7 @@
},
"scripts": {
"build": "bun run build:fonts && bun run --cwd ../.. build:hyperframes-runtime:modular && node build.mjs",
"build:fonts": "node -e \"const fs=require('fs');if(!fs.existsSync('src/services/fontData.generated.ts')){const {execSync}=require('child_process');execSync('node --experimental-strip-types scripts/generate-font-data.ts',{stdio:'inherit'})}else{console.log('[build:fonts] skipped — fontData.generated.ts already exists')}\"",
"build:fonts": "node scripts/build-fonts.mjs",
"typecheck": "tsc --noEmit",
"parity:check": "tsx src/parity-harness.ts",
"parity:fixtures": "tsx src/parity-fixtures.ts",
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env node
import { existsSync } from "node:fs";
import { execSync } from "node:child_process";
const target = "src/services/fontData.generated.ts";
if (existsSync(target)) {
console.log("[build:fonts] skipped — fontData.generated.ts already exists");
process.exit(0);
}
execSync("node --experimental-strip-types scripts/generate-font-data.ts", {
stdio: "inherit",
});
+1 -3
View File
@@ -38,9 +38,7 @@
"@codemirror/view": "6.40.0",
"@hyperframes/core": "workspace:*",
"@hyperframes/player": "workspace:*",
"@phosphor-icons/react": "^2.1.10",
"codemirror": "^6.0.1",
"motion": "^12.38.0"
"@phosphor-icons/react": "^2.1.10"
},
"devDependencies": {
"@hyperframes/producer": "workspace:*",
@@ -26,9 +26,6 @@ export {
applyStudioBoxSizeDraft,
applyStudioRotation,
applyStudioRotationDraft,
clearStudioPathOffset,
clearStudioRotation,
clearStudioBoxSize,
reapplyPositionEditsAfterSeek,
buildMotionPatches,
buildClearMotionPatches,
@@ -41,6 +38,9 @@ export {
restoreStudioBoxSize,
restoreStudioRotation,
restoreStudioPathOffset,
clearStudioPathOffset,
clearStudioRotation,
clearStudioBoxSize,
} from "./manualEditsSnapshot";
import type { StudioManualEditSeekWindow } from "./manualEditsTypes";
@@ -464,13 +464,6 @@ export function applyStudioRotationDraft(element: HTMLElement, rotation: { angle
);
}
// Clear functions live in manualEditsSnapshot.ts (they depend on restoreInline* helpers).
export {
clearStudioPathOffset,
clearStudioRotation,
clearStudioBoxSize,
} from "./manualEditsSnapshot";
/* ── HTML patch builders ──────────────────────────────────────────── */
import type { PatchOperation } from "../../utils/sourcePatcher";
@@ -86,8 +86,6 @@ export const Eye = makeIcon(PhEye);
export const EyeOff = makeIcon(EyeClosed);
export const File = makeIcon(PhFile);
export const FileCode = makeIcon(PhFileCode);
// FileIcon alias (lucide exports both `File` and `FileIcon`)
export const FileIcon = makeIcon(PhFile);
export const FileText = makeIcon(PhFileText);
export const Film = makeIcon(FilmStrip);
export const Heart = makeIcon(PhHeart);