guard tui exit (#16640)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user