errors: add toError utility and migrate assertError usages

Add a `toError` utility function to `@backstage/errors` that converts
unknown values to `ErrorLike` objects. If the value is already error-like
it is returned as-is. Strings are used directly as the error message, and
other values are stringified with a fallback to JSON.stringify to avoid
unhelpful `[object Object]` messages.

Non-error causes passed to `CustomErrorBase` are now converted and stored
using `toError` rather than discarded. Existing `assertError` call sites
across the codebase are migrated to `toError`.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
This commit is contained in:
Patrik Oldsberg
2026-04-03 01:33:34 +02:00
parent 3cdf048f77
commit b2319ffe45
70 changed files with 400 additions and 345 deletions
+4 -4
View File
@@ -24,7 +24,7 @@ import {
} from 'node:path';
import { ConfigSchemaPackageEntry } from './types';
import { JsonObject } from '@backstage/types';
import { assertError } from '@backstage/errors';
import { toError } from '@backstage/errors';
type Item = {
name?: string;
@@ -249,9 +249,9 @@ async function compileTsSchemas(
);
}
} catch (error) {
assertError(error);
if (error.message !== 'type Config not found') {
throw error;
const err = toError(error);
if (err.message !== 'type Config not found') {
throw err;
}
}
@@ -15,7 +15,7 @@
*/
import { AppConfig } from '@backstage/config';
import { assertError } from '@backstage/errors';
import { toError } from '@backstage/errors';
import { JsonObject } from '@backstage/types';
import { AsyncConfigSourceGenerator, ConfigSource } from './types';
@@ -165,7 +165,6 @@ function safeJsonParse(str: string): [Error | null, any] {
try {
return [null, JSON.parse(str)];
} catch (err) {
assertError(err);
return [err, str];
return [toError(err), str];
}
}
@@ -15,7 +15,7 @@
*/
import { JsonObject, JsonValue } from '@backstage/types';
import { assertError } from '@backstage/errors';
import { toError } from '@backstage/errors';
import { TransformContext, TransformFunc } from './types';
import { isObject } from './utils';
import { createSubstitutionTransform } from './substitution';
@@ -50,8 +50,7 @@ export async function applyConfigTransforms(
break;
}
} catch (error) {
assertError(error);
throw new Error(`error at ${path}, ${error.message}`);
throw new Error(`error at ${path}, ${toError(error).message}`);
}
}