@hyperframes/core 0.1.0
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.
- package/README.md +125 -0
- package/dist/adapters/gsap.d.ts +14 -0
- package/dist/adapters/gsap.d.ts.map +1 -0
- package/dist/adapters/gsap.js +25 -0
- package/dist/adapters/gsap.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +15 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/compiler/htmlBundler.d.ts +16 -0
- package/dist/compiler/htmlBundler.d.ts.map +1 -0
- package/dist/compiler/htmlBundler.js +448 -0
- package/dist/compiler/htmlBundler.js.map +1 -0
- package/dist/compiler/htmlCompiler.d.ts +18 -0
- package/dist/compiler/htmlCompiler.d.ts.map +1 -0
- package/dist/compiler/htmlCompiler.js +65 -0
- package/dist/compiler/htmlCompiler.js.map +1 -0
- package/dist/compiler/index.d.ts +5 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +9 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/staticGuard.d.ts +8 -0
- package/dist/compiler/staticGuard.d.ts.map +1 -0
- package/dist/compiler/staticGuard.js +26 -0
- package/dist/compiler/staticGuard.js.map +1 -0
- package/dist/compiler/timingCompiler.d.ts +72 -0
- package/dist/compiler/timingCompiler.d.ts.map +1 -0
- package/dist/compiler/timingCompiler.js +191 -0
- package/dist/compiler/timingCompiler.js.map +1 -0
- package/dist/core.types.d.ts +314 -0
- package/dist/core.types.d.ts.map +1 -0
- package/dist/core.types.js +52 -0
- package/dist/core.types.js.map +1 -0
- package/dist/generators/hyperframes.d.ts +21 -0
- package/dist/generators/hyperframes.d.ts.map +1 -0
- package/dist/generators/hyperframes.js +572 -0
- package/dist/generators/hyperframes.js.map +1 -0
- package/dist/hyperframe.manifest.json +22 -0
- package/dist/hyperframe.runtime.iife.js +13 -0
- package/dist/hyperframe.runtime.mjs +13 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-scripts/hyperframe.d.ts +13 -0
- package/dist/inline-scripts/hyperframe.d.ts.map +1 -0
- package/dist/inline-scripts/hyperframe.js +15 -0
- package/dist/inline-scripts/hyperframe.js.map +1 -0
- package/dist/inline-scripts/hyperframesRuntime.engine.d.ts +7 -0
- package/dist/inline-scripts/hyperframesRuntime.engine.d.ts.map +1 -0
- package/dist/inline-scripts/hyperframesRuntime.engine.js +31 -0
- package/dist/inline-scripts/hyperframesRuntime.engine.js.map +1 -0
- package/dist/inline-scripts/parityContract.d.ts +5 -0
- package/dist/inline-scripts/parityContract.d.ts.map +1 -0
- package/dist/inline-scripts/parityContract.js +43 -0
- package/dist/inline-scripts/parityContract.js.map +1 -0
- package/dist/inline-scripts/pickerApi.d.ts +32 -0
- package/dist/inline-scripts/pickerApi.d.ts.map +1 -0
- package/dist/inline-scripts/pickerApi.js +2 -0
- package/dist/inline-scripts/pickerApi.js.map +1 -0
- package/dist/inline-scripts/runtimeContract.d.ts +14 -0
- package/dist/inline-scripts/runtimeContract.d.ts.map +1 -0
- package/dist/inline-scripts/runtimeContract.js +21 -0
- package/dist/inline-scripts/runtimeContract.js.map +1 -0
- package/dist/lint/hyperframeLinter.d.ts +3 -0
- package/dist/lint/hyperframeLinter.d.ts.map +1 -0
- package/dist/lint/hyperframeLinter.js +621 -0
- package/dist/lint/hyperframeLinter.js.map +1 -0
- package/dist/lint/index.d.ts +3 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +2 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/lint/types.d.ts +21 -0
- package/dist/lint/types.d.ts.map +1 -0
- package/dist/lint/types.js +2 -0
- package/dist/lint/types.js.map +1 -0
- package/dist/parsers/gsapParser.d.ts +50 -0
- package/dist/parsers/gsapParser.d.ts.map +1 -0
- package/dist/parsers/gsapParser.js +411 -0
- package/dist/parsers/gsapParser.js.map +1 -0
- package/dist/parsers/htmlParser.d.ts +29 -0
- package/dist/parsers/htmlParser.d.ts.map +1 -0
- package/dist/parsers/htmlParser.js +726 -0
- package/dist/parsers/htmlParser.js.map +1 -0
- package/dist/templates/base.d.ts +4 -0
- package/dist/templates/base.d.ts.map +1 -0
- package/dist/templates/base.js +20 -0
- package/dist/templates/base.js.map +1 -0
- package/dist/templates/constants.d.ts +7 -0
- package/dist/templates/constants.d.ts.map +1 -0
- package/dist/templates/constants.js +8 -0
- package/dist/templates/constants.js.map +1 -0
- package/docs/common-mistakes.md +73 -0
- package/docs/core.md +532 -0
- package/docs/core_notes.md +61 -0
- package/docs/quickstart-template.html +180 -0
- package/docs/versions/changelog.md +5 -0
- package/docs/versions/v0.1/core.md +326 -0
- package/package.json +83 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { join, resolve, isAbsolute, sep } from "path";
|
|
3
|
+
import * as cheerio from "cheerio";
|
|
4
|
+
import { transformSync } from "esbuild";
|
|
5
|
+
import { compileHtml } from "./htmlCompiler";
|
|
6
|
+
import { validateHyperframeHtmlContract } from "./staticGuard";
|
|
7
|
+
/** Resolve a relative path within projectDir, rejecting traversal outside it. */
|
|
8
|
+
function safePath(projectDir, relativePath) {
|
|
9
|
+
const resolved = resolve(projectDir, relativePath);
|
|
10
|
+
const normalizedBase = resolve(projectDir) + sep;
|
|
11
|
+
if (!resolved.startsWith(normalizedBase) && resolved !== resolve(projectDir))
|
|
12
|
+
return null;
|
|
13
|
+
return resolved;
|
|
14
|
+
}
|
|
15
|
+
const RUNTIME_BOOTSTRAP_ATTR = "data-hyperframes-preview-runtime";
|
|
16
|
+
const DEFAULT_RUNTIME_SCRIPT_URL = "";
|
|
17
|
+
function stripEmbeddedRuntimeScripts(html) {
|
|
18
|
+
if (!html)
|
|
19
|
+
return html;
|
|
20
|
+
const scriptRe = /<script\b[^>]*>[\s\S]*?<\/script>/gi;
|
|
21
|
+
const runtimeSrcMarkers = [
|
|
22
|
+
"hyperframe.runtime.iife.js",
|
|
23
|
+
"hyperframe-runtime.modular-runtime.inline.js",
|
|
24
|
+
RUNTIME_BOOTSTRAP_ATTR,
|
|
25
|
+
];
|
|
26
|
+
const runtimeInlineMarkers = [
|
|
27
|
+
"__hyperframeRuntimeBootstrapped",
|
|
28
|
+
"__hyperframeRuntime",
|
|
29
|
+
"__hyperframeRuntimeTeardown",
|
|
30
|
+
"window.__player =",
|
|
31
|
+
"window.__playerReady",
|
|
32
|
+
"window.__renderReady",
|
|
33
|
+
];
|
|
34
|
+
const shouldStrip = (block) => {
|
|
35
|
+
const lowered = block.toLowerCase();
|
|
36
|
+
for (const marker of runtimeSrcMarkers) {
|
|
37
|
+
if (lowered.includes(marker.toLowerCase()))
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
for (const marker of runtimeInlineMarkers) {
|
|
41
|
+
if (block.includes(marker))
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
};
|
|
46
|
+
return html.replace(scriptRe, (block) => (shouldStrip(block) ? "" : block));
|
|
47
|
+
}
|
|
48
|
+
function getRuntimeScriptUrl() {
|
|
49
|
+
const configured = (process.env.HYPERFRAME_RUNTIME_URL || "").trim();
|
|
50
|
+
return configured || DEFAULT_RUNTIME_SCRIPT_URL;
|
|
51
|
+
}
|
|
52
|
+
function injectInterceptor(html) {
|
|
53
|
+
const sanitized = stripEmbeddedRuntimeScripts(html);
|
|
54
|
+
if (sanitized.includes(RUNTIME_BOOTSTRAP_ATTR))
|
|
55
|
+
return sanitized;
|
|
56
|
+
const runtimeScriptUrl = getRuntimeScriptUrl().replace(/"/g, """);
|
|
57
|
+
const tag = `<script ${RUNTIME_BOOTSTRAP_ATTR}="1" src="${runtimeScriptUrl}"></script>`;
|
|
58
|
+
if (sanitized.includes("</head>")) {
|
|
59
|
+
return sanitized.replace("</head>", `${tag}\n</head>`);
|
|
60
|
+
}
|
|
61
|
+
const doctypeIdx = sanitized.toLowerCase().indexOf("<!doctype");
|
|
62
|
+
if (doctypeIdx >= 0) {
|
|
63
|
+
const insertPos = sanitized.indexOf(">", doctypeIdx) + 1;
|
|
64
|
+
return sanitized.slice(0, insertPos) + tag + sanitized.slice(insertPos);
|
|
65
|
+
}
|
|
66
|
+
return tag + sanitized;
|
|
67
|
+
}
|
|
68
|
+
function isRelativeUrl(url) {
|
|
69
|
+
if (!url)
|
|
70
|
+
return false;
|
|
71
|
+
return !url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("//") && !url.startsWith("data:") && !isAbsolute(url);
|
|
72
|
+
}
|
|
73
|
+
function safeReadFile(filePath) {
|
|
74
|
+
if (!existsSync(filePath))
|
|
75
|
+
return null;
|
|
76
|
+
try {
|
|
77
|
+
return readFileSync(filePath, "utf-8");
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function safeReadFileBuffer(filePath) {
|
|
84
|
+
if (!existsSync(filePath))
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
return readFileSync(filePath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function splitUrlSuffix(urlValue) {
|
|
94
|
+
const queryIdx = urlValue.indexOf("?");
|
|
95
|
+
const hashIdx = urlValue.indexOf("#");
|
|
96
|
+
if (queryIdx < 0 && hashIdx < 0)
|
|
97
|
+
return { basePath: urlValue, suffix: "" };
|
|
98
|
+
const cutIdx = queryIdx < 0 ? hashIdx : hashIdx < 0 ? queryIdx : Math.min(queryIdx, hashIdx);
|
|
99
|
+
return { basePath: urlValue.slice(0, cutIdx), suffix: urlValue.slice(cutIdx) };
|
|
100
|
+
}
|
|
101
|
+
function appendSuffixToUrl(baseUrl, suffix) {
|
|
102
|
+
if (!suffix)
|
|
103
|
+
return baseUrl;
|
|
104
|
+
if (suffix.startsWith("#"))
|
|
105
|
+
return `${baseUrl}${suffix}`;
|
|
106
|
+
if (suffix.startsWith("?")) {
|
|
107
|
+
const queryWithOptionalHash = suffix.slice(1);
|
|
108
|
+
if (!queryWithOptionalHash)
|
|
109
|
+
return baseUrl;
|
|
110
|
+
const hashIdx = queryWithOptionalHash.indexOf("#");
|
|
111
|
+
const queryPart = hashIdx >= 0 ? queryWithOptionalHash.slice(0, hashIdx) : queryWithOptionalHash;
|
|
112
|
+
const hashPart = hashIdx >= 0 ? queryWithOptionalHash.slice(hashIdx) : "";
|
|
113
|
+
if (!queryPart)
|
|
114
|
+
return `${baseUrl}${hashPart}`;
|
|
115
|
+
const joiner = baseUrl.includes("?") ? "&" : "?";
|
|
116
|
+
return `${baseUrl}${joiner}${queryPart}${hashPart}`;
|
|
117
|
+
}
|
|
118
|
+
return baseUrl;
|
|
119
|
+
}
|
|
120
|
+
function guessMimeType(filePath) {
|
|
121
|
+
const l = filePath.toLowerCase();
|
|
122
|
+
if (l.endsWith(".svg"))
|
|
123
|
+
return "image/svg+xml";
|
|
124
|
+
if (l.endsWith(".json"))
|
|
125
|
+
return "application/json";
|
|
126
|
+
if (l.endsWith(".txt"))
|
|
127
|
+
return "text/plain";
|
|
128
|
+
if (l.endsWith(".xml"))
|
|
129
|
+
return "application/xml";
|
|
130
|
+
return "application/octet-stream";
|
|
131
|
+
}
|
|
132
|
+
function shouldInlineAsDataUrl(filePath) {
|
|
133
|
+
const l = filePath.toLowerCase();
|
|
134
|
+
return l.endsWith(".svg") || l.endsWith(".json") || l.endsWith(".txt") || l.endsWith(".xml");
|
|
135
|
+
}
|
|
136
|
+
function maybeInlineRelativeAssetUrl(urlValue, projectDir) {
|
|
137
|
+
if (!urlValue || !isRelativeUrl(urlValue))
|
|
138
|
+
return null;
|
|
139
|
+
const { basePath, suffix } = splitUrlSuffix(urlValue.trim());
|
|
140
|
+
if (!basePath)
|
|
141
|
+
return null;
|
|
142
|
+
const filePath = safePath(projectDir, basePath);
|
|
143
|
+
if (!filePath || !shouldInlineAsDataUrl(filePath))
|
|
144
|
+
return null;
|
|
145
|
+
const content = safeReadFileBuffer(filePath);
|
|
146
|
+
if (content == null)
|
|
147
|
+
return null;
|
|
148
|
+
const mimeType = guessMimeType(filePath);
|
|
149
|
+
const dataUrl = `data:${mimeType};base64,${content.toString("base64")}`;
|
|
150
|
+
return appendSuffixToUrl(dataUrl, suffix);
|
|
151
|
+
}
|
|
152
|
+
function rewriteSrcsetWithInlinedAssets(srcsetValue, projectDir) {
|
|
153
|
+
if (!srcsetValue)
|
|
154
|
+
return srcsetValue;
|
|
155
|
+
return srcsetValue.split(",").map((rawCandidate) => {
|
|
156
|
+
const candidate = rawCandidate.trim();
|
|
157
|
+
if (!candidate)
|
|
158
|
+
return candidate;
|
|
159
|
+
const parts = candidate.split(/\s+/);
|
|
160
|
+
if (parts.length === 0)
|
|
161
|
+
return candidate;
|
|
162
|
+
const maybeInlined = maybeInlineRelativeAssetUrl(parts[0] ?? "", projectDir);
|
|
163
|
+
if (maybeInlined)
|
|
164
|
+
parts[0] = maybeInlined;
|
|
165
|
+
return parts.join(" ");
|
|
166
|
+
}).join(", ");
|
|
167
|
+
}
|
|
168
|
+
function rewriteCssUrlsWithInlinedAssets(cssText, projectDir) {
|
|
169
|
+
if (!cssText)
|
|
170
|
+
return cssText;
|
|
171
|
+
return cssText.replace(/\burl\(\s*(["']?)([^)"']+)\1\s*\)/g, (_full, quote, rawUrl) => {
|
|
172
|
+
const maybeInlined = maybeInlineRelativeAssetUrl((rawUrl || "").trim(), projectDir);
|
|
173
|
+
if (!maybeInlined)
|
|
174
|
+
return _full;
|
|
175
|
+
return `url(${quote || ""}${maybeInlined}${quote || ""})`;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function enforceCompositionPixelSizing($) {
|
|
179
|
+
const compositionEls = $("[data-composition-id][data-width][data-height]").toArray();
|
|
180
|
+
if (compositionEls.length === 0)
|
|
181
|
+
return;
|
|
182
|
+
const sizeMap = new Map();
|
|
183
|
+
for (const el of compositionEls) {
|
|
184
|
+
const compId = $(el).attr("data-composition-id");
|
|
185
|
+
const w = Number($(el).attr("data-width"));
|
|
186
|
+
const h = Number($(el).attr("data-height"));
|
|
187
|
+
if (compId && Number.isFinite(w) && Number.isFinite(h) && w > 0 && h > 0) {
|
|
188
|
+
sizeMap.set(compId, { w, h });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (sizeMap.size === 0)
|
|
192
|
+
return;
|
|
193
|
+
$("style").each((_, styleEl) => {
|
|
194
|
+
let css = $(styleEl).html() || "";
|
|
195
|
+
let modified = false;
|
|
196
|
+
for (const [compId, { w, h }] of sizeMap) {
|
|
197
|
+
const escaped = compId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
198
|
+
const blockRe = new RegExp(`(\\[data-composition-id=["']${escaped}["']\\]\\s*\\{)([^}]*)(})`, "g");
|
|
199
|
+
css = css.replace(blockRe, (_, open, body, close) => {
|
|
200
|
+
const newBody = body.replace(/(\bwidth\s*:\s*)100%/g, `$1${w}px`).replace(/(\bheight\s*:\s*)100%/g, `$1${h}px`);
|
|
201
|
+
if (newBody !== body)
|
|
202
|
+
modified = true;
|
|
203
|
+
return open + newBody + close;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
if (modified)
|
|
207
|
+
$(styleEl).text(css);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function autoHealMissingCompositionIds($) {
|
|
211
|
+
const compositionIdRe = /data-composition-id=["']([^"']+)["']/gi;
|
|
212
|
+
const referencedIds = new Set();
|
|
213
|
+
$("style, script").each((_, el) => {
|
|
214
|
+
const text = ($(el).html() || "").trim();
|
|
215
|
+
if (!text)
|
|
216
|
+
return;
|
|
217
|
+
let match;
|
|
218
|
+
while ((match = compositionIdRe.exec(text)) !== null) {
|
|
219
|
+
const compId = (match[1] || "").trim();
|
|
220
|
+
if (compId)
|
|
221
|
+
referencedIds.add(compId);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
if (referencedIds.size === 0)
|
|
225
|
+
return;
|
|
226
|
+
const existingIds = new Set();
|
|
227
|
+
$("[data-composition-id]").each((_, el) => {
|
|
228
|
+
const id = ($(el).attr("data-composition-id") || "").trim();
|
|
229
|
+
if (id)
|
|
230
|
+
existingIds.add(id);
|
|
231
|
+
});
|
|
232
|
+
for (const compId of referencedIds) {
|
|
233
|
+
if (compId === "root" || existingIds.has(compId))
|
|
234
|
+
continue;
|
|
235
|
+
const candidates = [`${compId}-layer`, `${compId}-comp`, compId];
|
|
236
|
+
for (const targetId of candidates) {
|
|
237
|
+
const match = $(`#${targetId}`).first();
|
|
238
|
+
if (match.length > 0 && !match.attr("data-composition-id")) {
|
|
239
|
+
match.attr("data-composition-id", compId);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function coalesceHeadStylesAndBodyScripts($) {
|
|
246
|
+
const headStyleEls = $("head style").toArray();
|
|
247
|
+
if (headStyleEls.length > 1) {
|
|
248
|
+
const importRe = /@import\s+url\([^)]*\)\s*;|@import\s+["'][^"']+["']\s*;/gi;
|
|
249
|
+
const imports = [];
|
|
250
|
+
const cssParts = [];
|
|
251
|
+
const seenImports = new Set();
|
|
252
|
+
for (const el of headStyleEls) {
|
|
253
|
+
const raw = ($(el).html() || "").trim();
|
|
254
|
+
if (!raw)
|
|
255
|
+
continue;
|
|
256
|
+
const nonImportCss = raw.replace(importRe, (match) => {
|
|
257
|
+
const cleaned = match.trim();
|
|
258
|
+
if (!seenImports.has(cleaned)) {
|
|
259
|
+
seenImports.add(cleaned);
|
|
260
|
+
imports.push(cleaned);
|
|
261
|
+
}
|
|
262
|
+
return "";
|
|
263
|
+
});
|
|
264
|
+
const trimmed = nonImportCss.trim();
|
|
265
|
+
if (trimmed)
|
|
266
|
+
cssParts.push(trimmed);
|
|
267
|
+
}
|
|
268
|
+
const merged = [...imports, ...cssParts].join("\n\n").trim();
|
|
269
|
+
if (merged) {
|
|
270
|
+
$(headStyleEls[0]).text(merged);
|
|
271
|
+
for (let i = 1; i < headStyleEls.length; i++)
|
|
272
|
+
$(headStyleEls[i]).remove();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const bodyInlineScripts = $("body script").toArray().filter((el) => {
|
|
276
|
+
const src = ($(el).attr("src") || "").trim();
|
|
277
|
+
if (src)
|
|
278
|
+
return false;
|
|
279
|
+
const type = ($(el).attr("type") || "").trim().toLowerCase();
|
|
280
|
+
return !type || type === "text/javascript" || type === "application/javascript";
|
|
281
|
+
});
|
|
282
|
+
if (bodyInlineScripts.length > 0) {
|
|
283
|
+
const mergedJs = bodyInlineScripts.map((el) => ($(el).html() || "").trim()).filter(Boolean).join("\n;\n").trim();
|
|
284
|
+
for (const el of bodyInlineScripts)
|
|
285
|
+
$(el).remove();
|
|
286
|
+
if (mergedJs) {
|
|
287
|
+
const stripped = stripJsCommentsParserSafe(mergedJs);
|
|
288
|
+
$("body").append(`<script>${stripped}</script>`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
function stripJsCommentsParserSafe(source) {
|
|
293
|
+
if (!source)
|
|
294
|
+
return source;
|
|
295
|
+
try {
|
|
296
|
+
const result = transformSync(source, { loader: "js", minify: false, legalComments: "none" });
|
|
297
|
+
return result.code.trim();
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return source;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Bundle a project's index.html into a single self-contained HTML file.
|
|
305
|
+
*
|
|
306
|
+
* - Compiles timing attributes and optionally resolves media durations
|
|
307
|
+
* - Injects the HyperFrames runtime script
|
|
308
|
+
* - Inlines local CSS and JS files
|
|
309
|
+
* - Inlines sub-composition HTML fragments (data-composition-src)
|
|
310
|
+
* - Inlines small textual assets as data URLs
|
|
311
|
+
*/
|
|
312
|
+
export async function bundleToSingleHtml(projectDir, options) {
|
|
313
|
+
const indexPath = join(projectDir, "index.html");
|
|
314
|
+
if (!existsSync(indexPath))
|
|
315
|
+
throw new Error("index.html not found in project directory");
|
|
316
|
+
const rawHtml = readFileSync(indexPath, "utf-8");
|
|
317
|
+
const compiled = await compileHtml(rawHtml, projectDir, options?.probeMediaDuration);
|
|
318
|
+
const staticGuard = validateHyperframeHtmlContract(compiled);
|
|
319
|
+
if (!staticGuard.isValid) {
|
|
320
|
+
console.warn(`[StaticGuard] Invalid HyperFrame contract: ${staticGuard.missingKeys.join("; ")}`);
|
|
321
|
+
}
|
|
322
|
+
const withInterceptor = injectInterceptor(compiled);
|
|
323
|
+
const $ = cheerio.load(withInterceptor);
|
|
324
|
+
// Inline local CSS
|
|
325
|
+
const localCssChunks = [];
|
|
326
|
+
let cssAnchorPlaced = false;
|
|
327
|
+
$('link[rel="stylesheet"]').each((_, el) => {
|
|
328
|
+
const href = $(el).attr("href");
|
|
329
|
+
if (!href || !isRelativeUrl(href))
|
|
330
|
+
return;
|
|
331
|
+
const cssPath = safePath(projectDir, href);
|
|
332
|
+
const css = cssPath ? safeReadFile(cssPath) : null;
|
|
333
|
+
if (css == null)
|
|
334
|
+
return;
|
|
335
|
+
localCssChunks.push(css);
|
|
336
|
+
if (!cssAnchorPlaced) {
|
|
337
|
+
$(el).replaceWith('<style data-hf-bundled-local-css="1"></style>');
|
|
338
|
+
cssAnchorPlaced = true;
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
$(el).remove();
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
if (localCssChunks.length > 0) {
|
|
345
|
+
const $anchor = $('style[data-hf-bundled-local-css="1"]').first();
|
|
346
|
+
if ($anchor.length)
|
|
347
|
+
$anchor.removeAttr("data-hf-bundled-local-css").text(localCssChunks.join("\n\n"));
|
|
348
|
+
else
|
|
349
|
+
$("head").append(`<style>${localCssChunks.join("\n\n")}</style>`);
|
|
350
|
+
}
|
|
351
|
+
// Inline local JS
|
|
352
|
+
const localJsChunks = [];
|
|
353
|
+
let jsAnchorPlaced = false;
|
|
354
|
+
$("script[src]").each((_, el) => {
|
|
355
|
+
const src = $(el).attr("src");
|
|
356
|
+
if (!src || !isRelativeUrl(src))
|
|
357
|
+
return;
|
|
358
|
+
const jsPath = safePath(projectDir, src);
|
|
359
|
+
const js = jsPath ? safeReadFile(jsPath) : null;
|
|
360
|
+
if (js == null)
|
|
361
|
+
return;
|
|
362
|
+
localJsChunks.push(js);
|
|
363
|
+
if (!jsAnchorPlaced) {
|
|
364
|
+
$(el).replaceWith('<script data-hf-bundled-local-js="1"></script>');
|
|
365
|
+
jsAnchorPlaced = true;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
$(el).remove();
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
if (localJsChunks.length > 0) {
|
|
372
|
+
const $anchor = $('script[data-hf-bundled-local-js="1"]').first();
|
|
373
|
+
if ($anchor.length)
|
|
374
|
+
$anchor.removeAttr("data-hf-bundled-local-js").text(localJsChunks.join("\n;\n"));
|
|
375
|
+
else
|
|
376
|
+
$("body").append(`<script>${localJsChunks.join("\n;\n")}</script>`);
|
|
377
|
+
}
|
|
378
|
+
// Inline sub-compositions
|
|
379
|
+
const compStyleChunks = [];
|
|
380
|
+
const compScriptChunks = [];
|
|
381
|
+
$("[data-composition-src]").each((_, hostEl) => {
|
|
382
|
+
const src = $(hostEl).attr("data-composition-src");
|
|
383
|
+
if (!src || !isRelativeUrl(src))
|
|
384
|
+
return;
|
|
385
|
+
const compPath = safePath(projectDir, src);
|
|
386
|
+
const compHtml = compPath ? safeReadFile(compPath) : null;
|
|
387
|
+
if (compHtml == null) {
|
|
388
|
+
console.warn(`[Bundler] Composition file not found: ${src}`);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const $comp = cheerio.load(compHtml);
|
|
392
|
+
const compId = $(hostEl).attr("data-composition-id");
|
|
393
|
+
const $contentRoot = $comp("template").first();
|
|
394
|
+
const contentHtml = $contentRoot.length ? $contentRoot.html() || "" : $comp("body").html() || "";
|
|
395
|
+
const $content = cheerio.load(contentHtml);
|
|
396
|
+
const $innerRoot = compId ? $content(`[data-composition-id="${compId}"]`).first() : $content("[data-composition-id]").first();
|
|
397
|
+
$content("style").each((_, s) => { compStyleChunks.push($content(s).html() || ""); $content(s).remove(); });
|
|
398
|
+
$content("script").each((_, s) => {
|
|
399
|
+
compScriptChunks.push(`(function(){ try { ${$content(s).html() || ""} } catch (_err) { console.error('[HyperFrames] composition script error:', _err); } })();`);
|
|
400
|
+
$content(s).remove();
|
|
401
|
+
});
|
|
402
|
+
if ($innerRoot.length) {
|
|
403
|
+
const innerCompId = $innerRoot.attr("data-composition-id");
|
|
404
|
+
const innerW = $innerRoot.attr("data-width");
|
|
405
|
+
const innerH = $innerRoot.attr("data-height");
|
|
406
|
+
if (innerCompId && !$(hostEl).attr("data-composition-id"))
|
|
407
|
+
$(hostEl).attr("data-composition-id", innerCompId);
|
|
408
|
+
if (innerW && !$(hostEl).attr("data-width"))
|
|
409
|
+
$(hostEl).attr("data-width", innerW);
|
|
410
|
+
if (innerH && !$(hostEl).attr("data-height"))
|
|
411
|
+
$(hostEl).attr("data-height", innerH);
|
|
412
|
+
$innerRoot.find("style, script").remove();
|
|
413
|
+
$(hostEl).html($innerRoot.html() || "");
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
$content("style, script").remove();
|
|
417
|
+
$(hostEl).html($content.html() || "");
|
|
418
|
+
}
|
|
419
|
+
$(hostEl).removeAttr("data-composition-src");
|
|
420
|
+
});
|
|
421
|
+
if (compStyleChunks.length)
|
|
422
|
+
$("head").append(`<style>${compStyleChunks.join("\n\n")}</style>`);
|
|
423
|
+
if (compScriptChunks.length)
|
|
424
|
+
$("body").append(`<script>${compScriptChunks.join("\n;\n")}</script>`);
|
|
425
|
+
enforceCompositionPixelSizing($);
|
|
426
|
+
autoHealMissingCompositionIds($);
|
|
427
|
+
coalesceHeadStylesAndBodyScripts($);
|
|
428
|
+
// Inline textual assets
|
|
429
|
+
$("[src], [href], [poster], [xlink\\:href]").each((_, el) => {
|
|
430
|
+
for (const attr of ["src", "href", "poster", "xlink:href"]) {
|
|
431
|
+
const value = $(el).attr(attr);
|
|
432
|
+
if (!value)
|
|
433
|
+
continue;
|
|
434
|
+
const inlined = maybeInlineRelativeAssetUrl(value, projectDir);
|
|
435
|
+
if (inlined)
|
|
436
|
+
$(el).attr(attr, inlined);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
$("[srcset]").each((_, el) => {
|
|
440
|
+
const srcset = $(el).attr("srcset");
|
|
441
|
+
if (srcset)
|
|
442
|
+
$(el).attr("srcset", rewriteSrcsetWithInlinedAssets(srcset, projectDir));
|
|
443
|
+
});
|
|
444
|
+
$("style").each((_, el) => { $(el).text(rewriteCssUrlsWithInlinedAssets($(el).html() || "", projectDir)); });
|
|
445
|
+
$("[style]").each((_, el) => { $(el).attr("style", rewriteCssUrlsWithInlinedAssets($(el).attr("style") || "", projectDir)); });
|
|
446
|
+
return $.html();
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=htmlBundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlBundler.js","sourceRoot":"","sources":["../../src/compiler/htmlBundler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callback to probe media duration. If not provided, media duration resolution is skipped.
|
|
3
|
+
* Return duration in seconds, or 0 if unknown.
|
|
4
|
+
*/
|
|
5
|
+
export type MediaDurationProber = (src: string) => Promise<number>;
|
|
6
|
+
/**
|
|
7
|
+
* Compile HTML with full duration resolution.
|
|
8
|
+
*
|
|
9
|
+
* 1. Static pass: compileTimingAttrs() adds data-end where data-duration exists
|
|
10
|
+
* 2. For unresolved video/audio (no data-duration): probe via probeMediaDuration, inject durations
|
|
11
|
+
* 3. For pre-resolved video/audio: validate data-duration against actual source, clamp if needed
|
|
12
|
+
*
|
|
13
|
+
* @param rawHtml - The raw HTML string
|
|
14
|
+
* @param projectDir - The project directory for resolving relative paths
|
|
15
|
+
* @param probeMediaDuration - Optional callback to probe media duration (e.g., via ffprobe)
|
|
16
|
+
*/
|
|
17
|
+
export declare function compileHtml(rawHtml: string, projectDir: string, probeMediaDuration?: MediaDurationProber): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=htmlCompiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlCompiler.d.ts","sourceRoot":"","sources":["../../src/compiler/htmlCompiler.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAQnE;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,mBAAmB,GACvC,OAAO,CAAC,MAAM,CAAC,CAqDjB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { resolve } from "path";
|
|
2
|
+
import { compileTimingAttrs, injectDurations, extractResolvedMedia, clampDurations, } from "./timingCompiler";
|
|
3
|
+
function resolveMediaSrc(src, projectDir) {
|
|
4
|
+
return src.startsWith("http://") || src.startsWith("https://")
|
|
5
|
+
? src
|
|
6
|
+
: resolve(projectDir, src);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Compile HTML with full duration resolution.
|
|
10
|
+
*
|
|
11
|
+
* 1. Static pass: compileTimingAttrs() adds data-end where data-duration exists
|
|
12
|
+
* 2. For unresolved video/audio (no data-duration): probe via probeMediaDuration, inject durations
|
|
13
|
+
* 3. For pre-resolved video/audio: validate data-duration against actual source, clamp if needed
|
|
14
|
+
*
|
|
15
|
+
* @param rawHtml - The raw HTML string
|
|
16
|
+
* @param projectDir - The project directory for resolving relative paths
|
|
17
|
+
* @param probeMediaDuration - Optional callback to probe media duration (e.g., via ffprobe)
|
|
18
|
+
*/
|
|
19
|
+
export async function compileHtml(rawHtml, projectDir, probeMediaDuration) {
|
|
20
|
+
const { html: staticCompiled, unresolved } = compileTimingAttrs(rawHtml);
|
|
21
|
+
let html = staticCompiled;
|
|
22
|
+
if (!probeMediaDuration)
|
|
23
|
+
return html;
|
|
24
|
+
// Phase 1: Resolve missing durations
|
|
25
|
+
const mediaUnresolved = unresolved.filter((el) => el.tagName === "video" || el.tagName === "audio");
|
|
26
|
+
if (mediaUnresolved.length > 0) {
|
|
27
|
+
const resolutions = [];
|
|
28
|
+
for (const el of mediaUnresolved) {
|
|
29
|
+
if (!el.src)
|
|
30
|
+
continue;
|
|
31
|
+
const src = resolveMediaSrc(el.src, projectDir);
|
|
32
|
+
const fileDuration = await probeMediaDuration(src);
|
|
33
|
+
if (fileDuration <= 0)
|
|
34
|
+
continue;
|
|
35
|
+
const effectiveDuration = fileDuration - el.mediaStart;
|
|
36
|
+
resolutions.push({
|
|
37
|
+
id: el.id,
|
|
38
|
+
duration: effectiveDuration > 0 ? effectiveDuration : fileDuration,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (resolutions.length > 0) {
|
|
42
|
+
html = injectDurations(html, resolutions);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Phase 2: Validate pre-resolved media — clamp data-duration to actual source duration
|
|
46
|
+
const preResolved = extractResolvedMedia(html);
|
|
47
|
+
const clampList = [];
|
|
48
|
+
for (const el of preResolved) {
|
|
49
|
+
if (!el.src)
|
|
50
|
+
continue;
|
|
51
|
+
const src = resolveMediaSrc(el.src, projectDir);
|
|
52
|
+
const fileDuration = await probeMediaDuration(src);
|
|
53
|
+
if (fileDuration <= 0)
|
|
54
|
+
continue;
|
|
55
|
+
const maxDuration = fileDuration - el.mediaStart;
|
|
56
|
+
if (maxDuration > 0 && el.duration > maxDuration) {
|
|
57
|
+
clampList.push({ id: el.id, duration: maxDuration });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (clampList.length > 0) {
|
|
61
|
+
html = clampDurations(html, clampList);
|
|
62
|
+
}
|
|
63
|
+
return html;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=htmlCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"htmlCompiler.js","sourceRoot":"","sources":["../../src/compiler/htmlCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { compileTimingAttrs, injectDurations, extractResolvedMedia, clampDurations, type UnresolvedElement, type ResolvedDuration, type ResolvedMediaElement, type CompilationResult, } from "./timingCompiler";
|
|
2
|
+
export { compileHtml, type MediaDurationProber } from "./htmlCompiler";
|
|
3
|
+
export { bundleToSingleHtml, type BundleOptions } from "./htmlBundler";
|
|
4
|
+
export { validateHyperframeHtmlContract, type HyperframeStaticFailureReason, type HyperframeStaticGuardResult, } from "./staticGuard";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,EACL,8BAA8B,EAC9B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,GACjC,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Timing compiler (browser-safe)
|
|
2
|
+
export { compileTimingAttrs, injectDurations, extractResolvedMedia, clampDurations, } from "./timingCompiler";
|
|
3
|
+
// HTML compiler (Node.js — requires fs)
|
|
4
|
+
export { compileHtml } from "./htmlCompiler";
|
|
5
|
+
// HTML bundler (Node.js — requires fs, cheerio, esbuild)
|
|
6
|
+
export { bundleToSingleHtml } from "./htmlBundler";
|
|
7
|
+
// Static guard
|
|
8
|
+
export { validateHyperframeHtmlContract, } from "./staticGuard";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,cAAc,GAKf,MAAM,kBAAkB,CAAC;AAE1B,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAA4B,MAAM,gBAAgB,CAAC;AAEvE,yDAAyD;AACzD,OAAO,EAAE,kBAAkB,EAAsB,MAAM,eAAe,CAAC;AAEvE,eAAe;AACf,OAAO,EACL,8BAA8B,GAG/B,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type HyperframeStaticFailureReason = "missing_composition_id" | "missing_composition_dimensions" | "missing_timeline_registry" | "invalid_script_syntax" | "invalid_static_hyperframe_contract";
|
|
2
|
+
export type HyperframeStaticGuardResult = {
|
|
3
|
+
isValid: boolean;
|
|
4
|
+
missingKeys: string[];
|
|
5
|
+
failureReason: HyperframeStaticFailureReason | null;
|
|
6
|
+
};
|
|
7
|
+
export declare function validateHyperframeHtmlContract(html: string): HyperframeStaticGuardResult;
|
|
8
|
+
//# sourceMappingURL=staticGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staticGuard.d.ts","sourceRoot":"","sources":["../../src/compiler/staticGuard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,6BAA6B,GACrC,wBAAwB,GACxB,gCAAgC,GAChC,2BAA2B,GAC3B,uBAAuB,GACvB,oCAAoC,CAAC;AAEzC,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,6BAA6B,GAAG,IAAI,CAAC;CACrD,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B,CAuBxF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { lintHyperframeHtml } from "../lint/hyperframeLinter";
|
|
2
|
+
export function validateHyperframeHtmlContract(html) {
|
|
3
|
+
const result = lintHyperframeHtml(html);
|
|
4
|
+
const missingKeys = result.findings
|
|
5
|
+
.filter((finding) => finding.severity === "error")
|
|
6
|
+
.map((finding) => finding.message);
|
|
7
|
+
if (missingKeys.length === 0) {
|
|
8
|
+
return { isValid: true, missingKeys: [], failureReason: null };
|
|
9
|
+
}
|
|
10
|
+
const joined = missingKeys.join(" ").toLowerCase();
|
|
11
|
+
let failureReason = "invalid_static_hyperframe_contract";
|
|
12
|
+
if (joined.includes("data-composition-id")) {
|
|
13
|
+
failureReason = "missing_composition_id";
|
|
14
|
+
}
|
|
15
|
+
else if (joined.includes("data-width") || joined.includes("data-height")) {
|
|
16
|
+
failureReason = "missing_composition_dimensions";
|
|
17
|
+
}
|
|
18
|
+
else if (joined.includes("window.__timelines")) {
|
|
19
|
+
failureReason = "missing_timeline_registry";
|
|
20
|
+
}
|
|
21
|
+
else if (joined.includes("script syntax")) {
|
|
22
|
+
failureReason = "invalid_script_syntax";
|
|
23
|
+
}
|
|
24
|
+
return { isValid: false, missingKeys, failureReason };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=staticGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staticGuard.js","sourceRoot":"","sources":["../../src/compiler/staticGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAe9D,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ;SAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;SACjD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,aAAa,GAAkC,oCAAoC,CAAC;IACxF,IAAI,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC3C,aAAa,GAAG,wBAAwB,CAAC;IAC3C,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3E,aAAa,GAAG,gCAAgC,CAAC;IACnD,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACjD,aAAa,GAAG,2BAA2B,CAAC;IAC9C,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5C,aAAa,GAAG,uBAAuB,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AACxD,CAAC"}
|