From 68c557b381357cd8ac83935397758ad371e01059 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 13 Apr 2026 14:58:03 +0200 Subject: [PATCH] backend-plugin-api: tighten internal any usage (#33867) * backend-plugin-api: tighten internal any usage Replace internal `any` type annotations with proper types: - Use `'root' | 'plugin'` union in DepsToInstances conditional type and createServiceRef implementation signature - Use Error type guard with object cast fallback in isDatabaseConflictError instead of `as any` Signed-off-by: Patrik Oldsberg Made-with: Cursor * Use isError in isDatabaseConflictError Signed-off-by: Patrik Oldsberg Made-with: Cursor * Update changeset wording per review feedback Signed-off-by: Patrik Oldsberg Made-with: Cursor --------- Signed-off-by: Patrik Oldsberg --- .changeset/tighten-internal-any-usage.md | 5 +++++ packages/backend-plugin-api/src/services/system/types.ts | 4 ++-- .../backend-plugin-api/src/services/utilities/database.ts | 4 +++- packages/backend-plugin-api/src/wiring/types.ts | 6 +++++- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .changeset/tighten-internal-any-usage.md diff --git a/.changeset/tighten-internal-any-usage.md b/.changeset/tighten-internal-any-usage.md new file mode 100644 index 0000000000..acbeecdd3e --- /dev/null +++ b/.changeset/tighten-internal-any-usage.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-plugin-api': patch +--- + +Added stricter type checks in `isDatabaseConflictError`. diff --git a/packages/backend-plugin-api/src/services/system/types.ts b/packages/backend-plugin-api/src/services/system/types.ts index 7e4b78b5a1..c6425cca42 100644 --- a/packages/backend-plugin-api/src/services/system/types.ts +++ b/packages/backend-plugin-api/src/services/system/types.ts @@ -136,8 +136,8 @@ export function createServiceRef< TService, TInstances extends 'singleton' | 'multiton', >( - options: ServiceRefOptions, -): ServiceRef { + options: ServiceRefOptions, +): ServiceRef { const { id, scope = 'plugin', multiton = false, defaultFactory } = options; return { id, diff --git a/packages/backend-plugin-api/src/services/utilities/database.ts b/packages/backend-plugin-api/src/services/utilities/database.ts index f5abcd7fba..6a550c0d78 100644 --- a/packages/backend-plugin-api/src/services/utilities/database.ts +++ b/packages/backend-plugin-api/src/services/utilities/database.ts @@ -14,6 +14,8 @@ * limitations under the License. */ +import { isError } from '@backstage/errors'; + /** * Tries to deduce whether a thrown error is a database conflict. * @@ -23,7 +25,7 @@ * known database engine */ export function isDatabaseConflictError(e: unknown) { - const message = (e as any)?.message; + const message = isError(e) ? e.message : undefined; return ( typeof message === 'string' && diff --git a/packages/backend-plugin-api/src/wiring/types.ts b/packages/backend-plugin-api/src/wiring/types.ts index 28b70b547f..9397cf597b 100644 --- a/packages/backend-plugin-api/src/wiring/types.ts +++ b/packages/backend-plugin-api/src/wiring/types.ts @@ -56,7 +56,11 @@ type DepsToInstances< [key in string]: ServiceRef | ExtensionPoint; }, > = { - [key in keyof TDeps]: TDeps[key] extends ServiceRef + [key in keyof TDeps]: TDeps[key] extends ServiceRef< + unknown, + 'root' | 'plugin', + 'multiton' + > ? Array : TDeps[key]['T']; };