From 0f878b3ecc2a6c06e145cb4d4a39b7c115c8598e Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Tue, 20 Jan 2026 18:26:52 +0100 Subject: [PATCH 1/4] react 19.2 --- src/React.bs.js | 3 +++ src/React.res | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/React.bs.js b/src/React.bs.js index ef827dd..6565a0f 100644 --- a/src/React.bs.js +++ b/src/React.bs.js @@ -23,6 +23,8 @@ function lazy_(load) { var Uncurried = {}; +var Activity = {}; + exports.Children = Children; exports.Context = Context; exports.Fragment = Fragment; @@ -30,4 +32,5 @@ exports.StrictMode = StrictMode; exports.Suspense = Suspense; exports.lazy_ = lazy_; exports.Uncurried = Uncurried; +exports.Activity = Activity; /* react Not a pure module */ diff --git a/src/React.res b/src/React.res index 2644e4b..585accd 100644 --- a/src/React.res +++ b/src/React.res @@ -459,3 +459,16 @@ captureOwnerStack reads the current Owner Stack in development and returns it as @module("react") @return(null_to_opt) external captureOwnerStack: unit => option = "captureOwnerStack" + +/** + lets you hide and restore the UI and internal state of its children. +[Read more on the React Documentation](https://react.dev/reference/react/Activity) +*/ +module Activity = { + type mode = [#visible | #hidden] + + type props = {mode?: mode, children: element, name?: string} + + @module("react") + external make: component = "Activity" +} From a40b14ce511a9173995544050e307b31ee2d1e45 Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Tue, 20 Jan 2026 18:27:39 +0100 Subject: [PATCH 2/4] react 19.2 useEffectEvent --- src/React.res | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/React.res b/src/React.res index 585accd..e18bc83 100644 --- a/src/React.res +++ b/src/React.res @@ -472,3 +472,10 @@ module Activity = { @module("react") external make: component = "Activity" } + +/** +useEffectEvent is a React Hook that lets you extract non-reactive logic from your Effects into a reusable function called an Effect Event. +[Read more on the React Documentation](https://react.dev/reference/react/useEffectEvent) +*/ +@module("react") +external useEffectEvent: (unit => unit) => unit = "useEffectEvent" From e1c9b3cbdd9a45d23d9438ea0bd832f0a1bd5692 Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Tue, 20 Jan 2026 18:28:19 +0100 Subject: [PATCH 3/4] react 19.2 partial pre-rendering --- src/ReactDOMServer.res | 28 ++++++++++++++++++++++++++++ src/ReactDOMStatic.res | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/ReactDOMServer.res b/src/ReactDOMServer.res index d50ddc1..44b77fd 100644 --- a/src/ReactDOMServer.res +++ b/src/ReactDOMServer.res @@ -3,3 +3,31 @@ external renderToString: React.element => string = "renderToString" @module("react-dom/server") external renderToStaticMarkup: React.element => string = "renderToStaticMarkup" + +type resumeOptions<'error> = { + nonce?: string, + signal?: ReactDOMStatic.abortSignal, + onError?: 'error => unit, +} + +/** +resume streams a pre-rendered React tree to a Readable Web Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/server/resume) +*/ +@module("react-dom/server") +external resume: ( + React.element, + ReactDOMStatic.postponedState, + ~options: resumeOptions<'error>=?, +) => promise = "resume" + +/** +resumeToPipeableStream streams a pre-rendered React tree to a pipeable Node.js Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/server/resumeToPipeableStream) +*/ +@module("react-dom/server") +external resumeToPipeableStream: ( + React.element, + ReactDOMStatic.postponedState, + ~options: resumeOptions<'error>=?, +) => promise = "resumeToPipeableStream" diff --git a/src/ReactDOMStatic.res b/src/ReactDOMStatic.res index 7988fbb..0539f8a 100644 --- a/src/ReactDOMStatic.res +++ b/src/ReactDOMStatic.res @@ -4,6 +4,8 @@ type nodeStream // NodeJs.Stream.stream type readableStream // WebAPI.FileAPI.readableStream +type postponedState + type prerenderOptions<'error> = { bootstrapScriptContent?: string, bootstrapScripts?: array, @@ -15,16 +17,46 @@ type prerenderOptions<'error> = { signal?: abortSignal, } -type staticResult = {prelude: readableStream} +type staticResult = {prelude: readableStream, postponed: postponedState} +/** +prerender renders a React tree to a static HTML string using a Web Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/static/prerender) +*/ @module("react-dom/static") external prerender: (React.element, ~options: prerenderOptions<'error>=?) => promise = "prerender" -type staticResultNode = {prelude: nodeStream} +/** +resumeAndPrerender continues a prerendered React tree to a static HTML string using a Web Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/static/resumeAndPrerender) +*/ +@module("react-dom/static") +external resumeAndPrerender: ( + React.element, + postponedState, + ~options: prerenderOptions<'error>=?, +) => promise = "resumeAndPrerender" + +type staticResultNode = {prelude: nodeStream, postponed: postponedState} +/** +prerenderToNodeStream renders a React tree to a static HTML string using a Node.js Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/static/prerenderToNodeStream) +*/ @module("react-dom/static") external prerenderToNodeStream: ( React.element, ~options: prerenderOptions<'error>=?, ) => promise = "prerenderToNodeStream" + +/** +resumeAndPrerenderToNodeStream continues a prerendered React tree to a static HTML string using a a Node.js Stream. +[Read more on the React Documentation](https://react.dev/reference/react-dom/static/resumeAndPrerenderToNodeStream) +*/ +@module("react-dom/static") +external resumeAndPrerenderToNodeStream: ( + React.element, + postponedState, + ~options: prerenderOptions<'error>=?, +) => promise = "resumeAndPrerenderToNodeStream" From 09582817eb1b569ca143042ab36d267f5320ac9d Mon Sep 17 00:00:00 2001 From: Freddy Harris Date: Wed, 21 Jan 2026 11:24:02 +0100 Subject: [PATCH 4/4] change Activity type mode to variant --- src/React.res | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/React.res b/src/React.res index e18bc83..4eb876a 100644 --- a/src/React.res +++ b/src/React.res @@ -465,7 +465,9 @@ external captureOwnerStack: unit => option = "captureOwnerStack" [Read more on the React Documentation](https://react.dev/reference/react/Activity) */ module Activity = { - type mode = [#visible | #hidden] + type mode = + | @as("visible") Visible + | @as("hidden") Hidden type props = {mode?: mode, children: element, name?: string}