Skip to content

Commit ee9648f

Browse files
authored
fix: support exactOptionalPropertyTypes (fix vikejs/vike#3251) (#219)
1 parent aea5c56 commit ee9648f

3 files changed

Lines changed: 39 additions & 26 deletions

File tree

packages/vike-react/src/integration/onRenderClient.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ function onUncaughtErrorGlobal(
102102
}
103103
type OnUncaughtError = RootOptions['onUncaughtError']
104104
type OnUncaughtErrorArgs = Parameters<NonNullable<RootOptions['onUncaughtError']>>
105+
type OnUncaughtErrorInfo = OnUncaughtErrorArgs[1]
105106

106107
// Inject componentStack to the error's stack trace
107108
// - Server counterpart: https://github.com/brillout/react-streaming/blob/e0a6210957e65dad2c92877ad075ebac4713d8fa/src/server/renderToStream/common.ts#L93
108-
type ErrorInfo = { componentStack?: string }
109-
function getErrorWithComponentStack(errorOriginal: unknown, errorInfo?: ErrorInfo) {
109+
function getErrorWithComponentStack(errorOriginal: unknown, errorInfo?: OnUncaughtErrorInfo) {
110110
if (!errorInfo?.componentStack || !isObject(errorOriginal)) return errorOriginal
111111
const errorStackLines = String(errorOriginal.stack).split('\n')
112112

packages/vike-react/src/integration/onRenderHtml.tsx

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export { onRenderHtml }
33

44
import React from 'react'
55
import { renderToString, renderToStaticMarkup } from 'react-dom/server'
6-
import { renderToStream } from 'react-streaming/server'
6+
import { renderToStream, type RenderToStreamOptions } from 'react-streaming/server'
77
import { dangerouslySkipEscape, escapeInject } from 'vike/server'
88
import type { PageContextServer } from 'vike/types'
99
import { VikeReactProviderPageContext } from '../hooks/usePageContext.js'
@@ -80,29 +80,10 @@ async function renderPageToHtml(pageContext: PageContextServer) {
8080
const pageHtmlString = renderToString(pageContext.page, renderToStringOptions)
8181
pageContext.pageHtmlString = pageHtmlString
8282
} else {
83-
const pageHtmlStream = await renderToStream(pageContext.page, {
84-
webStream: !streamSetting.type
85-
? /* Let react-streaming decide which stream type to use.
86-
false
87-
*/
88-
undefined
89-
: streamSetting.type === 'web',
90-
userAgent:
91-
pageContext.headers?.['user-agent'] ||
92-
// TO-DO/eventually: remove old way of acccessing the User Agent header.
93-
// @ts-ignore
94-
pageContext.userAgent,
95-
disable:
96-
// +stream.require is true => default +stream.enable is true
97-
// +stream.require is false => default +stream.enable is false
98-
streamSetting.enable === false
99-
? true
100-
: /* Don't override disabling when bot is detected.
101-
false,
102-
*/
103-
undefined,
104-
...renderToStreamOptions,
105-
})
83+
const pageHtmlStream = await renderToStream(
84+
pageContext.page,
85+
getRenderToStreamOptions(pageContext, streamSetting, renderToStreamOptions),
86+
)
10687
pageContext.pageHtmlStream = pageHtmlStream
10788
}
10889
}
@@ -230,6 +211,37 @@ async function getHtmlInjections(pageContext: PageContextServer) {
230211
return { bodyHtmlBegin, bodyHtmlEnd, headHtmlBegin, headHtmlEnd }
231212
}
232213

214+
function getRenderToStreamOptions(
215+
pageContext: PageContextServer,
216+
streamSetting: StreamSetting,
217+
renderToStreamOptions: RenderToStreamOptions | undefined,
218+
): RenderToStreamOptions {
219+
const options: RenderToStreamOptions = {}
220+
221+
if (streamSetting.type) {
222+
options.webStream = streamSetting.type === 'web'
223+
} else {
224+
// Let react-streaming decide the stream type
225+
}
226+
227+
const userAgent =
228+
pageContext.headers?.['user-agent'] ||
229+
// TO-DO/eventually: remove old way of acccessing the User Agent header.
230+
// @ts-ignore
231+
pageContext.userAgent
232+
if (userAgent) options.userAgent = userAgent
233+
234+
// +stream.require is true => default +stream.enable is true
235+
// +stream.require is false => default +stream.enable is false
236+
if (streamSetting.enable === false) {
237+
options.disable = true
238+
} else {
239+
// Let react-streaming disable streaming when it detects a bot
240+
}
241+
242+
return { ...options, ...renderToStreamOptions }
243+
}
244+
233245
type StreamSetting = {
234246
type: 'node' | 'web' | null
235247
enable: boolean | null

packages/vike-react/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"noUncheckedIndexedAccess": true,
1111
"noUnusedLocals": true,
1212
"noUnusedParameters": true,
13+
"exactOptionalPropertyTypes": true,
1314
// Resolution
1415
"esModuleInterop": true,
1516
"moduleResolution": "Node16",

0 commit comments

Comments
 (0)