diff --git a/packages/cli/src/commands/compositions.ts b/packages/cli/src/commands/compositions.ts index 55220658..302ed303 100644 --- a/packages/cli/src/commands/compositions.ts +++ b/packages/cli/src/commands/compositions.ts @@ -1,6 +1,7 @@ import { defineCommand } from "citty"; import type { Example } from "./_examples.js"; -import { readFileSync } from "node:fs"; +import { existsSync, readFileSync } from "node:fs"; +import { resolve, dirname } from "node:path"; export const examples: Example[] = [ ["List compositions in the current project", "hyperframes compositions"], @@ -17,9 +18,10 @@ interface CompositionInfo { width: number; height: number; elementCount: number; + source?: string; } -function parseCompositions(html: string): CompositionInfo[] { +function parseCompositions(html: string, baseDir: string): CompositionInfo[] { const parser = new DOMParser(); const doc = parser.parseFromString(html, "text/html"); @@ -30,6 +32,18 @@ function parseCompositions(html: string): CompositionInfo[] { const id = div.getAttribute("data-composition-id") ?? "unknown"; const width = parseInt(div.getAttribute("data-width") ?? "1920", 10); const height = parseInt(div.getAttribute("data-height") ?? "1080", 10); + const compositionSrc = div.getAttribute("data-composition-src"); + + // If this references an external sub-composition, parse that file + if (compositionSrc) { + const subPath = resolve(baseDir, compositionSrc); + if (existsSync(subPath)) { + const subHtml = readFileSync(subPath, "utf-8"); + const subInfo = parseSubComposition(subHtml, id, width, height); + compositions.push({ ...subInfo, source: compositionSrc }); + return; + } + } const timedChildren = div.querySelectorAll("[data-start]"); let maxEnd = 0; @@ -67,6 +81,62 @@ function parseCompositions(html: string): CompositionInfo[] { return compositions; } +function parseSubComposition( + html: string, + fallbackId: string, + fallbackWidth: number, + fallbackHeight: number, +): CompositionInfo { + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + + // Sub-compositions may use