From 6dd771b3ffeffd21d1981e19841cf188c3e42fdd Mon Sep 17 00:00:00 2001 From: Hassan Khan Date: Thu, 30 Apr 2026 23:43:09 +0100 Subject: [PATCH 1/2] feat(@expo/router-server): use stream rendering in SSR (#43963) # Why In order to support streaming SSR responses, we need to add a new renderer that uses `ReactDOM.renderToReadableStream()`. # How Exposes a streaming renderer with `getStreamingContent()` to `renderStaticContent.tsx`. # Test Plan - CI - Manual testing `apps/router-e2e` using `pnpm export:server-rendering && pnpm expo serve`. # Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- packages/@expo/cli/CHANGELOG.md | 1 + .../server-rendering.test.ts.snap | 24 ++--- .../__tests__/export/server-rendering.test.ts | 72 +++++++++++-- .../__tests__/export/static-splitting.test.ts | 13 +-- .../playwright/prod/server-rendering.test.ts | 74 +++++++++++++ packages/@expo/router-server/CHANGELOG.md | 2 + .../router-server/build/static/html.d.ts | 7 -- .../router-server/build/static/html.d.ts.map | 2 +- .../@expo/router-server/build/static/html.js | 14 --- .../router-server/build/static/html.js.map | 2 +- .../build/static/renderStaticContent.d.ts | 12 +++ .../build/static/renderStaticContent.d.ts.map | 2 +- .../build/static/renderStaticContent.js | 74 ++++++++++--- .../build/static/renderStaticContent.js.map | 2 +- .../@expo/router-server/build/utils/html.d.ts | 8 ++ .../router-server/build/utils/html.d.ts.map | 2 +- .../@expo/router-server/build/utils/html.js | 12 +++ .../router-server/build/utils/html.js.map | 2 +- .../router-server/build/utils/streams.d.ts | 12 +++ .../build/utils/streams.d.ts.map | 1 + .../router-server/build/utils/streams.js | 69 ++++++++++++ .../router-server/build/utils/streams.js.map | 1 + .../src/static/__tests__/html.test.web.tsx | 51 --------- .../@expo/router-server/src/static/html.tsx | 22 ---- .../src/static/renderStaticContent.tsx | 95 +++++++++++++--- .../src/utils/__tests__/html.test.ts | 64 +++++++++++ .../src/utils/__tests__/streams.test.node.ts | 102 ++++++++++++++++++ .../@expo/router-server/src/utils/html.ts | 12 +++ .../@expo/router-server/src/utils/streams.ts | 89 +++++++++++++++ packages/expo-router/CHANGELOG.md | 1 + packages/expo-server/CHANGELOG.md | 2 + packages/expo-server/build/cjs/rendering.d.ts | 6 +- .../build/cjs/vendor/abstract.d.ts | 2 +- .../expo-server/build/cjs/vendor/abstract.js | 16 +++ .../build/cjs/vendor/abstract.js.map | 2 +- .../build/cjs/vendor/environment/common.d.ts | 2 +- .../build/cjs/vendor/environment/common.js | 2 +- .../cjs/vendor/environment/common.js.map | 2 +- packages/expo-server/build/mjs/rendering.d.ts | 6 +- .../build/mjs/vendor/abstract.d.ts | 2 +- .../expo-server/build/mjs/vendor/abstract.js | 16 +++ .../build/mjs/vendor/abstract.js.map | 2 +- .../build/mjs/vendor/environment/common.d.ts | 2 +- .../build/mjs/vendor/environment/common.js | 2 +- .../mjs/vendor/environment/common.js.map | 2 +- packages/expo-server/src/rendering.ts | 12 ++- .../src/vendor/__tests__/abstract.test.ts | 71 ++++++++++++ packages/expo-server/src/vendor/abstract.ts | 24 ++++- .../environment/__tests__/common.test.ts | 33 ++++-- .../src/vendor/environment/common.ts | 4 +- 50 files changed, 869 insertions(+), 185 deletions(-) create mode 100644 packages/@expo/cli/e2e/playwright/prod/server-rendering.test.ts create mode 100644 packages/@expo/router-server/build/utils/streams.d.ts create mode 100644 packages/@expo/router-server/build/utils/streams.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/streams.js create mode 100644 packages/@expo/router-server/build/utils/streams.js.map delete mode 100644 packages/@expo/router-server/src/static/__tests__/html.test.web.tsx create mode 100644 packages/@expo/router-server/src/utils/__tests__/streams.test.node.ts create mode 100644 packages/@expo/router-server/src/utils/streams.ts diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md index 7a061838cbcc11..7df47eb220abeb 100644 --- a/packages/@expo/cli/CHANGELOG.md +++ b/packages/@expo/cli/CHANGELOG.md @@ -15,6 +15,7 @@ - Enable parallel CocoaPods code signing to speed up device builds. ([#43529](https://github.com/expo/expo/pull/43529) by [@evanbacon](https://github.com/evanbacon)) - Prompt before clearing native folders when we detect project as a native module ([#44458](https://github.com/expo/expo/pull/44458) by [@kitten](https://github.com/kitten)) - Rewrite @react-navigation/core to expo-router for library compatibility ([#45039](https://github.com/expo/expo/pull/45039) by [@Ubax](https://github.com/Ubax)) +- Use stream rendering in SSR ([#43963](https://github.com/expo/expo/pull/43963) by [@hassankhan](https://github.com/hassankhan)) ### 🐛 Bug fixes diff --git a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap index b26f06adfd563b..c40ada10b4c8fc 100644 --- a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap +++ b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`exports server expo serve requests supports usePathname in +html files 1`] = ` -" - - - -

index

Index
-" +@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}} + + +

index

Index
" `; exports[`exports server workerd requests supports usePathname in +html files 1`] = ` -" - - - -

index

Index
-" +@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}} + + +

index

Index
" `; diff --git a/packages/@expo/cli/e2e/__tests__/export/server-rendering.test.ts b/packages/@expo/cli/e2e/__tests__/export/server-rendering.test.ts index 1b163a39656338..8e2a755fa0c283 100644 --- a/packages/@expo/cli/e2e/__tests__/export/server-rendering.test.ts +++ b/packages/@expo/cli/e2e/__tests__/export/server-rendering.test.ts @@ -34,6 +34,11 @@ describe('exports server', () => { )('$name requests', (config) => { const server = setupServer(config); + it('sets the `Transfer-Encoding: chunked` header', async () => { + const res = await server.fetchAsync('/'); + expect(res.headers.get('Transfer-Encoding')).toEqual('chunked'); + }); + it(`can serve up index html`, async () => { const html = getHtml(await server.fetchAsync('/').then((res) => res.text())); expect(html.querySelector('[data-testid="index-text"]')?.textContent).toEqual('Index'); @@ -214,7 +219,25 @@ describe('exports server', () => { it('injects hydration assets into SSR response', async () => { const html = await server.fetchAsync('/').then((res) => res.text()); - expect(html).toMatch(/' + ); + const bootstrapScriptIndex = html.search( + /`; } +/** + * Returns a synchronous inline ``; +} const HELMET_HEAD_KEYS = ['title', 'priority', 'meta', 'link', 'script', 'style']; /** * Extracts head tags and document attributes from a `react-helmet-async` helmet instance. diff --git a/packages/@expo/router-server/build/utils/html.js.map b/packages/@expo/router-server/build/utils/html.js.map index 4bac30af60d653..07fad9b168c740 100644 --- a/packages/@expo/router-server/build/utils/html.js.map +++ b/packages/@expo/router-server/build/utils/html.js.map @@ -1 +1 @@ -{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/utils/html.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqBH,wDAEC;AASD,8DAOC;AAQD,oEAEC;AASD,wDAEC;AAUD,sDAsBC;AA1FD,mIAAmI;AACnI,sGAAsG;AAEtG,iEAAiE;AACjE,uGAAuG;AAEvG,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AACrD,MAAM,kBAAkB,GAAgC;IACtD,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,KAAe;IACvD,OAAO,KAAK;SACT,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,6BAA6B,IAAI,eAAe;QAChD,gCAAgC,IAAI,IAAI;KACzC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,4BAA4B,CAAC,IAAc;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB;IACpC,OAAO,yEAAyE,CAAC;AACnF,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAE3F;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,MAAW;IAK/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvD,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;KACxD,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// See: https://github.com/urql-graphql/urql/blob/ad0276ae616b2b2f2cd01a527b4217ae35c3fa2d/packages/next-urql/src/htmlescape.ts#L10\n// License: https://github.com/urql-graphql/urql/blob/ad0276ae616b2b2f2cd01a527b4217ae35c3fa2d/LICENSE\n\n// This utility is based on https://github.com/zertosh/htmlescape\n// License: https://github.com/zertosh/htmlescape/blob/0527ca7156a524d256101bb310a9f970f63078ad/LICENSE\n\nconst UNSAFE_CHARACTERS_REGEX = /[&><\\u2028\\u2029]/g;\nconst ESCAPED_CHARACTERS: { [match: string]: string } = {\n '&': '\\\\u0026',\n '>': '\\\\u003e',\n '<': '\\\\u003c',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n};\n\n/**\n * Replaces unsafe characters in a string with their escaped equivalents. This is to safely\n * embed data in an HTML context to prevent XSS.\n */\nexport function escapeUnsafeCharacters(str: string): string {\n return str.replace(UNSAFE_CHARACTERS_REGEX, (match) => ESCAPED_CHARACTERS[match] ?? match);\n}\n\n/**\n * Returns a newline-separated `` and `` pair for each\n * CSS href.\n *\n * Used by both `renderStaticContent()` and `serializeHtml()` to inject CSS bundles into the HTML\n * document's `` element.\n */\nexport function createInjectedCssElements(hrefs: string[]): string {\n return hrefs\n .flatMap((href) => [\n ``,\n ``,\n ])\n .join('\\n');\n}\n\n/**\n * Returns newline-separated ``).join('\\n');\n}\n\n/**\n * Returns a module script that sets the `__EXPO_ROUTER_HYDRATE__` global flag, which tells the\n * client-side Expo Router entrypoint to hydrate the server-rendered markup instead of performing\n * a full client render.\n *\n * @see packages/expo/src/launch/registerRootComponent.tsx\n */\nexport function getHydrationFlagScript(): string {\n return ``;\n}\n\nconst HELMET_HEAD_KEYS = ['title', 'priority', 'meta', 'link', 'script', 'style'] as const;\n\n/**\n * Extracts head tags and document attributes from a `react-helmet-async` helmet instance.\n *\n * `` keys are serialized in document order: title, priority, meta, link, script, style.\n * Returns empty strings when `helmet` is `null`/`undefined`.\n */\nexport function serializeHelmetToHtml(helmet: any): {\n headTags: string;\n htmlAttributes: string;\n bodyAttributes: string;\n} {\n if (!helmet) {\n return { headTags: '', htmlAttributes: '', bodyAttributes: '' };\n }\n\n const headParts: string[] = [];\n for (const key of HELMET_HEAD_KEYS) {\n const result = helmet[key]?.toString();\n if (result) {\n headParts.push(result);\n }\n }\n\n return {\n headTags: headParts.join(''),\n htmlAttributes: helmet.htmlAttributes?.toString() ?? '',\n bodyAttributes: helmet.bodyAttributes?.toString() ?? '',\n };\n}\n"]} \ No newline at end of file +{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/utils/html.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAqBH,wDAEC;AASD,8DAOC;AAQD,oEAEC;AASD,wDAEC;AASD,wDAGC;AAUD,sDAsBC;AAtGD,mIAAmI;AACnI,sGAAsG;AAEtG,iEAAiE;AACjE,uGAAuG;AAEvG,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AACrD,MAAM,kBAAkB,GAAgC;IACtD,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,yBAAyB,CAAC,KAAe;IACvD,OAAO,KAAK;SACT,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,6BAA6B,IAAI,eAAe;QAChD,gCAAgC,IAAI,IAAI;KACzC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,4BAA4B,CAAC,IAAc;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB;IACpC,OAAO,yEAAyE,CAAC;AACnF,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,IAA6B;IAClE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,qFAAqF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;AACpI,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAE3F;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,MAAW;IAK/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;QACvD,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;KACxD,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// See: https://github.com/urql-graphql/urql/blob/ad0276ae616b2b2f2cd01a527b4217ae35c3fa2d/packages/next-urql/src/htmlescape.ts#L10\n// License: https://github.com/urql-graphql/urql/blob/ad0276ae616b2b2f2cd01a527b4217ae35c3fa2d/LICENSE\n\n// This utility is based on https://github.com/zertosh/htmlescape\n// License: https://github.com/zertosh/htmlescape/blob/0527ca7156a524d256101bb310a9f970f63078ad/LICENSE\n\nconst UNSAFE_CHARACTERS_REGEX = /[&><\\u2028\\u2029]/g;\nconst ESCAPED_CHARACTERS: { [match: string]: string } = {\n '&': '\\\\u0026',\n '>': '\\\\u003e',\n '<': '\\\\u003c',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n};\n\n/**\n * Replaces unsafe characters in a string with their escaped equivalents. This is to safely\n * embed data in an HTML context to prevent XSS.\n */\nexport function escapeUnsafeCharacters(str: string): string {\n return str.replace(UNSAFE_CHARACTERS_REGEX, (match) => ESCAPED_CHARACTERS[match] ?? match);\n}\n\n/**\n * Returns a newline-separated `` and `` pair for each\n * CSS href.\n *\n * Used by both `renderStaticContent()` and `serializeHtml()` to inject CSS bundles into the HTML\n * document's `` element.\n */\nexport function createInjectedCssElements(hrefs: string[]): string {\n return hrefs\n .flatMap((href) => [\n ``,\n ``,\n ])\n .join('\\n');\n}\n\n/**\n * Returns newline-separated ``).join('\\n');\n}\n\n/**\n * Returns a module script that sets the `__EXPO_ROUTER_HYDRATE__` global flag, which tells the\n * client-side Expo Router entrypoint to hydrate the server-rendered markup instead of performing\n * a full client render.\n *\n * @see packages/expo/src/launch/registerRootComponent.tsx\n */\nexport function getHydrationFlagScript(): string {\n return ``;\n}\n\n/**\n * Returns a synchronous inline ``;\n}\n\nconst HELMET_HEAD_KEYS = ['title', 'priority', 'meta', 'link', 'script', 'style'] as const;\n\n/**\n * Extracts head tags and document attributes from a `react-helmet-async` helmet instance.\n *\n * `` keys are serialized in document order: title, priority, meta, link, script, style.\n * Returns empty strings when `helmet` is `null`/`undefined`.\n */\nexport function serializeHelmetToHtml(helmet: any): {\n headTags: string;\n htmlAttributes: string;\n bodyAttributes: string;\n} {\n if (!helmet) {\n return { headTags: '', htmlAttributes: '', bodyAttributes: '' };\n }\n\n const headParts: string[] = [];\n for (const key of HELMET_HEAD_KEYS) {\n const result = helmet[key]?.toString();\n if (result) {\n headParts.push(result);\n }\n }\n\n return {\n headTags: headParts.join(''),\n htmlAttributes: helmet.htmlAttributes?.toString() ?? '',\n bodyAttributes: helmet.bodyAttributes?.toString() ?? '',\n };\n}\n"]} \ No newline at end of file diff --git a/packages/@expo/router-server/build/utils/streams.d.ts b/packages/@expo/router-server/build/utils/streams.d.ts new file mode 100644 index 00000000000000..f7238dc9ee81a1 --- /dev/null +++ b/packages/@expo/router-server/build/utils/streams.d.ts @@ -0,0 +1,12 @@ +type HeadInjectionOptions = { + injectionParts: string[]; + htmlAttributes?: string; + bodyAttributes?: string; +}; +/** + * Buffers the initial HTML document prefix, injects head content plus any serialized document + * attributes, then switches to passthrough mode for the rest of the stream. + */ +export declare function createDocumentMetadataInjectionTransform(options: HeadInjectionOptions): TransformStream; +export {}; +//# sourceMappingURL=streams.d.ts.map \ No newline at end of file diff --git a/packages/@expo/router-server/build/utils/streams.d.ts.map b/packages/@expo/router-server/build/utils/streams.d.ts.map new file mode 100644 index 00000000000000..ad32583d6b9c5d --- /dev/null +++ b/packages/@expo/router-server/build/utils/streams.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAeF;;;GAGG;AACH,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,oBAAoB,GAC5B,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CA4DzC"} \ No newline at end of file diff --git a/packages/@expo/router-server/build/utils/streams.js b/packages/@expo/router-server/build/utils/streams.js new file mode 100644 index 00000000000000..704b93cabc0543 --- /dev/null +++ b/packages/@expo/router-server/build/utils/streams.js @@ -0,0 +1,69 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDocumentMetadataInjectionTransform = createDocumentMetadataInjectionTransform; +const HEAD_CLOSE_TAG = ''; +const BODY_OPEN_TAG = '`; + if (html.includes(bareTag)) { + return html.replace(bareTag, `<${tagName} ${attributes}>`); + } + return html.replace(`<${tagName} `, `<${tagName} ${attributes} `); +} +/** + * Buffers the initial HTML document prefix, injects head content plus any serialized document + * attributes, then switches to passthrough mode for the rest of the stream. + */ +function createDocumentMetadataInjectionTransform(options) { + let buffer = ''; + let injected = false; + const decoder = new TextDecoder(); + const encoder = new TextEncoder(); + const injection = options.injectionParts.join(''); + return new TransformStream({ + transform(chunk, controller) { + const decodedChunk = decoder.decode(chunk, { stream: true }); + if (injected) { + controller.enqueue(encoder.encode(decodedChunk)); + return; + } + buffer += decodedChunk; + const headCloseIdx = buffer.indexOf(HEAD_CLOSE_TAG); + const bodyOpenIdx = options.bodyAttributes ? buffer.indexOf(BODY_OPEN_TAG) : 0; + const hasRequiredDocumentPrefix = headCloseIdx !== -1 && bodyOpenIdx !== -1; + if (hasRequiredDocumentPrefix) { + const bodyOpenTagEndIdx = options.bodyAttributes + ? buffer.indexOf('>', bodyOpenIdx) + : headCloseIdx + HEAD_CLOSE_TAG.length; + if (bodyOpenTagEndIdx === -1) { + return; + } + let before = buffer.slice(0, headCloseIdx); + const afterHead = buffer.slice(headCloseIdx, bodyOpenTagEndIdx + 1); + const remainder = buffer.slice(bodyOpenTagEndIdx + 1); + before = injectTagAttributes(before, 'html', options.htmlAttributes); + const documentPrefix = injectTagAttributes(afterHead, 'body', options.bodyAttributes); + injected = true; + buffer = ''; + controller.enqueue(encoder.encode(before + injection + documentPrefix + remainder)); + } + }, + flush(controller) { + const trailing = decoder.decode(); + if (trailing) { + if (injected) { + controller.enqueue(encoder.encode(trailing)); + return; + } + buffer += trailing; + } + if (!injected) { + controller.error(new Error(`Streaming SSR head injection failed: missing ${HEAD_CLOSE_TAG} in HTML output.`)); + } + }, + }); +} +//# sourceMappingURL=streams.js.map \ No newline at end of file diff --git a/packages/@expo/router-server/build/utils/streams.js.map b/packages/@expo/router-server/build/utils/streams.js.map new file mode 100644 index 00000000000000..fb7996b3891078 --- /dev/null +++ b/packages/@expo/router-server/build/utils/streams.js.map @@ -0,0 +1 @@ +{"version":3,"file":"streams.js","sourceRoot":"","sources":["../../src/utils/streams.ts"],"names":[],"mappings":"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","sourcesContent":["const HEAD_CLOSE_TAG = '';\nconst BODY_OPEN_TAG = '`;\n if (html.includes(bareTag)) {\n return html.replace(bareTag, `<${tagName} ${attributes}>`);\n }\n\n return html.replace(`<${tagName} `, `<${tagName} ${attributes} `);\n}\n\n/**\n * Buffers the initial HTML document prefix, injects head content plus any serialized document\n * attributes, then switches to passthrough mode for the rest of the stream.\n */\nexport function createDocumentMetadataInjectionTransform(\n options: HeadInjectionOptions\n): TransformStream {\n let buffer = '';\n let injected = false;\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n const injection = options.injectionParts.join('');\n\n return new TransformStream({\n transform(chunk, controller): void {\n const decodedChunk = decoder.decode(chunk, { stream: true });\n\n if (injected) {\n controller.enqueue(encoder.encode(decodedChunk));\n return;\n }\n\n buffer += decodedChunk;\n\n const headCloseIdx = buffer.indexOf(HEAD_CLOSE_TAG);\n const bodyOpenIdx = options.bodyAttributes ? buffer.indexOf(BODY_OPEN_TAG) : 0;\n const hasRequiredDocumentPrefix = headCloseIdx !== -1 && bodyOpenIdx !== -1;\n if (hasRequiredDocumentPrefix) {\n const bodyOpenTagEndIdx = options.bodyAttributes\n ? buffer.indexOf('>', bodyOpenIdx)\n : headCloseIdx + HEAD_CLOSE_TAG.length;\n\n if (bodyOpenTagEndIdx === -1) {\n return;\n }\n\n let before = buffer.slice(0, headCloseIdx);\n const afterHead = buffer.slice(headCloseIdx, bodyOpenTagEndIdx + 1);\n const remainder = buffer.slice(bodyOpenTagEndIdx + 1);\n before = injectTagAttributes(before, 'html', options.htmlAttributes);\n const documentPrefix = injectTagAttributes(afterHead, 'body', options.bodyAttributes);\n injected = true;\n buffer = '';\n controller.enqueue(encoder.encode(before + injection + documentPrefix + remainder));\n }\n },\n\n flush(controller): void {\n const trailing = decoder.decode();\n if (trailing) {\n if (injected) {\n controller.enqueue(encoder.encode(trailing));\n return;\n }\n buffer += trailing;\n }\n\n if (!injected) {\n controller.error(\n new Error(\n `Streaming SSR head injection failed: missing ${HEAD_CLOSE_TAG} in HTML output.`\n )\n );\n }\n },\n });\n}\n"]} \ No newline at end of file diff --git a/packages/@expo/router-server/src/static/__tests__/html.test.web.tsx b/packages/@expo/router-server/src/static/__tests__/html.test.web.tsx deleted file mode 100644 index 7692a332feeec0..00000000000000 --- a/packages/@expo/router-server/src/static/__tests__/html.test.web.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/** @jest-environment jsdom */ -import { render } from '@testing-library/react'; -import React from 'react'; - -import { PreloadedDataScript } from '../html'; - -describe(PreloadedDataScript, () => { - it('renders script tag with loader data', () => { - const data = { '/': { foo: 'bar' } }; - const { container } = render(); - const scriptElement = container.querySelector('script[id="expo-router-data"]'); - - expect(scriptElement).not.toBeNull(); - expect(scriptElement?.getAttribute('type')).toBe('module'); - expect(scriptElement?.innerHTML).toContain('globalThis.__EXPO_ROUTER_LOADER_DATA__'); - expect(scriptElement?.innerHTML).toContain('JSON.parse("{\\"/\\":{\\"foo\\":\\"bar\\"}}")'); - }); - - it('handles special characters', () => { - const data = { - '/': { - dangerous: '', - nested: { value: '' }, - multiple: '<<>>', - mixed: 'Text with and ', - quotes: 'He said "Hello"', - backslash: 'C:\\Users\\test', - newline: 'Line 1\nLine 2', - unicode: '你好世界 🌍', - }, - }; - const { container } = render(); - const scriptElement = container.querySelector('script[id="expo-router-data"]'); - const content = scriptElement?.innerHTML || ''; - - expect(content).not.toContain(''); - expect(content).toContain('\\\\u003cscript'); - expect(content).toContain('\\\\u003c/script\\\\u003e\\'); - - const unescapedMatches = content.match(/(? }) { - const safeJson = escapeUnsafeCharacters(JSON.stringify(data)); - - return ( - ', + nested: { value: '' }, + multiple: '<<>>', + mixed: 'Text with and ', + quotes: 'He said "Hello"', + backslash: 'C:\\Users\\test', + newline: 'Line 1\nLine 2', + unicode: '你好世界 🌍', + ampersand: 'A & B', + separators: '\u2028\u2029', + }, + }); + + const result = escapeUnsafeCharacters(input); + + expect(result).not.toContain(''); + expect(result).not.toContain(''); + expect(result).toContain('\\u003cscript'); + expect(result).toContain('\\u003c/script\\u003e'); + expect(result).toContain('\\u003c\\u003c\\u003cmultiple'); + expect(result).toContain('\\u003ctag'); + expect(result).toContain('\\u003c/tag\\u003e'); + expect(result).toContain('He said \\"Hello\\"'); + expect(result).toContain('C:\\\\Users\\\\test'); + expect(result).toContain('\\n'); + expect(result).toContain('你好世界'); + expect(result).toContain('A \\u0026 B'); + expect(result).toContain('\\u2028\\u2029'); + + const unescapedAngleBrackets = result.match(/[<>]/g); + expect(unescapedAngleBrackets).toBeNull(); + }); +}); + describe(createInjectedCssElements, () => { it('returns empty string for empty array', () => { expect(createInjectedCssElements([])).toBe(''); @@ -53,6 +93,30 @@ describe(getHydrationFlagScript, () => { }); }); +describe(createLoaderDataScript, () => { + it('returns the expected inline script markup', () => { + const data = { '/': { foo: 'bar' } }; + + expect(createLoaderDataScript(data)).toBe( + '' + ); + }); + + it('uses an escaped payload for unsafe HTML input', () => { + const data = { '/route': '' }; + const result = createLoaderDataScript(data); + + expect(result).toContain('`; } +/** + * Returns a synchronous inline ``; +} + const HELMET_HEAD_KEYS = ['title', 'priority', 'meta', 'link', 'script', 'style'] as const; /** diff --git a/packages/@expo/router-server/src/utils/streams.ts b/packages/@expo/router-server/src/utils/streams.ts new file mode 100644 index 00000000000000..76a5f036ee3e2b --- /dev/null +++ b/packages/@expo/router-server/src/utils/streams.ts @@ -0,0 +1,89 @@ +const HEAD_CLOSE_TAG = ''; +const BODY_OPEN_TAG = '`; + if (html.includes(bareTag)) { + return html.replace(bareTag, `<${tagName} ${attributes}>`); + } + + return html.replace(`<${tagName} `, `<${tagName} ${attributes} `); +} + +/** + * Buffers the initial HTML document prefix, injects head content plus any serialized document + * attributes, then switches to passthrough mode for the rest of the stream. + */ +export function createDocumentMetadataInjectionTransform( + options: HeadInjectionOptions +): TransformStream { + let buffer = ''; + let injected = false; + const decoder = new TextDecoder(); + const encoder = new TextEncoder(); + const injection = options.injectionParts.join(''); + + return new TransformStream({ + transform(chunk, controller): void { + const decodedChunk = decoder.decode(chunk, { stream: true }); + + if (injected) { + controller.enqueue(encoder.encode(decodedChunk)); + return; + } + + buffer += decodedChunk; + + const headCloseIdx = buffer.indexOf(HEAD_CLOSE_TAG); + const bodyOpenIdx = options.bodyAttributes ? buffer.indexOf(BODY_OPEN_TAG) : 0; + const hasRequiredDocumentPrefix = headCloseIdx !== -1 && bodyOpenIdx !== -1; + if (hasRequiredDocumentPrefix) { + const bodyOpenTagEndIdx = options.bodyAttributes + ? buffer.indexOf('>', bodyOpenIdx) + : headCloseIdx + HEAD_CLOSE_TAG.length; + + if (bodyOpenTagEndIdx === -1) { + return; + } + + let before = buffer.slice(0, headCloseIdx); + const afterHead = buffer.slice(headCloseIdx, bodyOpenTagEndIdx + 1); + const remainder = buffer.slice(bodyOpenTagEndIdx + 1); + before = injectTagAttributes(before, 'html', options.htmlAttributes); + const documentPrefix = injectTagAttributes(afterHead, 'body', options.bodyAttributes); + injected = true; + buffer = ''; + controller.enqueue(encoder.encode(before + injection + documentPrefix + remainder)); + } + }, + + flush(controller): void { + const trailing = decoder.decode(); + if (trailing) { + if (injected) { + controller.enqueue(encoder.encode(trailing)); + return; + } + buffer += trailing; + } + + if (!injected) { + controller.error( + new Error( + `Streaming SSR head injection failed: missing ${HEAD_CLOSE_TAG} in HTML output.` + ) + ); + } + }, + }); +} diff --git a/packages/expo-router/CHANGELOG.md b/packages/expo-router/CHANGELOG.md index 14bdb6fcf83f03..cb65898af62e89 100644 --- a/packages/expo-router/CHANGELOG.md +++ b/packages/expo-router/CHANGELOG.md @@ -20,6 +20,7 @@ - Support `ColorValue`. ([#44301](https://github.com/expo/expo/pull/44301) by [@jakex7](https://github.com/jakex7)) - Allow customizing route-level `` fallback ([#43885](https://github.com/expo/expo/pull/43885) by [@hassankhan](https://github.com/hassankhan)) - Upgrade react-native-screens version to 4.25.0-beta.1 ([#45172](https://github.com/expo/expo/pull/45172) by [@Ubax](https://github.com/Ubax)) +- [web] Use stream rendering in SSR ([#43963](https://github.com/expo/expo/pull/43963) by [@hassankhan](https://github.com/hassankhan)) ### 🐛 Bug fixes diff --git a/packages/expo-server/CHANGELOG.md b/packages/expo-server/CHANGELOG.md index 23e41b16a9642c..d049ce9e7ab365 100644 --- a/packages/expo-server/CHANGELOG.md +++ b/packages/expo-server/CHANGELOG.md @@ -6,6 +6,8 @@ ### 🎉 New features +- Use stream rendering in SSR ([#43963](https://github.com/expo/expo/pull/43963) by [@hassankhan](https://github.com/hassankhan)) + ### 🐛 Bug fixes - Correctly handle JavaScript assets when `asyncRoutes: true` in SSR ([#43446](https://github.com/expo/expo/pull/43446) by [@hassankhan](https://github.com/hassankhan))` diff --git a/packages/expo-server/build/cjs/rendering.d.ts b/packages/expo-server/build/cjs/rendering.d.ts index 5b8df2ecea0bfe..e2d38b42ab7f5c 100644 --- a/packages/expo-server/build/cjs/rendering.d.ts +++ b/packages/expo-server/build/cjs/rendering.d.ts @@ -6,8 +6,8 @@ import type { AssetInfo, GetStaticContentOptions } from './manifest'; * {@link import('@expo/router-server/src/static/renderStaticContent')} */ export interface ServerRenderModule { - /** {@link import('@expo/router-server/src/static/renderStaticContent').getStaticContent} */ - getStaticContent(location: URL, options?: GetStaticContentOptions): Promise; + /** {@link import('@expo/router-server/src/static/renderStaticContent').getStreamingContent} */ + getStreamingContent(location: URL, options?: GetStaticContentOptions): Promise>; } export interface RenderOptions { loader?: { @@ -16,7 +16,7 @@ export interface RenderOptions { }; assets?: AssetInfo; } -export type SsrRenderFn = (request: Request, options?: RenderOptions) => Promise; +export type SsrRenderFn = (request: Request, options?: RenderOptions) => Promise>; /** Module exported from loader bundle, typically `_expo/loaders/[ROUTE].js` */ export interface LoaderModule { loader(request: ImmutableRequest | undefined, params: Record): Promise | unknown; diff --git a/packages/expo-server/build/cjs/vendor/abstract.d.ts b/packages/expo-server/build/cjs/vendor/abstract.d.ts index be2cdc116486c6..470a016e3c6cc3 100644 --- a/packages/expo-server/build/cjs/vendor/abstract.d.ts +++ b/packages/expo-server/build/cjs/vendor/abstract.d.ts @@ -32,7 +32,7 @@ export interface RequestHandlerParams { beforeAPIResponse?: BeforeResponseCallback; } export interface RequestHandlerInput { - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getRoutesManifest(): Promise; getApiRoute(route: Route): Promise; getMiddleware(route: MiddlewareInfo): Promise; diff --git a/packages/expo-server/build/cjs/vendor/abstract.js b/packages/expo-server/build/cjs/vendor/abstract.js index d9b2d9d7005eb4..4e03cfc820cd0a 100644 --- a/packages/expo-server/build/cjs/vendor/abstract.js +++ b/packages/expo-server/build/cjs/vendor/abstract.js @@ -202,6 +202,14 @@ function createRequestHandler({ getRoutesManifest, getHtml, getApiRoute, getMidd // Only used for development errors return html; } + if (html != null) { + return createResponse('notFoundHtml', route, html, { + status: 404, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } async function respondAPI(mod, request, route) { @@ -241,6 +249,14 @@ function createRequestHandler({ getRoutesManifest, getHtml, getApiRoute, getMidd // Only used for development error responses return html; } + if (html != null) { + return createResponse('html', route, html, { + status: 200, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } function respondRedirect(url, request, route) { diff --git a/packages/expo-server/build/cjs/vendor/abstract.js.map b/packages/expo-server/build/cjs/vendor/abstract.js.map index c9a6e4f920b64c..091c84cfc524cf 100644 --- a/packages/expo-server/build/cjs/vendor/abstract.js.map +++ b/packages/expo-server/build/cjs/vendor/abstract.js.map @@ -1 +1 @@ -{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/vendor/abstract.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/vendor/abstract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-server/build/cjs/vendor/environment/common.d.ts b/packages/expo-server/build/cjs/vendor/environment/common.d.ts index 8a3573f757bdff..a0812a6f7355ca 100644 --- a/packages/expo-server/build/cjs/vendor/environment/common.d.ts +++ b/packages/expo-server/build/cjs/vendor/environment/common.d.ts @@ -7,7 +7,7 @@ interface EnvironmentInput { } export interface CommonEnvironment { getRoutesManifest(): Promise; - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getApiRoute(route: Route): Promise; getMiddleware(middleware: MiddlewareInfo): Promise; getLoaderData(request: Request, route: Route): Promise; diff --git a/packages/expo-server/build/cjs/vendor/environment/common.js b/packages/expo-server/build/cjs/vendor/environment/common.js index 145d1193e92267..a2e6135ee7489d 100644 --- a/packages/expo-server/build/cjs/vendor/environment/common.js +++ b/packages/expo-server/build/cjs/vendor/environment/common.js @@ -58,7 +58,7 @@ function createEnvironment(input) { const url = new URL(request.url); const location = new URL(url.pathname + url.search, url.origin); const assets = mergeAssets(topLevelAssets, options?.assets); - return ssrModule.getStaticContent(location, { + return ssrModule.getStreamingContent(location, { loader: options?.loader, request, assets, diff --git a/packages/expo-server/build/cjs/vendor/environment/common.js.map b/packages/expo-server/build/cjs/vendor/environment/common.js.map index 58f5444038313d..8077156affd98d 100644 --- a/packages/expo-server/build/cjs/vendor/environment/common.js.map +++ b/packages/expo-server/build/cjs/vendor/environment/common.js.map @@ -1 +1 @@ -{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/vendor/environment/common.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/vendor/environment/common.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-server/build/mjs/rendering.d.ts b/packages/expo-server/build/mjs/rendering.d.ts index 5b8df2ecea0bfe..e2d38b42ab7f5c 100644 --- a/packages/expo-server/build/mjs/rendering.d.ts +++ b/packages/expo-server/build/mjs/rendering.d.ts @@ -6,8 +6,8 @@ import type { AssetInfo, GetStaticContentOptions } from './manifest'; * {@link import('@expo/router-server/src/static/renderStaticContent')} */ export interface ServerRenderModule { - /** {@link import('@expo/router-server/src/static/renderStaticContent').getStaticContent} */ - getStaticContent(location: URL, options?: GetStaticContentOptions): Promise; + /** {@link import('@expo/router-server/src/static/renderStaticContent').getStreamingContent} */ + getStreamingContent(location: URL, options?: GetStaticContentOptions): Promise>; } export interface RenderOptions { loader?: { @@ -16,7 +16,7 @@ export interface RenderOptions { }; assets?: AssetInfo; } -export type SsrRenderFn = (request: Request, options?: RenderOptions) => Promise; +export type SsrRenderFn = (request: Request, options?: RenderOptions) => Promise>; /** Module exported from loader bundle, typically `_expo/loaders/[ROUTE].js` */ export interface LoaderModule { loader(request: ImmutableRequest | undefined, params: Record): Promise | unknown; diff --git a/packages/expo-server/build/mjs/vendor/abstract.d.ts b/packages/expo-server/build/mjs/vendor/abstract.d.ts index be2cdc116486c6..470a016e3c6cc3 100644 --- a/packages/expo-server/build/mjs/vendor/abstract.d.ts +++ b/packages/expo-server/build/mjs/vendor/abstract.d.ts @@ -32,7 +32,7 @@ export interface RequestHandlerParams { beforeAPIResponse?: BeforeResponseCallback; } export interface RequestHandlerInput { - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getRoutesManifest(): Promise; getApiRoute(route: Route): Promise; getMiddleware(route: MiddlewareInfo): Promise; diff --git a/packages/expo-server/build/mjs/vendor/abstract.js b/packages/expo-server/build/mjs/vendor/abstract.js index 754a1a89a9816a..07a4ee8d143f10 100644 --- a/packages/expo-server/build/mjs/vendor/abstract.js +++ b/packages/expo-server/build/mjs/vendor/abstract.js @@ -197,6 +197,14 @@ export function createRequestHandler({ getRoutesManifest, getHtml, getApiRoute, // Only used for development errors return html; } + if (html != null) { + return createResponse('notFoundHtml', route, html, { + status: 404, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } async function respondAPI(mod, request, route) { @@ -236,6 +244,14 @@ export function createRequestHandler({ getRoutesManifest, getHtml, getApiRoute, // Only used for development error responses return html; } + if (html != null) { + return createResponse('html', route, html, { + status: 200, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } function respondRedirect(url, request, route) { diff --git a/packages/expo-server/build/mjs/vendor/abstract.js.map b/packages/expo-server/build/mjs/vendor/abstract.js.map index b7b992cfda9925..e2dfaf344f1206 100644 --- a/packages/expo-server/build/mjs/vendor/abstract.js.map +++ b/packages/expo-server/build/mjs/vendor/abstract.js.map @@ -1 +1 @@ -{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/vendor/abstract.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../src/vendor/abstract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-server/build/mjs/vendor/environment/common.d.ts b/packages/expo-server/build/mjs/vendor/environment/common.d.ts index 8a3573f757bdff..a0812a6f7355ca 100644 --- a/packages/expo-server/build/mjs/vendor/environment/common.d.ts +++ b/packages/expo-server/build/mjs/vendor/environment/common.d.ts @@ -7,7 +7,7 @@ interface EnvironmentInput { } export interface CommonEnvironment { getRoutesManifest(): Promise; - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getApiRoute(route: Route): Promise; getMiddleware(middleware: MiddlewareInfo): Promise; getLoaderData(request: Request, route: Route): Promise; diff --git a/packages/expo-server/build/mjs/vendor/environment/common.js b/packages/expo-server/build/mjs/vendor/environment/common.js index d4ccb0c04b57ef..f1907daaf9c737 100644 --- a/packages/expo-server/build/mjs/vendor/environment/common.js +++ b/packages/expo-server/build/mjs/vendor/environment/common.js @@ -55,7 +55,7 @@ export function createEnvironment(input) { const url = new URL(request.url); const location = new URL(url.pathname + url.search, url.origin); const assets = mergeAssets(topLevelAssets, options?.assets); - return ssrModule.getStaticContent(location, { + return ssrModule.getStreamingContent(location, { loader: options?.loader, request, assets, diff --git a/packages/expo-server/build/mjs/vendor/environment/common.js.map b/packages/expo-server/build/mjs/vendor/environment/common.js.map index d56a891de2246f..b844b10d83043a 100644 --- a/packages/expo-server/build/mjs/vendor/environment/common.js.map +++ b/packages/expo-server/build/mjs/vendor/environment/common.js.map @@ -1 +1 @@ -{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/vendor/environment/common.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/vendor/environment/common.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-server/src/rendering.ts b/packages/expo-server/src/rendering.ts index e06918d74d4cf0..a2f96ba407c928 100644 --- a/packages/expo-server/src/rendering.ts +++ b/packages/expo-server/src/rendering.ts @@ -7,8 +7,11 @@ import type { AssetInfo, GetStaticContentOptions } from './manifest'; * {@link import('@expo/router-server/src/static/renderStaticContent')} */ export interface ServerRenderModule { - /** {@link import('@expo/router-server/src/static/renderStaticContent').getStaticContent} */ - getStaticContent(location: URL, options?: GetStaticContentOptions): Promise; + /** {@link import('@expo/router-server/src/static/renderStaticContent').getStreamingContent} */ + getStreamingContent( + location: URL, + options?: GetStaticContentOptions + ): Promise>; } export interface RenderOptions { @@ -16,7 +19,10 @@ export interface RenderOptions { assets?: AssetInfo; } -export type SsrRenderFn = (request: Request, options?: RenderOptions) => Promise; +export type SsrRenderFn = ( + request: Request, + options?: RenderOptions +) => Promise>; /** Module exported from loader bundle, typically `_expo/loaders/[ROUTE].js` */ export interface LoaderModule { diff --git a/packages/expo-server/src/vendor/__tests__/abstract.test.ts b/packages/expo-server/src/vendor/__tests__/abstract.test.ts index 183b03d038c8fc..9a3e5333149e81 100644 --- a/packages/expo-server/src/vendor/__tests__/abstract.test.ts +++ b/packages/expo-server/src/vendor/__tests__/abstract.test.ts @@ -2,6 +2,68 @@ import type { Manifest } from '../../manifest'; import { createRequestHandler } from '../abstract'; describe(createRequestHandler, () => { + it('returns streamed HTML responses for matched routes', async () => { + const manifest: Manifest = { + htmlRoutes: [ + { + file: 'index', + page: '/', + namedRegex: /^\/$/, + routeKeys: {}, + }, + ], + apiRoutes: [], + notFoundRoutes: [], + redirects: [], + rewrites: [], + }; + + const handler = createRequestHandler({ + getRoutesManifest: jest.fn(async () => manifest), + getHtml: jest.fn(async () => createHtmlStream('streamed')), + getApiRoute: jest.fn(), + getMiddleware: jest.fn(), + getLoaderData: jest.fn(), + }); + + const response = await handler(new Request('http://localhost/')); + + expect(response.status).toBe(200); + expect(response.headers.get('Content-Type')).toBe('text/html'); + expect(await response.text()).toBe('streamed'); + }); + + it('returns streamed 404 HTML responses for matched not-found routes', async () => { + const manifest: Manifest = { + htmlRoutes: [], + apiRoutes: [], + notFoundRoutes: [ + { + file: 'not-found', + page: '/404', + namedRegex: /^\/.*$/, + routeKeys: {}, + }, + ], + redirects: [], + rewrites: [], + }; + + const handler = createRequestHandler({ + getRoutesManifest: jest.fn(async () => manifest), + getHtml: jest.fn(async () => createHtmlStream('missing')), + getApiRoute: jest.fn(), + getMiddleware: jest.fn(), + getLoaderData: jest.fn(), + }); + + const response = await handler(new Request('http://localhost/missing')); + + expect(response.status).toBe(404); + expect(response.headers.get('Content-Type')).toBe('text/html'); + expect(await response.text()).toBe('missing'); + }); + it('applies custom headers from manifest', async () => { const manifest: Manifest = { htmlRoutes: [ @@ -330,3 +392,12 @@ describe(createRequestHandler, () => { }); }); }); + +function createHtmlStream(html: string): ReadableStream { + return new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(html)); + controller.close(); + }, + }); +} diff --git a/packages/expo-server/src/vendor/abstract.ts b/packages/expo-server/src/vendor/abstract.ts index 875284ace4f2b2..5cace9347c6ced 100644 --- a/packages/expo-server/src/vendor/abstract.ts +++ b/packages/expo-server/src/vendor/abstract.ts @@ -52,7 +52,7 @@ export interface RequestHandlerParams { } export interface RequestHandlerInput { - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getRoutesManifest(): Promise; getApiRoute(route: Route): Promise; getMiddleware(route: MiddlewareInfo): Promise; @@ -271,7 +271,7 @@ export function createRequestHandler({ } async function respondNotFoundHTML( - html: string | Response | null, + html: string | ReadableStream | Response | null, route: Route ): Promise { if (typeof html === 'string') { @@ -288,6 +288,15 @@ export function createRequestHandler({ return html; } + if (html != null) { + return createResponse('notFoundHtml', route, html, { + status: 404, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } + throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } @@ -322,7 +331,7 @@ export function createRequestHandler({ return createResponseFrom('api', route, response); } - function respondHTML(html: string | Response | null, route: Route): Response { + function respondHTML(html: string | ReadableStream | Response | null, route: Route): Response { if (typeof html === 'string') { return createResponse('html', route, html, { status: 200, @@ -337,6 +346,15 @@ export function createRequestHandler({ return html; } + if (html != null) { + return createResponse('html', route, html, { + status: 200, + headers: new Headers({ + 'Content-Type': 'text/html', + }), + }); + } + throw new ExpoError(`HTML route file ${route.page}.html could not be loaded`); } diff --git a/packages/expo-server/src/vendor/environment/__tests__/common.test.ts b/packages/expo-server/src/vendor/environment/__tests__/common.test.ts index fe353d176a836a..39a8c32eaffbef 100644 --- a/packages/expo-server/src/vendor/environment/__tests__/common.test.ts +++ b/packages/expo-server/src/vendor/environment/__tests__/common.test.ts @@ -207,7 +207,7 @@ describe('getHtml', () => { }) ); - expect(html).toBe('SSR content'); + expect(await new Response(html as ReadableStream).text()).toBe('SSR content'); expect(input.loadModule).toHaveBeenCalledWith('_expo/server/render.js'); expect(input.readText).not.toHaveBeenCalled(); }); @@ -295,7 +295,7 @@ describe('getHtml', () => { expect(input.loadModule).toHaveBeenCalledTimes(2); }); - it('passes location, request, and assets to `getStaticContent()`', async () => { + it('passes location, request, and assets to `getStreamingContent()`', async () => { const mockSSRModule = createMockSSRModule(); const input = createMockInput({ manifest: { @@ -316,7 +316,7 @@ describe('getHtml', () => { }) ); - expect(mockSSRModule.getStaticContent).toHaveBeenCalledWith( + expect(mockSSRModule.getStreamingContent).toHaveBeenCalledWith( expect.objectContaining({ pathname: '/path', search: '?query=1', @@ -326,6 +326,14 @@ describe('getHtml', () => { assets: { css: ['/style.css'], js: ['/app.js'] }, }) ); + expect(mockSSRModule.getStreamingContent).toHaveBeenCalledWith( + expect.any(URL), + expect.objectContaining({ + request: expect.objectContaining({ + signal: request.signal, + }), + }) + ); }); it('merges top-level and per-route assets', async () => { @@ -349,7 +357,7 @@ describe('getHtml', () => { }) ); - expect(mockSSRModule.getStaticContent).toHaveBeenCalledWith( + expect(mockSSRModule.getStreamingContent).toHaveBeenCalledWith( expect.any(URL), expect.objectContaining({ assets: { @@ -364,7 +372,7 @@ describe('getHtml', () => { const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(); const renderError = new Error('Render failed'); const mockSSRModule = { - getStaticContent: jest.fn().mockRejectedValue(renderError), + getStreamingContent: jest.fn().mockRejectedValue(renderError), }; const input = createMockInput({ manifest: { @@ -426,7 +434,7 @@ describe('getHtml', () => { expect(input.loadModule).toHaveBeenCalledWith('_expo/loaders/index.js'); expect(loaderModule.loader).toHaveBeenCalledWith(expect.any(ImmutableRequest), {}); - expect(mockSSRModule.getStaticContent).toHaveBeenCalledWith( + expect(mockSSRModule.getStreamingContent).toHaveBeenCalledWith( expect.any(URL), expect.objectContaining({ loader: { key: '/index', data: loaderData }, @@ -724,6 +732,17 @@ function createMockRoute( function createMockSSRModule(): ServerRenderModule { return { - getStaticContent: jest.fn().mockResolvedValue('SSR content'), + getStreamingContent: jest + .fn() + .mockResolvedValue(createMockHtmlStream('SSR content')), }; } + +function createMockHtmlStream(html: string): ReadableStream { + return new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode(html)); + controller.close(); + }, + }); +} diff --git a/packages/expo-server/src/vendor/environment/common.ts b/packages/expo-server/src/vendor/environment/common.ts index e347005201fe44..92c2d2c6df59df 100644 --- a/packages/expo-server/src/vendor/environment/common.ts +++ b/packages/expo-server/src/vendor/environment/common.ts @@ -43,7 +43,7 @@ interface EnvironmentInput { export interface CommonEnvironment { getRoutesManifest(): Promise; - getHtml(request: Request, route: Route): Promise; + getHtml(request: Request, route: Route): Promise; getApiRoute(route: Route): Promise; getMiddleware(middleware: MiddlewareInfo): Promise; getLoaderData(request: Request, route: Route): Promise; @@ -89,7 +89,7 @@ export function createEnvironment(input: EnvironmentInput): CommonEnvironment { const location = new URL(url.pathname + url.search, url.origin); const assets = mergeAssets(topLevelAssets, options?.assets); - return ssrModule.getStaticContent(location, { + return ssrModule.getStreamingContent(location, { loader: options?.loader, request, assets, From e6f247b4f2b0d1dffb819d4821bc2b0a8393c80e Mon Sep 17 00:00:00 2001 From: Hassan Khan Date: Fri, 1 May 2026 00:13:14 +0100 Subject: [PATCH 2/2] feat(@expo/router-server,expo-router,expo-server): add support for metadata in streaming SSR (#44731) # Why In streaming SSR, routes require a way to define dynamic, per-page metadata that is resolved on the server and injected into the initial streamed HTML shell. The existing `` component doesn't solve this because its metadata is only available once the component actually renders. `generateMetadata()` sidesteps this by resolving metadata as a separate step _before_ the React render begins, ensuring the metadata is available before we create the stream. # How Route files can now export a `generateMetadata()` function that returns an object conforming to the new `Metadata` type. This function is invoked by `expo-server`, and its result is passed into the new streaming renderer (similar to how loaders work). Client bundles strip the `generateMetadata()` function through a new Babel plugin. # Test Plan - CI - Manual testing with `pnpm --filter @expo/router-e2e run export:server-rendering && pnpm --filter @expo/router-e2e exec expo serve` # Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- .../app/metadata-async/[id].tsx | 15 + .../__e2e__/static-rendering/app/metadata.tsx | 31 + packages/@expo/cli/CHANGELOG.md | 1 + .../server-rendering.test.ts.snap | 48 ++ .../__tests__/export/server-rendering.test.ts | 33 + .../__tests__/export/static-splitting.test.ts | 2 + packages/@expo/router-server/CHANGELOG.md | 1 + .../router-server/build/server/metadata.d.ts | 16 + .../build/server/metadata.d.ts.map | 1 + .../router-server/build/server/metadata.js | 29 + .../build/server/metadata.js.map | 1 + .../build/static/renderStaticContent.d.ts | 5 + .../build/static/renderStaticContent.d.ts.map | 2 +- .../build/static/renderStaticContent.js | 7 +- .../build/static/renderStaticContent.js.map | 2 +- .../build/utils/metadata/render.d.ts | 4 + .../build/utils/metadata/render.d.ts.map | 1 + .../build/utils/metadata/render.js | 245 ++++++ .../build/utils/metadata/render.js.map | 1 + .../build/utils/metadata/resolve.d.ts | 15 + .../build/utils/metadata/resolve.d.ts.map | 1 + .../build/utils/metadata/resolve.js | 465 +++++++++++ .../build/utils/metadata/resolve.js.map | 1 + .../build/utils/metadata/serialize.d.ts | 4 + .../build/utils/metadata/serialize.d.ts.map | 1 + .../build/utils/metadata/serialize.js | 13 + .../build/utils/metadata/serialize.js.map | 1 + .../build/utils/metadata/tag.d.ts | 6 + .../build/utils/metadata/tag.d.ts.map | 1 + .../router-server/build/utils/metadata/tag.js | 57 ++ .../build/utils/metadata/tag.js.map | 1 + .../build/utils/metadata/types.d.ts | 176 ++++ .../build/utils/metadata/types.d.ts.map | 1 + .../build/utils/metadata/types.js | 3 + .../build/utils/metadata/types.js.map | 1 + .../src/server/__tests__/metadata.test.ts | 87 ++ .../router-server/src/server/metadata.ts | 50 ++ .../src/static/renderStaticContent.tsx | 6 + .../src/utils/__tests__/metadata.test.ts | 781 ++++++++++++++++++ .../src/utils/metadata/render.ts | 288 +++++++ .../src/utils/metadata/resolve.ts | 595 +++++++++++++ .../src/utils/metadata/serialize.ts | 12 + .../router-server/src/utils/metadata/tag.ts | 68 ++ .../router-server/src/utils/metadata/types.ts | 175 ++++ packages/babel-preset-expo/CHANGELOG.md | 2 + packages/babel-preset-expo/build/index.js | 2 + packages/babel-preset-expo/build/index.js.map | 2 +- .../build/server-metadata-plugin.d.ts | 8 + .../build/server-metadata-plugin.js | 71 ++ .../build/server-metadata-plugin.js.map | 1 + .../__tests__/server-metadata-plugin.test.ts | 202 +++++ packages/babel-preset-expo/src/index.ts | 2 + .../src/server-metadata-plugin.ts | 95 +++ packages/expo-router/CHANGELOG.md | 1 + packages/expo-router/build/Route.d.ts | 3 +- packages/expo-router/build/Route.d.ts.map | 2 +- packages/expo-router/build/Route.js.map | 2 +- .../expo-router/build/getRoutesCore.d.ts.map | 2 +- packages/expo-router/build/getRoutesCore.js | 4 + .../expo-router/build/getRoutesCore.js.map | 2 +- packages/expo-router/server.d.ts | 8 +- packages/expo-router/src/Route.tsx | 3 +- packages/expo-router/src/getRoutesCore.ts | 5 + packages/expo-server/CHANGELOG.md | 1 + packages/expo-server/build/cjs/manifest.d.ts | 3 + packages/expo-server/build/cjs/metadata.d.ts | 207 +++++ packages/expo-server/build/cjs/metadata.js | 3 + .../expo-server/build/cjs/metadata.js.map | 1 + packages/expo-server/build/cjs/rendering.d.ts | 16 + packages/expo-server/build/cjs/types.d.ts | 2 + .../build/cjs/vendor/environment/common.js | 34 +- .../cjs/vendor/environment/common.js.map | 2 +- packages/expo-server/build/mjs/manifest.d.ts | 3 + packages/expo-server/build/mjs/metadata.d.ts | 207 +++++ packages/expo-server/build/mjs/metadata.js | 2 + .../expo-server/build/mjs/metadata.js.map | 1 + packages/expo-server/build/mjs/rendering.d.ts | 16 + packages/expo-server/build/mjs/types.d.ts | 2 + .../build/mjs/vendor/environment/common.js | 34 +- .../mjs/vendor/environment/common.js.map | 2 +- packages/expo-server/src/manifest.ts | 1 + packages/expo-server/src/metadata.ts | 263 ++++++ packages/expo-server/src/rendering.ts | 19 + packages/expo-server/src/types.ts | 17 + .../environment/__tests__/common.test.ts | 108 ++- .../src/vendor/environment/common.ts | 40 +- 86 files changed, 4621 insertions(+), 34 deletions(-) create mode 100644 apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx create mode 100644 apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx create mode 100644 packages/@expo/router-server/build/server/metadata.d.ts create mode 100644 packages/@expo/router-server/build/server/metadata.d.ts.map create mode 100644 packages/@expo/router-server/build/server/metadata.js create mode 100644 packages/@expo/router-server/build/server/metadata.js.map create mode 100644 packages/@expo/router-server/build/utils/metadata/render.d.ts create mode 100644 packages/@expo/router-server/build/utils/metadata/render.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/metadata/render.js create mode 100644 packages/@expo/router-server/build/utils/metadata/render.js.map create mode 100644 packages/@expo/router-server/build/utils/metadata/resolve.d.ts create mode 100644 packages/@expo/router-server/build/utils/metadata/resolve.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/metadata/resolve.js create mode 100644 packages/@expo/router-server/build/utils/metadata/resolve.js.map create mode 100644 packages/@expo/router-server/build/utils/metadata/serialize.d.ts create mode 100644 packages/@expo/router-server/build/utils/metadata/serialize.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/metadata/serialize.js create mode 100644 packages/@expo/router-server/build/utils/metadata/serialize.js.map create mode 100644 packages/@expo/router-server/build/utils/metadata/tag.d.ts create mode 100644 packages/@expo/router-server/build/utils/metadata/tag.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/metadata/tag.js create mode 100644 packages/@expo/router-server/build/utils/metadata/tag.js.map create mode 100644 packages/@expo/router-server/build/utils/metadata/types.d.ts create mode 100644 packages/@expo/router-server/build/utils/metadata/types.d.ts.map create mode 100644 packages/@expo/router-server/build/utils/metadata/types.js create mode 100644 packages/@expo/router-server/build/utils/metadata/types.js.map create mode 100644 packages/@expo/router-server/src/server/__tests__/metadata.test.ts create mode 100644 packages/@expo/router-server/src/server/metadata.ts create mode 100644 packages/@expo/router-server/src/utils/__tests__/metadata.test.ts create mode 100644 packages/@expo/router-server/src/utils/metadata/render.ts create mode 100644 packages/@expo/router-server/src/utils/metadata/resolve.ts create mode 100644 packages/@expo/router-server/src/utils/metadata/serialize.ts create mode 100644 packages/@expo/router-server/src/utils/metadata/tag.ts create mode 100644 packages/@expo/router-server/src/utils/metadata/types.ts create mode 100644 packages/babel-preset-expo/build/server-metadata-plugin.d.ts create mode 100644 packages/babel-preset-expo/build/server-metadata-plugin.js create mode 100644 packages/babel-preset-expo/build/server-metadata-plugin.js.map create mode 100644 packages/babel-preset-expo/src/__tests__/server-metadata-plugin.test.ts create mode 100644 packages/babel-preset-expo/src/server-metadata-plugin.ts create mode 100644 packages/expo-server/build/cjs/metadata.d.ts create mode 100644 packages/expo-server/build/cjs/metadata.js create mode 100644 packages/expo-server/build/cjs/metadata.js.map create mode 100644 packages/expo-server/build/mjs/metadata.d.ts create mode 100644 packages/expo-server/build/mjs/metadata.js create mode 100644 packages/expo-server/build/mjs/metadata.js.map create mode 100644 packages/expo-server/src/metadata.ts diff --git a/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx b/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx new file mode 100644 index 00000000000000..235f28667df49a --- /dev/null +++ b/apps/router-e2e/__e2e__/static-rendering/app/metadata-async/[id].tsx @@ -0,0 +1,15 @@ +import type { GenerateMetadataFunction, Metadata } from 'expo-router/server'; +import { Text } from 'react-native'; + +export const generateMetadata: GenerateMetadataFunction = async (request, params) => { + const pathname = new URL(request.url).pathname; + + return { + title: `Async Metadata ${params.id}`, + description: `Async metadata for ${pathname}`, + } satisfies Metadata; +}; + +export default function AsyncMetadataPage() { + return Async Metadata; +} diff --git a/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx b/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx new file mode 100644 index 00000000000000..22030074c705cd --- /dev/null +++ b/apps/router-e2e/__e2e__/static-rendering/app/metadata.tsx @@ -0,0 +1,31 @@ +import Head from 'expo-router/head'; +import { Text } from 'react-native'; +import type { GenerateMetadataFunction, Metadata } from 'expo-router/server'; + +export const generateMetadata: GenerateMetadataFunction = async () => { + return { + title: 'Metadata Page', + description: 'Page with generateMetadata', + keywords: ['metadata', 'e2e'], + openGraph: { + title: 'Metadata OG Title', + description: 'Metadata OG Description', + }, + twitter: { + card: 'summary', + title: 'Metadata Twitter Title', + }, + } satisfies Metadata; +}; + +export default function MetadataPage() { + return ( + <> + {/* The component is here to check that the app doesn't crash when using it with `generateMetadata()` */} + + + + Metadata + + ); +} diff --git a/packages/@expo/cli/CHANGELOG.md b/packages/@expo/cli/CHANGELOG.md index 7df47eb220abeb..0c50068cd59ce6 100644 --- a/packages/@expo/cli/CHANGELOG.md +++ b/packages/@expo/cli/CHANGELOG.md @@ -16,6 +16,7 @@ - Prompt before clearing native folders when we detect project as a native module ([#44458](https://github.com/expo/expo/pull/44458) by [@kitten](https://github.com/kitten)) - Rewrite @react-navigation/core to expo-router for library compatibility ([#45039](https://github.com/expo/expo/pull/45039) by [@Ubax](https://github.com/Ubax)) - Use stream rendering in SSR ([#43963](https://github.com/expo/expo/pull/43963) by [@hassankhan](https://github.com/hassankhan)) +- Add support for metadata in streaming SSR ([#44731](https://github.com/expo/expo/pull/44731) by [@hassankhan](https://github.com/hassankhan)) ### 🐛 Bug fixes diff --git a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap index c40ada10b4c8fc..441214f607ac52 100644 --- a/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap +++ b/packages/@expo/cli/e2e/__tests__/export/__snapshots__/server-rendering.test.ts.snap @@ -1,5 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`exports server expo serve requests injects \`generateMetadata()\` result into the initial server HTML 1`] = ` +[ + "", + "", + "", + "", + "", + "", + "", + "Metadata Page", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", +] +`; + exports[`exports server expo serve requests supports usePathname in +html files 1`] = ` "