remote-components 0.0.26 → 0.0.27
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/internal/shared/ssr/dom-flight.cjs +66 -32
- package/dist/internal/shared/ssr/dom-flight.cjs.map +1 -1
- package/dist/internal/shared/ssr/dom-flight.d.ts +8 -1
- package/dist/internal/shared/ssr/dom-flight.js +66 -32
- package/dist/internal/shared/ssr/dom-flight.js.map +1 -1
- package/package.json +1 -1
|
@@ -51,19 +51,26 @@ function visit(node, context = {
|
|
|
51
51
|
url: new URL("http://localhost"),
|
|
52
52
|
active: false
|
|
53
53
|
}) {
|
|
54
|
+
if ("attrs" in node && typeof node.attrsObj === "undefined") {
|
|
55
|
+
node.attrsObjToArray = {};
|
|
56
|
+
node.attrsObj = node.attrs.reduce((acc, attr) => {
|
|
57
|
+
acc[attr.name] = attr.value;
|
|
58
|
+
if (node.attrsObjToArray) {
|
|
59
|
+
node.attrsObjToArray[attr.name] = attr;
|
|
60
|
+
}
|
|
61
|
+
return acc;
|
|
62
|
+
}, {});
|
|
63
|
+
}
|
|
54
64
|
if (applyOriginToNodes.includes(node.nodeName.toLowerCase()) && "attrs" in node) {
|
|
55
65
|
const origin = context.origin ?? context.url.origin;
|
|
56
|
-
const src = node.
|
|
66
|
+
const src = node.attrsObj?.src;
|
|
57
67
|
if (src) {
|
|
58
68
|
const url = new URL(src, origin);
|
|
59
|
-
node.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
return attr;
|
|
64
|
-
});
|
|
69
|
+
if (node.attrsObjToArray && "src" in node.attrsObjToArray) {
|
|
70
|
+
node.attrsObjToArray.src.value = url.href;
|
|
71
|
+
}
|
|
65
72
|
}
|
|
66
|
-
const srcSet = node.
|
|
73
|
+
const srcSet = node.attrsObj?.srcset;
|
|
67
74
|
if (srcSet) {
|
|
68
75
|
const srcSetValue = srcSet.split(",").map((entry) => {
|
|
69
76
|
const [url, descriptor] = entry.trim().split(/\s+/);
|
|
@@ -72,16 +79,13 @@ function visit(node, context = {
|
|
|
72
79
|
const absoluteUrl = new URL(url, origin).href;
|
|
73
80
|
return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;
|
|
74
81
|
}).join(", ");
|
|
75
|
-
node.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
return attr;
|
|
80
|
-
});
|
|
82
|
+
if (node.attrsObjToArray && "srcset" in node.attrsObjToArray) {
|
|
83
|
+
node.attrsObjToArray.srcset.value = srcSetValue;
|
|
84
|
+
}
|
|
81
85
|
}
|
|
82
86
|
}
|
|
83
87
|
if (node.nodeName === "script" || node.nodeName === "link") {
|
|
84
|
-
const nodeId = node.
|
|
88
|
+
const nodeId = node.attrsObj?.id;
|
|
85
89
|
if (nodeId?.endsWith("_shared")) {
|
|
86
90
|
context.onShared?.(
|
|
87
91
|
JSON.parse(node.childNodes[0].value)
|
|
@@ -103,7 +107,7 @@ function visit(node, context = {
|
|
|
103
107
|
JSON.parse(node.childNodes[0].value)
|
|
104
108
|
);
|
|
105
109
|
} else if (node.childNodes.length === 0) {
|
|
106
|
-
if (node.nodeName === "script" &&
|
|
110
|
+
if (node.nodeName === "script" && node.attrsObj && !("src" in node.attrsObj)) {
|
|
107
111
|
return [
|
|
108
112
|
"$",
|
|
109
113
|
node.nodeName,
|
|
@@ -124,13 +128,17 @@ function visit(node, context = {
|
|
|
124
128
|
return props;
|
|
125
129
|
}, {})
|
|
126
130
|
);
|
|
127
|
-
const src = node.
|
|
131
|
+
const src = node.attrsObj?.src;
|
|
128
132
|
if (src) {
|
|
129
133
|
node.attrs = node.attrs.filter((attr) => attr.name !== "src");
|
|
130
134
|
node.attrs.push({
|
|
131
135
|
name: "data-src",
|
|
132
136
|
value: src
|
|
133
137
|
});
|
|
138
|
+
if (node.attrsObj) {
|
|
139
|
+
delete node.attrsObj.src;
|
|
140
|
+
node.attrsObj["data-src"] = src;
|
|
141
|
+
}
|
|
134
142
|
}
|
|
135
143
|
context.onHTML?.((0, import_parse5.serializeOuter)(node));
|
|
136
144
|
} else {
|
|
@@ -149,16 +157,28 @@ function visit(node, context = {
|
|
|
149
157
|
}
|
|
150
158
|
}
|
|
151
159
|
if (!context.active) {
|
|
160
|
+
if (!context.visitedNonActiveNodes) {
|
|
161
|
+
context.visitedNonActiveNodes = /* @__PURE__ */ new Set();
|
|
162
|
+
}
|
|
152
163
|
if ("childNodes" in node) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
164
|
+
if (!context.visitedNonActiveNodes.has(node)) {
|
|
165
|
+
context.visitedNonActiveNodes.add(node);
|
|
166
|
+
node.childNodes.forEach((childNode) => {
|
|
167
|
+
visit(childNode, context);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
156
170
|
} else
|
|
157
171
|
return null;
|
|
158
172
|
}
|
|
159
173
|
switch (node.nodeName) {
|
|
160
174
|
case "#document-fragment":
|
|
161
|
-
return node.childNodes.
|
|
175
|
+
return node.childNodes.reduce((acc, childNode) => {
|
|
176
|
+
const result = visit(childNode, context);
|
|
177
|
+
if (result !== null) {
|
|
178
|
+
acc.push(result);
|
|
179
|
+
}
|
|
180
|
+
return acc;
|
|
181
|
+
}, []);
|
|
162
182
|
case "#text":
|
|
163
183
|
return node.value;
|
|
164
184
|
case "#comment":
|
|
@@ -168,22 +188,36 @@ function visit(node, context = {
|
|
|
168
188
|
case "noscript":
|
|
169
189
|
return null;
|
|
170
190
|
default: {
|
|
171
|
-
const nodeId =
|
|
172
|
-
if (node.nodeName === "div" && (nodeId === "__next" || (context.name ? node.
|
|
173
|
-
(it) => it.name === "id" && it.value.startsWith(
|
|
174
|
-
context.name ?? "__vercel_remote_component"
|
|
175
|
-
)
|
|
176
|
-
) : node.attrs.find((it) => it.name === "data-bundle" && it.value) && node.attrs.find((it) => it.name === "data-route") && nodeId?.endsWith("_ssr")))) {
|
|
191
|
+
const nodeId = node.attrsObj?.id;
|
|
192
|
+
if (node.nodeName === "div" && (nodeId === "__next" || (context.name ? nodeId?.startsWith(context.name) : node.attrsObj && "data-bundle" in node.attrsObj && node.attrsObj["data-bundle"] && "data-route" in node.attrsObj && nodeId?.endsWith("_ssr")))) {
|
|
177
193
|
context.onMetadata?.({
|
|
178
|
-
bundle: node.
|
|
179
|
-
route: node.
|
|
180
|
-
runtime: node.
|
|
194
|
+
bundle: node.attrsObj?.["data-bundle"] ?? "default",
|
|
195
|
+
route: node.attrsObj?.["data-route"] ?? "/",
|
|
196
|
+
runtime: node.attrsObj?.["data-runtime"] ?? "webpack",
|
|
181
197
|
id: nodeId?.endsWith("_ssr") ? nodeId : "__vercel_remote_component"
|
|
182
198
|
});
|
|
183
199
|
context.onHTML?.((0, import_parse5.serializeOuter)(node));
|
|
184
|
-
return node.childNodes.
|
|
200
|
+
return node.childNodes.reduce((acc, childNode) => {
|
|
201
|
+
const result = visit(childNode, {
|
|
202
|
+
...context,
|
|
203
|
+
active: true
|
|
204
|
+
});
|
|
205
|
+
if (result !== null) {
|
|
206
|
+
acc.push(result);
|
|
207
|
+
}
|
|
208
|
+
return acc;
|
|
209
|
+
}, []);
|
|
185
210
|
}
|
|
186
|
-
const childNodes = node.childNodes.
|
|
211
|
+
const childNodes = node.childNodes.reduce(
|
|
212
|
+
(acc, childNode) => {
|
|
213
|
+
const result = visit(childNode, context);
|
|
214
|
+
if (result !== null) {
|
|
215
|
+
acc.push(result);
|
|
216
|
+
}
|
|
217
|
+
return acc;
|
|
218
|
+
},
|
|
219
|
+
[]
|
|
220
|
+
);
|
|
187
221
|
const children = childNodes.length > 1 ? childNodes : childNodes[0];
|
|
188
222
|
const nodeProps = node.attrs.reduce((props, attr) => {
|
|
189
223
|
if (attr.name === "style") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/shared/ssr/dom-flight.ts"],"sourcesContent":["import { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { serializeOuter } from 'parse5';\nimport type { RemoteComponentMetadata } from './types';\n\n// add fetch-priority to the possible standard names\npossibleStandardNames.fetchpriority = 'fetchPriority';\npossibleStandardNames['data-precedence'] = 'precedence';\n\nexport interface Context {\n name?: string;\n url: URL;\n origin?: string;\n defer?: boolean;\n active?: boolean;\n visitedRSCNodes?: Set<Node>;\n onMetadata?: (metadata: RemoteComponentMetadata) => void;\n onScript?: (attrs: Record<string, string | boolean>) => void;\n onLink?: (attrs: Record<string, string | boolean>) => void;\n onRSC?: (rsc: string) => void;\n onNextData?: (data: {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: {\n bundle: string;\n runtime: string;\n };\n };\n page?: string;\n }) => void;\n onHTML?: (html: string) => void;\n onShared?: (shared: Record<string, string>) => void;\n}\n\ntype RSC =\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | (\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | string\n | null\n )[]\n | string\n | null;\n\nconst applyOriginToNodes = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n];\n\nexport function visit(\n node: Node | ChildNode,\n context: Context = {\n url: new URL('http://localhost'),\n active: false,\n },\n): RSC | RSC[] | string | null {\n // apply origin to src and srcset attributes\n if (\n applyOriginToNodes.includes(node.nodeName.toLowerCase()) &&\n 'attrs' in node\n ) {\n const origin = context.origin ?? context.url.origin;\n const src = node.attrs.find((attr) => attr.name === 'src')?.value;\n if (src) {\n const url = new URL(src, origin);\n node.attrs = node.attrs.map((attr) => {\n if (attr.name === 'src') {\n attr.value = url.href;\n }\n return attr;\n });\n }\n\n const srcSet = node.attrs.find((attr) => attr.name === 'srcset')?.value;\n if (srcSet) {\n const srcSetValue = 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, origin).href;\n return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;\n })\n .join(', ');\n node.attrs = node.attrs.map((attr) => {\n if (attr.name === 'srcset') {\n attr.value = srcSetValue;\n }\n return attr;\n });\n }\n }\n\n if (node.nodeName === 'script' || node.nodeName === 'link') {\n const nodeId = node.attrs.find((attr) => attr.name === 'id')?.value;\n if (nodeId?.endsWith('_shared')) {\n context.onShared?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as Record<\n string,\n string\n >,\n );\n return null;\n } else if (nodeId?.endsWith('_rsc') && 'childNodes' in node) {\n if (!context.visitedRSCNodes) {\n context.visitedRSCNodes = new Set();\n }\n if (\n !context.visitedRSCNodes.has(node) &&\n (context.name ? nodeId.startsWith(context.name) : true)\n ) {\n context.visitedRSCNodes.add(node);\n context.onRSC?.((node.childNodes[0] as TextNode).value);\n }\n } else if (nodeId === '__NEXT_DATA__' && 'childNodes' in node) {\n context.onHTML?.(\n `<script id=\"__REMOTE_NEXT_DATA__\" type=\"application/json\">${(node.childNodes[0] as TextNode).value}</script>`,\n );\n context.onNextData?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as {\n props: { pageProps: Record<string, unknown> };\n },\n );\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n !node.attrs.find((attr) => attr.name === 'src')\n ) {\n return [\n '$',\n node.nodeName,\n null,\n node.attrs.reduce<Record<string, string>>((props, attr) => {\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {}),\n null,\n null,\n 1,\n ] as RSC;\n }\n if (node.nodeName === 'script') {\n context.onScript?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n }, {}),\n );\n const src = node.attrs.find((attr) => attr.name === 'src')?.value;\n if (src) {\n node.attrs = node.attrs.filter((attr) => attr.name !== 'src');\n node.attrs.push({\n name: 'data-src',\n value: src,\n });\n }\n context.onHTML?.(serializeOuter(node));\n } else {\n context.onLink?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n if (attr.name === 'href') {\n attr.value = new URL(attr.value, context.url.origin).href;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] =\n attr.value || true;\n return props;\n }, {}),\n );\n context.onHTML?.(serializeOuter(node));\n }\n return null;\n }\n }\n\n if (!context.active) {\n if ('childNodes' in node) {\n (node as Element).childNodes.forEach((childNode) => {\n visit(childNode, context);\n });\n } else return null;\n }\n\n switch (node.nodeName) {\n case '#document-fragment':\n return node.childNodes\n .map((childNode) => visit(childNode, context))\n .filter((it) => it !== null) as unknown as RSC;\n case '#text':\n return (node as TextNode).value;\n case '#comment':\n case 'head':\n case 'meta':\n case 'title':\n case 'noscript':\n return null;\n default: {\n const nodeId = Array.isArray((node as Element).attrs)\n ? (node as Element).attrs.find((attr) => attr.name === 'id')?.value\n : undefined;\n\n if (\n node.nodeName === 'div' &&\n (nodeId === '__next' ||\n (context.name\n ? node.attrs.find(\n (it) =>\n it.name === 'id' &&\n it.value.startsWith(\n context.name ?? '__vercel_remote_component',\n ),\n )\n : node.attrs.find((it) => it.name === 'data-bundle' && it.value) &&\n node.attrs.find((it) => it.name === 'data-route') &&\n nodeId?.endsWith('_ssr')))\n ) {\n context.onMetadata?.({\n bundle:\n node.attrs.find((it) => it.name === 'data-bundle' && it.value)\n ?.value ?? '',\n route:\n node.attrs.find((it) => it.name === 'data-route')?.value ?? '/',\n runtime: (node.attrs.find((it) => it.name === 'data-runtime')\n ?.value ?? 'webpack') as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n });\n context.onHTML?.(serializeOuter(node));\n return node.childNodes\n .map((childNode) => visit(childNode, { ...context, active: true }))\n .filter((it) => it !== null) as unknown as RSC;\n }\n const childNodes = (node as Element).childNodes\n .map((childNode) => visit(childNode, context))\n .filter((childNode) => childNode !== null);\n const children = childNodes.length > 1 ? childNodes : childNodes[0];\n const nodeProps = (node as Element).attrs.reduce<\n Record<string, string | ReturnType<typeof styleToJs>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children?: any;\n }\n >((props, attr) => {\n if (attr.name === 'style') {\n props.style = styleToJs(attr.value, {\n reactCompat: true,\n });\n return props;\n }\n if (node.nodeName === 'input' && attr.name === 'value') {\n props.defaultValue = attr.value;\n return props;\n }\n if (isCustomAttribute(attr.name)) {\n props[attr.name] = attr.value;\n return props;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {});\n if (typeof children !== 'undefined') {\n if (\n node.nodeName === 'script' &&\n typeof children === 'string' &&\n children.startsWith('$')\n ) {\n nodeProps.children = `$${children}`;\n } else {\n nodeProps.children = children;\n }\n }\n if (!context.active) {\n if (childNodes.length > 0) {\n return childNodes as RSC;\n }\n return null;\n }\n return ['$', node.nodeName, null, nodeProps, null, null, 1] as RSC;\n }\n }\n}\n"],"mappings":"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","names":["styleToJs"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/shared/ssr/dom-flight.ts"],"sourcesContent":["import { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { serializeOuter } from 'parse5';\nimport type { RemoteComponentMetadata } from './types';\n\n// add fetch-priority to the possible standard names\npossibleStandardNames.fetchpriority = 'fetchPriority';\npossibleStandardNames['data-precedence'] = 'precedence';\n\nexport interface Context {\n name?: string;\n url: URL;\n origin?: string;\n defer?: boolean;\n active?: boolean;\n visitedRSCNodes?: Set<Node>;\n visitedNonActiveNodes?: Set<Node>;\n onMetadata?: (metadata: RemoteComponentMetadata) => void;\n onScript?: (attrs: Record<string, string | boolean>) => void;\n onLink?: (attrs: Record<string, string | boolean>) => void;\n onRSC?: (rsc: string) => void;\n onNextData?: (data: {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: {\n bundle: string;\n runtime: string;\n };\n };\n page?: string;\n }) => void;\n onHTML?: (html: string) => void;\n onShared?: (shared: Record<string, string>) => void;\n}\n\ntype RSC =\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | (\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | string\n | null\n )[]\n | string\n | null;\n\nconst applyOriginToNodes = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n];\n\nexport function visit(\n node: (Node | ChildNode) & {\n attrsObj?: Record<string, string>;\n attrsObjToArray?: Record<string, { name: string; value: string }>;\n },\n context: Context = {\n url: new URL('http://localhost'),\n active: false,\n },\n): RSC | RSC[] | string | null {\n if ('attrs' in node && typeof node.attrsObj === 'undefined') {\n node.attrsObjToArray = {};\n node.attrsObj = node.attrs.reduce<Record<string, string>>((acc, attr) => {\n acc[attr.name] = attr.value;\n if (node.attrsObjToArray) {\n node.attrsObjToArray[attr.name] = attr;\n }\n return acc;\n }, {});\n }\n\n // apply origin to src and srcset attributes\n if (\n applyOriginToNodes.includes(node.nodeName.toLowerCase()) &&\n 'attrs' in node\n ) {\n const origin = context.origin ?? context.url.origin;\n const src = node.attrsObj?.src;\n if (src) {\n const url = new URL(src, origin);\n if (node.attrsObjToArray && 'src' in node.attrsObjToArray) {\n node.attrsObjToArray.src.value = url.href;\n }\n }\n\n const srcSet = node.attrsObj?.srcset;\n if (srcSet) {\n const srcSetValue = 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, origin).href;\n return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;\n })\n .join(', ');\n if (node.attrsObjToArray && 'srcset' in node.attrsObjToArray) {\n node.attrsObjToArray.srcset.value = srcSetValue;\n }\n }\n }\n\n if (node.nodeName === 'script' || node.nodeName === 'link') {\n const nodeId = node.attrsObj?.id;\n if (nodeId?.endsWith('_shared')) {\n context.onShared?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as Record<\n string,\n string\n >,\n );\n return null;\n } else if (nodeId?.endsWith('_rsc') && 'childNodes' in node) {\n if (!context.visitedRSCNodes) {\n context.visitedRSCNodes = new Set();\n }\n if (\n !context.visitedRSCNodes.has(node) &&\n (context.name ? nodeId.startsWith(context.name) : true)\n ) {\n context.visitedRSCNodes.add(node);\n context.onRSC?.((node.childNodes[0] as TextNode).value);\n }\n } else if (nodeId === '__NEXT_DATA__' && 'childNodes' in node) {\n context.onHTML?.(\n `<script id=\"__REMOTE_NEXT_DATA__\" type=\"application/json\">${(node.childNodes[0] as TextNode).value}</script>`,\n );\n context.onNextData?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as {\n props: { pageProps: Record<string, unknown> };\n },\n );\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n node.attrsObj &&\n !('src' in node.attrsObj)\n ) {\n return [\n '$',\n node.nodeName,\n null,\n node.attrs.reduce<Record<string, string>>((props, attr) => {\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {}),\n null,\n null,\n 1,\n ] as RSC;\n }\n if (node.nodeName === 'script') {\n context.onScript?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n }, {}),\n );\n const src = node.attrsObj?.src;\n if (src) {\n node.attrs = node.attrs.filter((attr) => attr.name !== 'src');\n node.attrs.push({\n name: 'data-src',\n value: src,\n });\n if (node.attrsObj) {\n delete node.attrsObj.src;\n node.attrsObj['data-src'] = src;\n }\n }\n context.onHTML?.(serializeOuter(node));\n } else {\n context.onLink?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n if (attr.name === 'href') {\n attr.value = new URL(attr.value, context.url.origin).href;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] =\n attr.value || true;\n return props;\n }, {}),\n );\n context.onHTML?.(serializeOuter(node));\n }\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if ('childNodes' in node) {\n if (!context.visitedNonActiveNodes.has(node)) {\n context.visitedNonActiveNodes.add(node);\n (node as Element).childNodes.forEach((childNode) => {\n visit(childNode, context);\n });\n }\n } else return null;\n }\n\n switch (node.nodeName) {\n case '#document-fragment':\n return node.childNodes.reduce<RSC[]>((acc, childNode) => {\n const result = visit(childNode, context);\n if (result !== null) {\n acc.push(result as unknown as RSC);\n }\n return acc;\n }, []);\n case '#text':\n return (node as TextNode).value;\n case '#comment':\n case 'head':\n case 'meta':\n case 'title':\n case 'noscript':\n return null;\n default: {\n const nodeId = node.attrsObj?.id;\n\n if (\n node.nodeName === 'div' &&\n (nodeId === '__next' ||\n (context.name\n ? nodeId?.startsWith(context.name)\n : node.attrsObj &&\n 'data-bundle' in node.attrsObj &&\n node.attrsObj['data-bundle'] &&\n 'data-route' in node.attrsObj &&\n nodeId?.endsWith('_ssr')))\n ) {\n context.onMetadata?.({\n bundle: node.attrsObj?.['data-bundle'] ?? 'default',\n route: node.attrsObj?.['data-route'] ?? '/',\n runtime: (node.attrsObj?.['data-runtime'] ??\n 'webpack') as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n });\n context.onHTML?.(serializeOuter(node));\n return node.childNodes.reduce<RSC[]>((acc, childNode) => {\n const result = visit(childNode, {\n ...context,\n active: true,\n });\n if (result !== null) {\n acc.push(result as unknown as RSC);\n }\n return acc;\n }, []);\n }\n const childNodes = (node as Element).childNodes.reduce<unknown[]>(\n (acc, childNode) => {\n const result = visit(childNode, context);\n if (result !== null) {\n acc.push(result as unknown);\n }\n return acc;\n },\n [],\n );\n const children = childNodes.length > 1 ? childNodes : childNodes[0];\n const nodeProps = (node as Element).attrs.reduce<\n Record<string, string | ReturnType<typeof styleToJs>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children?: any;\n }\n >((props, attr) => {\n if (attr.name === 'style') {\n props.style = styleToJs(attr.value, {\n reactCompat: true,\n });\n return props;\n }\n if (node.nodeName === 'input' && attr.name === 'value') {\n props.defaultValue = attr.value;\n return props;\n }\n if (isCustomAttribute(attr.name)) {\n props[attr.name] = attr.value;\n return props;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {});\n if (typeof children !== 'undefined') {\n if (\n node.nodeName === 'script' &&\n typeof children === 'string' &&\n children.startsWith('$')\n ) {\n nodeProps.children = `$${children}`;\n } else {\n nodeProps.children = children;\n }\n }\n if (!context.active) {\n if (childNodes.length > 0) {\n return childNodes as RSC;\n }\n return null;\n }\n return ['$', node.nodeName, null, nodeProps, null, null, 1] as RSC;\n }\n }\n}\n"],"mappings":"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","names":["styleToJs"]}
|
|
@@ -8,6 +8,7 @@ interface Context {
|
|
|
8
8
|
defer?: boolean;
|
|
9
9
|
active?: boolean;
|
|
10
10
|
visitedRSCNodes?: Set<Node>;
|
|
11
|
+
visitedNonActiveNodes?: Set<Node>;
|
|
11
12
|
onMetadata?: (metadata: RemoteComponentMetadata) => void;
|
|
12
13
|
onScript?: (attrs: Record<string, string | boolean>) => void;
|
|
13
14
|
onLink?: (attrs: Record<string, string | boolean>) => void;
|
|
@@ -26,6 +27,12 @@ interface Context {
|
|
|
26
27
|
onShared?: (shared: Record<string, string>) => void;
|
|
27
28
|
}
|
|
28
29
|
type RSC = ['$', string, null, Record<string, unknown>, null, null, number] | (['$', string, null, Record<string, unknown>, null, null, number] | string | null)[] | string | null;
|
|
29
|
-
declare function visit(node: Node | ChildNode
|
|
30
|
+
declare function visit(node: (Node | ChildNode) & {
|
|
31
|
+
attrsObj?: Record<string, string>;
|
|
32
|
+
attrsObjToArray?: Record<string, {
|
|
33
|
+
name: string;
|
|
34
|
+
value: string;
|
|
35
|
+
}>;
|
|
36
|
+
}, context?: Context): RSC | RSC[] | string | null;
|
|
30
37
|
|
|
31
38
|
export { Context, visit };
|
|
@@ -18,19 +18,26 @@ function visit(node, context = {
|
|
|
18
18
|
url: new URL("http://localhost"),
|
|
19
19
|
active: false
|
|
20
20
|
}) {
|
|
21
|
+
if ("attrs" in node && typeof node.attrsObj === "undefined") {
|
|
22
|
+
node.attrsObjToArray = {};
|
|
23
|
+
node.attrsObj = node.attrs.reduce((acc, attr) => {
|
|
24
|
+
acc[attr.name] = attr.value;
|
|
25
|
+
if (node.attrsObjToArray) {
|
|
26
|
+
node.attrsObjToArray[attr.name] = attr;
|
|
27
|
+
}
|
|
28
|
+
return acc;
|
|
29
|
+
}, {});
|
|
30
|
+
}
|
|
21
31
|
if (applyOriginToNodes.includes(node.nodeName.toLowerCase()) && "attrs" in node) {
|
|
22
32
|
const origin = context.origin ?? context.url.origin;
|
|
23
|
-
const src = node.
|
|
33
|
+
const src = node.attrsObj?.src;
|
|
24
34
|
if (src) {
|
|
25
35
|
const url = new URL(src, origin);
|
|
26
|
-
node.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
return attr;
|
|
31
|
-
});
|
|
36
|
+
if (node.attrsObjToArray && "src" in node.attrsObjToArray) {
|
|
37
|
+
node.attrsObjToArray.src.value = url.href;
|
|
38
|
+
}
|
|
32
39
|
}
|
|
33
|
-
const srcSet = node.
|
|
40
|
+
const srcSet = node.attrsObj?.srcset;
|
|
34
41
|
if (srcSet) {
|
|
35
42
|
const srcSetValue = srcSet.split(",").map((entry) => {
|
|
36
43
|
const [url, descriptor] = entry.trim().split(/\s+/);
|
|
@@ -39,16 +46,13 @@ function visit(node, context = {
|
|
|
39
46
|
const absoluteUrl = new URL(url, origin).href;
|
|
40
47
|
return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;
|
|
41
48
|
}).join(", ");
|
|
42
|
-
node.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
return attr;
|
|
47
|
-
});
|
|
49
|
+
if (node.attrsObjToArray && "srcset" in node.attrsObjToArray) {
|
|
50
|
+
node.attrsObjToArray.srcset.value = srcSetValue;
|
|
51
|
+
}
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
if (node.nodeName === "script" || node.nodeName === "link") {
|
|
51
|
-
const nodeId = node.
|
|
55
|
+
const nodeId = node.attrsObj?.id;
|
|
52
56
|
if (nodeId?.endsWith("_shared")) {
|
|
53
57
|
context.onShared?.(
|
|
54
58
|
JSON.parse(node.childNodes[0].value)
|
|
@@ -70,7 +74,7 @@ function visit(node, context = {
|
|
|
70
74
|
JSON.parse(node.childNodes[0].value)
|
|
71
75
|
);
|
|
72
76
|
} else if (node.childNodes.length === 0) {
|
|
73
|
-
if (node.nodeName === "script" &&
|
|
77
|
+
if (node.nodeName === "script" && node.attrsObj && !("src" in node.attrsObj)) {
|
|
74
78
|
return [
|
|
75
79
|
"$",
|
|
76
80
|
node.nodeName,
|
|
@@ -91,13 +95,17 @@ function visit(node, context = {
|
|
|
91
95
|
return props;
|
|
92
96
|
}, {})
|
|
93
97
|
);
|
|
94
|
-
const src = node.
|
|
98
|
+
const src = node.attrsObj?.src;
|
|
95
99
|
if (src) {
|
|
96
100
|
node.attrs = node.attrs.filter((attr) => attr.name !== "src");
|
|
97
101
|
node.attrs.push({
|
|
98
102
|
name: "data-src",
|
|
99
103
|
value: src
|
|
100
104
|
});
|
|
105
|
+
if (node.attrsObj) {
|
|
106
|
+
delete node.attrsObj.src;
|
|
107
|
+
node.attrsObj["data-src"] = src;
|
|
108
|
+
}
|
|
101
109
|
}
|
|
102
110
|
context.onHTML?.(serializeOuter(node));
|
|
103
111
|
} else {
|
|
@@ -116,16 +124,28 @@ function visit(node, context = {
|
|
|
116
124
|
}
|
|
117
125
|
}
|
|
118
126
|
if (!context.active) {
|
|
127
|
+
if (!context.visitedNonActiveNodes) {
|
|
128
|
+
context.visitedNonActiveNodes = /* @__PURE__ */ new Set();
|
|
129
|
+
}
|
|
119
130
|
if ("childNodes" in node) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
if (!context.visitedNonActiveNodes.has(node)) {
|
|
132
|
+
context.visitedNonActiveNodes.add(node);
|
|
133
|
+
node.childNodes.forEach((childNode) => {
|
|
134
|
+
visit(childNode, context);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
123
137
|
} else
|
|
124
138
|
return null;
|
|
125
139
|
}
|
|
126
140
|
switch (node.nodeName) {
|
|
127
141
|
case "#document-fragment":
|
|
128
|
-
return node.childNodes.
|
|
142
|
+
return node.childNodes.reduce((acc, childNode) => {
|
|
143
|
+
const result = visit(childNode, context);
|
|
144
|
+
if (result !== null) {
|
|
145
|
+
acc.push(result);
|
|
146
|
+
}
|
|
147
|
+
return acc;
|
|
148
|
+
}, []);
|
|
129
149
|
case "#text":
|
|
130
150
|
return node.value;
|
|
131
151
|
case "#comment":
|
|
@@ -135,22 +155,36 @@ function visit(node, context = {
|
|
|
135
155
|
case "noscript":
|
|
136
156
|
return null;
|
|
137
157
|
default: {
|
|
138
|
-
const nodeId =
|
|
139
|
-
if (node.nodeName === "div" && (nodeId === "__next" || (context.name ? node.
|
|
140
|
-
(it) => it.name === "id" && it.value.startsWith(
|
|
141
|
-
context.name ?? "__vercel_remote_component"
|
|
142
|
-
)
|
|
143
|
-
) : node.attrs.find((it) => it.name === "data-bundle" && it.value) && node.attrs.find((it) => it.name === "data-route") && nodeId?.endsWith("_ssr")))) {
|
|
158
|
+
const nodeId = node.attrsObj?.id;
|
|
159
|
+
if (node.nodeName === "div" && (nodeId === "__next" || (context.name ? nodeId?.startsWith(context.name) : node.attrsObj && "data-bundle" in node.attrsObj && node.attrsObj["data-bundle"] && "data-route" in node.attrsObj && nodeId?.endsWith("_ssr")))) {
|
|
144
160
|
context.onMetadata?.({
|
|
145
|
-
bundle: node.
|
|
146
|
-
route: node.
|
|
147
|
-
runtime: node.
|
|
161
|
+
bundle: node.attrsObj?.["data-bundle"] ?? "default",
|
|
162
|
+
route: node.attrsObj?.["data-route"] ?? "/",
|
|
163
|
+
runtime: node.attrsObj?.["data-runtime"] ?? "webpack",
|
|
148
164
|
id: nodeId?.endsWith("_ssr") ? nodeId : "__vercel_remote_component"
|
|
149
165
|
});
|
|
150
166
|
context.onHTML?.(serializeOuter(node));
|
|
151
|
-
return node.childNodes.
|
|
167
|
+
return node.childNodes.reduce((acc, childNode) => {
|
|
168
|
+
const result = visit(childNode, {
|
|
169
|
+
...context,
|
|
170
|
+
active: true
|
|
171
|
+
});
|
|
172
|
+
if (result !== null) {
|
|
173
|
+
acc.push(result);
|
|
174
|
+
}
|
|
175
|
+
return acc;
|
|
176
|
+
}, []);
|
|
152
177
|
}
|
|
153
|
-
const childNodes = node.childNodes.
|
|
178
|
+
const childNodes = node.childNodes.reduce(
|
|
179
|
+
(acc, childNode) => {
|
|
180
|
+
const result = visit(childNode, context);
|
|
181
|
+
if (result !== null) {
|
|
182
|
+
acc.push(result);
|
|
183
|
+
}
|
|
184
|
+
return acc;
|
|
185
|
+
},
|
|
186
|
+
[]
|
|
187
|
+
);
|
|
154
188
|
const children = childNodes.length > 1 ? childNodes : childNodes[0];
|
|
155
189
|
const nodeProps = node.attrs.reduce((props, attr) => {
|
|
156
190
|
if (attr.name === "style") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/shared/ssr/dom-flight.ts"],"sourcesContent":["import { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { serializeOuter } from 'parse5';\nimport type { RemoteComponentMetadata } from './types';\n\n// add fetch-priority to the possible standard names\npossibleStandardNames.fetchpriority = 'fetchPriority';\npossibleStandardNames['data-precedence'] = 'precedence';\n\nexport interface Context {\n name?: string;\n url: URL;\n origin?: string;\n defer?: boolean;\n active?: boolean;\n visitedRSCNodes?: Set<Node>;\n onMetadata?: (metadata: RemoteComponentMetadata) => void;\n onScript?: (attrs: Record<string, string | boolean>) => void;\n onLink?: (attrs: Record<string, string | boolean>) => void;\n onRSC?: (rsc: string) => void;\n onNextData?: (data: {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: {\n bundle: string;\n runtime: string;\n };\n };\n page?: string;\n }) => void;\n onHTML?: (html: string) => void;\n onShared?: (shared: Record<string, string>) => void;\n}\n\ntype RSC =\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | (\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | string\n | null\n )[]\n | string\n | null;\n\nconst applyOriginToNodes = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n];\n\nexport function visit(\n node: Node | ChildNode,\n context: Context = {\n url: new URL('http://localhost'),\n active: false,\n },\n): RSC | RSC[] | string | null {\n // apply origin to src and srcset attributes\n if (\n applyOriginToNodes.includes(node.nodeName.toLowerCase()) &&\n 'attrs' in node\n ) {\n const origin = context.origin ?? context.url.origin;\n const src = node.attrs.find((attr) => attr.name === 'src')?.value;\n if (src) {\n const url = new URL(src, origin);\n node.attrs = node.attrs.map((attr) => {\n if (attr.name === 'src') {\n attr.value = url.href;\n }\n return attr;\n });\n }\n\n const srcSet = node.attrs.find((attr) => attr.name === 'srcset')?.value;\n if (srcSet) {\n const srcSetValue = 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, origin).href;\n return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;\n })\n .join(', ');\n node.attrs = node.attrs.map((attr) => {\n if (attr.name === 'srcset') {\n attr.value = srcSetValue;\n }\n return attr;\n });\n }\n }\n\n if (node.nodeName === 'script' || node.nodeName === 'link') {\n const nodeId = node.attrs.find((attr) => attr.name === 'id')?.value;\n if (nodeId?.endsWith('_shared')) {\n context.onShared?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as Record<\n string,\n string\n >,\n );\n return null;\n } else if (nodeId?.endsWith('_rsc') && 'childNodes' in node) {\n if (!context.visitedRSCNodes) {\n context.visitedRSCNodes = new Set();\n }\n if (\n !context.visitedRSCNodes.has(node) &&\n (context.name ? nodeId.startsWith(context.name) : true)\n ) {\n context.visitedRSCNodes.add(node);\n context.onRSC?.((node.childNodes[0] as TextNode).value);\n }\n } else if (nodeId === '__NEXT_DATA__' && 'childNodes' in node) {\n context.onHTML?.(\n `<script id=\"__REMOTE_NEXT_DATA__\" type=\"application/json\">${(node.childNodes[0] as TextNode).value}</script>`,\n );\n context.onNextData?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as {\n props: { pageProps: Record<string, unknown> };\n },\n );\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n !node.attrs.find((attr) => attr.name === 'src')\n ) {\n return [\n '$',\n node.nodeName,\n null,\n node.attrs.reduce<Record<string, string>>((props, attr) => {\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {}),\n null,\n null,\n 1,\n ] as RSC;\n }\n if (node.nodeName === 'script') {\n context.onScript?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n }, {}),\n );\n const src = node.attrs.find((attr) => attr.name === 'src')?.value;\n if (src) {\n node.attrs = node.attrs.filter((attr) => attr.name !== 'src');\n node.attrs.push({\n name: 'data-src',\n value: src,\n });\n }\n context.onHTML?.(serializeOuter(node));\n } else {\n context.onLink?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n if (attr.name === 'href') {\n attr.value = new URL(attr.value, context.url.origin).href;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] =\n attr.value || true;\n return props;\n }, {}),\n );\n context.onHTML?.(serializeOuter(node));\n }\n return null;\n }\n }\n\n if (!context.active) {\n if ('childNodes' in node) {\n (node as Element).childNodes.forEach((childNode) => {\n visit(childNode, context);\n });\n } else return null;\n }\n\n switch (node.nodeName) {\n case '#document-fragment':\n return node.childNodes\n .map((childNode) => visit(childNode, context))\n .filter((it) => it !== null) as unknown as RSC;\n case '#text':\n return (node as TextNode).value;\n case '#comment':\n case 'head':\n case 'meta':\n case 'title':\n case 'noscript':\n return null;\n default: {\n const nodeId = Array.isArray((node as Element).attrs)\n ? (node as Element).attrs.find((attr) => attr.name === 'id')?.value\n : undefined;\n\n if (\n node.nodeName === 'div' &&\n (nodeId === '__next' ||\n (context.name\n ? node.attrs.find(\n (it) =>\n it.name === 'id' &&\n it.value.startsWith(\n context.name ?? '__vercel_remote_component',\n ),\n )\n : node.attrs.find((it) => it.name === 'data-bundle' && it.value) &&\n node.attrs.find((it) => it.name === 'data-route') &&\n nodeId?.endsWith('_ssr')))\n ) {\n context.onMetadata?.({\n bundle:\n node.attrs.find((it) => it.name === 'data-bundle' && it.value)\n ?.value ?? '',\n route:\n node.attrs.find((it) => it.name === 'data-route')?.value ?? '/',\n runtime: (node.attrs.find((it) => it.name === 'data-runtime')\n ?.value ?? 'webpack') as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n });\n context.onHTML?.(serializeOuter(node));\n return node.childNodes\n .map((childNode) => visit(childNode, { ...context, active: true }))\n .filter((it) => it !== null) as unknown as RSC;\n }\n const childNodes = (node as Element).childNodes\n .map((childNode) => visit(childNode, context))\n .filter((childNode) => childNode !== null);\n const children = childNodes.length > 1 ? childNodes : childNodes[0];\n const nodeProps = (node as Element).attrs.reduce<\n Record<string, string | ReturnType<typeof styleToJs>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children?: any;\n }\n >((props, attr) => {\n if (attr.name === 'style') {\n props.style = styleToJs(attr.value, {\n reactCompat: true,\n });\n return props;\n }\n if (node.nodeName === 'input' && attr.name === 'value') {\n props.defaultValue = attr.value;\n return props;\n }\n if (isCustomAttribute(attr.name)) {\n props[attr.name] = attr.value;\n return props;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {});\n if (typeof children !== 'undefined') {\n if (\n node.nodeName === 'script' &&\n typeof children === 'string' &&\n children.startsWith('$')\n ) {\n nodeProps.children = `$${children}`;\n } else {\n nodeProps.children = children;\n }\n }\n if (!context.active) {\n if (childNodes.length > 0) {\n return childNodes as RSC;\n }\n return null;\n }\n return ['$', node.nodeName, null, nodeProps, null, null, 1] as RSC;\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/shared/ssr/dom-flight.ts"],"sourcesContent":["import { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { serializeOuter } from 'parse5';\nimport type { RemoteComponentMetadata } from './types';\n\n// add fetch-priority to the possible standard names\npossibleStandardNames.fetchpriority = 'fetchPriority';\npossibleStandardNames['data-precedence'] = 'precedence';\n\nexport interface Context {\n name?: string;\n url: URL;\n origin?: string;\n defer?: boolean;\n active?: boolean;\n visitedRSCNodes?: Set<Node>;\n visitedNonActiveNodes?: Set<Node>;\n onMetadata?: (metadata: RemoteComponentMetadata) => void;\n onScript?: (attrs: Record<string, string | boolean>) => void;\n onLink?: (attrs: Record<string, string | boolean>) => void;\n onRSC?: (rsc: string) => void;\n onNextData?: (data: {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: {\n bundle: string;\n runtime: string;\n };\n };\n page?: string;\n }) => void;\n onHTML?: (html: string) => void;\n onShared?: (shared: Record<string, string>) => void;\n}\n\ntype RSC =\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | (\n | ['$', string, null, Record<string, unknown>, null, null, number]\n | string\n | null\n )[]\n | string\n | null;\n\nconst applyOriginToNodes = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n];\n\nexport function visit(\n node: (Node | ChildNode) & {\n attrsObj?: Record<string, string>;\n attrsObjToArray?: Record<string, { name: string; value: string }>;\n },\n context: Context = {\n url: new URL('http://localhost'),\n active: false,\n },\n): RSC | RSC[] | string | null {\n if ('attrs' in node && typeof node.attrsObj === 'undefined') {\n node.attrsObjToArray = {};\n node.attrsObj = node.attrs.reduce<Record<string, string>>((acc, attr) => {\n acc[attr.name] = attr.value;\n if (node.attrsObjToArray) {\n node.attrsObjToArray[attr.name] = attr;\n }\n return acc;\n }, {});\n }\n\n // apply origin to src and srcset attributes\n if (\n applyOriginToNodes.includes(node.nodeName.toLowerCase()) &&\n 'attrs' in node\n ) {\n const origin = context.origin ?? context.url.origin;\n const src = node.attrsObj?.src;\n if (src) {\n const url = new URL(src, origin);\n if (node.attrsObjToArray && 'src' in node.attrsObjToArray) {\n node.attrsObjToArray.src.value = url.href;\n }\n }\n\n const srcSet = node.attrsObj?.srcset;\n if (srcSet) {\n const srcSetValue = 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, origin).href;\n return descriptor ? `${absoluteUrl} ${descriptor}` : absoluteUrl;\n })\n .join(', ');\n if (node.attrsObjToArray && 'srcset' in node.attrsObjToArray) {\n node.attrsObjToArray.srcset.value = srcSetValue;\n }\n }\n }\n\n if (node.nodeName === 'script' || node.nodeName === 'link') {\n const nodeId = node.attrsObj?.id;\n if (nodeId?.endsWith('_shared')) {\n context.onShared?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as Record<\n string,\n string\n >,\n );\n return null;\n } else if (nodeId?.endsWith('_rsc') && 'childNodes' in node) {\n if (!context.visitedRSCNodes) {\n context.visitedRSCNodes = new Set();\n }\n if (\n !context.visitedRSCNodes.has(node) &&\n (context.name ? nodeId.startsWith(context.name) : true)\n ) {\n context.visitedRSCNodes.add(node);\n context.onRSC?.((node.childNodes[0] as TextNode).value);\n }\n } else if (nodeId === '__NEXT_DATA__' && 'childNodes' in node) {\n context.onHTML?.(\n `<script id=\"__REMOTE_NEXT_DATA__\" type=\"application/json\">${(node.childNodes[0] as TextNode).value}</script>`,\n );\n context.onNextData?.(\n JSON.parse((node.childNodes[0] as TextNode).value) as {\n props: { pageProps: Record<string, unknown> };\n },\n );\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n node.attrsObj &&\n !('src' in node.attrsObj)\n ) {\n return [\n '$',\n node.nodeName,\n null,\n node.attrs.reduce<Record<string, string>>((props, attr) => {\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {}),\n null,\n null,\n 1,\n ] as RSC;\n }\n if (node.nodeName === 'script') {\n context.onScript?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n }, {}),\n );\n const src = node.attrsObj?.src;\n if (src) {\n node.attrs = node.attrs.filter((attr) => attr.name !== 'src');\n node.attrs.push({\n name: 'data-src',\n value: src,\n });\n if (node.attrsObj) {\n delete node.attrsObj.src;\n node.attrsObj['data-src'] = src;\n }\n }\n context.onHTML?.(serializeOuter(node));\n } else {\n context.onLink?.(\n node.attrs.reduce<Record<string, string | boolean>>((props, attr) => {\n if (attr.name === 'href') {\n attr.value = new URL(attr.value, context.url.origin).href;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] =\n attr.value || true;\n return props;\n }, {}),\n );\n context.onHTML?.(serializeOuter(node));\n }\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if ('childNodes' in node) {\n if (!context.visitedNonActiveNodes.has(node)) {\n context.visitedNonActiveNodes.add(node);\n (node as Element).childNodes.forEach((childNode) => {\n visit(childNode, context);\n });\n }\n } else return null;\n }\n\n switch (node.nodeName) {\n case '#document-fragment':\n return node.childNodes.reduce<RSC[]>((acc, childNode) => {\n const result = visit(childNode, context);\n if (result !== null) {\n acc.push(result as unknown as RSC);\n }\n return acc;\n }, []);\n case '#text':\n return (node as TextNode).value;\n case '#comment':\n case 'head':\n case 'meta':\n case 'title':\n case 'noscript':\n return null;\n default: {\n const nodeId = node.attrsObj?.id;\n\n if (\n node.nodeName === 'div' &&\n (nodeId === '__next' ||\n (context.name\n ? nodeId?.startsWith(context.name)\n : node.attrsObj &&\n 'data-bundle' in node.attrsObj &&\n node.attrsObj['data-bundle'] &&\n 'data-route' in node.attrsObj &&\n nodeId?.endsWith('_ssr')))\n ) {\n context.onMetadata?.({\n bundle: node.attrsObj?.['data-bundle'] ?? 'default',\n route: node.attrsObj?.['data-route'] ?? '/',\n runtime: (node.attrsObj?.['data-runtime'] ??\n 'webpack') as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n });\n context.onHTML?.(serializeOuter(node));\n return node.childNodes.reduce<RSC[]>((acc, childNode) => {\n const result = visit(childNode, {\n ...context,\n active: true,\n });\n if (result !== null) {\n acc.push(result as unknown as RSC);\n }\n return acc;\n }, []);\n }\n const childNodes = (node as Element).childNodes.reduce<unknown[]>(\n (acc, childNode) => {\n const result = visit(childNode, context);\n if (result !== null) {\n acc.push(result as unknown);\n }\n return acc;\n },\n [],\n );\n const children = childNodes.length > 1 ? childNodes : childNodes[0];\n const nodeProps = (node as Element).attrs.reduce<\n Record<string, string | ReturnType<typeof styleToJs>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n children?: any;\n }\n >((props, attr) => {\n if (attr.name === 'style') {\n props.style = styleToJs(attr.value, {\n reactCompat: true,\n });\n return props;\n }\n if (node.nodeName === 'input' && attr.name === 'value') {\n props.defaultValue = attr.value;\n return props;\n }\n if (isCustomAttribute(attr.name)) {\n props[attr.name] = attr.value;\n return props;\n }\n props[possibleStandardNames[attr.name] ?? attr.name] = attr.value;\n return props;\n }, {});\n if (typeof children !== 'undefined') {\n if (\n node.nodeName === 'script' &&\n typeof children === 'string' &&\n children.startsWith('$')\n ) {\n nodeProps.children = `$${children}`;\n } else {\n nodeProps.children = children;\n }\n }\n if (!context.active) {\n if (childNodes.length > 0) {\n return childNodes as RSC;\n }\n return null;\n }\n return ['$', node.nodeName, null, nodeProps, null, null, 1] as RSC;\n }\n }\n}\n"],"mappings":"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","names":[]}
|