diff --git a/bin/run.js b/bin/run.js index 328ee477a..407d1ed80 100755 --- a/bin/run.js +++ b/bin/run.js @@ -9,4 +9,6 @@ oclif await oclif.flush(); process.exit(0); }) - .catch(handleError); + .catch(async (error) => { + await handleError(error); + }); diff --git a/package.json b/package.json index 02f5c81a7..1ffaa1a8a 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "node": ">=20.7.0" }, "scripts": { - "clean": "(rimraf --glob dist tsconfig.*.tsbuildinfo) | true", + "clean": "rimraf --glob 'dist' 'tsconfig*.tsbuildinfo' || true", "compile": "tsc --build tsconfig.json", "format": "yarn format:prettier --write", "format:prettier": "prettier $@ '**/*.{ts,tsx,yaml,yml,json,md,mdx}'", diff --git a/src/lib/basecommands/ExecRenderBaseCommand.tsx b/src/lib/basecommands/ExecRenderBaseCommand.tsx index f316eb4a4..e06fbc1a7 100644 --- a/src/lib/basecommands/ExecRenderBaseCommand.tsx +++ b/src/lib/basecommands/ExecRenderBaseCommand.tsx @@ -34,7 +34,7 @@ export abstract class ExecRenderBaseCommand< const result = await this.exec(); const wrappedRender = wrapRender(this.render.bind(this)); - render( + const handle = render( , ); + + await handle.waitUntilExit(); } protected abstract render(executionResult: TRes): ReactNode; diff --git a/src/lib/basecommands/RenderBaseCommand.tsx b/src/lib/basecommands/RenderBaseCommand.tsx index 42ae6aa50..c6735523c 100644 --- a/src/lib/basecommands/RenderBaseCommand.tsx +++ b/src/lib/basecommands/RenderBaseCommand.tsx @@ -54,9 +54,12 @@ export abstract class RenderBaseCommand< public async run(): Promise { const onError = () => { - setImmediate(() => { + setImmediate(async () => { handle.unmount(); - process.exit(1); + import("@oclif/core").then(async (oclif) => { + await oclif.default.flush(); + process.exit(1); + }); }); }; diff --git a/src/lib/error/handleError.ts b/src/lib/error/handleError.ts index c3df48563..ca90c73ef 100644 --- a/src/lib/error/handleError.ts +++ b/src/lib/error/handleError.ts @@ -1,3 +1,4 @@ +import oclif from "@oclif/core"; import { OclifError, PrettyPrintableError } from "@oclif/core/interfaces"; import { ApiClientError, AxiosResponse } from "@mittwald/api-client-commons"; import type { MittwaldAPIV2 } from "@mittwald/api-client"; @@ -8,22 +9,25 @@ type CommonsValidationErrors = MittwaldAPIV2.Components.Schemas.CommonsValidationErrors; // noinspection JSUnusedGlobalSymbols -export default function handleError( +export default async function handleError( error: Error & Partial & Partial & { skipOclifErrorHandling?: boolean; }, -): void { +): Promise { if (!isUnexpectedError(error)) { + await oclif.flush(); process.exit(1); } if (error instanceof ExitError) { + await oclif.flush(); process.exit(error.oclif.exit); } - renderError(error); + await renderError(error); + await oclif.flush(); process.exit(1); } diff --git a/src/rendering/react/error.tsx b/src/rendering/react/error.tsx index de56e696b..52e92a12c 100644 --- a/src/rendering/react/error.tsx +++ b/src/rendering/react/error.tsx @@ -7,6 +7,7 @@ import { ErrorBox } from "./components/ErrorBox.js"; * @param err The error to render. May be anything; the ErrorBox component will * handle it. */ -export function renderError(err: unknown) { - render(); +export async function renderError(err: unknown): Promise { + const handle = render(); + await handle.waitUntilExit(); }