From 082eccf5ad0be2e0557e79b067657eae17653b78 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 22 Nov 2023 16:24:04 +0100 Subject: [PATCH] frontend-plugin-api: allow extensions to only define a name Co-authored-by: Camila Belo Signed-off-by: Patrik Oldsberg --- .../wiring/resolveExtensionDefinition.test.ts | 6 ++--- .../src/wiring/resolveExtensionDefinition.ts | 23 ++++++++----------- .../src/app/createExtensionTester.ts | 2 +- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts index 202c513aa2..8f3755ac5d 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts @@ -20,6 +20,7 @@ import { resolveExtensionDefinition } from './resolveExtensionDefinition'; describe('resolveExtensionDefinition', () => { it.each([ [{ namespace: 'ns' }, 'ns'], + [{ namespace: 'n' }, 'n'], [{ namespace: 'ns', name: 'n' }, 'ns/n'], [{ kind: 'k', namespace: 'ns' }, 'k:ns'], [{ kind: 'k', namespace: 'ns', name: 'n' }, 'k:ns/n'], @@ -34,15 +35,14 @@ describe('resolveExtensionDefinition', () => { expect(() => resolveExtensionDefinition({ kind: 'k', - name: 'n', } as ExtensionDefinition), ).toThrow( - 'Extension must declare an explicit namespace as it could not be resolved from context, name=n kind=k', + 'Extension must declare an explicit namespace or name as it could not be resolved from context, kind=k namespace=undefined name=undefined', ); expect(() => resolveExtensionDefinition({} as ExtensionDefinition), ).toThrow( - 'Extension must declare an explicit namespace as it could not be resolved from context, name=undefined kind=undefined', + 'Extension must declare an explicit namespace or name as it could not be resolved from context, kind=undefined namespace=undefined name=undefined', ); }); }); diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts index 7a7e319590..3d7acb33bd 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts @@ -24,22 +24,17 @@ export function resolveExtensionDefinition( const { name, kind, namespace: _, ...rest } = definition; const namespace = context?.namespace ?? definition.namespace; - if (!namespace) { + const namePart = + name && namespace ? `${namespace}/${name}` : namespace || name; + if (!namePart) { throw new Error( - `Extension must declare an explicit namespace as it could not be resolved from context, name=${name} kind=${kind}`, + `Extension must declare an explicit namespace or name as it could not be resolved from context, kind=${kind} namespace=${namespace} name=${name}`, ); } - let id; - if (kind && name) { - id = `${kind}:${namespace}/${name}`; // nav-item:catalog/index - } else if (kind) { - id = `${kind}:${namespace}`; // nav-item:search - } else if (name) { - id = `${namespace}/${name}`; // core/nav - } else { - id = namespace; // core - } - - return { id, ...rest, $$type: '@backstage/Extension' }; + return { + ...rest, + id: kind ? `${kind}:${namePart}` : namePart, + $$type: '@backstage/Extension', + }; } diff --git a/packages/frontend-test-utils/src/app/createExtensionTester.ts b/packages/frontend-test-utils/src/app/createExtensionTester.ts index b6d6542818..257a47439c 100644 --- a/packages/frontend-test-utils/src/app/createExtensionTester.ts +++ b/packages/frontend-test-utils/src/app/createExtensionTester.ts @@ -49,7 +49,7 @@ export class ExtensionTester { ): ExtensionTester { const withNamespace = { ...extension, - namespace: extension.namespace ?? 'test', + name: !extension.namespace && !extension.name ? 'test' : extension.name, }; this.#extensions.push({ id: resolveExtensionDefinition(withNamespace).id,