@hyperframes/core 0.6.17 → 0.6.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Shared sub-composition inlining logic.
3
+ *
4
+ * Both the core bundler (preview) and the producer compiler (render) need to
5
+ * inline sub-composition HTML referenced via `data-composition-src`. This
6
+ * module is the single source of truth for that transformation, eliminating
7
+ * divergence that previously caused bugs (e.g. producer not setting
8
+ * `data-composition-file`).
9
+ */
10
+ import { rewriteAssetPaths, rewriteCssAssetUrls, rewriteInlineStyleAssetUrls, } from "./rewriteSubCompPaths";
11
+ import { scopeCssToComposition, wrapScopedCompositionScript } from "./compositionScoping";
12
+ // ---------------------------------------------------------------------------
13
+ // Default helpers
14
+ // ---------------------------------------------------------------------------
15
+ function defaultBuildScopeSelector(compId) {
16
+ const escaped = compId.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
17
+ return `[data-composition-id="${escaped}"]`;
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Core implementation
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Inline sub-compositions into a document. For each host element in `hosts`:
24
+ *
25
+ * 1. Resolve the sub-composition HTML via `options.resolveHtml`
26
+ * 2. Parse it, find `<template>` or `<body>` content
27
+ * 3. Find the inner `[data-composition-id]` root
28
+ * 4. Extract `<style>` elements, scope CSS, collect them
29
+ * 5. Extract `<script>` elements, wrap inline scripts, collect them
30
+ * 6. Collect external script `src` URLs for deduplication
31
+ * 7. Rewrite asset paths (and optionally inline-style asset URLs)
32
+ * 8. Copy dimension attrs from inner root to host if missing
33
+ * 9. Set `data-composition-file` on host
34
+ * 10. Remove `data-composition-src` from host
35
+ * 11. Inject the content into the host element
36
+ */
37
+ export function inlineSubCompositions(document, hosts, options) {
38
+ const { resolveHtml, parseHtml, hostIdentityMap, rewriteInlineStyles = false, flattenInnerRoot, readVariableDefaults, parseHostVariables, buildScopeSelector = defaultBuildScopeSelector, scriptErrorLabel = "[HyperFrames] composition script error:", onMissingComposition, } = options;
39
+ const styles = [];
40
+ const scripts = [];
41
+ const externalScriptSrcs = [];
42
+ const variablesByComp = {};
43
+ for (const hostEl of hosts) {
44
+ const src = hostEl.getAttribute("data-composition-src");
45
+ if (!src)
46
+ continue;
47
+ const compHtml = resolveHtml(src);
48
+ if (compHtml == null) {
49
+ if (onMissingComposition) {
50
+ onMissingComposition(src);
51
+ }
52
+ continue;
53
+ }
54
+ const compDoc = parseHtml(compHtml);
55
+ // Determine composition IDs
56
+ let compId;
57
+ let runtimeCompId;
58
+ if (hostIdentityMap) {
59
+ const identity = hostIdentityMap.get(hostEl);
60
+ compId = identity?.authoredCompositionId || null;
61
+ runtimeCompId = identity?.runtimeCompositionId || compId || "";
62
+ }
63
+ else {
64
+ compId = hostEl.getAttribute("data-composition-id") || null;
65
+ runtimeCompId = compId || "";
66
+ }
67
+ // Find content: prefer <template>, fall back to <body>
68
+ const contentRoot = compDoc.querySelector("template");
69
+ const contentHtml = contentRoot ? contentRoot.innerHTML || "" : compDoc.body?.innerHTML || "";
70
+ const contentDoc = parseHtml(contentHtml);
71
+ // Find the inner composition root
72
+ const innerRoot = compId
73
+ ? contentDoc.querySelector(`[data-composition-id="${compId}"]`)
74
+ : contentDoc.querySelector("[data-composition-id]");
75
+ const inferredCompId = innerRoot?.getAttribute("data-composition-id")?.trim() || "";
76
+ const authoredRootId = innerRoot?.getAttribute("id")?.trim() || null;
77
+ const scopeCompId = compId || inferredCompId;
78
+ const runtimeScope = runtimeCompId ? buildScopeSelector(runtimeCompId) : "";
79
+ // Variable merging (bundler feature)
80
+ if (readVariableDefaults && parseHostVariables && runtimeCompId) {
81
+ const mergedVariables = {
82
+ ...readVariableDefaults(compDoc.documentElement),
83
+ ...parseHostVariables(hostEl),
84
+ };
85
+ if (Object.keys(mergedVariables).length > 0) {
86
+ variablesByComp[runtimeCompId] = mergedVariables;
87
+ }
88
+ }
89
+ // When a sub-composition is a full HTML document (no <template>), styles
90
+ // and scripts in <head> are not part of contentDoc (which only has body
91
+ // content). Extract them so backgrounds, positioning, fonts, and library
92
+ // scripts (e.g. GSAP CDN) are not silently dropped.
93
+ if (!contentRoot && compDoc.head) {
94
+ for (const s of [...compDoc.head.querySelectorAll("style")]) {
95
+ const css = rewriteCssAssetUrls(s.textContent || "", src);
96
+ styles.push(scopeCompId
97
+ ? scopeCssToComposition(css, scopeCompId, runtimeScope || undefined, authoredRootId)
98
+ : css);
99
+ }
100
+ for (const s of [...compDoc.head.querySelectorAll("script")]) {
101
+ const externalSrc = (s.getAttribute("src") || "").trim();
102
+ if (externalSrc && !externalScriptSrcs.includes(externalSrc)) {
103
+ externalScriptSrcs.push(externalSrc);
104
+ }
105
+ }
106
+ }
107
+ // Extract styles from content
108
+ for (const s of [...contentDoc.querySelectorAll("style")]) {
109
+ const css = rewriteCssAssetUrls(s.textContent || "", src);
110
+ styles.push(scopeCompId
111
+ ? scopeCssToComposition(css, scopeCompId, runtimeScope || undefined, authoredRootId)
112
+ : css);
113
+ s.remove();
114
+ }
115
+ // Extract scripts from content
116
+ for (const s of [...contentDoc.querySelectorAll("script")]) {
117
+ const externalSrc = (s.getAttribute("src") || "").trim();
118
+ if (externalSrc) {
119
+ if (!externalScriptSrcs.includes(externalSrc)) {
120
+ externalScriptSrcs.push(externalSrc);
121
+ }
122
+ }
123
+ else {
124
+ scripts.push(scopeCompId
125
+ ? wrapScopedCompositionScript(s.textContent || "", scopeCompId, scriptErrorLabel, runtimeScope || undefined, runtimeCompId || scopeCompId, authoredRootId)
126
+ : `(function(){ try { ${s.textContent || ""} } catch (_err) { console.error(${JSON.stringify(scriptErrorLabel)}, _err); } })();`);
127
+ }
128
+ s.remove();
129
+ }
130
+ // Rewrite relative asset paths before inlining so ../foo.svg from
131
+ // compositions/ resolves correctly when the content moves to root.
132
+ const assetEls = innerRoot
133
+ ? innerRoot.querySelectorAll("[src], [href]")
134
+ : contentDoc.querySelectorAll("[src], [href]");
135
+ rewriteAssetPaths(assetEls, src, (el, attr) => el.getAttribute(attr), (el, attr, val) => {
136
+ el.setAttribute(attr, val);
137
+ });
138
+ if (rewriteInlineStyles) {
139
+ const styledEls = innerRoot
140
+ ? innerRoot.querySelectorAll("[style]")
141
+ : contentDoc.querySelectorAll("[style]");
142
+ rewriteInlineStyleAssetUrls(styledEls, src, (el) => el.getAttribute("style"), (el, val) => {
143
+ el.setAttribute("style", val);
144
+ });
145
+ }
146
+ // Copy dimension attributes from inner root to host if missing
147
+ if (innerRoot) {
148
+ const innerW = innerRoot.getAttribute("data-width");
149
+ const innerH = innerRoot.getAttribute("data-height");
150
+ if (innerW && !hostEl.getAttribute("data-width"))
151
+ hostEl.setAttribute("data-width", innerW);
152
+ if (innerH && !hostEl.getAttribute("data-height")) {
153
+ hostEl.setAttribute("data-height", innerH);
154
+ }
155
+ }
156
+ // Inject content into the host element
157
+ if (innerRoot) {
158
+ innerRoot.setAttribute("data-composition-file", src);
159
+ for (const child of [...innerRoot.querySelectorAll("style, script")])
160
+ child.remove();
161
+ if (flattenInnerRoot) {
162
+ const prepared = flattenInnerRoot(innerRoot);
163
+ hostEl.innerHTML = prepared.outerHTML || "";
164
+ }
165
+ else {
166
+ hostEl.innerHTML = compId ? innerRoot.innerHTML || "" : innerRoot.outerHTML || "";
167
+ }
168
+ }
169
+ else {
170
+ for (const child of [...contentDoc.querySelectorAll("style, script")])
171
+ child.remove();
172
+ // linkedom fragment parsing: when content is `<div data-composition-id="X">...</div>`,
173
+ // the div becomes documentElement and body is empty. Fall back to documentElement.outerHTML
174
+ // to preserve the composition wrapper.
175
+ const bodyHtml = contentDoc.body?.innerHTML || "";
176
+ hostEl.innerHTML = bodyHtml || contentDoc.documentElement?.outerHTML || "";
177
+ }
178
+ hostEl.setAttribute("data-composition-file", src);
179
+ hostEl.removeAttribute("data-composition-src");
180
+ }
181
+ return { styles, scripts, externalScriptSrcs, variablesByComp };
182
+ }
183
+ //# sourceMappingURL=inlineSubCompositions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inlineSubCompositions.js","sourceRoot":"","sources":["../../src/compiler/inlineSubCompositions.ts"],"names":[],"mappings":"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"}