remote-components 0.3.0 → 0.3.1

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.
Files changed (66) hide show
  1. package/dist/host/html.cjs +88 -53
  2. package/dist/host/html.cjs.map +1 -1
  3. package/dist/host/html.js +88 -53
  4. package/dist/host/html.js.map +1 -1
  5. package/dist/host/nextjs/app/client-only.cjs +64 -22
  6. package/dist/host/nextjs/app/client-only.cjs.map +1 -1
  7. package/dist/host/nextjs/app/client-only.js +64 -22
  8. package/dist/host/nextjs/app/client-only.js.map +1 -1
  9. package/dist/host/nextjs/app.cjs +5 -6
  10. package/dist/host/nextjs/app.cjs.map +1 -1
  11. package/dist/host/nextjs/app.js +5 -6
  12. package/dist/host/nextjs/app.js.map +1 -1
  13. package/dist/host/nextjs/pages.cjs +6 -11
  14. package/dist/host/nextjs/pages.cjs.map +1 -1
  15. package/dist/host/nextjs/pages.js +9 -11
  16. package/dist/host/nextjs/pages.js.map +1 -1
  17. package/dist/host/react.cjs +64 -22
  18. package/dist/host/react.cjs.map +1 -1
  19. package/dist/host/react.js +64 -22
  20. package/dist/host/react.js.map +1 -1
  21. package/dist/internal/host/nextjs/dom-flight.cjs +16 -7
  22. package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
  23. package/dist/internal/host/nextjs/dom-flight.d.ts +2 -2
  24. package/dist/internal/host/nextjs/dom-flight.js +16 -7
  25. package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
  26. package/dist/internal/host/server/fetch-remote-component.cjs +164 -149
  27. package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
  28. package/dist/internal/host/server/fetch-remote-component.js +166 -149
  29. package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
  30. package/dist/internal/runtime/constants.cjs +6 -6
  31. package/dist/internal/runtime/constants.cjs.map +1 -1
  32. package/dist/internal/runtime/constants.d.ts +3 -3
  33. package/dist/internal/runtime/constants.js +4 -4
  34. package/dist/internal/runtime/constants.js.map +1 -1
  35. package/dist/internal/runtime/html/parse-remote-html.cjs +11 -15
  36. package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
  37. package/dist/internal/runtime/html/parse-remote-html.d.ts +2 -12
  38. package/dist/internal/runtime/html/parse-remote-html.js +17 -15
  39. package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
  40. package/dist/internal/runtime/loaders/script-loader.cjs +2 -2
  41. package/dist/internal/runtime/loaders/script-loader.cjs.map +1 -1
  42. package/dist/internal/runtime/loaders/script-loader.js +1 -1
  43. package/dist/internal/runtime/loaders/script-loader.js.map +1 -1
  44. package/dist/internal/runtime/metadata.cjs +42 -0
  45. package/dist/internal/runtime/metadata.cjs.map +1 -1
  46. package/dist/internal/runtime/metadata.d.ts +21 -1
  47. package/dist/internal/runtime/metadata.js +38 -0
  48. package/dist/internal/runtime/metadata.js.map +1 -1
  49. package/dist/internal/runtime/patterns.cjs +38 -0
  50. package/dist/internal/runtime/patterns.cjs.map +1 -0
  51. package/dist/internal/runtime/patterns.d.ts +5 -0
  52. package/dist/internal/runtime/patterns.js +12 -0
  53. package/dist/internal/runtime/patterns.js.map +1 -0
  54. package/dist/internal/runtime/turbopack/chunk-loader.cjs +4 -3
  55. package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
  56. package/dist/internal/runtime/turbopack/chunk-loader.js +1 -1
  57. package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
  58. package/dist/internal/runtime/turbopack/webpack-runtime.cjs +11 -2
  59. package/dist/internal/runtime/turbopack/webpack-runtime.cjs.map +1 -1
  60. package/dist/internal/runtime/turbopack/webpack-runtime.js +10 -2
  61. package/dist/internal/runtime/turbopack/webpack-runtime.js.map +1 -1
  62. package/dist/remote/nextjs/app.cjs +2 -1
  63. package/dist/remote/nextjs/app.cjs.map +1 -1
  64. package/dist/remote/nextjs/app.js +2 -1
  65. package/dist/remote/nextjs/app.js.map +1 -1
  66. package/package.json +1 -1
