mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-07 18:26:17 +00:00
* refactor: extract @hyperframes/studio-server package from core Moves all studio-api routes, helpers, and Hono server wiring from packages/core/src/studio-api/ into a new standalone packages/studio-server package (@hyperframes/studio-server). Core keeps thin re-export stubs at @hyperframes/core/studio-api and the subpath helpers (screenshot-clip, draft-markers, etc.) for backward compatibility. Consumer imports (cli studioServer, vite adapter/config, producer htmlCompiler, studio manualEditsTypes) are updated to import from @hyperframes/studio-server directly. Also exports rewriteInlineStyleAssetUrls from @hyperframes/core root (was in compiler/rewriteSubCompPaths.ts but not re-exported), required by @hyperframes/studio-server/helpers/subComposition. Removes postcss-selector-parser from @hyperframes/core dependencies (moved to @hyperframes/studio-server which owns the routes that used it). Depends on @hyperframes/parsers (PR #1755). * fix(ci): add parsers+studio-server to Dockerfile and build before preview tests * fix(ci): build @hyperframes/studio-server before Test and studio load smoke Studio's vite.config.ts imports @hyperframes/studio-server, which resolves via its "node" export condition to built dist. The Test and studio-load-smoke jobs only built parsers + core, so esbuild's config load failed to resolve the package entry. Build studio-server too. * fix(studio): repoint sdkCutoverParity test import to studio-server sourceMutation moved from core's studio-api to @hyperframes/studio-server; the test still imported the deleted core path. This was masked while studio's vite.config failed to load (couldn't resolve studio-server); now that the config loads, the test runs and the stale import surfaced.
41 lines
1.6 KiB
TypeScript
41 lines
1.6 KiB
TypeScript
import { join } from "node:path";
|
|
import { readdirSync } from "node:fs";
|
|
|
|
// `isSafePath` lives at the package root so non-studio-api layers (compiler,
|
|
// CLI, engine) can share it without a backwards dependency on studio-api.
|
|
// Re-exported here for back-compat with existing `../helpers/safePath.js` imports.
|
|
export { isSafePath, resolveWithinProject } from "@hyperframes/core";
|
|
|
|
const IGNORE_DIRS = new Set([".thumbnails", "node_modules", ".git"]);
|
|
|
|
function shouldIgnoreDir(rel: string): boolean {
|
|
return rel === ".hyperframes/backup";
|
|
}
|
|
|
|
/**
|
|
* True when any directory segment of a relative path is a dot-directory or
|
|
* node_modules. Projects that vendor tooling assets under dot-directories
|
|
* (.hyperframes/, .cache/, …) ship example/preset HTML that must not surface
|
|
* as project compositions or studio lint targets (#1384). The file tree is
|
|
* deliberately not filtered — this only gates discovery.
|
|
*/
|
|
export function isInHiddenOrVendorDir(relPath: string): boolean {
|
|
const segments = relPath.split("/");
|
|
return segments.slice(0, -1).some((seg) => seg.startsWith(".") || seg === "node_modules");
|
|
}
|
|
|
|
/** Recursively walk a directory and return relative file paths. */
|
|
export function walkDir(dir: string, prefix = ""): string[] {
|
|
const files: string[] = [];
|
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
if (IGNORE_DIRS.has(entry.name) || shouldIgnoreDir(rel)) continue;
|
|
if (entry.isDirectory()) {
|
|
files.push(...walkDir(join(dir, entry.name), rel));
|
|
} else {
|
|
files.push(rel);
|
|
}
|
|
}
|
|
return files;
|
|
}
|