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();
}