@@ -129,9 +129,18 @@ function visit(node, context = {
129
129
  context.onHTML?.(
130
130
  `<script id="__REMOTE_NEXT_DATA__" type="application/json">${node.childNodes[0].value}</script>`
131
131
  );
132
- context.onNextData?.(
133
- JSON.parse(node.childNodes[0].value)
132
+ const nextDataValue = JSON.parse(
133
+ node.childNodes[0].value
134
134
  );
135
+ if (nextDataValue.props.__REMOTE_COMPONENT__) {
136
+ context.onMetadata?.({
137
+ bundle: nextDataValue.props.__REMOTE_COMPONENT__.bundle,
138
+ runtime: nextDataValue.props.__REMOTE_COMPONENT__.runtime,
139
+ id: "__next",
140
+ route: nextDataValue.page
141
+ });
142
+ }
143
+ context.onNextData?.(nextDataValue);
135
144
  } else if (node.childNodes.length === 0) {
136
145
  if (node.nodeName === "script" && node.attrsObj && !("src" in node.attrsObj) && !("data-src" in node.attrsObj)) {
137
146
  return [
@@ -233,11 +242,11 @@ function visit(node, context = {
233
242
  const nodeId = node.attrsObj?.id;
234
243
  if (node.nodeName === "remote-component" && !node.attrsObj?.src && (!context.name || node.attrsObj?.name === context.name) || 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")))) {
235
244
  context.onMetadata?.({
236
- bundle: node.attrsObj?.["data-bundle"] ?? "default",
237
- route: node.attrsObj?.["data-route"] ?? context.url.pathname,
238
- runtime: node.attrsObj?.["data-runtime"] ?? (node.nodeName === "remote-component" ? "script" : "webpack"),
239
- id: nodeId?.endsWith("_ssr") ? nodeId : "__vercel_remote_component",
240
- type: node.nodeName === "remote-component" ? "remote-component" : node.attrsObj?.["data-type"] || "unknown"
245
+ bundle: node.attrsObj?.["data-bundle"],
246
+ route: node.attrsObj?.["data-route"],
247
+ runtime: node.attrsObj?.["data-runtime"] ?? (node.nodeName === "remote-component" ? "script" : void 0),
248
+ id: nodeId?.endsWith("_ssr") ? nodeId : void 0,
249
+ type: node.nodeName === "remote-component" ? "remote-component" : node.attrsObj?.["data-type"]
241
250
  });
242
251
  context.onHTML?.((0, import_parse5.serializeOuter)(node));
243
252
  return node.childNodes.reduce((acc, childNode) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/nextjs/dom-flight.ts"],"sourcesContent":["import { serializeOuter } from 'parse5';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type { RemoteComponentMetadata } from '#internal/runtime/metadata';\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 onError?: (message: string, stack?: string) => void;\n}\n\nexport type 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 if (\n node.nodeName === 'template' &&\n node.attrsObj?.['data-next-error-message']\n ) {\n context.onError?.(\n node.attrsObj['data-next-error-message'],\n node.attrsObj['data-next-error-stack'],\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 const href = node.attrsObj?.href;\n if (href) {\n const url = new URL(href, origin);\n if (node.attrsObjToArray && 'href' in node.attrsObjToArray) {\n node.attrsObjToArray.href.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 const imageSrcSet = node.attrsObj?.imagesrcset;\n if (imageSrcSet) {\n const srcSetValue = imageSrcSet\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 && 'imagesrcset' in node.attrsObjToArray) {\n node.attrsObjToArray.imagesrcset.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 !('data-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 if (attr.name === 'data-src') {\n props.src = attr.value;\n } else {\n props[attr.name] = attr.value || true;\n }\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 } else if (\n context.active &&\n node.nodeName === 'script' &&\n 'childNodes' in node &&\n node.childNodes.length > 0\n ) {\n // inline script\n context.onScript?.({\n ...node.attrs.reduce<Record<string, string | boolean>>(\n (props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n },\n {},\n ),\n textContent: (node.childNodes[0] as TextNode).value,\n });\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if (\n 'childNodes' in node &&\n !(\n node.nodeName === 'remote-component' &&\n !node.attrsObj?.src &&\n (context.name ? node.attrsObj?.name !== context.name : false)\n )\n ) {\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 === 'remote-component' &&\n !node.attrsObj?.src &&\n (!context.name || node.attrsObj?.name === context.name)) ||\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'] ?? context.url.pathname,\n runtime: (node.attrsObj?.['data-runtime'] ??\n (node.nodeName === 'remote-component'\n ? 'script'\n : 'webpack')) as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n type: (node.nodeName === 'remote-component'\n ? 'remote-component'\n : node.attrsObj?.['data-type'] ||\n 'unknown') as RemoteComponentMetadata['type'],\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;AAO/B,4BAAyD;AACzD,yBAAsB;AAItB,4CAAsB,gBAAgB;AACtC,4CAAsB,iBAAiB,IAAI;AAuC3C,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,MACd,MAIA,UAAmB;AAAA,EACjB,KAAK,IAAI,IAAI,kBAAkB;AAAA,EAC/B,QAAQ;AACV,GAC6B;AAC7B,MAAI,WAAW,QAAQ,OAAO,KAAK,aAAa,aAAa;AAC3D,SAAK,kBAAkB,CAAC;AACxB,SAAK,WAAW,KAAK,MAAM,OAA+B,CAAC,KAAK,SAAS;AACvE,UAAI,KAAK,IAAI,IAAI,KAAK;AACtB,UAAI,KAAK,iBAAiB;AACxB,aAAK,gBAAgB,KAAK,IAAI,IAAI;AAAA,MACpC;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AAEA,MACE,KAAK,aAAa,cAClB,KAAK,WAAW,yBAAyB,GACzC;AACA,YAAQ;AAAA,MACN,KAAK,SAAS,yBAAyB;AAAA,MACvC,KAAK,SAAS,uBAAuB;AAAA,IACvC;AAAA,EACF;AAGA,MACE,mBAAmB,SAAS,KAAK,SAAS,YAAY,CAAC,KACvD,WAAW,MACX;AACA,UAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAC7C,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,KAAK;AACP,YAAM,MAAM,IAAI,IAAI,KAAK,MAAM;AAC/B,UAAI,KAAK,mBAAmB,SAAS,KAAK,iBAAiB;AACzD,aAAK,gBAAgB,IAAI,QAAQ,IAAI;AAAA,MACvC;AAAA,IACF;AACA,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,MAAM;AACR,YAAM,MAAM,IAAI,IAAI,MAAM,MAAM;AAChC,UAAI,KAAK,mBAAmB,UAAU,KAAK,iBAAiB;AAC1D,aAAK,gBAAgB,KAAK,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,QAAQ;AACV,YAAM,cAAc,OACjB,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,cAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,YAAI,CAAC;AAAK,iBAAO;AAEjB,cAAM,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE;AACzC,eAAO,aAAa,GAAG,eAAe,eAAe;AAAA,MACvD,CAAC,EACA,KAAK,IAAI;AACZ,UAAI,KAAK,mBAAmB,YAAY,KAAK,iBAAiB;AAC5D,aAAK,gBAAgB,OAAO,QAAQ;AAAA,MACtC;AAAA,IACF;AACA,UAAM,cAAc,KAAK,UAAU;AACnC,QAAI,aAAa;AACf,YAAM,cAAc,YACjB,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,cAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,YAAI,CAAC;AAAK,iBAAO;AAEjB,cAAM,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE;AACzC,eAAO,aAAa,GAAG,eAAe,eAAe;AAAA,MACvD,CAAC,EACA,KAAK,IAAI;AACZ,UAAI,KAAK,mBAAmB,iBAAiB,KAAK,iBAAiB;AACjE,aAAK,gBAAgB,YAAY,QAAQ;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,aAAa,YAAY,KAAK,aAAa,QAAQ;AAC1D,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,cAAQ;AAAA,QACN,KAAK,MAAO,KAAK,WAAW,CAAC,EAAe,KAAK;AAAA,MAInD;AACA,aAAO;AAAA,IACT,WAAW,QAAQ,SAAS,MAAM,KAAK,gBAAgB,MAAM;AAC3D,UAAI,CAAC,QAAQ,iBAAiB;AAC5B,gBAAQ,kBAAkB,oBAAI,IAAI;AAAA,MACpC;AACA,UACE,CAAC,QAAQ,gBAAgB,IAAI,IAAI,MAChC,QAAQ,OAAO,OAAO,WAAW,QAAQ,IAAI,IAAI,OAClD;AACA,gBAAQ,gBAAgB,IAAI,IAAI;AAChC,gBAAQ,QAAS,KAAK,WAAW,CAAC,EAAe,KAAK;AAAA,MACxD;AAAA,IACF,WAAW,WAAW,mBAAmB,gBAAgB,MAAM;AAC7D,cAAQ;AAAA,QACN,6DAA8D,KAAK,WAAW,CAAC,EAAe;AAAA,MAChG;AACA,cAAQ;AAAA,QACN,KAAK,MAAO,KAAK,WAAW,CAAC,EAAe,KAAK;AAAA,MAGnD;AAAA,IACF,WAAW,KAAK,WAAW,WAAW,GAAG;AACvC,UACE,KAAK,aAAa,YAClB,KAAK,YACL,EAAE,SAAS,KAAK,aAChB,EAAE,cAAc,KAAK,WACrB;AACA,eAAO;AAAA,UACL;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA,KAAK,MAAM,OAA+B,CAAC,OAAO,SAAS;AACzD,kBAAM,4CAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK;AAC5D,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,aAAa,UAAU;AAC9B,gBAAQ;AAAA,UACN,KAAK,MAAM,OAAyC,CAAC,OAAO,SAAS;AACnE,gBAAI,KAAK,SAAS,YAAY;AAC5B,oBAAM,MAAM,KAAK;AAAA,YACnB,OAAO;AACL,oBAAM,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,YACnC;AACA,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,QACP;AACA,cAAM,MAAM,KAAK,UAAU;AAC3B,YAAI,KAAK;AACP,eAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK;AAC5D,eAAK,MAAM,KAAK;AAAA,YACd,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AACD,cAAI,KAAK,UAAU;AACjB,mBAAO,KAAK,SAAS;AACrB,iBAAK,SAAS,UAAU,IAAI;AAAA,UAC9B;AAAA,QACF;AACA,gBAAQ,aAAS,8BAAe,IAAI,CAAC;AAAA,MACvC,OAAO;AACL,gBAAQ;AAAA,UACN,KAAK,MAAM,OAAyC,CAAC,OAAO,SAAS;AACnE,gBAAI,KAAK,SAAS,QAAQ;AACxB,mBAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,EAAE;AAAA,YACvD;AACA,kBAAM,4CAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IACjD,KAAK,SAAS;AAChB,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,QACP;AACA,gBAAQ,aAAS,8BAAe,IAAI,CAAC;AAAA,MACvC;AACA,aAAO;AAAA,IACT,WACE,QAAQ,UACR,KAAK,aAAa,YAClB,gBAAgB,QAChB,KAAK,WAAW,SAAS,GACzB;AAEA,cAAQ,WAAW;AAAA,QACjB,GAAG,KAAK,MAAM;AAAA,UACZ,CAAC,OAAO,SAAS;AACf,kBAAM,KAAK,IAAI,IAAI,KAAK,SAAS;AACjC,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAAA,QACA,aAAc,KAAK,WAAW,CAAC,EAAe;AAAA,MAChD,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,CAAC,QAAQ,uBAAuB;AAClC,cAAQ,wBAAwB,oBAAI,IAAI;AAAA,IAC1C;AAEA,QACE,gBAAgB,QAChB,EACE,KAAK,aAAa,sBAClB,CAAC,KAAK,UAAU,QACf,QAAQ,OAAO,KAAK,UAAU,SAAS,QAAQ,OAAO,SAEzD;AACA,UAAI,CAAC,QAAQ,sBAAsB,IAAI,IAAI,GAAG;AAC5C,gBAAQ,sBAAsB,IAAI,IAAI;AACtC,QAAC,KAAiB,WAAW,QAAQ,CAAC,cAAc;AAClD,gBAAM,WAAW,OAAO;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAAO,aAAO;AAAA,EAChB;AAEA,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AACH,aAAO,KAAK,WAAW,OAAc,CAAC,KAAK,cAAc;AACvD,cAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAI,WAAW,MAAM;AACnB,cAAI,KAAK,MAAwB;AAAA,QACnC;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAAA,IACP,KAAK;AACH,aAAQ,KAAkB;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,SAAS,KAAK,UAAU;AAE9B,UACG,KAAK,aAAa,sBACjB,CAAC,KAAK,UAAU,QACf,CAAC,QAAQ,QAAQ,KAAK,UAAU,SAAS,QAAQ,SACnD,KAAK,aAAa,UAChB,WAAW,aACT,QAAQ,OACL,QAAQ,WAAW,QAAQ,IAAI,IAC/B,KAAK,YACL,iBAAiB,KAAK,YACtB,KAAK,SAAS,aAAa,KAC3B,gBAAgB,KAAK,YACrB,QAAQ,SAAS,MAAM,KAC/B;AACA,gBAAQ,aAAa;AAAA,UACnB,QAAQ,KAAK,WAAW,aAAa,KAAK;AAAA,UAC1C,OAAO,KAAK,WAAW,YAAY,KAAK,QAAQ,IAAI;AAAA,UACpD,SAAU,KAAK,WAAW,cAAc,MACrC,KAAK,aAAa,qBACf,WACA;AAAA,UACN,IAAI,QAAQ,SAAS,MAAM,IAAI,SAAS;AAAA,UACxC,MAAO,KAAK,aAAa,qBACrB,qBACA,KAAK,WAAW,WAAW,KAC3B;AAAA,QACN,CAAC;AACD,gBAAQ,aAAS,8BAAe,IAAI,CAAC;AACrC,eAAO,KAAK,WAAW,OAAc,CAAC,KAAK,cAAc;AACvD,gBAAM,SAAS,MAAM,WAAW;AAAA,YAC9B,GAAG;AAAA,YACH,QAAQ;AAAA,UACV,CAAC;AACD,cAAI,WAAW,MAAM;AACnB,gBAAI,KAAK,MAAwB;AAAA,UACnC;AACA,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC;AAAA,MACP;AACA,YAAM,aAAc,KAAiB,WAAW;AAAA,QAC9C,CAAC,KAAK,cAAc;AAClB,gBAAM,SAAS,MAAM,WAAW,OAAO;AACvC,cAAI,WAAW,MAAM;AACnB,gBAAI,KAAK,MAAiB;AAAA,UAC5B;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,WAAW,WAAW,SAAS,IAAI,aAAa,WAAW,CAAC;AAClE,YAAM,YAAa,KAAiB,MAAM,OAKxC,CAAC,OAAO,SAAS;AACjB,YAAI,KAAK,SAAS,SAAS;AACzB,gBAAM,YAAQ,mBAAAA,SAAU,KAAK,OAAO;AAAA,YAClC,aAAa;AAAA,UACf,CAAC;AACD,iBAAO;AAAA,QACT;AACA,YAAI,KAAK,aAAa,WAAW,KAAK,SAAS,SAAS;AACtD,gBAAM,eAAe,KAAK;AAC1B,iBAAO;AAAA,QACT;AACA,gBAAI,yCAAkB,KAAK,IAAI,GAAG;AAChC,gBAAM,KAAK,IAAI,IAAI,KAAK;AACxB,iBAAO;AAAA,QACT;AACA,cAAM,4CAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK;AAC5D,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AACL,UAAI,OAAO,aAAa,aAAa;AACnC,YACE,KAAK,aAAa,YAClB,OAAO,aAAa,YACpB,SAAS,WAAW,GAAG,GACvB;AACA,oBAAU,WAAW,IAAI;AAAA,QAC3B,OAAO;AACL,oBAAU,WAAW;AAAA,QACvB;AAAA,MACF;AACA,UAAI,CAAC,QAAQ,QAAQ;AACnB,YAAI,WAAW,SAAS,GAAG;AACzB,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AACA,aAAO,CAAC,KAAK,KAAK,UAAU,MAAM,WAAW,MAAM,MAAM,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;","names":["styleToJs"]}
1
+ {"version":3,"sources":["../../../../src/host/nextjs/dom-flight.ts"],"sourcesContent":["import { serializeOuter } from 'parse5';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type { RawMetadataAttrs } from '#internal/runtime/metadata';\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?: (attrs: RawMetadataAttrs) => 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 onError?: (message: string, stack?: string) => void;\n}\n\nexport type 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 if (\n node.nodeName === 'template' &&\n node.attrsObj?.['data-next-error-message']\n ) {\n context.onError?.(\n node.attrsObj['data-next-error-message'],\n node.attrsObj['data-next-error-stack'],\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 const href = node.attrsObj?.href;\n if (href) {\n const url = new URL(href, origin);\n if (node.attrsObjToArray && 'href' in node.attrsObjToArray) {\n node.attrsObjToArray.href.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 const imageSrcSet = node.attrsObj?.imagesrcset;\n if (imageSrcSet) {\n const srcSetValue = imageSrcSet\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 && 'imagesrcset' in node.attrsObjToArray) {\n node.attrsObjToArray.imagesrcset.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 const nextDataValue = JSON.parse(\n (node.childNodes[0] as TextNode).value,\n ) as {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: { bundle: string; runtime: string };\n };\n page?: string;\n };\n if (nextDataValue.props.__REMOTE_COMPONENT__) {\n context.onMetadata?.({\n bundle: nextDataValue.props.__REMOTE_COMPONENT__.bundle,\n runtime: nextDataValue.props.__REMOTE_COMPONENT__.runtime,\n id: '__next',\n route: nextDataValue.page,\n });\n }\n context.onNextData?.(nextDataValue);\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n node.attrsObj &&\n !('src' in node.attrsObj) &&\n !('data-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 if (attr.name === 'data-src') {\n props.src = attr.value;\n } else {\n props[attr.name] = attr.value || true;\n }\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 } else if (\n context.active &&\n node.nodeName === 'script' &&\n 'childNodes' in node &&\n node.childNodes.length > 0\n ) {\n // inline script\n context.onScript?.({\n ...node.attrs.reduce<Record<string, string | boolean>>(\n (props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n },\n {},\n ),\n textContent: (node.childNodes[0] as TextNode).value,\n });\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if (\n 'childNodes' in node &&\n !(\n node.nodeName === 'remote-component' &&\n !node.attrsObj?.src &&\n (context.name ? node.attrsObj?.name !== context.name : false)\n )\n ) {\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 === 'remote-component' &&\n !node.attrsObj?.src &&\n (!context.name || node.attrsObj?.name === context.name)) ||\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'],\n route: node.attrsObj?.['data-route'],\n runtime:\n node.attrsObj?.['data-runtime'] ??\n (node.nodeName === 'remote-component' ? 'script' : undefined),\n id: nodeId?.endsWith('_ssr') ? nodeId : undefined,\n type:\n node.nodeName === 'remote-component'\n ? 'remote-component'\n : node.attrsObj?.['data-type'],\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"]}
@@ -1,5 +1,5 @@
1
1
  import { Node, ChildNode } from 'parse5/dist/tree-adapters/default';
2
- import { RemoteComponentMetadata } from '../../runtime/metadata.js';
2
+ import { RawMetadataAttrs } from '../../runtime/metadata.js';
3
3
 
4
4
  interface Context {
5
5
  name?: string;
@@ -9,7 +9,7 @@ interface Context {
9
9
  active?: boolean;
10
10
  visitedRSCNodes?: Set<Node>;
11
11
  visitedNonActiveNodes?: Set<Node>;
12
- onMetadata?: (metadata: RemoteComponentMetadata) => void;
12
+ onMetadata?: (attrs: RawMetadataAttrs) => void;
13
13
  onScript?: (attrs: Record<string, string | boolean>) => void;
14
14
  onLink?: (attrs: Record<string, string | boolean>) => void;
15
15
  onRSC?: (rsc: string) => void;
@@ -96,9 +96,18 @@ function visit(node, context = {
96
96
  context.onHTML?.(
97
97
  `<script id="__REMOTE_NEXT_DATA__" type="application/json">${node.childNodes[0].value}</script>`
98
98
  );
99
- context.onNextData?.(
100
- JSON.parse(node.childNodes[0].value)
99
+ const nextDataValue = JSON.parse(
100
+ node.childNodes[0].value
101
101
  );
102
+ if (nextDataValue.props.__REMOTE_COMPONENT__) {
103
+ context.onMetadata?.({
104
+ bundle: nextDataValue.props.__REMOTE_COMPONENT__.bundle,
105
+ runtime: nextDataValue.props.__REMOTE_COMPONENT__.runtime,
106
+ id: "__next",
107
+ route: nextDataValue.page
108
+ });
109
+ }
110
+ context.onNextData?.(nextDataValue);
102
111
  } else if (node.childNodes.length === 0) {
103
112
  if (node.nodeName === "script" && node.attrsObj && !("src" in node.attrsObj) && !("data-src" in node.attrsObj)) {
104
113
  return [
@@ -200,11 +209,11 @@ function visit(node, context = {
200
209
  const nodeId = node.attrsObj?.id;
201
210
  if (node.nodeName === "remote-component" && !node.attrsObj?.src && (!context.name || node.attrsObj?.name === context.name) || 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")))) {
202
211
  context.onMetadata?.({
203
- bundle: node.attrsObj?.["data-bundle"] ?? "default",
204
- route: node.attrsObj?.["data-route"] ?? context.url.pathname,
205
- runtime: node.attrsObj?.["data-runtime"] ?? (node.nodeName === "remote-component" ? "script" : "webpack"),
206
- id: nodeId?.endsWith("_ssr") ? nodeId : "__vercel_remote_component",
207
- type: node.nodeName === "remote-component" ? "remote-component" : node.attrsObj?.["data-type"] || "unknown"
212
+ bundle: node.attrsObj?.["data-bundle"],
213
+ route: node.attrsObj?.["data-route"],
214
+ runtime: node.attrsObj?.["data-runtime"] ?? (node.nodeName === "remote-component" ? "script" : void 0),
215
+ id: nodeId?.endsWith("_ssr") ? nodeId : void 0,
216
+ type: node.nodeName === "remote-component" ? "remote-component" : node.attrsObj?.["data-type"]
208
217
  });
209
218
  context.onHTML?.(serializeOuter(node));
210
219
  return node.childNodes.reduce((acc, childNode) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/nextjs/dom-flight.ts"],"sourcesContent":["import { serializeOuter } from 'parse5';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type { RemoteComponentMetadata } from '#internal/runtime/metadata';\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 onError?: (message: string, stack?: string) => void;\n}\n\nexport type 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 if (\n node.nodeName === 'template' &&\n node.attrsObj?.['data-next-error-message']\n ) {\n context.onError?.(\n node.attrsObj['data-next-error-message'],\n node.attrsObj['data-next-error-stack'],\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 const href = node.attrsObj?.href;\n if (href) {\n const url = new URL(href, origin);\n if (node.attrsObjToArray && 'href' in node.attrsObjToArray) {\n node.attrsObjToArray.href.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 const imageSrcSet = node.attrsObj?.imagesrcset;\n if (imageSrcSet) {\n const srcSetValue = imageSrcSet\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 && 'imagesrcset' in node.attrsObjToArray) {\n node.attrsObjToArray.imagesrcset.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 !('data-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 if (attr.name === 'data-src') {\n props.src = attr.value;\n } else {\n props[attr.name] = attr.value || true;\n }\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 } else if (\n context.active &&\n node.nodeName === 'script' &&\n 'childNodes' in node &&\n node.childNodes.length > 0\n ) {\n // inline script\n context.onScript?.({\n ...node.attrs.reduce<Record<string, string | boolean>>(\n (props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n },\n {},\n ),\n textContent: (node.childNodes[0] as TextNode).value,\n });\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if (\n 'childNodes' in node &&\n !(\n node.nodeName === 'remote-component' &&\n !node.attrsObj?.src &&\n (context.name ? node.attrsObj?.name !== context.name : false)\n )\n ) {\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 === 'remote-component' &&\n !node.attrsObj?.src &&\n (!context.name || node.attrsObj?.name === context.name)) ||\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'] ?? context.url.pathname,\n runtime: (node.attrsObj?.['data-runtime'] ??\n (node.nodeName === 'remote-component'\n ? 'script'\n : 'webpack')) as RemoteComponentMetadata['runtime'],\n id: nodeId?.endsWith('_ssr') ? nodeId : '__vercel_remote_component',\n type: (node.nodeName === 'remote-component'\n ? 'remote-component'\n : node.attrsObj?.['data-type'] ||\n 'unknown') as RemoteComponentMetadata['type'],\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":[]}
1
+ {"version":3,"sources":["../../../../src/host/nextjs/dom-flight.ts"],"sourcesContent":["import { serializeOuter } from 'parse5';\nimport type {\n ChildNode,\n Element,\n Node,\n TextNode,\n} from 'parse5/dist/tree-adapters/default';\nimport { isCustomAttribute, possibleStandardNames } from 'react-property';\nimport styleToJs from 'style-to-js';\nimport type { RawMetadataAttrs } from '#internal/runtime/metadata';\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?: (attrs: RawMetadataAttrs) => 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 onError?: (message: string, stack?: string) => void;\n}\n\nexport type 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 if (\n node.nodeName === 'template' &&\n node.attrsObj?.['data-next-error-message']\n ) {\n context.onError?.(\n node.attrsObj['data-next-error-message'],\n node.attrsObj['data-next-error-stack'],\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 const href = node.attrsObj?.href;\n if (href) {\n const url = new URL(href, origin);\n if (node.attrsObjToArray && 'href' in node.attrsObjToArray) {\n node.attrsObjToArray.href.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 const imageSrcSet = node.attrsObj?.imagesrcset;\n if (imageSrcSet) {\n const srcSetValue = imageSrcSet\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 && 'imagesrcset' in node.attrsObjToArray) {\n node.attrsObjToArray.imagesrcset.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 const nextDataValue = JSON.parse(\n (node.childNodes[0] as TextNode).value,\n ) as {\n props: {\n pageProps: Record<string, unknown>;\n __REMOTE_COMPONENT__?: { bundle: string; runtime: string };\n };\n page?: string;\n };\n if (nextDataValue.props.__REMOTE_COMPONENT__) {\n context.onMetadata?.({\n bundle: nextDataValue.props.__REMOTE_COMPONENT__.bundle,\n runtime: nextDataValue.props.__REMOTE_COMPONENT__.runtime,\n id: '__next',\n route: nextDataValue.page,\n });\n }\n context.onNextData?.(nextDataValue);\n } else if (node.childNodes.length === 0) {\n if (\n node.nodeName === 'script' &&\n node.attrsObj &&\n !('src' in node.attrsObj) &&\n !('data-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 if (attr.name === 'data-src') {\n props.src = attr.value;\n } else {\n props[attr.name] = attr.value || true;\n }\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 } else if (\n context.active &&\n node.nodeName === 'script' &&\n 'childNodes' in node &&\n node.childNodes.length > 0\n ) {\n // inline script\n context.onScript?.({\n ...node.attrs.reduce<Record<string, string | boolean>>(\n (props, attr) => {\n props[attr.name] = attr.value || true;\n return props;\n },\n {},\n ),\n textContent: (node.childNodes[0] as TextNode).value,\n });\n return null;\n }\n }\n\n if (!context.active) {\n if (!context.visitedNonActiveNodes) {\n context.visitedNonActiveNodes = new Set();\n }\n\n if (\n 'childNodes' in node &&\n !(\n node.nodeName === 'remote-component' &&\n !node.attrsObj?.src &&\n (context.name ? node.attrsObj?.name !== context.name : false)\n )\n ) {\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 === 'remote-component' &&\n !node.attrsObj?.src &&\n (!context.name || node.attrsObj?.name === context.name)) ||\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'],\n route: node.attrsObj?.['data-route'],\n runtime:\n node.attrsObj?.['data-runtime'] ??\n (node.nodeName === 'remote-component' ? 'script' : undefined),\n id: nodeId?.endsWith('_ssr') ? nodeId : undefined,\n type:\n node.nodeName === 'remote-component'\n ? 'remote-component'\n : node.attrsObj?.['data-type'],\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":"AAAA,SAAS,sBAAsB;AAO/B,SAAS,mBAAmB,6BAA6B;AACzD,OAAO,eAAe;AAItB,sBAAsB,gBAAgB;AACtC,sBAAsB,iBAAiB,IAAI;AAuC3C,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,MACd,MAIA,UAAmB;AAAA,EACjB,KAAK,IAAI,IAAI,kBAAkB;AAAA,EAC/B,QAAQ;AACV,GAC6B;AAC7B,MAAI,WAAW,QAAQ,OAAO,KAAK,aAAa,aAAa;AAC3D,SAAK,kBAAkB,CAAC;AACxB,SAAK,WAAW,KAAK,MAAM,OAA+B,CAAC,KAAK,SAAS;AACvE,UAAI,KAAK,IAAI,IAAI,KAAK;AACtB,UAAI,KAAK,iBAAiB;AACxB,aAAK,gBAAgB,KAAK,IAAI,IAAI;AAAA,MACpC;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AAEA,MACE,KAAK,aAAa,cAClB,KAAK,WAAW,yBAAyB,GACzC;AACA,YAAQ;AAAA,MACN,KAAK,SAAS,yBAAyB;AAAA,MACvC,KAAK,SAAS,uBAAuB;AAAA,IACvC;AAAA,EACF;AAGA,MACE,mBAAmB,SAAS,KAAK,SAAS,YAAY,CAAC,KACvD,WAAW,MACX;AACA,UAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAC7C,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,KAAK;AACP,YAAM,MAAM,IAAI,IAAI,KAAK,MAAM;AAC/B,UAAI,KAAK,mBAAmB,SAAS,KAAK,iBAAiB;AACzD,aAAK,gBAAgB,IAAI,QAAQ,IAAI;AAAA,MACvC;AAAA,IACF;AACA,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,MAAM;AACR,YAAM,MAAM,IAAI,IAAI,MAAM,MAAM;AAChC,UAAI,KAAK,mBAAmB,UAAU,KAAK,iBAAiB;AAC1D,aAAK,gBAAgB,KAAK,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,QAAQ;AACV,YAAM,cAAc,OACjB,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,cAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,YAAI,CAAC;AAAK,iBAAO;AAEjB,cAAM,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE;AACzC,eAAO,aAAa,GAAG,eAAe,eAAe;AAAA,MACvD,CAAC,EACA,KAAK,IAAI;AACZ,UAAI,KAAK,mBAAmB,YAAY,KAAK,iBAAiB;AAC5D,aAAK,gBAAgB,OAAO,QAAQ;AAAA,MACtC;AAAA,IACF;AACA,UAAM,cAAc,KAAK,UAAU;AACnC,QAAI,aAAa;AACf,YAAM,cAAc,YACjB,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,cAAM,CAAC,KAAK,UAAU,IAAI,MAAM,KAAK,EAAE,MAAM,KAAK;AAClD,YAAI,CAAC;AAAK,iBAAO;AAEjB,cAAM,cAAc,IAAI,IAAI,KAAK,MAAM,EAAE;AACzC,eAAO,aAAa,GAAG,eAAe,eAAe;AAAA,MACvD,CAAC,EACA,KAAK,IAAI;AACZ,UAAI,KAAK,mBAAmB,iBAAiB,KAAK,iBAAiB;AACjE,aAAK,gBAAgB,YAAY,QAAQ;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,aAAa,YAAY,KAAK,aAAa,QAAQ;AAC1D,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,cAAQ;AAAA,QACN,KAAK,MAAO,KAAK,WAAW,CAAC,EAAe,KAAK;AAAA,MAInD;AACA,aAAO;AAAA,IACT,WAAW,QAAQ,SAAS,MAAM,KAAK,gBAAgB,MAAM;AAC3D,UAAI,CAAC,QAAQ,iBAAiB;AAC5B,gBAAQ,kBAAkB,oBAAI,IAAI;AAAA,MACpC;AACA,UACE,CAAC,QAAQ,gBAAgB,IAAI,IAAI,MAChC,QAAQ,OAAO,OAAO,WAAW,QAAQ,IAAI,IAAI,OAClD;AACA,gBAAQ,gBAAgB,IAAI,IAAI;AAChC,gBAAQ,QAAS,KAAK,WAAW,CAAC,EAAe,KAAK;AAAA,MACxD;AAAA,IACF,WAAW,WAAW,mBAAmB,gBAAgB,MAAM;AAC7D,cAAQ;AAAA,QACN,6DAA8D,KAAK,WAAW,CAAC,EAAe;AAAA,MAChG;AACA,YAAM,gBAAgB,KAAK;AAAA,QACxB,KAAK,WAAW,CAAC,EAAe;AAAA,MACnC;AAOA,UAAI,cAAc,MAAM,sBAAsB;AAC5C,gBAAQ,aAAa;AAAA,UACnB,QAAQ,cAAc,MAAM,qBAAqB;AAAA,UACjD,SAAS,cAAc,MAAM,qBAAqB;AAAA,UAClD,IAAI;AAAA,UACJ,OAAO,cAAc;AAAA,QACvB,CAAC;AAAA,MACH;AACA,cAAQ,aAAa,aAAa;AAAA,IACpC,WAAW,KAAK,WAAW,WAAW,GAAG;AACvC,UACE,KAAK,aAAa,YAClB,KAAK,YACL,EAAE,SAAS,KAAK,aAChB,EAAE,cAAc,KAAK,WACrB;AACA,eAAO;AAAA,UACL;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA,KAAK,MAAM,OAA+B,CAAC,OAAO,SAAS;AACzD,kBAAM,sBAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK;AAC5D,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,aAAa,UAAU;AAC9B,gBAAQ;AAAA,UACN,KAAK,MAAM,OAAyC,CAAC,OAAO,SAAS;AACnE,gBAAI,KAAK,SAAS,YAAY;AAC5B,oBAAM,MAAM,KAAK;AAAA,YACnB,OAAO;AACL,oBAAM,KAAK,IAAI,IAAI,KAAK,SAAS;AAAA,YACnC;AACA,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,QACP;AACA,cAAM,MAAM,KAAK,UAAU;AAC3B,YAAI,KAAK;AACP,eAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK;AAC5D,eAAK,MAAM,KAAK;AAAA,YACd,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AACD,cAAI,KAAK,UAAU;AACjB,mBAAO,KAAK,SAAS;AACrB,iBAAK,SAAS,UAAU,IAAI;AAAA,UAC9B;AAAA,QACF;AACA,gBAAQ,SAAS,eAAe,IAAI,CAAC;AAAA,MACvC,OAAO;AACL,gBAAQ;AAAA,UACN,KAAK,MAAM,OAAyC,CAAC,OAAO,SAAS;AACnE,gBAAI,KAAK,SAAS,QAAQ;AACxB,mBAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,EAAE;AAAA,YACvD;AACA,kBAAM,sBAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IACjD,KAAK,SAAS;AAChB,mBAAO;AAAA,UACT,GAAG,CAAC,CAAC;AAAA,QACP;AACA,gBAAQ,SAAS,eAAe,IAAI,CAAC;AAAA,MACvC;AACA,aAAO;AAAA,IACT,WACE,QAAQ,UACR,KAAK,aAAa,YAClB,gBAAgB,QAChB,KAAK,WAAW,SAAS,GACzB;AAEA,cAAQ,WAAW;AAAA,QACjB,GAAG,KAAK,MAAM;AAAA,UACZ,CAAC,OAAO,SAAS;AACf,kBAAM,KAAK,IAAI,IAAI,KAAK,SAAS;AACjC,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAAA,QACA,aAAc,KAAK,WAAW,CAAC,EAAe;AAAA,MAChD,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,CAAC,QAAQ,uBAAuB;AAClC,cAAQ,wBAAwB,oBAAI,IAAI;AAAA,IAC1C;AAEA,QACE,gBAAgB,QAChB,EACE,KAAK,aAAa,sBAClB,CAAC,KAAK,UAAU,QACf,QAAQ,OAAO,KAAK,UAAU,SAAS,QAAQ,OAAO,SAEzD;AACA,UAAI,CAAC,QAAQ,sBAAsB,IAAI,IAAI,GAAG;AAC5C,gBAAQ,sBAAsB,IAAI,IAAI;AACtC,QAAC,KAAiB,WAAW,QAAQ,CAAC,cAAc;AAClD,gBAAM,WAAW,OAAO;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAAO,aAAO;AAAA,EAChB;AAEA,UAAQ,KAAK,UAAU;AAAA,IACrB,KAAK;AACH,aAAO,KAAK,WAAW,OAAc,CAAC,KAAK,cAAc;AACvD,cAAM,SAAS,MAAM,WAAW,OAAO;AACvC,YAAI,WAAW,MAAM;AACnB,cAAI,KAAK,MAAwB;AAAA,QACnC;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAAA,IACP,KAAK;AACH,aAAQ,KAAkB;AAAA,IAC5B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,SAAS,KAAK,UAAU;AAE9B,UACG,KAAK,aAAa,sBACjB,CAAC,KAAK,UAAU,QACf,CAAC,QAAQ,QAAQ,KAAK,UAAU,SAAS,QAAQ,SACnD,KAAK,aAAa,UAChB,WAAW,aACT,QAAQ,OACL,QAAQ,WAAW,QAAQ,IAAI,IAC/B,KAAK,YACL,iBAAiB,KAAK,YACtB,KAAK,SAAS,aAAa,KAC3B,gBAAgB,KAAK,YACrB,QAAQ,SAAS,MAAM,KAC/B;AACA,gBAAQ,aAAa;AAAA,UACnB,QAAQ,KAAK,WAAW,aAAa;AAAA,UACrC,OAAO,KAAK,WAAW,YAAY;AAAA,UACnC,SACE,KAAK,WAAW,cAAc,MAC7B,KAAK,aAAa,qBAAqB,WAAW;AAAA,UACrD,IAAI,QAAQ,SAAS,MAAM,IAAI,SAAS;AAAA,UACxC,MACE,KAAK,aAAa,qBACd,qBACA,KAAK,WAAW,WAAW;AAAA,QACnC,CAAC;AACD,gBAAQ,SAAS,eAAe,IAAI,CAAC;AACrC,eAAO,KAAK,WAAW,OAAc,CAAC,KAAK,cAAc;AACvD,gBAAM,SAAS,MAAM,WAAW;AAAA,YAC9B,GAAG;AAAA,YACH,QAAQ;AAAA,UACV,CAAC;AACD,cAAI,WAAW,MAAM;AACnB,gBAAI,KAAK,MAAwB;AAAA,UACnC;AACA,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC;AAAA,MACP;AACA,YAAM,aAAc,KAAiB,WAAW;AAAA,QAC9C,CAAC,KAAK,cAAc;AAClB,gBAAM,SAAS,MAAM,WAAW,OAAO;AACvC,cAAI,WAAW,MAAM;AACnB,gBAAI,KAAK,MAAiB;AAAA,UAC5B;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AACA,YAAM,WAAW,WAAW,SAAS,IAAI,aAAa,WAAW,CAAC;AAClE,YAAM,YAAa,KAAiB,MAAM,OAKxC,CAAC,OAAO,SAAS;AACjB,YAAI,KAAK,SAAS,SAAS;AACzB,gBAAM,QAAQ,UAAU,KAAK,OAAO;AAAA,YAClC,aAAa;AAAA,UACf,CAAC;AACD,iBAAO;AAAA,QACT;AACA,YAAI,KAAK,aAAa,WAAW,KAAK,SAAS,SAAS;AACtD,gBAAM,eAAe,KAAK;AAC1B,iBAAO;AAAA,QACT;AACA,YAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,gBAAM,KAAK,IAAI,IAAI,KAAK;AACxB,iBAAO;AAAA,QACT;AACA,cAAM,sBAAsB,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK;AAC5D,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AACL,UAAI,OAAO,aAAa,aAAa;AACnC,YACE,KAAK,aAAa,YAClB,OAAO,aAAa,YACpB,SAAS,WAAW,GAAG,GACvB;AACA,oBAAU,WAAW,IAAI;AAAA,QAC3B,OAAO;AACL,oBAAU,WAAW;AAAA,QACvB;AAAA,MACF;AACA,UAAI,CAAC,QAAQ,QAAQ;AACnB,YAAI,WAAW,SAAS,GAAG;AACzB,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AACA,aAAO,CAAC,KAAK,KAAK,UAAU,MAAM,WAAW,MAAM,MAAM,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;","names":[]}
@@ -37,11 +37,149 @@ var import_skeleton = require("#internal/host/nextjs/skeleton");
37
37
  var import_fetch_with_hooks = require("#internal/host/server/fetch-with-hooks");
38
38
  var import_get_client_src = require("#internal/host/server/get-client-src");
39
39
  var import_get_ssr_relative_path_base_url = require("#internal/host/server/get-ssr-relative-path-base-url");
40
+ var import_metadata = require("#internal/runtime/metadata");
40
41
  var import_error = require("#internal/utils/error");
41
- const CURRENT_ZONE = process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION;
42
- async function fetchRemoteComponent(src, options = {
43
- rsc: false
44
- }) {
42
+ async function buildRscComponent(rsc, serverUrl) {
43
+ const componentRSC = `0:${JSON.stringify(rsc)}
44
+ `;
45
+ const { createFromReadableStream } = await import("next/dist/compiled/react-server-dom-webpack/client.edge");
46
+ return createFromReadableStream(
47
+ new ReadableStream({
48
+ type: "bytes",
49
+ start(controller) {
50
+ const encoder = new TextEncoder();
51
+ controller.enqueue(encoder.encode(componentRSC));
52
+ controller.close();
53
+ }
54
+ }),
55
+ {
56
+ serverConsumerManifest: {
57
+ moduleLoading: {
58
+ prefix: serverUrl.origin,
59
+ crossOrigin: true
60
+ },
61
+ moduleMap: {}
62
+ }
63
+ }
64
+ );
65
+ }
66
+ function buildSkeletonResponse(serverUrl, metadata, skeletonComponent) {
67
+ return {
68
+ name: "remote-component-skeleton",
69
+ serverUrl,
70
+ metadata: {
71
+ ...metadata,
72
+ type: "remote-component"
73
+ },
74
+ rsc: (0, import_skeleton.getSkeletonMessage)(),
75
+ scripts: [],
76
+ links: [],
77
+ hydrationData: [],
78
+ nextData: void 0,
79
+ component: skeletonComponent,
80
+ html: (0, import_skeleton.getSkeletonHtml)(serverUrl.href),
81
+ remoteShared: {}
82
+ };
83
+ }
84
+ function visitFragment(fragment, serverUrl, remoteName) {
85
+ const scriptSrcSet = /* @__PURE__ */ new Set();
86
+ const scriptTextSet = /* @__PURE__ */ new Set();
87
+ const scripts = [];
88
+ const linkKeySet = /* @__PURE__ */ new Set();
89
+ const links = [];
90
+ const hydrationData = [];
91
+ const htmlChunks = /* @__PURE__ */ new Set();
92
+ let metadata;
93
+ let nextData;
94
+ let remoteShared = {};
95
+ let hasRSC = false;
96
+ let hasShared = false;
97
+ let error;
98
+ const rsc = (0, import_dom_flight.visit)(fragment, {
99
+ url: serverUrl,
100
+ name: remoteName,
101
+ onMetadata(attrs) {
102
+ const incoming = (0, import_metadata.buildMetadata)(attrs, serverUrl);
103
+ if (!remoteName && metadata && metadata.id !== incoming.id && incoming.id !== "__next" && metadata.id !== "__next" && !nextData) {
104
+ throw (0, import_error.multipleRemoteComponentsError)(serverUrl.href);
105
+ }
106
+ metadata = incoming;
107
+ },
108
+ onScript(attrs) {
109
+ const clientSrc = (0, import_get_client_src.getClientSrc)(attrs.src, serverUrl.href);
110
+ const textContent = typeof attrs.textContent === "string" ? attrs.textContent : void 0;
111
+ if (textContent) {
112
+ if (!scriptTextSet.has(textContent)) {
113
+ scriptTextSet.add(textContent);
114
+ scripts.push({ src: "", textContent });
115
+ }
116
+ } else if (!scriptSrcSet.has(clientSrc)) {
117
+ scriptSrcSet.add(clientSrc);
118
+ scripts.push({ src: clientSrc });
119
+ }
120
+ },
121
+ onLink(attrs) {
122
+ const relativeAttrs = {
123
+ ...attrs,
124
+ href: (0, import_get_client_src.getClientSrc)(attrs.href, serverUrl.href)
125
+ };
126
+ const linkKey = `${relativeAttrs.href}::${attrs.rel}`;
127
+ if (!linkKeySet.has(linkKey)) {
128
+ linkKeySet.add(linkKey);
129
+ links.push(relativeAttrs);
130
+ }
131
+ },
132
+ onRSC(chunk) {
133
+ hydrationData.push(chunk);
134
+ hasRSC = true;
135
+ },
136
+ onNextData(data) {
137
+ nextData = data;
138
+ },
139
+ onHTML(chunk) {
140
+ if (!htmlChunks.has(chunk)) {
141
+ htmlChunks.add(chunk);
142
+ }
143
+ },
144
+ onShared(_shared) {
145
+ remoteShared = _shared;
146
+ hasShared = true;
147
+ },
148
+ onError(message, stack) {
149
+ error = new import_error.RemoteComponentsError(message);
150
+ if (stack) {
151
+ error.stack = stack;
152
+ }
153
+ }
154
+ });
155
+ if (error) {
156
+ throw error;
157
+ }
158
+ if (metadata) {
159
+ if (!hasRSC && !nextData && metadata.type === "nextjs") {
160
+ throw new import_error.RemoteComponentsError(
161
+ `The Remote Component at "${serverUrl.href}" seems to be a Next.js component but it does not contain any RSC flight data or Next.js props data. Make sure the remote URL is correct and contains a Remote Component.`
162
+ );
163
+ }
164
+ if (metadata.type === "nextjs" && !hasShared && !nextData?.props.__REMOTE_COMPONENT__?.shared) {
165
+ throw new import_error.RemoteComponentsError(
166
+ `No shared dependencies found for Remote Component at "${serverUrl.href}". Make sure the remote URL is correct and contains a Remote Component with shared dependencies.`
167
+ );
168
+ }
169
+ }
170
+ const resolvedShared = nextData?.props.__REMOTE_COMPONENT__?.shared ?? remoteShared;
171
+ return {
172
+ rsc,
173
+ metadata,
174
+ scripts,
175
+ links,
176
+ hydrationData,
177
+ nextData,
178
+ remoteShared: resolvedShared,
179
+ html: Array.from(htmlChunks).join("")
180
+ };
181
+ }
182
+ async function fetchRemoteComponent(src, options = {}) {
45
183
  const ssrRelativePathBaseUrl = (0, import_get_ssr_relative_path_base_url.getSSRRelativePathBaseUrl)();
46
184
  const serverUrl = new URL(src, ssrRelativePathBaseUrl);
47
185
  const tags = [
@@ -94,122 +232,36 @@ async function fetchRemoteComponent(src, options = {
94
232
  parser.tokenizer.write(decoder.decode(chunk), false);
95
233
  }
96
234
  const fragment = parser.getFragment();
97
- let metadata = {
98
- bundle: CURRENT_ZONE ?? "__vercel_remote_component",
99
- route: "/",
100
- runtime: "webpack",
101
- id: "__vercel_remote_component",
102
- type: "unknown"
103
- };
104
- let remoteShared = {};
105
- const scripts = [];
106
- const links = [];
107
- const hydrationData = [];
108
- let nextData;
109
- let html = "";
110
235
  const remoteName = options.name || (serverUrl.hash ? serverUrl.hash.substring(1) : void 0);
111
- let hasRemoteComponent = false;
112
- let hasRSC = false;
113
- let hasShared = false;
114
- let hasMultipleRemoteComponents = false;
115
- let error;
116
- const rsc = (0, import_dom_flight.visit)(fragment, {
117
- url: serverUrl,
118
- name: remoteName,
119
- onMetadata(_metadata) {
120
- if (hasRemoteComponent && metadata.id !== _metadata.id && _metadata.id !== "__next" && metadata.id !== "__next" && !nextData) {
121
- hasMultipleRemoteComponents = true;
122
- }
123
- metadata = _metadata;
124
- hasRemoteComponent = true;
125
- },
126
- onScript(attrs) {
127
- const clientSrc = (0, import_get_client_src.getClientSrc)(attrs.src, serverUrl.href);
128
- if (!scripts.find(
129
- (it) => it.src === clientSrc || attrs.textContent && it.textContent === attrs.textContent
130
- )) {
131
- scripts.push(
132
- typeof attrs.textContent === "string" ? {
133
- src: "",
134
- textContent: attrs.textContent
135
- } : {
136
- src: clientSrc
137
- }
138
- );
139
- }
140
- },
141
- onLink(attrs) {
142
- const relativeAttrs = {
143
- ...attrs,
144
- href: (0, import_get_client_src.getClientSrc)(attrs.href, serverUrl.href)
145
- };
146
- if (!links.find(
147
- (it) => it.href === relativeAttrs.href && it.rel === attrs.rel
148
- )) {
149
- links.push(relativeAttrs);
150
- }
151
- },
152
- onRSC(chunk) {
153
- hydrationData.push(chunk);
154
- hasRSC = true;
155
- },
156
- onNextData(data) {
157
- nextData = data;
158
- if (data.props.__REMOTE_COMPONENT__) {
159
- Object.assign(metadata, data.props.__REMOTE_COMPONENT__);
160
- metadata.id = "__next";
161
- metadata.route = data.page ?? "/";
162
- }
163
- },
164
- onHTML(_html) {
165
- if (!html.includes(_html)) {
166
- html += _html;
167
- }
168
- },
169
- onShared(_shared) {
170
- remoteShared = _shared;
171
- hasShared = true;
172
- },
173
- onError(message, stack) {
174
- error = new import_error.RemoteComponentsError(message);
175
- if (stack) {
176
- error.stack = stack;
177
- }
178
- }
179
- });
180
- if (error) {
181
- throw error;
182
- }
183
- if (!hasRemoteComponent) {
236
+ const {
237
+ rsc,
238
+ metadata,
239
+ scripts,
240
+ links,
241
+ hydrationData,
242
+ nextData,
243
+ remoteShared,
244
+ html
245
+ } = visitFragment(fragment, serverUrl, remoteName);
246
+ if (!metadata) {
184
247
  const isSSGBuild = process.env.NEXT_PHASE === "phase-production-build";
185
248
  const isSSRRelativePathBase = serverUrl.host === new URL(ssrRelativePathBaseUrl).host;
186
249
  const isPreview = process.env.VERCEL_TARGET_ENV === "preview";
187
250
  if (isSSGBuild && isSSRRelativePathBase && isPreview && options.appRouter) {
188
- const skeletonMessage = (0, import_skeleton.getSkeletonMessage)();
189
- const skeletonHtml = (0, import_skeleton.getSkeletonHtml)(serverUrl.href);
190
251
  let skeletonComponent;
191
252
  if (options.rsc) {
192
253
  const { createElement } = await import("react");
193
254
  skeletonComponent = createElement("div", {
194
- dangerouslySetInnerHTML: { __html: skeletonHtml }
255
+ dangerouslySetInnerHTML: {
256
+ __html: (0, import_skeleton.getSkeletonHtml)(serverUrl.href)
257
+ }
195
258
  });
196
259
  }
197
- return {
198
- name: "remote-component-skeleton",
260
+ return buildSkeletonResponse(
199
261
  serverUrl,
200
- metadata: {
201
- ...metadata,
202
- type: "remote-component"
203
- },
204
- rsc: skeletonMessage,
205
- scripts: [],
206
- links: [],
207
- hydrationData: [],
208
- nextData: void 0,
209
- component: skeletonComponent,
210
- html: skeletonHtml,
211
- remoteShared: {}
212
- };
262
+ (0, import_metadata.buildMetadata)({}, serverUrl),
263
+ skeletonComponent
264
+ );
213
265
  }
214
266
  throw (0, import_error.failedToFetchRemoteComponentError)(
215
267
  serverUrl.href,
@@ -217,47 +269,10 @@ async function fetchRemoteComponent(src, options = {
217
269
  `No Remote Component found. Make sure the remote URL is correct and contains a Remote Component.`
218
270
  );
219
271
  }
220
- if (hasMultipleRemoteComponents && !remoteName) {
221
- throw (0, import_error.multipleRemoteComponentsError)(serverUrl.href);
222
- }
223
- if (!hasRSC && !nextData && metadata.type === "nextjs") {
224
- throw new import_error.RemoteComponentsError(
225
- `The Remote Component at "${serverUrl.href}" seems to be a Next.js component but it does not contain any RSC flight data or Next.js props data. Make sure the remote URL is correct and contains a Remote Component.`
226
- );
227
- }
228
- if (metadata.type === "nextjs" && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
229
- !hasShared && !nextData?.props.__REMOTE_COMPONENT__?.shared) {
230
- throw new import_error.RemoteComponentsError(
231
- `No shared dependencies found for Remote Component at "${serverUrl.href}". Make sure the remote URL is correct and contains a Remote Component with shared dependencies.`
232
- );
233
- }
234
- let component;
235
- if (options.rsc) {
236
- const componentRSC = `0:${JSON.stringify(rsc)}
237
- `;
238
- const { createFromReadableStream } = await import("next/dist/compiled/react-server-dom-webpack/client.edge");
239
- component = await createFromReadableStream(
240
- new ReadableStream({
241
- type: "bytes",
242
- start(controller) {
243
- const encoder = new TextEncoder();
244
- controller.enqueue(encoder.encode(componentRSC));
245
- controller.close();
246
- }
247
- }),
248
- {
249
- serverConsumerManifest: {
250
- moduleLoading: {
251
- prefix: serverUrl.origin,
252
- crossOrigin: true
253
- },
254
- moduleMap: {}
255
- }
256
- }
257
- );
258
- }
272
+ const name = remoteName || metadata.name;
273
+ const component = options.rsc ? await buildRscComponent(rsc, serverUrl) : void 0;
259
274
  return {
260
- name: remoteName || metadata.id.replace(/_ssr$/, ""),
275
+ name,
261
276
  serverUrl,
262
277
  metadata,
263
278
  rsc,
@@ -267,7 +282,7 @@ async function fetchRemoteComponent(src, options = {
267
282
  nextData,
268
283
  component,
269
284
  html,
270
- remoteShared: nextData?.props.__REMOTE_COMPONENT__?.shared ?? remoteShared
285
+ remoteShared
271
286
  };
272
287
  }
273
288
  // Annotate the CommonJS export names for ESM import in node: