Skip to content

Commit 06abe6f

Browse files
committed
refactor(solid): replace render with createRoot
1 parent 9bc5fb5 commit 06abe6f

File tree

6 files changed

+55
-27
lines changed

6 files changed

+55
-27
lines changed

packages/solid/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ preload = ["@opentui/solid/preload"]
3030
3. Add render function to index.tsx:
3131

3232
```tsx
33+
import { createCliRenderer } from "@opentui/core"
3334
import { render } from "@opentui/solid"
3435

35-
render(() => <text>Hello, World!</text>)
36+
const renderer = await createCliRenderer()
37+
createRoot(renderer).render(() => <text>Hello, World!</text>)
3638
```
3739

3840
4. Run with `bun index.tsx`.

packages/solid/examples/index.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
import { render } from "@opentui/solid"
2-
import { ConsolePosition } from "@opentui/core"
1+
import { createRoot, render } from "@opentui/solid"
2+
import { ConsolePosition, createCliRenderer } from "@opentui/core"
33
import ExampleSelector from "./components/ExampleSelector"
44

55
// Uncomment to debug solidjs reconciler
66
// process.env.DEBUG = "true"
77

8-
const App = () => <ExampleSelector />
9-
10-
render(App, {
8+
const renderer = await createCliRenderer({
119
targetFps: 30,
1210
consoleOptions: {
1311
position: ConsolePosition.BOTTOM,
1412
maxStoredLogs: 1000,
1513
sizePercent: 40,
1614
},
1715
})
16+
17+
const App = () => <ExampleSelector />
18+
createRoot(renderer).render(App)

packages/solid/examples/repro-empty-styled-text.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createSignal, Show } from "solid-js"
2-
import { render, useKeyboard, useRenderer } from "@opentui/solid"
3-
import { t } from "@opentui/core"
2+
import { createRoot, useKeyboard, useRenderer } from "@opentui/solid"
3+
import { createCliRenderer, t } from "@opentui/core"
44

55
process.env.DEBUG = "true"
66

@@ -42,4 +42,5 @@ const EmptyStyledTextTest = () => {
4242
)
4343
}
4444

45-
render(EmptyStyledTextTest)
45+
const renderer = await createCliRenderer()
46+
createRoot(renderer).render(EmptyStyledTextTest)

packages/solid/examples/repro-filter-list.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createSignal, For } from "solid-js"
2-
import { render, useRenderer } from "@opentui/solid"
2+
import { createRoot, render, useRenderer } from "@opentui/solid"
3+
import { createCliRenderer } from "@opentui/core"
34

45
process.env.DEBUG = "true"
56

@@ -37,4 +38,5 @@ const FilterListTest = () => {
3738
)
3839
}
3940

40-
render(FilterListTest)
41+
const renderer = await createCliRenderer()
42+
createRoot(renderer).render(FilterListTest)

packages/solid/examples/repro-onSubmit.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createSignal, Match, Show, Switch } from "solid-js"
2-
import { render, useKeyboard, useRenderer } from "@opentui/solid"
2+
import { createRoot, render, useKeyboard, useRenderer } from "@opentui/solid"
3+
import { createCliRenderer } from "@opentui/core"
34

45
process.env.DEBUG = "true"
56

@@ -67,4 +68,5 @@ const InputTest = () => {
6768
)
6869
}
6970

70-
render(InputTest)
71+
const renderer = await createCliRenderer()
72+
createRoot(renderer).render(InputTest)

packages/solid/index.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,49 @@ import type { JSX } from "./jsx-runtime"
44
import { RendererContext } from "./src/elements"
55
import { _render as renderInternal, createComponent } from "./src/reconciler"
66

7+
/**
8+
* @deprecated Use `createRoot(renderer).render(() => element)` instead
9+
*/
710
export const render = async (
811
node: () => JSX.Element,
912
renderConfig: CliRendererConfig = {},
1013
): Promise<{ renderer: CliRenderer }> => {
1114
const renderer = await createCliRenderer(renderConfig)
12-
engine.attach(renderer)
13-
14-
renderInternal(
15-
() =>
16-
createComponent(RendererContext.Provider, {
17-
get value() {
18-
return renderer
19-
},
20-
get children() {
21-
return createComponent(node, {})
22-
},
23-
}),
24-
renderer.root,
25-
)
15+
createRoot(renderer).render(node)
2616

2717
return { renderer }
2818
}
2919

20+
/**
21+
* Creates a root for rendering a Solid tree with the given CLI renderer.
22+
* @param renderer The CLI renderer to use
23+
* @returns A root object with a `render` method
24+
* @example
25+
* ```tsx
26+
* const renderer = await createCliRenderer()
27+
* createRoot(renderer).render(() => <App />)
28+
* ```
29+
*/
30+
export const createRoot = (renderer: CliRenderer): { render: (node: () => JSX.Element) => void } => {
31+
return {
32+
render: (node) => {
33+
engine.attach(renderer)
34+
renderInternal(
35+
() =>
36+
createComponent(RendererContext.Provider, {
37+
get value() {
38+
return renderer
39+
},
40+
get children() {
41+
return createComponent(node, {})
42+
},
43+
}),
44+
renderer.root,
45+
)
46+
},
47+
}
48+
}
49+
3050
export const testRender = async (node: () => JSX.Element, renderConfig: TestRendererOptions = {}) => {
3151
const testSetup = await createTestRenderer(renderConfig)
3252
engine.attach(testSetup.renderer)

0 commit comments

Comments
 (0)