fix(solid): Call lifecycle dispose on renderer.destroy (#289)

This commit is contained in:
Haris Gušić
2025-11-12 11:57:16 +01:00
committed by GitHub
parent ab06252eb9
commit 2ca546cc78
3 changed files with 29 additions and 6 deletions
+11
View File
@@ -82,6 +82,7 @@ export interface CliRendererConfig {
backgroundColor?: ColorInput
openConsoleOnError?: boolean
prependInputHandlers?: ((sequence: string) => boolean)[]
onDestroy?: () => void
}
export type PixelResolution = {
@@ -334,6 +335,7 @@ export class CliRenderer extends EventEmitter implements RenderContext {
private _paletteDetector: TerminalPaletteDetector | null = null
private _cachedPalette: TerminalColors | null = null
private _paletteDetectionPromise: Promise<TerminalColors> | null = null
private _onDestroy?: () => void
private inputHandlers: ((sequence: string) => boolean)[] = []
private prependedInputHandlers: ((sequence: string) => boolean)[] = []
@@ -464,6 +466,7 @@ export class CliRenderer extends EventEmitter implements RenderContext {
this._console = new TerminalConsole(this, config.consoleOptions)
this.useConsole = config.useConsole ?? true
this._openConsoleOnError = config.openConsoleOnError ?? process.env.NODE_ENV !== "production"
this._onDestroy = config.onDestroy
global.requestAnimationFrame = (callback: FrameRequestCallback) => {
const id = CliRenderer.animationFrameId++
@@ -1384,6 +1387,14 @@ export class CliRenderer extends EventEmitter implements RenderContext {
this.lib.destroyRenderer(this.rendererPtr)
rendererTracker.removeRenderer(this)
if (this._onDestroy) {
try {
this._onDestroy()
} catch (e) {
console.error("Error in onDestroy callback:", e instanceof Error ? e.stack : String(e))
}
}
}
private startRenderLoop(): void {
+2 -2
View File
@@ -40,7 +40,7 @@ render(() => <text>Hello, World!</text>)
5. To build use [Bun.build](https://bun.com/docs/bundler) ([source](https://github.com/sst/opentui/issues/122)):
```ts
import solidPlugin from "./node_modules/@opentui/solid/scripts/solid-plugin";
import solidPlugin from "./node_modules/@opentui/solid/scripts/solid-plugin"
await Bun.build({
entrypoints: ["./index.tsx"],
@@ -51,5 +51,5 @@ await Bun.build({
target: "bun-darwin-arm64",
outfile: "app-macos",
},
});
})
```
+16 -4
View File
@@ -5,10 +5,16 @@ import { RendererContext } from "./src/elements"
import { _render as renderInternal, createComponent } from "./src/reconciler"
export const render = async (node: () => JSX.Element, renderConfig: CliRendererConfig = {}) => {
const renderer = await createCliRenderer(renderConfig)
const renderer = await createCliRenderer({
...renderConfig,
onDestroy: () => {
dispose()
renderConfig.onDestroy?.()
},
})
engine.attach(renderer)
renderInternal(
const dispose = renderInternal(
() =>
createComponent(RendererContext.Provider, {
get value() {
@@ -23,10 +29,16 @@ export const render = async (node: () => JSX.Element, renderConfig: CliRendererC
}
export const testRender = async (node: () => JSX.Element, renderConfig: TestRendererOptions = {}) => {
const testSetup = await createTestRenderer(renderConfig)
const testSetup = await createTestRenderer({
...renderConfig,
onDestroy: () => {
dispose()
renderConfig.onDestroy?.()
},
})
engine.attach(testSetup.renderer)
renderInternal(
const dispose = renderInternal(
() =>
createComponent(RendererContext.Provider, {
get value() {