guard tui exit (#16640)

This commit is contained in:
Sebastian
2026-03-08 23:14:41 +01:00
committed by GitHub
parent e51ed460a6
commit 49a3a9fe36
2 changed files with 18 additions and 15 deletions
@@ -111,7 +111,6 @@ export function tui(input: {
fetch?: typeof fetch fetch?: typeof fetch
headers?: RequestInit["headers"] headers?: RequestInit["headers"]
events?: EventSource events?: EventSource
onExit?: () => Promise<void>
}) { }) {
// promise to prevent immediate exit // promise to prevent immediate exit
return new Promise<void>(async (resolve) => { return new Promise<void>(async (resolve) => {
@@ -126,7 +125,6 @@ export function tui(input: {
const onExit = async () => { const onExit = async () => {
unguard?.() unguard?.()
await input.onExit?.()
resolve() resolve()
} }
@@ -15,6 +15,7 @@ export const { use: useExit, provider: ExitProvider } = createSimpleContext({
init: (input: { onExit?: () => Promise<void> }) => { init: (input: { onExit?: () => Promise<void> }) => {
const renderer = useRenderer() const renderer = useRenderer()
let message: string | undefined let message: string | undefined
let task: Promise<void> | undefined
const store = { const store = {
set: (value?: string) => { set: (value?: string) => {
const prev = message const prev = message
@@ -29,20 +30,24 @@ export const { use: useExit, provider: ExitProvider } = createSimpleContext({
get: () => message, get: () => message,
} }
const exit: Exit = Object.assign( const exit: Exit = Object.assign(
async (reason?: unknown) => { (reason?: unknown) => {
// Reset window title before destroying renderer if (task) return task
renderer.setTerminalTitle("") task = (async () => {
renderer.destroy() // Reset window title before destroying renderer
win32FlushInputBuffer() renderer.setTerminalTitle("")
if (reason) { renderer.destroy()
const formatted = FormatError(reason) ?? FormatUnknownError(reason) win32FlushInputBuffer()
if (formatted) { if (reason) {
process.stderr.write(formatted + "\n") const formatted = FormatError(reason) ?? FormatUnknownError(reason)
if (formatted) {
process.stderr.write(formatted + "\n")
}
} }
} const text = store.get()
const text = store.get() if (text) process.stdout.write(text + "\n")
if (text) process.stdout.write(text + "\n") await input.onExit?.()
await input.onExit?.() })()
return task
}, },
{ {
message: store, message: store,