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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user