diff --git a/.changeset/cold-birds-attack.md b/.changeset/cold-birds-attack.md new file mode 100644 index 0000000000..95990c5097 --- /dev/null +++ b/.changeset/cold-birds-attack.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-api': patch +--- + +Allow elements to be used multiple times in the app element tree. diff --git a/packages/core-api/src/extensions/traversal.ts b/packages/core-api/src/extensions/traversal.ts index bdf02d16c8..4431bbd24c 100644 --- a/packages/core-api/src/extensions/traversal.ts +++ b/packages/core-api/src/extensions/traversal.ts @@ -37,7 +37,6 @@ export function traverseElementTree(options: { discoverers: Discoverer[]; collectors: { [name in keyof Results]: Collector }; }): Results { - const visited = new Set(); const collectors: { [name in string]: ReturnType>; } = {}; @@ -74,14 +73,6 @@ export function traverseElementTree(options: { if (!isValidElement(element)) { return; } - if (visited.has(element)) { - const anyType = element?.type as - | { displayName?: string; name?: string } - | undefined; - const name = anyType?.displayName || anyType?.name || String(anyType); - throw new Error(`Visited element ${name} twice`); - } - visited.add(element); const nextContexts: QueueItem['contexts'] = {}; diff --git a/packages/core-api/src/routing/collectors.test.tsx b/packages/core-api/src/routing/collectors.test.tsx index 44d53856b4..cd3e378fff 100644 --- a/packages/core-api/src/routing/collectors.test.tsx +++ b/packages/core-api/src/routing/collectors.test.tsx @@ -353,24 +353,4 @@ describe('discovery', () => { }); }).toThrow('Mounted routable extension must have a path'); }); - - it('should not visit the same element twice', () => { - const element = ; - - expect(() => - traverseElementTree({ - root: ( - - {element} - {element} - - ), - discoverers: [childDiscoverer, routeElementDiscoverer], - collectors: { - routes: routePathCollector, - routeParents: routeParentCollector, - }, - }), - ).toThrow(`Visited element Extension(Component) twice`); - }); });