From b39f8c3258642450072b3a6f3a1f9206386df620 Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Sun, 28 Sep 2025 16:27:54 +0200 Subject: [PATCH 1/6] Ship partial-prerendering APIs to Canary --- .../src/__tests__/ReactDOMFizzStatic-test.js | 10 ++++++ .../__tests__/ReactDOMFizzStaticFloat-test.js | 4 +-- .../__tests__/ReactDOMFizzStaticNode-test.js | 32 +++++++++---------- .../src/__tests__/ReactHooks-test.internal.js | 16 ++++------ packages/shared/ReactFeatureFlags.js | 2 +- .../forks/ReactFeatureFlags.native-oss.js | 2 +- .../forks/ReactFeatureFlags.test-renderer.js | 2 +- ...actFeatureFlags.test-renderer.native-fb.js | 2 +- 8 files changed, 37 insertions(+), 33 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzStatic-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzStatic-test.js index de6e21b557a1d..650120234202a 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzStatic-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzStatic-test.js @@ -416,7 +416,11 @@ describe('ReactDOMFizzStatic', () => { return
aborted
; } + const errors = []; const pendingResult = ReactDOMFizzStatic.prerenderToNodeStream(, { + onError: error => { + errors.push(error); + }, signal: controller.signal, }); pendingResult.catch(() => {}); @@ -430,6 +434,7 @@ describe('ReactDOMFizzStatic', () => { result.prelude.pipe(writable); }); expect(getVisibleChildren(container)).toEqual(undefined); + expect(errors).toEqual([]); }); // @gate enablePostpone @@ -447,13 +452,18 @@ describe('ReactDOMFizzStatic', () => { return
aborted
; } + const errors = []; const result = await ReactDOMFizzStatic.prerenderToNodeStream(, { + onError: error => { + errors.push(error); + }, signal: controller.signal, }); await act(async () => { result.prelude.pipe(writable); }); expect(getVisibleChildren(container)).toEqual(undefined); + expect(errors).toEqual([]); }); // @gate enableHalt diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzStaticFloat-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzStaticFloat-test.js index 8bb1c7c861075..e806235b7fd04 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzStaticFloat-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzStaticFloat-test.js @@ -40,9 +40,7 @@ describe('ReactDOMFizzStaticFloat', () => { React = require('react'); ReactDOM = require('react-dom'); ReactDOMFizzServer = require('react-dom/server.browser'); - if (__EXPERIMENTAL__) { - ReactDOMFizzStatic = require('react-dom/static.browser'); - } + ReactDOMFizzStatic = require('react-dom/static.browser'); Suspense = React.Suspense; container = document.createElement('div'); document.body.appendChild(container); diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzStaticNode-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzStaticNode-test.js index e4b21fcf8d5a6..d3c7ba9d2b7e7 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzStaticNode-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzStaticNode-test.js @@ -18,9 +18,7 @@ describe('ReactDOMFizzStaticNode', () => { beforeEach(() => { jest.resetModules(); React = require('react'); - if (__EXPERIMENTAL__) { - ReactDOMFizzStatic = require('react-dom/static'); - } + ReactDOMFizzStatic = require('react-dom/static'); Suspense = React.Suspense; }); @@ -58,7 +56,7 @@ describe('ReactDOMFizzStaticNode', () => { } } - // @gate experimental + // @gate enableHalt || enablePostpone it('should call prerenderToNodeStream', async () => { const result = await ReactDOMFizzStatic.prerenderToNodeStream(
hello world
, @@ -67,14 +65,14 @@ describe('ReactDOMFizzStaticNode', () => { expect(prelude).toMatchInlineSnapshot(`"
hello world
"`); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should suppport web streams', async () => { const result = await ReactDOMFizzStatic.prerender(
hello world
); const prelude = await readContentWeb(result.prelude); expect(prelude).toMatchInlineSnapshot(`"
hello world
"`); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should emit DOCTYPE at the root of the document', async () => { const result = await ReactDOMFizzStatic.prerenderToNodeStream( @@ -93,7 +91,7 @@ describe('ReactDOMFizzStaticNode', () => { } }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should emit bootstrap script src at the end', async () => { const result = await ReactDOMFizzStatic.prerenderToNodeStream(
hello world
, @@ -109,7 +107,7 @@ describe('ReactDOMFizzStaticNode', () => { ); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('emits all HTML as one unit', async () => { let hasLoaded = false; let resolve; @@ -139,7 +137,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(prelude).toMatchInlineSnapshot(`"
Done
"`); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should reject the promise when an error is thrown at the root', async () => { const reportedErrors = []; let caughtError = null; @@ -161,7 +159,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(reportedErrors).toEqual([theError]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should reject the promise when an error is thrown inside a fallback', async () => { const reportedErrors = []; let caughtError = null; @@ -185,7 +183,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(reportedErrors).toEqual([theError]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should not error the stream when an error is thrown inside suspense boundary', async () => { const reportedErrors = []; const result = await ReactDOMFizzStatic.prerenderToNodeStream( @@ -206,7 +204,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(reportedErrors).toEqual([theError]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should be able to complete by aborting even if the promise never resolves', async () => { const errors = []; const controller = new AbortController(); @@ -236,7 +234,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(errors).toEqual(['This operation was aborted']); }); - // @gate experimental + // @gate enableHalt || enablePostpone // @gate !enableHalt it('should reject if aborting before the shell is complete and enableHalt is disabled', async () => { const errors = []; @@ -302,7 +300,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(content).toBe(''); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('should be able to abort before something suspends', async () => { const errors = []; const controller = new AbortController(); @@ -343,7 +341,7 @@ describe('ReactDOMFizzStaticNode', () => { } }); - // @gate experimental + // @gate enableHalt || enablePostpone // @gate !enableHalt it('should reject if passing an already aborted signal and enableHalt is disabled', async () => { const errors = []; @@ -414,7 +412,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(content).toBe(''); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('supports custom abort reasons with a string', async () => { const promise = new Promise(r => {}); function Wait() { @@ -456,7 +454,7 @@ describe('ReactDOMFizzStaticNode', () => { expect(errors).toEqual(['foobar', 'foobar']); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('supports custom abort reasons with an Error', async () => { const promise = new Promise(r => {}); function Wait() { diff --git a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js index 0bd0a25534202..82eb4620642f2 100644 --- a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js @@ -1589,17 +1589,15 @@ describe('ReactHooks', () => { useStateHelper, ]; - if (__EXPERIMENTAL__) { - const useTransitionHelper = () => React.useTransition(); - const useDeferredValueHelper = () => - React.useDeferredValue(0, {timeoutMs: 1000}); + const useTransitionHelper = () => React.useTransition(); + const useDeferredValueHelper = () => + React.useDeferredValue(0, {timeoutMs: 1000}); - orderedHooks.push(useTransitionHelper); - orderedHooks.push(useDeferredValueHelper); + orderedHooks.push(useTransitionHelper); + orderedHooks.push(useDeferredValueHelper); - hooksInList.push(useTransitionHelper); - hooksInList.push(useDeferredValueHelper); - } + hooksInList.push(useTransitionHelper); + hooksInList.push(useDeferredValueHelper); const formatHookNamesToMatchErrorMessage = (hookNameA, hookNameB) => { return `use${hookNameA}${' '.repeat(24 - hookNameA.length)}${ diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index f29ee68d7411b..cc9889b4cb1bc 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -82,7 +82,7 @@ export const enableTaint = __EXPERIMENTAL__; export const enablePostpone = __EXPERIMENTAL__; -export const enableHalt = __EXPERIMENTAL__; +export const enableHalt: boolean = true; export const enableViewTransition = __EXPERIMENTAL__; diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index fbef31b026e6f..06a4ce23994c7 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -30,7 +30,7 @@ export const enableCPUSuspense: boolean = false; export const enableCreateEventHandleAPI: boolean = false; export const enableMoveBefore: boolean = true; export const enableFizzExternalRuntime: boolean = true; -export const enableHalt: boolean = false; +export const enableHalt: boolean = true; export const enableHiddenSubtreeInsertionEffectCleanup: boolean = false; export const enableInfiniteRenderLoopDetection: boolean = false; export const enableLegacyCache: boolean = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index eb02b6a1807a1..f550f1b153838 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -21,7 +21,7 @@ export const enableLegacyCache: boolean = __EXPERIMENTAL__; export const enableAsyncIterableChildren: boolean = false; export const enableTaint: boolean = true; export const enablePostpone: boolean = false; -export const enableHalt: boolean = false; +export const enableHalt: boolean = true; export const disableCommentsAsDOMContainers: boolean = true; export const disableInputAttributeSyncing: boolean = false; export const enableScopeAPI: boolean = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js index 768ab592d2c50..51162c3955840 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js @@ -25,7 +25,7 @@ export const enableCPUSuspense = true; export const enableCreateEventHandleAPI = false; export const enableMoveBefore = false; export const enableFizzExternalRuntime = true; -export const enableHalt = false; +export const enableHalt = true; export const enableInfiniteRenderLoopDetection = false; export const enableHiddenSubtreeInsertionEffectCleanup = true; export const enableLegacyCache = false; From 8829ad367e90064dd146388ea270d3189e0f431d Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Sun, 28 Sep 2025 16:31:26 +0200 Subject: [PATCH 2/6] Enable for FB builds --- .../src/server/react-dom-server.browser.stable.js | 8 ++++++-- .../react-dom/src/server/react-dom-server.edge.stable.js | 8 ++++++-- .../react-dom/src/server/react-dom-server.node.stable.js | 9 ++++++++- packages/shared/forks/ReactFeatureFlags.native-fb.js | 2 +- .../shared/forks/ReactFeatureFlags.test-renderer.www.js | 2 +- packages/shared/forks/ReactFeatureFlags.www.js | 2 +- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/react-dom/src/server/react-dom-server.browser.stable.js b/packages/react-dom/src/server/react-dom-server.browser.stable.js index 2c8f8b5dd59a3..679e6803f6aa8 100644 --- a/packages/react-dom/src/server/react-dom-server.browser.stable.js +++ b/packages/react-dom/src/server/react-dom-server.browser.stable.js @@ -7,5 +7,9 @@ * @flow */ -export {renderToReadableStream, version} from './ReactDOMFizzServerBrowser.js'; -export {prerender} from './ReactDOMFizzStaticBrowser.js'; +export { + renderToReadableStream, + resume, + version, +} from './ReactDOMFizzServerBrowser.js'; +export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticBrowser.js'; diff --git a/packages/react-dom/src/server/react-dom-server.edge.stable.js b/packages/react-dom/src/server/react-dom-server.edge.stable.js index 5f47ecafd371a..588b6d8cb59af 100644 --- a/packages/react-dom/src/server/react-dom-server.edge.stable.js +++ b/packages/react-dom/src/server/react-dom-server.edge.stable.js @@ -7,5 +7,9 @@ * @flow */ -export {renderToReadableStream, version} from './ReactDOMFizzServerEdge.js'; -export {prerender} from './ReactDOMFizzStaticEdge.js'; +export { + renderToReadableStream, + resume, + version, +} from './ReactDOMFizzServerEdge.js'; +export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticEdge.js'; diff --git a/packages/react-dom/src/server/react-dom-server.node.stable.js b/packages/react-dom/src/server/react-dom-server.node.stable.js index a650dc161013c..e26eee2284565 100644 --- a/packages/react-dom/src/server/react-dom-server.node.stable.js +++ b/packages/react-dom/src/server/react-dom-server.node.stable.js @@ -10,6 +10,13 @@ export { renderToPipeableStream, renderToReadableStream, + resume, + resumeToPipeableStream, version, } from './ReactDOMFizzServerNode.js'; -export {prerenderToNodeStream, prerender} from './ReactDOMFizzStaticNode.js'; +export { + prerenderToNodeStream, + prerender, + resumeAndPrerender, + resumeAndPrerenderToNodeStream, +} from './ReactDOMFizzStaticNode.js'; diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index 409b10d0b2db7..2968a5d924bde 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -45,7 +45,7 @@ export const enableCPUSuspense: boolean = true; export const enableCreateEventHandleAPI: boolean = false; export const enableMoveBefore: boolean = true; export const enableFizzExternalRuntime: boolean = true; -export const enableHalt: boolean = false; +export const enableHalt: boolean = true; export const enableInfiniteRenderLoopDetection: boolean = false; export const enableLegacyCache: boolean = false; export const enableLegacyFBSupport: boolean = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index c0c788db52652..0f24ae8025f92 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -21,7 +21,7 @@ export const enableLegacyCache: boolean = true; export const enableAsyncIterableChildren: boolean = false; export const enableTaint: boolean = true; export const enablePostpone: boolean = false; -export const enableHalt: boolean = false; +export const enableHalt: boolean = true; export const disableCommentsAsDOMContainers: boolean = true; export const disableInputAttributeSyncing: boolean = false; export const enableScopeAPI: boolean = true; diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 408fc0b62f667..e07f15a6318aa 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -73,7 +73,7 @@ export const enableTaint: boolean = false; export const enablePostpone: boolean = false; -export const enableHalt: boolean = false; +export const enableHalt: boolean = true; // TODO: www currently relies on this feature. It's disabled in open source. // Need to remove it. From c7abf2c86b9510ffefabfe7f9851540704db1d0c Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Sun, 28 Sep 2025 17:06:13 +0200 Subject: [PATCH 3/6] Remove conditional exports All OSS builds have these entrypoints now --- packages/react-dom/npm/server.browser.js | 4 +--- packages/react-dom/npm/server.bun.js | 4 +--- packages/react-dom/npm/server.edge.js | 4 +--- packages/react-dom/npm/server.node.js | 8 ++------ 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/packages/react-dom/npm/server.browser.js b/packages/react-dom/npm/server.browser.js index 04446965dc662..4d8066527139f 100644 --- a/packages/react-dom/npm/server.browser.js +++ b/packages/react-dom/npm/server.browser.js @@ -13,6 +13,4 @@ exports.version = l.version; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; exports.renderToReadableStream = s.renderToReadableStream; -if (s.resume) { - exports.resume = s.resume; -} +exports.resume = s.resume; diff --git a/packages/react-dom/npm/server.bun.js b/packages/react-dom/npm/server.bun.js index f0b6bf3a82981..bb44b38ec3c77 100644 --- a/packages/react-dom/npm/server.bun.js +++ b/packages/react-dom/npm/server.bun.js @@ -12,8 +12,6 @@ if (process.env.NODE_ENV === 'production') { exports.version = b.version; exports.renderToReadableStream = b.renderToReadableStream; -if (b.resume) { - exports.resume = b.resume; -} +exports.resume = b.resume; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; diff --git a/packages/react-dom/npm/server.edge.js b/packages/react-dom/npm/server.edge.js index d64b9da7360a6..cc05ed6120f4f 100644 --- a/packages/react-dom/npm/server.edge.js +++ b/packages/react-dom/npm/server.edge.js @@ -14,6 +14,4 @@ exports.version = b.version; exports.renderToReadableStream = b.renderToReadableStream; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; -if (b.resume) { - exports.resume = b.resume; -} +exports.resume = b.resume; diff --git a/packages/react-dom/npm/server.node.js b/packages/react-dom/npm/server.node.js index 34276711b1025..3feeac208fe17 100644 --- a/packages/react-dom/npm/server.node.js +++ b/packages/react-dom/npm/server.node.js @@ -14,9 +14,5 @@ exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; exports.renderToPipeableStream = s.renderToPipeableStream; exports.renderToReadableStream = s.renderToReadableStream; -if (s.resumeToPipeableStream) { - exports.resumeToPipeableStream = s.resumeToPipeableStream; -} -if (s.resume) { - exports.resume = s.resume; -} +exports.resumeToPipeableStream = s.resumeToPipeableStream; +exports.resume = s.resume; From bdac823544cc00d6b33381258a91c25a45a3b469 Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Sun, 28 Sep 2025 17:26:40 +0200 Subject: [PATCH 4/6] [Flight] Promote `unstable_prerender` to `prerender` in Canary --- fixtures/flight/server/region.js | 2 +- .../react-server-dom-esm/npm/static.node.js | 4 +- .../server/react-flight-dom-server.node.js | 2 +- packages/react-server-dom-esm/static.node.js | 2 +- .../npm/static.browser.js | 4 +- .../npm/static.edge.js | 4 +- .../npm/static.node.js | 8 +- .../server/react-flight-dom-server.browser.js | 2 +- .../server/react-flight-dom-server.edge.js | 2 +- .../server/react-flight-dom-server.node.js | 4 +- .../react-server-dom-parcel/static.browser.js | 2 +- .../react-server-dom-parcel/static.edge.js | 2 +- .../react-server-dom-parcel/static.node.js | 4 +- .../npm/static.browser.js | 4 +- .../npm/static.edge.js | 4 +- .../npm/static.node.js | 8 +- .../server/react-flight-dom-server.browser.js | 2 +- .../server/react-flight-dom-server.edge.js | 2 +- .../server/react-flight-dom-server.node.js | 4 +- .../static.browser.js | 2 +- .../react-server-dom-turbopack/static.edge.js | 2 +- .../react-server-dom-turbopack/static.node.js | 4 +- .../npm/static.browser.js | 4 +- .../npm/static.edge.js | 4 +- .../npm/static.node.js | 8 +- .../npm/static.node.unbundled.js | 4 +- .../src/__tests__/ReactFlightDOM-test.js | 86 +++++++++--------- .../__tests__/ReactFlightDOMBrowser-test.js | 24 +++-- .../src/__tests__/ReactFlightDOMEdge-test.js | 50 +++++------ .../src/__tests__/ReactFlightDOMNode-test.js | 87 +++++++++++-------- .../server/react-flight-dom-server.browser.js | 2 +- .../server/react-flight-dom-server.edge.js | 2 +- .../server/react-flight-dom-server.node.js | 4 +- .../react-flight-dom-server.node.unbundled.js | 4 +- .../static.browser.js | 2 +- .../react-server-dom-webpack/static.edge.js | 2 +- .../react-server-dom-webpack/static.node.js | 4 +- .../static.node.unbundled.js | 4 +- 38 files changed, 168 insertions(+), 197 deletions(-) diff --git a/fixtures/flight/server/region.js b/fixtures/flight/server/region.js index 7339e3a48abbb..ccf7907aacc1f 100644 --- a/fixtures/flight/server/region.js +++ b/fixtures/flight/server/region.js @@ -133,7 +133,7 @@ async function renderApp(res, returnValue, formState, noCache, debugChannel) { } async function prerenderApp(res, returnValue, formState, noCache) { - const {unstable_prerenderToNodeStream: prerenderToNodeStream} = await import( + const {prerenderToNodeStream} = await import( 'react-server-dom-webpack/static' ); // const m = require('../src/App.js'); diff --git a/packages/react-server-dom-esm/npm/static.node.js b/packages/react-server-dom-esm/npm/static.node.js index 7fb451a3cd807..eea9fb7e18ebf 100644 --- a/packages/react-server-dom-esm/npm/static.node.js +++ b/packages/react-server-dom-esm/npm/static.node.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-esm-server.node.development.js'); } -if (s.unstable_prerenderToNodeStream) { - exports.unstable_prerenderToNodeStream = s.unstable_prerenderToNodeStream; -} +exports.prerenderToNodeStream = s.prerenderToNodeStream; diff --git a/packages/react-server-dom-esm/src/server/react-flight-dom-server.node.js b/packages/react-server-dom-esm/src/server/react-flight-dom-server.node.js index 7d5b19a521ea7..f24946fcae8bb 100644 --- a/packages/react-server-dom-esm/src/server/react-flight-dom-server.node.js +++ b/packages/react-server-dom-esm/src/server/react-flight-dom-server.node.js @@ -9,7 +9,7 @@ export { renderToPipeableStream, - prerenderToNodeStream as unstable_prerenderToNodeStream, + prerenderToNodeStream, decodeReplyFromBusboy, decodeReply, decodeAction, diff --git a/packages/react-server-dom-esm/static.node.js b/packages/react-server-dom-esm/static.node.js index 345f4123c9f09..d15eddc6f9b0e 100644 --- a/packages/react-server-dom-esm/static.node.js +++ b/packages/react-server-dom-esm/static.node.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerenderToNodeStream} from './src/server/react-flight-dom-server.node'; +export {prerenderToNodeStream} from './src/server/react-flight-dom-server.node'; diff --git a/packages/react-server-dom-parcel/npm/static.browser.js b/packages/react-server-dom-parcel/npm/static.browser.js index 1c5c8f19274f9..0f5f9ac5570a2 100644 --- a/packages/react-server-dom-parcel/npm/static.browser.js +++ b/packages/react-server-dom-parcel/npm/static.browser.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-parcel-server.browser.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-parcel/npm/static.edge.js b/packages/react-server-dom-parcel/npm/static.edge.js index 4deafdca05e9f..540332ad8d798 100644 --- a/packages/react-server-dom-parcel/npm/static.edge.js +++ b/packages/react-server-dom-parcel/npm/static.edge.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-parcel-server.edge.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-parcel/npm/static.node.js b/packages/react-server-dom-parcel/npm/static.node.js index 411c2958ef966..ca66f6e3f0e75 100644 --- a/packages/react-server-dom-parcel/npm/static.node.js +++ b/packages/react-server-dom-parcel/npm/static.node.js @@ -7,9 +7,5 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-parcel-server.node.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} -if (s.unstable_prerenderToNodeStream) { - exports.unstable_prerenderToNodeStream = s.unstable_prerenderToNodeStream; -} +exports.prerender = s.prerender; +exports.prerenderToNodeStream = s.prerenderToNodeStream; diff --git a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.browser.js b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.browser.js index c0a8015873eff..9b2a047c324f5 100644 --- a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.browser.js +++ b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.browser.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeAction, decodeFormState, diff --git a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.edge.js b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.edge.js index 54f3dbb2ec346..7f99c56f7cc76 100644 --- a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.edge.js +++ b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.edge.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeReplyFromAsyncIterable, decodeAction, diff --git a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.node.js b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.node.js index 37c0497178422..f18bec13536bd 100644 --- a/packages/react-server-dom-parcel/src/server/react-flight-dom-server.node.js +++ b/packages/react-server-dom-parcel/src/server/react-flight-dom-server.node.js @@ -10,8 +10,8 @@ export { renderToReadableStream, renderToPipeableStream, - prerender as unstable_prerender, - prerenderToNodeStream as unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, decodeReply, decodeReplyFromBusboy, decodeReplyFromAsyncIterable, diff --git a/packages/react-server-dom-parcel/static.browser.js b/packages/react-server-dom-parcel/static.browser.js index 3281fed6ea29c..2589789163206 100644 --- a/packages/react-server-dom-parcel/static.browser.js +++ b/packages/react-server-dom-parcel/static.browser.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.browser'; +export {prerender} from './src/server/react-flight-dom-server.browser'; diff --git a/packages/react-server-dom-parcel/static.edge.js b/packages/react-server-dom-parcel/static.edge.js index b1a96317ae9b3..a39d54c73f579 100644 --- a/packages/react-server-dom-parcel/static.edge.js +++ b/packages/react-server-dom-parcel/static.edge.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.edge'; +export {prerender} from './src/server/react-flight-dom-server.edge'; diff --git a/packages/react-server-dom-parcel/static.node.js b/packages/react-server-dom-parcel/static.node.js index 1b2c11edc10f1..78e70a1cf4c28 100644 --- a/packages/react-server-dom-parcel/static.node.js +++ b/packages/react-server-dom-parcel/static.node.js @@ -8,6 +8,6 @@ */ export { - unstable_prerender, - unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, } from './src/server/react-flight-dom-server.node'; diff --git a/packages/react-server-dom-turbopack/npm/static.browser.js b/packages/react-server-dom-turbopack/npm/static.browser.js index d04d771c2d3b6..d6acca4d6ec5d 100644 --- a/packages/react-server-dom-turbopack/npm/static.browser.js +++ b/packages/react-server-dom-turbopack/npm/static.browser.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-turbopack-server.browser.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-turbopack/npm/static.edge.js b/packages/react-server-dom-turbopack/npm/static.edge.js index 6d9ca4b3e8b84..acd8ad68d74e7 100644 --- a/packages/react-server-dom-turbopack/npm/static.edge.js +++ b/packages/react-server-dom-turbopack/npm/static.edge.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-turbopack-server.edge.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-turbopack/npm/static.node.js b/packages/react-server-dom-turbopack/npm/static.node.js index 34c9d63a4a26b..f082e275e0120 100644 --- a/packages/react-server-dom-turbopack/npm/static.node.js +++ b/packages/react-server-dom-turbopack/npm/static.node.js @@ -7,9 +7,5 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-turbopack-server.node.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} -if (s.unstable_prerenderToNodeStream) { - exports.unstable_prerenderToNodeStream = s.unstable_prerenderToNodeStream; -} +exports.prerender = s.prerender; +exports.prerenderToNodeStream = s.prerenderToNodeStream; diff --git a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.browser.js b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.browser.js index c0860225d7b57..d8373ec551bc0 100644 --- a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.browser.js +++ b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.browser.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeAction, decodeFormState, diff --git a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.edge.js b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.edge.js index 9198f9913ed37..e103ff761913f 100644 --- a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.edge.js +++ b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.edge.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeReplyFromAsyncIterable, decodeAction, diff --git a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.node.js b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.node.js index 1e3571a6f2ba4..3c2b9e512c7ca 100644 --- a/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.node.js +++ b/packages/react-server-dom-turbopack/src/server/react-flight-dom-server.node.js @@ -10,8 +10,8 @@ export { renderToReadableStream, renderToPipeableStream, - prerender as unstable_prerender, - prerenderToNodeStream as unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, decodeReply, decodeReplyFromBusboy, decodeReplyFromAsyncIterable, diff --git a/packages/react-server-dom-turbopack/static.browser.js b/packages/react-server-dom-turbopack/static.browser.js index 3281fed6ea29c..2589789163206 100644 --- a/packages/react-server-dom-turbopack/static.browser.js +++ b/packages/react-server-dom-turbopack/static.browser.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.browser'; +export {prerender} from './src/server/react-flight-dom-server.browser'; diff --git a/packages/react-server-dom-turbopack/static.edge.js b/packages/react-server-dom-turbopack/static.edge.js index b1a96317ae9b3..a39d54c73f579 100644 --- a/packages/react-server-dom-turbopack/static.edge.js +++ b/packages/react-server-dom-turbopack/static.edge.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.edge'; +export {prerender} from './src/server/react-flight-dom-server.edge'; diff --git a/packages/react-server-dom-turbopack/static.node.js b/packages/react-server-dom-turbopack/static.node.js index 1b2c11edc10f1..78e70a1cf4c28 100644 --- a/packages/react-server-dom-turbopack/static.node.js +++ b/packages/react-server-dom-turbopack/static.node.js @@ -8,6 +8,6 @@ */ export { - unstable_prerender, - unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, } from './src/server/react-flight-dom-server.node'; diff --git a/packages/react-server-dom-webpack/npm/static.browser.js b/packages/react-server-dom-webpack/npm/static.browser.js index 8c8951a62b9ea..06218aec3d437 100644 --- a/packages/react-server-dom-webpack/npm/static.browser.js +++ b/packages/react-server-dom-webpack/npm/static.browser.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-webpack-server.browser.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-webpack/npm/static.edge.js b/packages/react-server-dom-webpack/npm/static.edge.js index 975a4b5b87281..df9085690aaf6 100644 --- a/packages/react-server-dom-webpack/npm/static.edge.js +++ b/packages/react-server-dom-webpack/npm/static.edge.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-webpack-server.edge.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} +exports.prerender = s.prerender; diff --git a/packages/react-server-dom-webpack/npm/static.node.js b/packages/react-server-dom-webpack/npm/static.node.js index b0e4477fab466..2f649d1fc514e 100644 --- a/packages/react-server-dom-webpack/npm/static.node.js +++ b/packages/react-server-dom-webpack/npm/static.node.js @@ -7,9 +7,5 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-webpack-server.node.development.js'); } -if (s.unstable_prerender) { - exports.unstable_prerender = s.unstable_prerender; -} -if (s.unstable_prerenderToNodeStream) { - exports.unstable_prerenderToNodeStream = s.unstable_prerenderToNodeStream; -} +exports.prerender = s.prerender; +exports.prerenderToNodeStream = s.prerenderToNodeStream; diff --git a/packages/react-server-dom-webpack/npm/static.node.unbundled.js b/packages/react-server-dom-webpack/npm/static.node.unbundled.js index 5df3d5bf7afbc..850886dcd9e78 100644 --- a/packages/react-server-dom-webpack/npm/static.node.unbundled.js +++ b/packages/react-server-dom-webpack/npm/static.node.unbundled.js @@ -7,6 +7,4 @@ if (process.env.NODE_ENV === 'production') { s = require('./cjs/react-server-dom-webpack-server.node.unbundled.development.js'); } -if (s.unstable_prerenderToNodeStream) { - exports.unstable_prerenderToNodeStream = s.unstable_prerenderToNodeStream; -} +exports.prerenderToNodeStream = s.prerenderToNodeStream; diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js index 60154d6118138..9fe9c7aaf32fd 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js @@ -63,11 +63,9 @@ describe('ReactFlightDOM', () => { jest.mock('react-server-dom-webpack/server', () => require('react-server-dom-webpack/server.node.unbundled'), ); - if (__EXPERIMENTAL__) { - jest.mock('react-server-dom-webpack/static', () => - require('react-server-dom-webpack/static.node.unbundled'), - ); - } + jest.mock('react-server-dom-webpack/static', () => + require('react-server-dom-webpack/static.node.unbundled'), + ); const WebpackMock = require('./utils/WebpackMock'); clientExports = WebpackMock.clientExports; clientExportsESM = WebpackMock.clientExportsESM; @@ -75,9 +73,7 @@ describe('ReactFlightDOM', () => { webpackMap = WebpackMock.webpackMap; ReactServerDOMServer = require('react-server-dom-webpack/server'); - if (__EXPERIMENTAL__) { - ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); - } + ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); // This reset is to load modules for the SSR/Browser scope. jest.unmock('react-server-dom-webpack/server'); @@ -2874,7 +2870,7 @@ describe('ReactFlightDOM', () => { ); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender', async () => { let resolveGreeting; const greetingPromise = new Promise(resolve => { @@ -2897,11 +2893,10 @@ describe('ReactFlightDOM', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - , - webpackMap, - ), + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + , + webpackMap, + ), }; }); @@ -2964,17 +2959,16 @@ describe('ReactFlightDOM', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - , - webpackMap, - { - signal: controller.signal, - onError(err) { - errors.push(err); - }, + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + , + webpackMap, + { + signal: controller.signal, + onError(err) { + errors.push(err); }, - ), + }, + ), }; }); @@ -3022,7 +3016,7 @@ describe('ReactFlightDOM', () => { }); // This could be a bug. Discovered while making enableAsyncDebugInfo dynamic for www. - // @gate experimental && (enableHalt || (enableAsyncDebugInfo && __DEV__)) + // @gate enableHalt || enablePostpone || (enableAsyncDebugInfo && __DEV__) it('will leave async iterables in an incomplete state when halting', async () => { let resolve; const wait = new Promise(r => (resolve = r)); @@ -3040,19 +3034,18 @@ describe('ReactFlightDOM', () => { const controller = new AbortController(); const {pendingResult} = await serverAct(() => { return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - { - multiShotIterable, - }, - {}, - { - onError(x) { - errors.push(x); - }, - signal: controller.signal, + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + { + multiShotIterable, + }, + {}, + { + onError(x) { + errors.push(x); }, - ), + signal: controller.signal, + }, + ), }; }); @@ -3124,17 +3117,16 @@ describe('ReactFlightDOM', () => { const errors = []; const {pendingResult} = await serverAct(() => { return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - , - {}, - { - onError(x) { - errors.push(x); - }, - signal: controller.signal, + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + , + {}, + { + onError(x) { + errors.push(x); }, - ), + signal: controller.signal, + }, + ), }; }); diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js index 49cc28535e92d..9c7b5b62b195e 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js @@ -69,12 +69,10 @@ describe('ReactFlightDOMBrowser', () => { webpackMap = WebpackMock.webpackMap; webpackServerMap = WebpackMock.webpackServerMap; ReactServerDOMServer = require('react-server-dom-webpack/server'); - if (__EXPERIMENTAL__) { - jest.mock('react-server-dom-webpack/static', () => - require('react-server-dom-webpack/static.browser'), - ); - ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); - } + jest.mock('react-server-dom-webpack/static', () => + require('react-server-dom-webpack/static.browser'), + ); + ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); __unmockReact(); jest.resetModules(); @@ -2497,7 +2495,7 @@ describe('ReactFlightDOMBrowser', () => { expect(errors).toEqual([reason]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender', async () => { let resolveGreeting; const greetingPromise = new Promise(resolve => { @@ -2520,7 +2518,7 @@ describe('ReactFlightDOMBrowser', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( , webpackMap, ), @@ -2573,7 +2571,7 @@ describe('ReactFlightDOMBrowser', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( , webpackMap, { @@ -3011,9 +3009,9 @@ describe('ReactFlightDOMBrowser', () => { [ "", "/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js", - 2937, + 2935, 27, - 2931, + 2929, 34, ], [ @@ -3027,9 +3025,9 @@ describe('ReactFlightDOMBrowser', () => { [ "Object.", "/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js", - 2931, + 2929, 18, - 2918, + 2916, 89, ], ], diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js index 7aaf4150db087..44b3256afe8ab 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js @@ -90,12 +90,10 @@ describe('ReactFlightDOMEdge', () => { ReactServer = require('react'); ReactServerDOMServer = require('react-server-dom-webpack/server'); - if (__EXPERIMENTAL__) { - jest.mock('react-server-dom-webpack/static', () => - require('react-server-dom-webpack/static.edge'), - ); - ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); - } + jest.mock('react-server-dom-webpack/static', () => + require('react-server-dom-webpack/static.edge'), + ); + ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); jest.resetModules(); __unmockReact(); @@ -1372,7 +1370,7 @@ describe('ReactFlightDOMEdge', () => { ]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender', async () => { let resolveGreeting; const greetingPromise = new Promise(resolve => { @@ -1395,7 +1393,7 @@ describe('ReactFlightDOMEdge', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( , webpackMap, ), @@ -1453,7 +1451,7 @@ describe('ReactFlightDOMEdge', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( , webpackMap, { @@ -1514,7 +1512,7 @@ describe('ReactFlightDOMEdge', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( {promise: infinitePromise}, webpackMap, { @@ -1554,12 +1552,12 @@ describe('ReactFlightDOMEdge', () => { expect(error.message).toBe('Connection closed.'); }); - // @gate experimental - it('should be able to handle a rejected promise in unstable_prerender', async () => { + // @gate enableHalt || enablePostpone + it('should be able to handle a rejected promise in prerender', async () => { const expectedError = new Error('Bam!'); const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( Promise.reject(expectedError), webpackMap, { @@ -1593,12 +1591,12 @@ describe('ReactFlightDOMEdge', () => { expect(error.message).toBe(expectedMessage); }); - // @gate experimental - it('should be able to handle an erroring async iterable in unstable_prerender', async () => { + // @gate enableHalt || enablePostpone + it('should be able to handle an erroring async iterable in prerender', async () => { const expectedError = new Error('Bam!'); const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( { async *[Symbol.asyncIterator]() { await serverAct(() => { @@ -1640,12 +1638,12 @@ describe('ReactFlightDOMEdge', () => { expect(error.message).toBe(expectedMessage); }); - // @gate experimental - it('should be able to handle an erroring readable stream in unstable_prerender', async () => { + // @gate enableHalt || enablePostpone + it('should be able to handle an erroring readable stream in prerender', async () => { const expectedError = new Error('Bam!'); const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( new ReadableStream({ async start(controller) { await serverAct(() => { @@ -1688,11 +1686,11 @@ describe('ReactFlightDOMEdge', () => { expect(error.message).toBe(expectedMessage); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender an async iterable', async () => { const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( { async *[Symbol.asyncIterator]() { yield 'hello'; @@ -1732,11 +1730,11 @@ describe('ReactFlightDOMEdge', () => { expect(text).toBe('hello world'); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender a readable stream', async () => { const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( new ReadableStream({ start(controller) { controller.enqueue('hello world'); @@ -1766,7 +1764,7 @@ describe('ReactFlightDOMEdge', () => { expect(result).toBe('hello world'); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('does not return a prerender prelude early when an error is emitted and there are still pending tasks', async () => { let rejectPromise; const rejectingPromise = new Promise( @@ -1775,7 +1773,7 @@ describe('ReactFlightDOMEdge', () => { const expectedError = new Error('Boom!'); const errors = []; - const {prelude} = await ReactServerDOMStaticServer.unstable_prerender( + const {prelude} = await ReactServerDOMStaticServer.prerender( [ rejectingPromise, { @@ -1862,7 +1860,7 @@ describe('ReactFlightDOMEdge', () => { const serverAbortController = new AbortController(); const errors = []; - const prerenderResult = ReactServerDOMStaticServer.unstable_prerender( + const prerenderResult = ReactServerDOMStaticServer.prerender( ReactServer.createElement(App, null), webpackMap, { diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js index 59df3c24d6f40..f63f82333116e 100644 --- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js +++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js @@ -49,12 +49,10 @@ describe('ReactFlightDOMNode', () => { ); ReactServer = require('react'); ReactServerDOMServer = require('react-server-dom-webpack/server'); - if (__EXPERIMENTAL__) { - jest.mock('react-server-dom-webpack/static', () => - require('react-server-dom-webpack/static.node'), - ); - ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); - } + jest.mock('react-server-dom-webpack/static', () => + require('react-server-dom-webpack/static.node'), + ); + ReactServerDOMStaticServer = require('react-server-dom-webpack/static'); const WebpackMock = require('./utils/WebpackMock'); clientExports = WebpackMock.clientExports; @@ -489,7 +487,7 @@ describe('ReactFlightDOMNode', () => { expect(errors).toEqual([reason]); }); - // @gate experimental + // @gate enableHalt || enablePostpone it('can prerender', async () => { let resolveGreeting; const greetingPromise = new Promise(resolve => { @@ -512,11 +510,10 @@ describe('ReactFlightDOMNode', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - , - webpackMap, - ), + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + , + webpackMap, + ), }; }); @@ -571,17 +568,16 @@ describe('ReactFlightDOMNode', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: - ReactServerDOMStaticServer.unstable_prerenderToNodeStream( - , - webpackMap, - { - signal: controller.signal, - onError(err) { - errors.push(err); - }, + pendingResult: ReactServerDOMStaticServer.prerenderToNodeStream( + , + webpackMap, + { + signal: controller.signal, + onError(err) { + errors.push(err); }, - ), + }, + ), }; }); @@ -618,7 +614,7 @@ describe('ReactFlightDOMNode', () => { expect(result).toContain('loading...'); }); - // @gate enableHalt && enableAsyncDebugInfo + // @gate enableHalt it('includes source locations in component and owner stacks for halted components', async () => { async function Component() { await new Promise(() => {}); @@ -646,7 +642,7 @@ describe('ReactFlightDOMNode', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( ReactServer.createElement(App, null), webpackMap, { @@ -722,7 +718,9 @@ describe('ReactFlightDOMNode', () => { if (__DEV__) { expect(normalizeCodeLocInfo(componentStack)).toBe( - '\n in Component (at **)\n' + + '\n' + + ' in Component' + + (gate(flags => flags.enableAsyncDebugInfo) ? ' (at **)\n' : '\n') + ' in Suspense\n' + ' in body\n' + ' in html\n' + @@ -739,15 +737,19 @@ describe('ReactFlightDOMNode', () => { } if (__DEV__) { - expect(normalizeCodeLocInfo(ownerStack)).toBe( - '\n in Component (at **)\n in App (at **)', - ); + if (gate(flags => flags.enableAsyncDebugInfo)) { + expect(normalizeCodeLocInfo(ownerStack)).toBe( + '\n in Component (at **)\n in App (at **)', + ); + } else { + expect(normalizeCodeLocInfo(ownerStack)).toBe('\n in App (at **)'); + } } else { expect(ownerStack).toBeNull(); } }); - // @gate enableHalt && enableAsyncDebugInfo + // @gate enableHalt it('includes deeper location for aborted stacks', async () => { async function getData() { const signal = ReactServer.cacheSignal(); @@ -792,7 +794,7 @@ describe('ReactFlightDOMNode', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( ReactServer.createElement(App, null), webpackMap, { @@ -869,7 +871,9 @@ describe('ReactFlightDOMNode', () => { if (__DEV__) { expect(normalizeCodeLocInfo(componentStack)).toBe( - '\n in Component (at **)\n' + + '\n' + + ' in Component' + + (gate(flags => flags.enableAsyncDebugInfo) ? ' (at **)\n' : '\n') + ' in Suspense\n' + ' in body\n' + ' in html\n' + @@ -886,17 +890,24 @@ describe('ReactFlightDOMNode', () => { } if (__DEV__) { - expect(normalizeCodeLocInfo(ownerStack)).toBe( - '\n in getData (at **)' + - '\n in Component (at **)' + - '\n in App (at **)', - ); + if (gate(flags => flags.enableAsyncDebugInfo)) { + expect(normalizeCodeLocInfo(ownerStack)).toBe( + '' + + '\n in getData (at **)' + + '\n in Component (at **)' + + '\n in App (at **)', + ); + } else { + expect(normalizeCodeLocInfo(ownerStack)).toBe( + '' + '\n in App (at **)', + ); + } } else { expect(ownerStack).toBeNull(); } }); - // @gate experimental + // @gate enableHalt || enablePostpone // @gate enableHalt it('can handle an empty prelude when prerendering', async () => { function App() { @@ -909,7 +920,7 @@ describe('ReactFlightDOMNode', () => { const {pendingResult} = await serverAct(async () => { // destructure trick to avoid the act scope from awaiting the returned value return { - pendingResult: ReactServerDOMStaticServer.unstable_prerender( + pendingResult: ReactServerDOMStaticServer.prerender( ReactServer.createElement(App, null), webpackMap, { diff --git a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.browser.js b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.browser.js index c0860225d7b57..d8373ec551bc0 100644 --- a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.browser.js +++ b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.browser.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeAction, decodeFormState, diff --git a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.edge.js b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.edge.js index 9198f9913ed37..e103ff761913f 100644 --- a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.edge.js +++ b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.edge.js @@ -9,7 +9,7 @@ export { renderToReadableStream, - prerender as unstable_prerender, + prerender, decodeReply, decodeReplyFromAsyncIterable, decodeAction, diff --git a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.js b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.js index 1e3571a6f2ba4..3c2b9e512c7ca 100644 --- a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.js +++ b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.js @@ -10,8 +10,8 @@ export { renderToReadableStream, renderToPipeableStream, - prerender as unstable_prerender, - prerenderToNodeStream as unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, decodeReply, decodeReplyFromBusboy, decodeReplyFromAsyncIterable, diff --git a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.unbundled.js b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.unbundled.js index 1e3571a6f2ba4..3c2b9e512c7ca 100644 --- a/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.unbundled.js +++ b/packages/react-server-dom-webpack/src/server/react-flight-dom-server.node.unbundled.js @@ -10,8 +10,8 @@ export { renderToReadableStream, renderToPipeableStream, - prerender as unstable_prerender, - prerenderToNodeStream as unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, decodeReply, decodeReplyFromBusboy, decodeReplyFromAsyncIterable, diff --git a/packages/react-server-dom-webpack/static.browser.js b/packages/react-server-dom-webpack/static.browser.js index 3281fed6ea29c..2589789163206 100644 --- a/packages/react-server-dom-webpack/static.browser.js +++ b/packages/react-server-dom-webpack/static.browser.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.browser'; +export {prerender} from './src/server/react-flight-dom-server.browser'; diff --git a/packages/react-server-dom-webpack/static.edge.js b/packages/react-server-dom-webpack/static.edge.js index b1a96317ae9b3..a39d54c73f579 100644 --- a/packages/react-server-dom-webpack/static.edge.js +++ b/packages/react-server-dom-webpack/static.edge.js @@ -7,4 +7,4 @@ * @flow */ -export {unstable_prerender} from './src/server/react-flight-dom-server.edge'; +export {prerender} from './src/server/react-flight-dom-server.edge'; diff --git a/packages/react-server-dom-webpack/static.node.js b/packages/react-server-dom-webpack/static.node.js index 1b2c11edc10f1..78e70a1cf4c28 100644 --- a/packages/react-server-dom-webpack/static.node.js +++ b/packages/react-server-dom-webpack/static.node.js @@ -8,6 +8,6 @@ */ export { - unstable_prerender, - unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, } from './src/server/react-flight-dom-server.node'; diff --git a/packages/react-server-dom-webpack/static.node.unbundled.js b/packages/react-server-dom-webpack/static.node.unbundled.js index be7dbcb721b9f..3f19796a2055f 100644 --- a/packages/react-server-dom-webpack/static.node.unbundled.js +++ b/packages/react-server-dom-webpack/static.node.unbundled.js @@ -8,6 +8,6 @@ */ export { - unstable_prerender, - unstable_prerenderToNodeStream, + prerender, + prerenderToNodeStream, } from './src/server/react-flight-dom-server.node.unbundled'; From 63941a4c596fe80d117ba15f9e89ac6364bd6215 Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Tue, 30 Sep 2025 13:19:01 +0200 Subject: [PATCH 5/6] Don't ship resumeAndPrerender just yet --- .../src/server/react-dom-server.browser.stable.js | 2 +- .../react-dom/src/server/react-dom-server.edge.stable.js | 2 +- .../react-dom/src/server/react-dom-server.node.stable.js | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/react-dom/src/server/react-dom-server.browser.stable.js b/packages/react-dom/src/server/react-dom-server.browser.stable.js index 679e6803f6aa8..e863fff0b58ee 100644 --- a/packages/react-dom/src/server/react-dom-server.browser.stable.js +++ b/packages/react-dom/src/server/react-dom-server.browser.stable.js @@ -12,4 +12,4 @@ export { resume, version, } from './ReactDOMFizzServerBrowser.js'; -export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticBrowser.js'; +export {prerender} from './ReactDOMFizzStaticBrowser.js'; diff --git a/packages/react-dom/src/server/react-dom-server.edge.stable.js b/packages/react-dom/src/server/react-dom-server.edge.stable.js index 588b6d8cb59af..1d80910d48d65 100644 --- a/packages/react-dom/src/server/react-dom-server.edge.stable.js +++ b/packages/react-dom/src/server/react-dom-server.edge.stable.js @@ -12,4 +12,4 @@ export { resume, version, } from './ReactDOMFizzServerEdge.js'; -export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticEdge.js'; +export {prerender} from './ReactDOMFizzStaticEdge.js'; diff --git a/packages/react-dom/src/server/react-dom-server.node.stable.js b/packages/react-dom/src/server/react-dom-server.node.stable.js index e26eee2284565..e84452f51d3ec 100644 --- a/packages/react-dom/src/server/react-dom-server.node.stable.js +++ b/packages/react-dom/src/server/react-dom-server.node.stable.js @@ -14,9 +14,4 @@ export { resumeToPipeableStream, version, } from './ReactDOMFizzServerNode.js'; -export { - prerenderToNodeStream, - prerender, - resumeAndPrerender, - resumeAndPrerenderToNodeStream, -} from './ReactDOMFizzStaticNode.js'; +export {prerenderToNodeStream, prerender} from './ReactDOMFizzStaticNode.js'; From c9355cc7f72444924b391541fe558db7db4b8c1b Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Tue, 30 Sep 2025 20:05:56 +0200 Subject: [PATCH 6/6] Revert "Don't ship resumeAndPrerender just yet" This reverts commit 63941a4c596fe80d117ba15f9e89ac6364bd6215. --- .../src/server/react-dom-server.browser.stable.js | 2 +- .../react-dom/src/server/react-dom-server.edge.stable.js | 2 +- .../react-dom/src/server/react-dom-server.node.stable.js | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/react-dom/src/server/react-dom-server.browser.stable.js b/packages/react-dom/src/server/react-dom-server.browser.stable.js index e863fff0b58ee..679e6803f6aa8 100644 --- a/packages/react-dom/src/server/react-dom-server.browser.stable.js +++ b/packages/react-dom/src/server/react-dom-server.browser.stable.js @@ -12,4 +12,4 @@ export { resume, version, } from './ReactDOMFizzServerBrowser.js'; -export {prerender} from './ReactDOMFizzStaticBrowser.js'; +export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticBrowser.js'; diff --git a/packages/react-dom/src/server/react-dom-server.edge.stable.js b/packages/react-dom/src/server/react-dom-server.edge.stable.js index 1d80910d48d65..588b6d8cb59af 100644 --- a/packages/react-dom/src/server/react-dom-server.edge.stable.js +++ b/packages/react-dom/src/server/react-dom-server.edge.stable.js @@ -12,4 +12,4 @@ export { resume, version, } from './ReactDOMFizzServerEdge.js'; -export {prerender} from './ReactDOMFizzStaticEdge.js'; +export {prerender, resumeAndPrerender} from './ReactDOMFizzStaticEdge.js'; diff --git a/packages/react-dom/src/server/react-dom-server.node.stable.js b/packages/react-dom/src/server/react-dom-server.node.stable.js index e84452f51d3ec..e26eee2284565 100644 --- a/packages/react-dom/src/server/react-dom-server.node.stable.js +++ b/packages/react-dom/src/server/react-dom-server.node.stable.js @@ -14,4 +14,9 @@ export { resumeToPipeableStream, version, } from './ReactDOMFizzServerNode.js'; -export {prerenderToNodeStream, prerender} from './ReactDOMFizzStaticNode.js'; +export { + prerenderToNodeStream, + prerender, + resumeAndPrerender, + resumeAndPrerenderToNodeStream, +} from './ReactDOMFizzStaticNode.js';