remote-components 0.3.2 → 0.3.4
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/dist/config/nextjs.cjs +122 -62
- package/dist/config/nextjs.cjs.map +1 -1
- package/dist/config/nextjs.js +116 -56
- package/dist/config/nextjs.js.map +1 -1
- package/dist/config/webpack.cjs +5 -1
- package/dist/config/webpack.cjs.map +1 -1
- package/dist/config/webpack.js +5 -1
- package/dist/config/webpack.js.map +1 -1
- package/dist/host/defaults/app.cjs +2 -5
- package/dist/host/defaults/app.cjs.map +1 -1
- package/dist/host/defaults/app.d.ts +1 -3
- package/dist/host/defaults/app.js +1 -4
- package/dist/host/defaults/app.js.map +1 -1
- package/dist/host/defaults/pages.cjs +2 -5
- package/dist/host/defaults/pages.cjs.map +1 -1
- package/dist/host/defaults/pages.d.ts +1 -3
- package/dist/host/defaults/pages.js +1 -4
- package/dist/host/defaults/pages.js.map +1 -1
- package/dist/host/defaults/shared.cjs +32 -0
- package/dist/host/defaults/shared.cjs.map +1 -0
- package/dist/host/defaults/shared.d.ts +3 -0
- package/dist/host/defaults/shared.js +8 -0
- package/dist/host/defaults/shared.js.map +1 -0
- package/dist/host/html.cjs +533 -351
- package/dist/host/html.cjs.map +1 -1
- package/dist/host/html.js +533 -351
- package/dist/host/html.js.map +1 -1
- package/dist/host/nextjs/app/client-only.cjs +494 -285
- package/dist/host/nextjs/app/client-only.cjs.map +1 -1
- package/dist/host/nextjs/app/client-only.js +468 -259
- package/dist/host/nextjs/app/client-only.js.map +1 -1
- package/dist/host/react.cjs +412 -241
- package/dist/host/react.cjs.map +1 -1
- package/dist/host/react.js +412 -241
- package/dist/host/react.js.map +1 -1
- package/dist/internal/config/webpack/apply-shared-modules.cjs +6 -4
- package/dist/internal/config/webpack/apply-shared-modules.cjs.map +1 -1
- package/dist/internal/config/webpack/apply-shared-modules.js +6 -4
- package/dist/internal/config/webpack/apply-shared-modules.js.map +1 -1
- package/dist/internal/config/webpack/next-client-pages-loader.cjs +6 -7
- package/dist/internal/config/webpack/next-client-pages-loader.cjs.map +1 -1
- package/dist/internal/config/webpack/next-client-pages-loader.js +6 -7
- package/dist/internal/config/webpack/next-client-pages-loader.js.map +1 -1
- package/dist/internal/host/nextjs/app-client.cjs +6 -22
- package/dist/internal/host/nextjs/app-client.cjs.map +1 -1
- package/dist/internal/host/nextjs/app-client.js +5 -11
- package/dist/internal/host/nextjs/app-client.js.map +1 -1
- package/dist/internal/host/nextjs/dom-flight.cjs +19 -39
- package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
- package/dist/internal/host/nextjs/dom-flight.js +31 -39
- package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
- package/dist/internal/host/nextjs/image-shared.cjs +39 -3
- package/dist/internal/host/nextjs/image-shared.cjs.map +1 -1
- package/dist/internal/host/nextjs/image-shared.d.ts +5 -10
- package/dist/internal/host/nextjs/image-shared.js +29 -3
- package/dist/internal/host/nextjs/image-shared.js.map +1 -1
- package/dist/internal/host/nextjs/shared-import.cjs +46 -0
- package/dist/internal/host/nextjs/shared-import.cjs.map +1 -0
- package/dist/internal/host/nextjs/shared-import.d.ts +3 -0
- package/dist/internal/host/nextjs/shared-import.js +12 -0
- package/dist/internal/host/nextjs/shared-import.js.map +1 -0
- package/dist/internal/host/server/fetch-remote-component.cjs +2 -1
- package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
- package/dist/internal/host/server/fetch-remote-component.js +2 -1
- package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
- package/dist/internal/host/shared/polyfill.cjs +8 -7
- package/dist/internal/host/shared/polyfill.cjs.map +1 -1
- package/dist/internal/host/shared/polyfill.js +8 -7
- package/dist/internal/host/shared/polyfill.js.map +1 -1
- package/dist/internal/host/shared/shared-module-resolver.cjs +117 -0
- package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -0
- package/dist/internal/host/shared/shared-module-resolver.d.ts +64 -0
- package/dist/internal/host/shared/shared-module-resolver.js +78 -0
- package/dist/internal/host/shared/shared-module-resolver.js.map +1 -0
- package/dist/internal/remote/nextjs/next-internals.cjs +53 -0
- package/dist/internal/remote/nextjs/next-internals.cjs.map +1 -0
- package/dist/internal/remote/nextjs/next-internals.d.ts +42 -0
- package/dist/internal/remote/nextjs/next-internals.js +26 -0
- package/dist/internal/remote/nextjs/next-internals.js.map +1 -0
- package/dist/internal/runtime/html/apply-origin.cjs +11 -32
- package/dist/internal/runtime/html/apply-origin.cjs.map +1 -1
- package/dist/internal/runtime/html/apply-origin.js +11 -32
- package/dist/internal/runtime/html/apply-origin.js.map +1 -1
- package/dist/internal/runtime/html/html-spec.cjs +78 -0
- package/dist/internal/runtime/html/html-spec.cjs.map +1 -0
- package/dist/internal/runtime/html/html-spec.d.ts +23 -0
- package/dist/internal/runtime/html/html-spec.js +41 -0
- package/dist/internal/runtime/html/html-spec.js.map +1 -0
- package/dist/internal/runtime/html/parse-remote-html.cjs +15 -12
- package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
- package/dist/internal/runtime/html/parse-remote-html.js +29 -12
- package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
- package/dist/internal/runtime/html/rewrite-srcset.cjs +38 -0
- package/dist/internal/runtime/html/rewrite-srcset.cjs.map +1 -0
- package/dist/internal/runtime/html/rewrite-srcset.d.ts +12 -0
- package/dist/internal/runtime/html/rewrite-srcset.js +14 -0
- package/dist/internal/runtime/html/rewrite-srcset.js.map +1 -0
- package/dist/internal/runtime/loaders/component-loader.cjs +25 -44
- package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.d.ts +3 -1
- package/dist/internal/runtime/loaders/component-loader.js +28 -44
- package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
- package/dist/internal/runtime/loaders/script-loader.cjs +7 -0
- package/dist/internal/runtime/loaders/script-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/script-loader.js +7 -0
- package/dist/internal/runtime/loaders/script-loader.js.map +1 -1
- package/dist/internal/runtime/loaders/static-loader.cjs +15 -21
- package/dist/internal/runtime/loaders/static-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/static-loader.d.ts +3 -1
- package/dist/internal/runtime/loaders/static-loader.js +15 -21
- package/dist/internal/runtime/loaders/static-loader.js.map +1 -1
- package/dist/internal/runtime/namespace.cjs +82 -0
- package/dist/internal/runtime/namespace.cjs.map +1 -0
- package/dist/internal/runtime/namespace.d.ts +5 -0
- package/dist/internal/runtime/namespace.js +58 -0
- package/dist/internal/runtime/namespace.js.map +1 -0
- package/dist/internal/runtime/rsc-imports.cjs +86 -0
- package/dist/internal/runtime/rsc-imports.cjs.map +1 -0
- package/dist/internal/runtime/rsc-imports.d.ts +39 -0
- package/dist/internal/runtime/rsc-imports.js +50 -0
- package/dist/internal/runtime/rsc-imports.js.map +1 -0
- package/dist/internal/{host/shared/resolved-data.cjs → runtime/rsc-runtime.cjs} +3 -3
- package/dist/internal/runtime/rsc-runtime.cjs.map +1 -0
- package/dist/internal/runtime/rsc-runtime.d.ts +37 -0
- package/dist/internal/runtime/rsc-runtime.js +1 -0
- package/dist/internal/runtime/rsc.cjs +23 -12
- package/dist/internal/runtime/rsc.cjs.map +1 -1
- package/dist/internal/runtime/rsc.d.ts +19 -2
- package/dist/internal/runtime/rsc.js +20 -11
- package/dist/internal/runtime/rsc.js.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.cjs +53 -35
- package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.d.ts +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.js +53 -35
- package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
- package/dist/internal/runtime/turbopack/module.cjs +19 -17
- package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/module.d.ts +23 -1
- package/dist/internal/runtime/turbopack/module.js +19 -18
- package/dist/internal/runtime/turbopack/module.js.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.cjs +26 -10
- package/dist/internal/runtime/turbopack/patterns.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.d.ts +44 -49
- package/dist/internal/runtime/turbopack/patterns.js +23 -7
- package/dist/internal/runtime/turbopack/patterns.js.map +1 -1
- package/dist/internal/runtime/turbopack/{webpack-runtime.cjs → remote-scope-setup.cjs} +35 -32
- package/dist/internal/runtime/turbopack/remote-scope-setup.cjs.map +1 -0
- package/dist/internal/runtime/turbopack/remote-scope-setup.d.ts +25 -0
- package/dist/internal/runtime/turbopack/{webpack-runtime.js → remote-scope-setup.js} +36 -19
- package/dist/internal/runtime/turbopack/remote-scope-setup.js.map +1 -0
- package/dist/internal/runtime/turbopack/remote-scope.cjs +4 -6
- package/dist/internal/runtime/turbopack/remote-scope.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/remote-scope.d.ts +20 -1
- package/dist/internal/runtime/turbopack/remote-scope.js +4 -6
- package/dist/internal/runtime/turbopack/remote-scope.js.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.cjs +23 -15
- package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.d.ts +13 -1
- package/dist/internal/runtime/turbopack/shared-modules.js +25 -18
- package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
- package/dist/internal/runtime/types.cjs.map +1 -1
- package/dist/internal/runtime/types.d.ts +5 -41
- package/dist/internal/utils/logger.cjs +1 -1
- package/dist/internal/utils/logger.cjs.map +1 -1
- package/dist/internal/utils/logger.d.ts +2 -2
- package/dist/internal/utils/logger.js +1 -1
- package/dist/internal/utils/logger.js.map +1 -1
- package/dist/internal/utils/project-id-env.cjs +31 -0
- package/dist/internal/utils/project-id-env.cjs.map +1 -0
- package/dist/internal/utils/project-id-env.d.ts +7 -0
- package/dist/internal/utils/project-id-env.js +7 -0
- package/dist/internal/utils/project-id-env.js.map +1 -0
- package/dist/internal/utils/project-id.cjs +46 -0
- package/dist/internal/utils/project-id.cjs.map +1 -0
- package/dist/internal/utils/project-id.d.ts +8 -0
- package/dist/internal/utils/project-id.js +22 -0
- package/dist/internal/utils/project-id.js.map +1 -0
- package/dist/remote/defaults/app.cjs +2 -5
- package/dist/remote/defaults/app.cjs.map +1 -1
- package/dist/remote/defaults/app.d.ts +1 -3
- package/dist/remote/defaults/app.js +1 -4
- package/dist/remote/defaults/app.js.map +1 -1
- package/dist/remote/defaults/pages.cjs +2 -5
- package/dist/remote/defaults/pages.cjs.map +1 -1
- package/dist/remote/defaults/pages.d.ts +1 -3
- package/dist/remote/defaults/pages.js +1 -4
- package/dist/remote/defaults/pages.js.map +1 -1
- package/dist/remote/defaults/shared.cjs +32 -0
- package/dist/remote/defaults/shared.cjs.map +1 -0
- package/dist/remote/defaults/shared.d.ts +3 -0
- package/dist/remote/defaults/shared.js +8 -0
- package/dist/remote/defaults/shared.js.map +1 -0
- package/dist/remote/html.cjs +78 -22
- package/dist/remote/html.cjs.map +1 -1
- package/dist/remote/html.js +78 -22
- package/dist/remote/html.js.map +1 -1
- package/dist/remote/nextjs/app.cjs +16 -56
- package/dist/remote/nextjs/app.cjs.map +1 -1
- package/dist/remote/nextjs/app.js +26 -46
- package/dist/remote/nextjs/app.js.map +1 -1
- package/dist/remote/nextjs/pages.cjs +2 -1
- package/dist/remote/nextjs/pages.cjs.map +1 -1
- package/dist/remote/nextjs/pages.js +2 -1
- package/dist/remote/nextjs/pages.js.map +1 -1
- package/dist/types-59251814.d.ts +94 -0
- package/package.json +1 -1
- package/dist/internal/host/shared/resolved-data.cjs.map +0 -1
- package/dist/internal/host/shared/resolved-data.d.ts +0 -48
- package/dist/internal/host/shared/resolved-data.js +0 -1
- package/dist/internal/runtime/turbopack/webpack-runtime.cjs.map +0 -1
- package/dist/internal/runtime/turbopack/webpack-runtime.d.ts +0 -23
- package/dist/internal/runtime/turbopack/webpack-runtime.js.map +0 -1
- /package/dist/internal/{host/shared/resolved-data.js.map → runtime/rsc-runtime.js.map} +0 -0
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
"source",
|
|
4
|
-
"video",
|
|
5
|
-
"audio",
|
|
6
|
-
"track",
|
|
7
|
-
"iframe",
|
|
8
|
-
"embed",
|
|
9
|
-
"script",
|
|
10
|
-
"link"
|
|
11
|
-
];
|
|
1
|
+
import { ORIGIN_REWRITE_TAGS } from "./html-spec";
|
|
2
|
+
import { rewriteSrcset } from "./rewrite-srcset";
|
|
12
3
|
function applyOriginToNodes(doc, url, resolveClientUrl) {
|
|
13
4
|
if (url.origin !== location.origin) {
|
|
14
5
|
const nodes = doc.querySelectorAll(
|
|
15
|
-
|
|
6
|
+
ORIGIN_REWRITE_TAGS.map(
|
|
16
7
|
(type) => `${type}[src],${type}[srcset],${type}[href],${type}[imagesrcset]`
|
|
17
8
|
).join(",")
|
|
18
9
|
);
|
|
@@ -30,29 +21,17 @@ function applyOriginToNodes(doc, url, resolveClientUrl) {
|
|
|
30
21
|
);
|
|
31
22
|
}
|
|
32
23
|
if (node.hasAttribute("srcset")) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const absoluteUrl = new URL(urlPart, url).href;
|
|
38
|
-
const resolvedUrl = resolveClientUrl?.(absoluteUrl) ?? absoluteUrl;
|
|
39
|
-
return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;
|
|
40
|
-
}).join(", ");
|
|
41
|
-
if (srcSet) {
|
|
42
|
-
node.setAttribute("srcset", srcSet);
|
|
24
|
+
const raw = node.getAttribute("srcset");
|
|
25
|
+
if (raw) {
|
|
26
|
+
const resolve = resolveClientUrl ? (abs) => resolveClientUrl(abs) ?? abs : void 0;
|
|
27
|
+
node.setAttribute("srcset", rewriteSrcset(raw, url, resolve));
|
|
43
28
|
}
|
|
44
29
|
}
|
|
45
30
|
if (node.hasAttribute("imagesrcset")) {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const absoluteUrl = new URL(urlPart, url).href;
|
|
51
|
-
const resolvedUrl = resolveClientUrl?.(absoluteUrl) ?? absoluteUrl;
|
|
52
|
-
return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;
|
|
53
|
-
}).join(", ");
|
|
54
|
-
if (srcSet) {
|
|
55
|
-
node.setAttribute("imagesrcset", srcSet);
|
|
31
|
+
const raw = node.getAttribute("imagesrcset");
|
|
32
|
+
if (raw) {
|
|
33
|
+
const resolve = resolveClientUrl ? (abs) => resolveClientUrl(abs) ?? abs : void 0;
|
|
34
|
+
node.setAttribute("imagesrcset", rewriteSrcset(raw, url, resolve));
|
|
56
35
|
}
|
|
57
36
|
}
|
|
58
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/apply-origin.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/apply-origin.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { ORIGIN_REWRITE_TAGS } from './html-spec';\nimport { rewriteSrcset } from './rewrite-srcset';\n\nexport function applyOriginToNodes(\n doc: Document | HTMLElement,\n url: URL,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n if (url.origin !== location.origin) {\n const nodes = doc.querySelectorAll<HTMLImageElement>(\n ORIGIN_REWRITE_TAGS.map(\n (type) =>\n `${type}[src],${type}[srcset],${type}[href],${type}[imagesrcset]`,\n ).join(','),\n );\n nodes.forEach((node) => {\n if (\n node.hasAttribute('src') &&\n /^[./]+\\/?/.test(node.getAttribute('src') ?? '')\n ) {\n const absoluteSrc = new URL(node.getAttribute('src') ?? '/', url).href;\n // Script elements are handled by the loaders (script-loader, static-loader)\n // which apply the callback themselves. Only apply it here for non-script elements.\n const isScript = node.tagName.toLowerCase() === 'script';\n node.src = isScript\n ? absoluteSrc\n : (resolveClientUrl?.(absoluteSrc) ?? absoluteSrc);\n }\n if (\n node.hasAttribute('href') &&\n /^[./]+\\/?/.test(node.getAttribute('href') ?? '')\n ) {\n const absoluteHref = new URL(node.getAttribute('href') ?? '/', url)\n .href;\n node.setAttribute(\n 'href',\n resolveClientUrl?.(absoluteHref) ?? absoluteHref,\n );\n }\n if (node.hasAttribute('srcset')) {\n const raw = node.getAttribute('srcset');\n if (raw) {\n const resolve = resolveClientUrl\n ? (abs: string) => resolveClientUrl(abs) ?? abs\n : undefined;\n node.setAttribute('srcset', rewriteSrcset(raw, url, resolve));\n }\n }\n if (node.hasAttribute('imagesrcset')) {\n const raw = node.getAttribute('imagesrcset');\n if (raw) {\n const resolve = resolveClientUrl\n ? (abs: string) => resolveClientUrl(abs) ?? abs\n : undefined;\n node.setAttribute('imagesrcset', rewriteSrcset(raw, url, resolve));\n }\n }\n });\n }\n}\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAEvB,SAAS,mBACd,KACA,KACA,kBACA;AACA,MAAI,IAAI,WAAW,SAAS,QAAQ;AAClC,UAAM,QAAQ,IAAI;AAAA,MAChB,oBAAoB;AAAA,QAClB,CAAC,SACC,GAAG,aAAa,gBAAgB,cAAc;AAAA,MAClD,EAAE,KAAK,GAAG;AAAA,IACZ;AACA,UAAM,QAAQ,CAAC,SAAS;AACtB,UACE,KAAK,aAAa,KAAK,KACvB,YAAY,KAAK,KAAK,aAAa,KAAK,KAAK,EAAE,GAC/C;AACA,cAAM,cAAc,IAAI,IAAI,KAAK,aAAa,KAAK,KAAK,KAAK,GAAG,EAAE;AAGlE,cAAM,WAAW,KAAK,QAAQ,YAAY,MAAM;AAChD,aAAK,MAAM,WACP,cACC,mBAAmB,WAAW,KAAK;AAAA,MAC1C;AACA,UACE,KAAK,aAAa,MAAM,KACxB,YAAY,KAAK,KAAK,aAAa,MAAM,KAAK,EAAE,GAChD;AACA,cAAM,eAAe,IAAI,IAAI,KAAK,aAAa,MAAM,KAAK,KAAK,GAAG,EAC/D;AACH,aAAK;AAAA,UACH;AAAA,UACA,mBAAmB,YAAY,KAAK;AAAA,QACtC;AAAA,MACF;AACA,UAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,cAAM,MAAM,KAAK,aAAa,QAAQ;AACtC,YAAI,KAAK;AACP,gBAAM,UAAU,mBACZ,CAAC,QAAgB,iBAAiB,GAAG,KAAK,MAC1C;AACJ,eAAK,aAAa,UAAU,cAAc,KAAK,KAAK,OAAO,CAAC;AAAA,QAC9D;AAAA,MACF;AACA,UAAI,KAAK,aAAa,aAAa,GAAG;AACpC,cAAM,MAAM,KAAK,aAAa,aAAa;AAC3C,YAAI,KAAK;AACP,gBAAM,UAAU,mBACZ,CAAC,QAAgB,iBAAiB,GAAG,KAAK,MAC1C;AACJ,eAAK,aAAa,eAAe,cAAc,KAAK,KAAK,OAAO,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var html_spec_exports = {};
|
|
20
|
+
__export(html_spec_exports, {
|
|
21
|
+
DATA_BUNDLE: () => DATA_BUNDLE,
|
|
22
|
+
DATA_REMOTE_COMPONENTS_SHARED: () => DATA_REMOTE_COMPONENTS_SHARED,
|
|
23
|
+
DATA_ROUTE: () => DATA_ROUTE,
|
|
24
|
+
DATA_RUNTIME: () => DATA_RUNTIME,
|
|
25
|
+
DATA_SRC: () => DATA_SRC,
|
|
26
|
+
DATA_TYPE: () => DATA_TYPE,
|
|
27
|
+
ID_SUFFIX_RSC: () => ID_SUFFIX_RSC,
|
|
28
|
+
ID_SUFFIX_SHARED: () => ID_SUFFIX_SHARED,
|
|
29
|
+
ID_SUFFIX_SSR: () => ID_SUFFIX_SSR,
|
|
30
|
+
NEXT_CONTAINER_ID: () => NEXT_CONTAINER_ID,
|
|
31
|
+
NEXT_DATA_ID: () => NEXT_DATA_ID,
|
|
32
|
+
ORIGIN_REWRITE_TAGS: () => ORIGIN_REWRITE_TAGS,
|
|
33
|
+
REMOTE_NEXT_DATA_ID: () => REMOTE_NEXT_DATA_ID,
|
|
34
|
+
TAG_REMOTE_COMPONENT: () => TAG_REMOTE_COMPONENT
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(html_spec_exports);
|
|
37
|
+
const ORIGIN_REWRITE_TAGS = [
|
|
38
|
+
"img",
|
|
39
|
+
"source",
|
|
40
|
+
"video",
|
|
41
|
+
"audio",
|
|
42
|
+
"track",
|
|
43
|
+
"iframe",
|
|
44
|
+
"embed",
|
|
45
|
+
"script",
|
|
46
|
+
"link"
|
|
47
|
+
];
|
|
48
|
+
const ID_SUFFIX_RSC = "_rsc";
|
|
49
|
+
const ID_SUFFIX_SSR = "_ssr";
|
|
50
|
+
const ID_SUFFIX_SHARED = "_shared";
|
|
51
|
+
const DATA_BUNDLE = "data-bundle";
|
|
52
|
+
const DATA_ROUTE = "data-route";
|
|
53
|
+
const DATA_RUNTIME = "data-runtime";
|
|
54
|
+
const DATA_TYPE = "data-type";
|
|
55
|
+
const DATA_SRC = "data-src";
|
|
56
|
+
const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
57
|
+
const TAG_REMOTE_COMPONENT = "remote-component";
|
|
58
|
+
const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
59
|
+
const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
60
|
+
const NEXT_CONTAINER_ID = "__next";
|
|
61
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
62
|
+
0 && (module.exports = {
|
|
63
|
+
DATA_BUNDLE,
|
|
64
|
+
DATA_REMOTE_COMPONENTS_SHARED,
|
|
65
|
+
DATA_ROUTE,
|
|
66
|
+
DATA_RUNTIME,
|
|
67
|
+
DATA_SRC,
|
|
68
|
+
DATA_TYPE,
|
|
69
|
+
ID_SUFFIX_RSC,
|
|
70
|
+
ID_SUFFIX_SHARED,
|
|
71
|
+
ID_SUFFIX_SSR,
|
|
72
|
+
NEXT_CONTAINER_ID,
|
|
73
|
+
NEXT_DATA_ID,
|
|
74
|
+
ORIGIN_REWRITE_TAGS,
|
|
75
|
+
REMOTE_NEXT_DATA_ID,
|
|
76
|
+
TAG_REMOTE_COMPONENT
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=html-spec.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAGzB,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,gCAAgC;AAGtC,MAAM,uBAAuB;AAC7B,MAAM,eAAe;AACrB,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure constants for HTML element names, data attributes, and ID suffixes
|
|
3
|
+
* used across both server-side (parse5) and browser (DOM) HTML processing.
|
|
4
|
+
*
|
|
5
|
+
* No imports, no runtime code — safe to use in any context.
|
|
6
|
+
*/
|
|
7
|
+
/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */
|
|
8
|
+
declare const ORIGIN_REWRITE_TAGS: readonly ["img", "source", "video", "audio", "track", "iframe", "embed", "script", "link"];
|
|
9
|
+
declare const ID_SUFFIX_RSC = "_rsc";
|
|
10
|
+
declare const ID_SUFFIX_SSR = "_ssr";
|
|
11
|
+
declare const ID_SUFFIX_SHARED = "_shared";
|
|
12
|
+
declare const DATA_BUNDLE = "data-bundle";
|
|
13
|
+
declare const DATA_ROUTE = "data-route";
|
|
14
|
+
declare const DATA_RUNTIME = "data-runtime";
|
|
15
|
+
declare const DATA_TYPE = "data-type";
|
|
16
|
+
declare const DATA_SRC = "data-src";
|
|
17
|
+
declare const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
18
|
+
declare const TAG_REMOTE_COMPONENT = "remote-component";
|
|
19
|
+
declare const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
20
|
+
declare const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
21
|
+
declare const NEXT_CONTAINER_ID = "__next";
|
|
22
|
+
|
|
23
|
+
export { DATA_BUNDLE, DATA_REMOTE_COMPONENTS_SHARED, DATA_ROUTE, DATA_RUNTIME, DATA_SRC, DATA_TYPE, ID_SUFFIX_RSC, ID_SUFFIX_SHARED, ID_SUFFIX_SSR, NEXT_CONTAINER_ID, NEXT_DATA_ID, ORIGIN_REWRITE_TAGS, REMOTE_NEXT_DATA_ID, TAG_REMOTE_COMPONENT };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const ORIGIN_REWRITE_TAGS = [
|
|
2
|
+
"img",
|
|
3
|
+
"source",
|
|
4
|
+
"video",
|
|
5
|
+
"audio",
|
|
6
|
+
"track",
|
|
7
|
+
"iframe",
|
|
8
|
+
"embed",
|
|
9
|
+
"script",
|
|
10
|
+
"link"
|
|
11
|
+
];
|
|
12
|
+
const ID_SUFFIX_RSC = "_rsc";
|
|
13
|
+
const ID_SUFFIX_SSR = "_ssr";
|
|
14
|
+
const ID_SUFFIX_SHARED = "_shared";
|
|
15
|
+
const DATA_BUNDLE = "data-bundle";
|
|
16
|
+
const DATA_ROUTE = "data-route";
|
|
17
|
+
const DATA_RUNTIME = "data-runtime";
|
|
18
|
+
const DATA_TYPE = "data-type";
|
|
19
|
+
const DATA_SRC = "data-src";
|
|
20
|
+
const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
21
|
+
const TAG_REMOTE_COMPONENT = "remote-component";
|
|
22
|
+
const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
23
|
+
const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
24
|
+
const NEXT_CONTAINER_ID = "__next";
|
|
25
|
+
export {
|
|
26
|
+
DATA_BUNDLE,
|
|
27
|
+
DATA_REMOTE_COMPONENTS_SHARED,
|
|
28
|
+
DATA_ROUTE,
|
|
29
|
+
DATA_RUNTIME,
|
|
30
|
+
DATA_SRC,
|
|
31
|
+
DATA_TYPE,
|
|
32
|
+
ID_SUFFIX_RSC,
|
|
33
|
+
ID_SUFFIX_SHARED,
|
|
34
|
+
ID_SUFFIX_SSR,
|
|
35
|
+
NEXT_CONTAINER_ID,
|
|
36
|
+
NEXT_DATA_ID,
|
|
37
|
+
ORIGIN_REWRITE_TAGS,
|
|
38
|
+
REMOTE_NEXT_DATA_ID,
|
|
39
|
+
TAG_REMOTE_COMPONENT
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=html-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":"AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AAGzB,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,gCAAgC;AAGtC,MAAM,uBAAuB;AAC7B,MAAM,eAAe;AACrB,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;","names":[]}
|
|
@@ -32,27 +32,30 @@ module.exports = __toCommonJS(parse_remote_html_exports);
|
|
|
32
32
|
var import_constants = require("#internal/runtime/constants");
|
|
33
33
|
var import_metadata = require("#internal/runtime/metadata");
|
|
34
34
|
var import_error = require("#internal/utils/error");
|
|
35
|
+
var import_html_spec = require("./html-spec");
|
|
35
36
|
function validateSingleComponent(doc, name, url) {
|
|
36
|
-
if (doc.querySelectorAll(
|
|
37
|
+
if (doc.querySelectorAll(`div[${import_html_spec.DATA_BUNDLE}][${import_html_spec.DATA_ROUTE}]`).length > 1 && !doc.querySelector(
|
|
38
|
+
`div[${import_html_spec.DATA_BUNDLE}][${import_html_spec.DATA_ROUTE}][id^="${name}"]`
|
|
39
|
+
) || doc.querySelectorAll(`${import_html_spec.TAG_REMOTE_COMPONENT}:not([src])`).length > 1 && !doc.querySelector(`${import_html_spec.TAG_REMOTE_COMPONENT}[name="${name}"]`)) {
|
|
37
40
|
throw (0, import_error.multipleRemoteComponentsError)(url);
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
function findComponentElement(doc, name) {
|
|
41
|
-
return doc.querySelector(`div[
|
|
44
|
+
return doc.querySelector(`div[${import_html_spec.DATA_BUNDLE}][${import_html_spec.DATA_ROUTE}][id^="${name}"]`) ?? doc.querySelector(`div[${import_html_spec.DATA_BUNDLE}][${import_html_spec.DATA_ROUTE}]`) ?? doc.querySelector(`div#${import_html_spec.NEXT_CONTAINER_ID}`) ?? doc.querySelector(`${import_html_spec.TAG_REMOTE_COMPONENT}[name="${name}"]:not([src])`) ?? doc.querySelector(`${import_html_spec.TAG_REMOTE_COMPONENT}:not([src])`);
|
|
42
45
|
}
|
|
43
46
|
function parseNextData(doc) {
|
|
44
47
|
return JSON.parse(
|
|
45
|
-
(doc.querySelector(
|
|
48
|
+
(doc.querySelector(`#${import_html_spec.NEXT_DATA_ID}`) ?? doc.querySelector(`#${import_html_spec.REMOTE_NEXT_DATA_ID}`))?.textContent ?? "null"
|
|
46
49
|
);
|
|
47
50
|
}
|
|
48
51
|
function resolveComponentName(component, nextData, fallbackName) {
|
|
49
|
-
const isRemoteComponent = component?.tagName.toLowerCase() ===
|
|
50
|
-
const name = component?.getAttribute("id")?.replace(
|
|
52
|
+
const isRemoteComponent = component?.tagName.toLowerCase() === import_html_spec.TAG_REMOTE_COMPONENT;
|
|
53
|
+
const name = component?.getAttribute("id")?.replace(new RegExp(`${import_html_spec.ID_SUFFIX_SSR}$`), "") || isRemoteComponent && component?.getAttribute("name") || (nextData ? "__next" : fallbackName);
|
|
51
54
|
return { name, isRemoteComponent };
|
|
52
55
|
}
|
|
53
56
|
function extractRemoteShared(doc, name, nextData) {
|
|
54
57
|
const remoteSharedEl = doc.querySelector(
|
|
55
|
-
`#${name}
|
|
58
|
+
`#${name}${import_html_spec.ID_SUFFIX_SHARED}[${import_html_spec.DATA_REMOTE_COMPONENTS_SHARED}]`
|
|
56
59
|
);
|
|
57
60
|
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.shared ?? (JSON.parse(remoteSharedEl?.textContent ?? "{}") ?? {});
|
|
58
61
|
remoteSharedEl?.remove();
|
|
@@ -73,7 +76,7 @@ function extractLinks(doc, component) {
|
|
|
73
76
|
function extractScripts(doc, component, isRemoteComponent) {
|
|
74
77
|
return Array.from(
|
|
75
78
|
(isRemoteComponent ? component : doc).querySelectorAll(
|
|
76
|
-
|
|
79
|
+
`script[src],script[${import_html_spec.DATA_SRC}]`
|
|
77
80
|
)
|
|
78
81
|
);
|
|
79
82
|
}
|
|
@@ -86,15 +89,15 @@ function parseRemoteComponentDocument(doc, name, url) {
|
|
|
86
89
|
nextData,
|
|
87
90
|
name
|
|
88
91
|
);
|
|
89
|
-
const rsc = doc.querySelector(`#${resolvedName}
|
|
92
|
+
const rsc = doc.querySelector(`#${resolvedName}${import_html_spec.ID_SUFFIX_RSC}`);
|
|
90
93
|
const metadata = (0, import_metadata.buildMetadata)(
|
|
91
94
|
{
|
|
92
95
|
name: resolvedName,
|
|
93
|
-
bundle: component?.getAttribute(
|
|
94
|
-
route: component?.getAttribute(
|
|
95
|
-
runtime: component?.getAttribute(
|
|
96
|
+
bundle: component?.getAttribute(import_html_spec.DATA_BUNDLE) || nextData?.props.__REMOTE_COMPONENT__?.bundle,
|
|
97
|
+
route: component?.getAttribute(import_html_spec.DATA_ROUTE) ?? nextData?.page,
|
|
98
|
+
runtime: component?.getAttribute(import_html_spec.DATA_RUNTIME) ?? nextData?.props.__REMOTE_COMPONENT__?.runtime ?? import_constants.RUNTIME_SCRIPT,
|
|
96
99
|
id: component?.getAttribute("id"),
|
|
97
|
-
type: component?.getAttribute(
|
|
100
|
+
type: component?.getAttribute(import_html_spec.DATA_TYPE)
|
|
98
101
|
},
|
|
99
102
|
url
|
|
100
103
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module map extracted from the component's shared data script. */\n remoteShared: Record<string, string>;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll('div[data-bundle][data-route]').length > 1 &&\n !doc.querySelector(`div[data-bundle][data-route][id^=\"${name}\"]`)) ||\n (doc.querySelectorAll('remote-component:not([src])').length > 1 &&\n !doc.querySelector(`remote-component[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[data-bundle][data-route][id^=\"${name}\"]`) ??\n doc.querySelector('div[data-bundle][data-route]') ??\n doc.querySelector('div#__next') ??\n doc.querySelector(`remote-component[name=\"${name}\"]:not([src])`) ??\n doc.querySelector('remote-component:not([src])')\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector('#__NEXT_DATA__') ??\n doc.querySelector('#__REMOTE_NEXT_DATA__')\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === 'remote-component';\n\n const name =\n component?.getAttribute('id')?.replace(/_ssr$/, '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): Record<string, string> {\n const remoteSharedEl = doc.querySelector(\n `#${name}_shared[data-remote-components-shared]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n 'script[src],script[data-src]',\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}_rsc`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute('data-bundle') ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute('data-route') ?? nextData?.page,\n runtime:\n component?.getAttribute('data-runtime') ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute('data-type'),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport {\n DATA_BUNDLE,\n DATA_REMOTE_COMPONENTS_SHARED,\n DATA_ROUTE,\n DATA_RUNTIME,\n DATA_SRC,\n DATA_TYPE,\n ID_SUFFIX_RSC,\n ID_SUFFIX_SHARED,\n ID_SUFFIX_SSR,\n NEXT_CONTAINER_ID,\n NEXT_DATA_ID,\n REMOTE_NEXT_DATA_ID,\n TAG_REMOTE_COMPONENT,\n} from './html-spec';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module map extracted from the component's shared data script. */\n remoteShared: Record<string, string>;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`).length > 1 &&\n !doc.querySelector(\n `div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`,\n )) ||\n (doc.querySelectorAll(`${TAG_REMOTE_COMPONENT}:not([src])`).length > 1 &&\n !doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`) ??\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`) ??\n doc.querySelector(`div#${NEXT_CONTAINER_ID}`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]:not([src])`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}:not([src])`)\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector(`#${NEXT_DATA_ID}`) ??\n doc.querySelector(`#${REMOTE_NEXT_DATA_ID}`)\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === TAG_REMOTE_COMPONENT;\n\n const name =\n component\n ?.getAttribute('id')\n ?.replace(new RegExp(`${ID_SUFFIX_SSR}$`), '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): Record<string, string> {\n const remoteSharedEl = doc.querySelector(\n `#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n `script[src],script[${DATA_SRC}]`,\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}${ID_SUFFIX_RSC}`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute(DATA_BUNDLE) ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute(DATA_ROUTE) ?? nextData?.page,\n runtime:\n component?.getAttribute(DATA_RUNTIME) ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute(DATA_TYPE),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -9,27 +9,44 @@ import {
|
|
|
9
9
|
multipleRemoteComponentsError,
|
|
10
10
|
RemoteComponentsError
|
|
11
11
|
} from "#internal/utils/error";
|
|
12
|
+
import {
|
|
13
|
+
DATA_BUNDLE,
|
|
14
|
+
DATA_REMOTE_COMPONENTS_SHARED,
|
|
15
|
+
DATA_ROUTE,
|
|
16
|
+
DATA_RUNTIME,
|
|
17
|
+
DATA_SRC,
|
|
18
|
+
DATA_TYPE,
|
|
19
|
+
ID_SUFFIX_RSC,
|
|
20
|
+
ID_SUFFIX_SHARED,
|
|
21
|
+
ID_SUFFIX_SSR,
|
|
22
|
+
NEXT_CONTAINER_ID,
|
|
23
|
+
NEXT_DATA_ID,
|
|
24
|
+
REMOTE_NEXT_DATA_ID,
|
|
25
|
+
TAG_REMOTE_COMPONENT
|
|
26
|
+
} from "./html-spec";
|
|
12
27
|
function validateSingleComponent(doc, name, url) {
|
|
13
|
-
if (doc.querySelectorAll(
|
|
28
|
+
if (doc.querySelectorAll(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`).length > 1 && !doc.querySelector(
|
|
29
|
+
`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^="${name}"]`
|
|
30
|
+
) || doc.querySelectorAll(`${TAG_REMOTE_COMPONENT}:not([src])`).length > 1 && !doc.querySelector(`${TAG_REMOTE_COMPONENT}[name="${name}"]`)) {
|
|
14
31
|
throw multipleRemoteComponentsError(url);
|
|
15
32
|
}
|
|
16
33
|
}
|
|
17
34
|
function findComponentElement(doc, name) {
|
|
18
|
-
return doc.querySelector(`div[
|
|
35
|
+
return doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^="${name}"]`) ?? doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`) ?? doc.querySelector(`div#${NEXT_CONTAINER_ID}`) ?? doc.querySelector(`${TAG_REMOTE_COMPONENT}[name="${name}"]:not([src])`) ?? doc.querySelector(`${TAG_REMOTE_COMPONENT}:not([src])`);
|
|
19
36
|
}
|
|
20
37
|
function parseNextData(doc) {
|
|
21
38
|
return JSON.parse(
|
|
22
|
-
(doc.querySelector(
|
|
39
|
+
(doc.querySelector(`#${NEXT_DATA_ID}`) ?? doc.querySelector(`#${REMOTE_NEXT_DATA_ID}`))?.textContent ?? "null"
|
|
23
40
|
);
|
|
24
41
|
}
|
|
25
42
|
function resolveComponentName(component, nextData, fallbackName) {
|
|
26
|
-
const isRemoteComponent = component?.tagName.toLowerCase() ===
|
|
27
|
-
const name = component?.getAttribute("id")?.replace(
|
|
43
|
+
const isRemoteComponent = component?.tagName.toLowerCase() === TAG_REMOTE_COMPONENT;
|
|
44
|
+
const name = component?.getAttribute("id")?.replace(new RegExp(`${ID_SUFFIX_SSR}$`), "") || isRemoteComponent && component?.getAttribute("name") || (nextData ? "__next" : fallbackName);
|
|
28
45
|
return { name, isRemoteComponent };
|
|
29
46
|
}
|
|
30
47
|
function extractRemoteShared(doc, name, nextData) {
|
|
31
48
|
const remoteSharedEl = doc.querySelector(
|
|
32
|
-
`#${name}
|
|
49
|
+
`#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`
|
|
33
50
|
);
|
|
34
51
|
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.shared ?? (JSON.parse(remoteSharedEl?.textContent ?? "{}") ?? {});
|
|
35
52
|
remoteSharedEl?.remove();
|
|
@@ -50,7 +67,7 @@ function extractLinks(doc, component) {
|
|
|
50
67
|
function extractScripts(doc, component, isRemoteComponent) {
|
|
51
68
|
return Array.from(
|
|
52
69
|
(isRemoteComponent ? component : doc).querySelectorAll(
|
|
53
|
-
|
|
70
|
+
`script[src],script[${DATA_SRC}]`
|
|
54
71
|
)
|
|
55
72
|
);
|
|
56
73
|
}
|
|
@@ -63,15 +80,15 @@ function parseRemoteComponentDocument(doc, name, url) {
|
|
|
63
80
|
nextData,
|
|
64
81
|
name
|
|
65
82
|
);
|
|
66
|
-
const rsc = doc.querySelector(`#${resolvedName}
|
|
83
|
+
const rsc = doc.querySelector(`#${resolvedName}${ID_SUFFIX_RSC}`);
|
|
67
84
|
const metadata = buildMetadata(
|
|
68
85
|
{
|
|
69
86
|
name: resolvedName,
|
|
70
|
-
bundle: component?.getAttribute(
|
|
71
|
-
route: component?.getAttribute(
|
|
72
|
-
runtime: component?.getAttribute(
|
|
87
|
+
bundle: component?.getAttribute(DATA_BUNDLE) || nextData?.props.__REMOTE_COMPONENT__?.bundle,
|
|
88
|
+
route: component?.getAttribute(DATA_ROUTE) ?? nextData?.page,
|
|
89
|
+
runtime: component?.getAttribute(DATA_RUNTIME) ?? nextData?.props.__REMOTE_COMPONENT__?.runtime ?? RUNTIME_SCRIPT,
|
|
73
90
|
id: component?.getAttribute("id"),
|
|
74
|
-
type: component?.getAttribute(
|
|
91
|
+
type: component?.getAttribute(DATA_TYPE)
|
|
75
92
|
},
|
|
76
93
|
url
|
|
77
94
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module map extracted from the component's shared data script. */\n remoteShared: Record<string, string>;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll('div[data-bundle][data-route]').length > 1 &&\n !doc.querySelector(`div[data-bundle][data-route][id^=\"${name}\"]`)) ||\n (doc.querySelectorAll('remote-component:not([src])').length > 1 &&\n !doc.querySelector(`remote-component[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[data-bundle][data-route][id^=\"${name}\"]`) ??\n doc.querySelector('div[data-bundle][data-route]') ??\n doc.querySelector('div#__next') ??\n doc.querySelector(`remote-component[name=\"${name}\"]:not([src])`) ??\n doc.querySelector('remote-component:not([src])')\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector('#__NEXT_DATA__') ??\n doc.querySelector('#__REMOTE_NEXT_DATA__')\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === 'remote-component';\n\n const name =\n component?.getAttribute('id')?.replace(/_ssr$/, '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): Record<string, string> {\n const remoteSharedEl = doc.querySelector(\n `#${name}_shared[data-remote-components-shared]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n 'script[src],script[data-src]',\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}_rsc`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute('data-bundle') ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute('data-route') ?? nextData?.page,\n runtime:\n component?.getAttribute('data-runtime') ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute('data-type'),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport {\n DATA_BUNDLE,\n DATA_REMOTE_COMPONENTS_SHARED,\n DATA_ROUTE,\n DATA_RUNTIME,\n DATA_SRC,\n DATA_TYPE,\n ID_SUFFIX_RSC,\n ID_SUFFIX_SHARED,\n ID_SUFFIX_SSR,\n NEXT_CONTAINER_ID,\n NEXT_DATA_ID,\n REMOTE_NEXT_DATA_ID,\n TAG_REMOTE_COMPONENT,\n} from './html-spec';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module map extracted from the component's shared data script. */\n remoteShared: Record<string, string>;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`).length > 1 &&\n !doc.querySelector(\n `div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`,\n )) ||\n (doc.querySelectorAll(`${TAG_REMOTE_COMPONENT}:not([src])`).length > 1 &&\n !doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`) ??\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`) ??\n doc.querySelector(`div#${NEXT_CONTAINER_ID}`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]:not([src])`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}:not([src])`)\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector(`#${NEXT_DATA_ID}`) ??\n doc.querySelector(`#${REMOTE_NEXT_DATA_ID}`)\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === TAG_REMOTE_COMPONENT;\n\n const name =\n component\n ?.getAttribute('id')\n ?.replace(new RegExp(`${ID_SUFFIX_SSR}$`), '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): Record<string, string> {\n const remoteSharedEl = doc.querySelector(\n `#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n `script[src],script[${DATA_SRC}]`,\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}${ID_SUFFIX_RSC}`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute(DATA_BUNDLE) ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute(DATA_ROUTE) ?? nextData?.page,\n runtime:\n component?.getAttribute(DATA_RUNTIME) ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute(DATA_TYPE),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var rewrite_srcset_exports = {};
|
|
20
|
+
__export(rewrite_srcset_exports, {
|
|
21
|
+
rewriteSrcset: () => rewriteSrcset
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(rewrite_srcset_exports);
|
|
24
|
+
function rewriteSrcset(srcset, base, resolve) {
|
|
25
|
+
return srcset.split(",").map((entry) => {
|
|
26
|
+
const [url, descriptor] = entry.trim().split(/\s+/);
|
|
27
|
+
if (!url)
|
|
28
|
+
return entry;
|
|
29
|
+
const absoluteUrl = new URL(url, base).href;
|
|
30
|
+
const resolvedUrl = resolve ? resolve(absoluteUrl) : absoluteUrl;
|
|
31
|
+
return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;
|
|
32
|
+
}).join(", ");
|
|
33
|
+
}
|
|
34
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
+
0 && (module.exports = {
|
|
36
|
+
rewriteSrcset
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=rewrite-srcset.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/rewrite-srcset.ts"],"sourcesContent":["/**\n * Rewrites relative URLs in an HTML `srcset` or `imagesrcset` attribute value\n * to absolute URLs. Works identically in server (parse5) and browser (DOM) contexts.\n *\n * @param srcset - The raw srcset attribute value (comma-separated entries).\n * @param base - Base URL or origin to resolve relative URLs against.\n * @param resolve - Optional callback applied to each absolute URL (e.g. to proxy through a CDN).\n * @returns The rewritten srcset string with absolute (and optionally resolved) URLs.\n */\nexport function rewriteSrcset(\n srcset: string,\n base: URL | string,\n resolve?: (absoluteUrl: string) => string,\n): string {\n return srcset\n .split(',')\n .map((entry) => {\n const [url, descriptor] = entry.trim().split(/\\s+/);\n if (!url) return entry;\n\n const absoluteUrl = new URL(url, base).href;\n const resolvedUrl = resolve ? resolve(absoluteUrl) : absoluteUrl;\n return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;\n })\n .join(', ');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,SAAS,cACd,QACA,MACA,SACQ;AACR,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,UAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,QAAI,CAAC;AAAK,aAAO;AAEjB,UAAM,cAAc,IAAI,IAAI,KAAK,IAAI,EAAE;AACvC,UAAM,cAAc,UAAU,QAAQ,WAAW,IAAI;AACrD,WAAO,aAAa,GAAG,eAAe,eAAe;AAAA,EACvD,CAAC,EACA,KAAK,IAAI;AACd;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rewrites relative URLs in an HTML `srcset` or `imagesrcset` attribute value
|
|
3
|
+
* to absolute URLs. Works identically in server (parse5) and browser (DOM) contexts.
|
|
4
|
+
*
|
|
5
|
+
* @param srcset - The raw srcset attribute value (comma-separated entries).
|
|
6
|
+
* @param base - Base URL or origin to resolve relative URLs against.
|
|
7
|
+
* @param resolve - Optional callback applied to each absolute URL (e.g. to proxy through a CDN).
|
|
8
|
+
* @returns The rewritten srcset string with absolute (and optionally resolved) URLs.
|
|
9
|
+
*/
|
|
10
|
+
declare function rewriteSrcset(srcset: string, base: URL | string, resolve?: (absoluteUrl: string) => string): string;
|
|
11
|
+
|
|
12
|
+
export { rewriteSrcset };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function rewriteSrcset(srcset, base, resolve) {
|
|
2
|
+
return srcset.split(",").map((entry) => {
|
|
3
|
+
const [url, descriptor] = entry.trim().split(/\s+/);
|
|
4
|
+
if (!url)
|
|
5
|
+
return entry;
|
|
6
|
+
const absoluteUrl = new URL(url, base).href;
|
|
7
|
+
const resolvedUrl = resolve ? resolve(absoluteUrl) : absoluteUrl;
|
|
8
|
+
return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;
|
|
9
|
+
}).join(", ");
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
rewriteSrcset
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=rewrite-srcset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/rewrite-srcset.ts"],"sourcesContent":["/**\n * Rewrites relative URLs in an HTML `srcset` or `imagesrcset` attribute value\n * to absolute URLs. Works identically in server (parse5) and browser (DOM) contexts.\n *\n * @param srcset - The raw srcset attribute value (comma-separated entries).\n * @param base - Base URL or origin to resolve relative URLs against.\n * @param resolve - Optional callback applied to each absolute URL (e.g. to proxy through a CDN).\n * @returns The rewritten srcset string with absolute (and optionally resolved) URLs.\n */\nexport function rewriteSrcset(\n srcset: string,\n base: URL | string,\n resolve?: (absoluteUrl: string) => string,\n): string {\n return srcset\n .split(',')\n .map((entry) => {\n const [url, descriptor] = entry.trim().split(/\\s+/);\n if (!url) return entry;\n\n const absoluteUrl = new URL(url, base).href;\n const resolvedUrl = resolve ? resolve(absoluteUrl) : absoluteUrl;\n return descriptor ? `${resolvedUrl} ${descriptor}` : resolvedUrl;\n })\n .join(', ');\n}\n"],"mappings":"AASO,SAAS,cACd,QACA,MACA,SACQ;AACR,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,UAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,QAAI,CAAC;AAAK,aAAO;AAEjB,UAAM,cAAc,IAAI,IAAI,KAAK,IAAI,EAAE;AACvC,UAAM,cAAc,UAAU,QAAQ,WAAW,IAAI;AACrD,WAAO,aAAa,GAAG,eAAe,eAAe;AAAA,EACvD,CAAC,EACA,KAAK,IAAI;AACd;","names":[]}
|