From 8741e5a8002892f4b55c9248f7e9e6c2770892ad Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 15 Apr 2026 12:20:33 +0200 Subject: [PATCH] errors: add explicit name property to ServiceUnavailableError Every CustomErrorBase subclass explicitly sets `name = 'ClassName' as const` except ServiceUnavailableError, which relied on the constructor fallback that reads `this.constructor.name`. This is fragile under minification. Added the explicit name property for consistency and added a serialization round-trip test. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .changeset/add-service-unavailable-error-name.md | 5 +++++ packages/errors/report.api.md | 5 ++++- packages/errors/src/errors/common.ts | 4 +++- packages/errors/src/serialization/error.test.ts | 12 +++++++++++- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 .changeset/add-service-unavailable-error-name.md diff --git a/.changeset/add-service-unavailable-error-name.md b/.changeset/add-service-unavailable-error-name.md new file mode 100644 index 0000000000..78647f7a56 --- /dev/null +++ b/.changeset/add-service-unavailable-error-name.md @@ -0,0 +1,5 @@ +--- +'@backstage/errors': patch +--- + +Added explicit `name` property to `ServiceUnavailableError` for consistency with all other error classes, making it resilient to minification. diff --git a/packages/errors/report.api.md b/packages/errors/report.api.md index 4bb50cc5ea..5026f8d872 100644 --- a/packages/errors/report.api.md +++ b/packages/errors/report.api.md @@ -151,7 +151,10 @@ export function serializeError( ): SerializedError; // @public -export class ServiceUnavailableError extends CustomErrorBase {} +export class ServiceUnavailableError extends CustomErrorBase { + // (undocumented) + name: 'ServiceUnavailableError'; +} // @public export function stringifyError(error: unknown): string; diff --git a/packages/errors/src/errors/common.ts b/packages/errors/src/errors/common.ts index 861c3a7c3a..a1a9cfbf2d 100644 --- a/packages/errors/src/errors/common.ts +++ b/packages/errors/src/errors/common.ts @@ -100,7 +100,9 @@ export class NotImplementedError extends CustomErrorBase { * * @public */ -export class ServiceUnavailableError extends CustomErrorBase {} +export class ServiceUnavailableError extends CustomErrorBase { + name = 'ServiceUnavailableError' as const; +} /** * An error that forwards an underlying cause with additional context in the message. diff --git a/packages/errors/src/serialization/error.test.ts b/packages/errors/src/serialization/error.test.ts index 6418170f98..2c462610da 100644 --- a/packages/errors/src/serialization/error.test.ts +++ b/packages/errors/src/serialization/error.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { NotModifiedError } from '../errors'; +import { NotModifiedError, ServiceUnavailableError } from '../errors'; import { deserializeError, serializeError, stringifyError } from './error'; class CustomError extends Error { @@ -77,6 +77,16 @@ describe('serialization', () => { expect(withoutStack2.cause.stack).not.toBeDefined(); }); + it('round-trips a ServiceUnavailableError', () => { + const before = new ServiceUnavailableError('service down'); + const after = deserializeError( + serializeError(before, { includeStack: true }), + ); + expect(after.name).toEqual('ServiceUnavailableError'); + expect(after.message).toEqual('service down'); + expect(after.stack).toEqual(before.stack); + }); + it('stringifies all supported forms', () => { expect(stringifyError({})).toEqual("unknown error '[object Object]'"); expect(