Skip to content

Commit 8803d53

Browse files
authored
feat: add createRootOptions to ComponentRenderOptions (#53)
1 parent fa58d74 commit 8803d53

3 files changed

Lines changed: 27 additions & 5 deletions

File tree

src/pure.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Locator, LocatorSelectors, PrettyDOMOptions } from 'vitest/browser'
22
import { page, server, utils } from 'vitest/browser'
33
import React from 'react'
4-
import type { Container } from 'react-dom/client'
4+
import type { Container, RootOptions } from 'react-dom/client'
55
import ReactDOMClient from 'react-dom/client'
66

77
const { debug, getElementLocatorSelectors } = utils
@@ -64,6 +64,12 @@ export interface ComponentRenderOptions {
6464
container?: HTMLElement
6565
baseElement?: HTMLElement
6666
wrapper?: React.JSXElementConstructor<{ children: React.ReactNode }>
67+
/**
68+
* Options passed to React's `createRoot`.
69+
*
70+
* @see {@link https://react.dev/reference/react-dom/client/createRoot API Reference for `createRoot`}
71+
*/
72+
createRootOptions?: RootOptions
6773
}
6874

6975
export interface RenderOptions extends ComponentRenderOptions {}
@@ -82,7 +88,7 @@ const mountedRootEntries: {
8288
*/
8389
export async function render(
8490
ui: React.ReactNode,
85-
{ container, baseElement, wrapper: WrapperComponent }: ComponentRenderOptions = {},
91+
{ container, baseElement, wrapper: WrapperComponent, createRootOptions }: RenderOptions = {},
8692
): Promise<RenderResult> {
8793
if (!baseElement) {
8894
// default to document.body instead of documentElement to avoid output of potentially-large
@@ -102,7 +108,7 @@ export async function render(
102108
let root: ReactRoot
103109

104110
if (!mountedContainers.has(container)) {
105-
root = createConcurrentRoot(container)
111+
root = createConcurrentRoot(container, createRootOptions)
106112

107113
mountedRootEntries.push({ container, root })
108114
// we'll add it to the mounted containers regardless of whether it's actually
@@ -250,8 +256,8 @@ interface ReactRoot {
250256
unmount: () => void
251257
}
252258

253-
function createConcurrentRoot(container: HTMLElement): ReactRoot {
254-
const root = ReactDOMClient.createRoot(container)
259+
function createConcurrentRoot(container: HTMLElement, options: RootOptions | undefined): ReactRoot {
260+
const root = ReactDOMClient.createRoot(container, options)
255261

256262
return {
257263
render(element: React.ReactNode) {

test/fixtures/RenderId.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { useId } from 'react'
2+
3+
export function RenderId(): React.ReactNode {
4+
return useId()
5+
}

test/render.test.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { render } from 'vitest-browser-react'
66
import { HelloWorld } from './fixtures/HelloWorld'
77
import { Counter } from './fixtures/Counter'
88
import { SuspendedHelloWorld } from './fixtures/SuspendedHelloWorld'
9+
import { RenderId } from './fixtures/RenderId'
910

1011
test('renders simple component', async () => {
1112
const screen = await render(<HelloWorld />)
@@ -67,3 +68,13 @@ test('trace mark', async () => {
6768
await screen.unmount()
6869
expect(screen.container.innerHTML).toBe('')
6970
})
71+
72+
test('passes createRootOptions to createRoot', async () => {
73+
const identifierPrefix = 'my-custom-id-prefix'
74+
75+
const screen = await render(<RenderId />, {
76+
createRootOptions: { identifierPrefix },
77+
})
78+
79+
expect(screen.container).toHaveTextContent(identifierPrefix)
80+
})

0 commit comments

Comments
 (0)