frontend-plugin-api: allow extensions to only define a name

Co-authored-by: Camila Belo <camilaibs@gmail.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2023-11-22 16:24:04 +01:00
parent 933dc2d7f6
commit 082eccf5ad
3 changed files with 13 additions and 18 deletions
@@ -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<unknown>),
).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<unknown>),
).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',
);
});
});
@@ -24,22 +24,17 @@ export function resolveExtensionDefinition<TConfig>(
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',
};
}
@@ -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,