diff --git a/packages/core/src/compiler/htmlBundler.ts b/packages/core/src/compiler/htmlBundler.ts index 3e1377d84..862c6460a 100644 --- a/packages/core/src/compiler/htmlBundler.ts +++ b/packages/core/src/compiler/htmlBundler.ts @@ -7,15 +7,12 @@ import { parseHTMLContent, stripEmbeddedRuntimeScripts, } from "./htmlDocument"; -import { - rewriteAssetPaths, - rewriteCssAssetUrls, - rewriteInlineStyleAssetUrls, -} from "./rewriteSubCompPaths"; +// rewriteSubCompPaths functions are used by inlineSubCompositions (shared module) import { scopeCssToComposition, wrapScopedCompositionScript } from "./compositionScoping"; import { validateHyperframeHtmlContract } from "./staticGuard"; import { getHyperframeRuntimeScript } from "../generated/runtime-inline"; import { readDeclaredDefaults } from "../runtime/getVariables"; +import { inlineSubCompositions } from "./inlineSubCompositions"; /** Resolve a relative path within projectDir, rejecting traversal outside it. */ function safePath(projectDir: string, relativePath: string): string | null { @@ -581,144 +578,36 @@ export async function bundleToSingleHtml( } } - // Inline sub-compositions - const compStyleChunks: string[] = []; - const compScriptChunks: string[] = []; - const compExternalScriptSrcs: string[] = []; - const compVariablesByComp: Record> = {}; + // Inline sub-compositions (via shared function) const trackedCompositionHosts = getBundledTrackedCompositionHosts(document); const hostIdentityByElement = assignBundledRuntimeCompositionIds(trackedCompositionHosts); const subCompositionHosts = trackedCompositionHosts.filter((host) => host.hasAttribute("data-composition-src"), ); - for (const hostEl of subCompositionHosts) { - const src = hostEl.getAttribute("data-composition-src"); - if (!src || !isRelativeUrl(src)) continue; - const compPath = safePath(projectDir, src); - const compHtml = compPath ? safeReadFile(compPath) : null; - if (compHtml == null) { - console.warn(`[Bundler] Composition file not found: ${src}`); - continue; - } - - const compDoc = parseHTMLContent(compHtml); - const hostIdentity = hostIdentityByElement.get(hostEl); - const compId = hostIdentity?.authoredCompositionId || null; - const runtimeCompId = hostIdentity?.runtimeCompositionId || compId || ""; - const contentRoot = compDoc.querySelector("template"); - const contentHtml = contentRoot ? contentRoot.innerHTML || "" : compDoc.body.innerHTML || ""; - const contentDoc = parseHTMLContent(contentHtml); - const innerRoot = compId - ? contentDoc.querySelector(`[data-composition-id="${compId}"]`) - : contentDoc.querySelector("[data-composition-id]"); - const inferredCompId = innerRoot?.getAttribute("data-composition-id")?.trim() || ""; - const authoredRootId = innerRoot?.getAttribute("id")?.trim() || null; - const scopeCompId = compId || inferredCompId; - const runtimeScope = runtimeCompId - ? cssAttributeSelector("data-composition-id", runtimeCompId) - : ""; - const mergedVariables = runtimeCompId - ? { - ...readDeclaredDefaults(compDoc.documentElement), - ...parseHostVariableValues(hostEl), - } - : {}; - if (runtimeCompId && Object.keys(mergedVariables).length > 0) { - compVariablesByComp[runtimeCompId] = mergedVariables; - } - - // When a sub-composition is a full HTML document (no