From 0d24c1fa3e3409a10542b37b9b465f2ed977e2e7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 27 Jul 2024 11:10:53 +0200 Subject: [PATCH] frontend-plugin-api: more fixes for new extension io structure Signed-off-by: Patrik Oldsberg --- .../src/wiring/createExtension.ts | 22 ++++---- .../wiring/createExtensionBlueprint.test.tsx | 8 +-- .../src/wiring/createExtensionInput.ts | 52 ++++++++++++------- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 6727a92419..4034ef7238 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -80,15 +80,15 @@ export type ExtensionDataContainer = * @public */ export type ResolvedExtensionInput< - TExtensionData extends AnyExtensionDataMap | AnyExtensionDataRef, -> = [TExtensionData] extends [AnyExtensionDataRef] + TExtensionInput extends ExtensionInput, +> = TExtensionInput['extensionData'] extends Array ? { node: AppNode; - } & ExtensionDataContainer - : TExtensionData extends AnyExtensionDataMap + } & ExtensionDataContainer + : TExtensionInput['extensionData'] extends AnyExtensionDataMap ? { node: AppNode; - output: ExtensionDataValues; + output: ExtensionDataValues; } : never; @@ -97,15 +97,15 @@ export type ResolvedExtensionInput< * @public */ export type ResolvedExtensionInputs< - TInputs extends { [name in string]: ExtensionInput }, + TInputs extends { + [name in string]: ExtensionInput | LegacyExtensionInput; + }, > = { [InputName in keyof TInputs]: false extends TInputs[InputName]['config']['singleton'] - ? Array>> + ? Array>> : false extends TInputs[InputName]['config']['optional'] - ? Expand> - : Expand< - ResolvedExtensionInput | undefined - >; + ? Expand> + : Expand | undefined>; }; /** diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx index cb8855d892..e4cb9e26f1 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx @@ -57,13 +57,7 @@ describe('createExtensionBlueprint', () => { name: 'my-extension', namespace: undefined, output: { - element: { - $$type: '@backstage/ExtensionDataRef', - config: {}, - id: 'core.reactElement', - optional: expect.any(Function), - toString: expect.any(Function), - }, + element: coreExtensionData.reactElement, }, factory: expect.any(Function), toString: expect.any(Function), diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts index 5627bdecc2..b7efb13e6e 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts @@ -23,7 +23,7 @@ export interface ExtensionInput< TConfig extends { singleton: boolean; optional: boolean }, > { $$type: '@backstage/ExtensionInput'; - extensionData: TExtensionData; + extensionData: Array; config: TConfig; } @@ -76,7 +76,7 @@ export function createExtensionInput< TExtensionDataMap extends AnyExtensionDataMap, TConfig extends { singleton?: boolean; optional?: boolean }, >( - extensionData: TExtensionData, + extensionData: Array | TExtensionDataMap, config?: TConfig, ): | LegacyExtensionInput< @@ -93,22 +93,24 @@ export function createExtensionInput< optional: TConfig['optional'] extends true ? true : false; } > { - if (Array.isArray(extensionData)) { - const seen = new Set(); - const duplicates = []; - for (const dataRef of extensionData) { - if (seen.has(dataRef.id)) { - duplicates.push(dataRef.id); - } else { - seen.add(dataRef.id); + if (process.env.NODE_ENV !== 'production') { + if (Array.isArray(extensionData)) { + const seen = new Set(); + const duplicates = []; + for (const dataRef of extensionData) { + if (seen.has(dataRef.id)) { + duplicates.push(dataRef.id); + } else { + seen.add(dataRef.id); + } + } + if (duplicates.length > 0) { + throw new Error( + `ExtensionInput may not have duplicate data refs: '${duplicates.join( + "', '", + )}'`, + ); } - } - if (duplicates.length > 0) { - throw new Error( - `ExtensionInput may not have duplicate data refs: '${duplicates.join( - "', '", - )}'`, - ); } } return { @@ -122,5 +124,19 @@ export function createExtensionInput< ? true : false, }, - }; + } as + | LegacyExtensionInput< + TExtensionDataMap, + { + singleton: TConfig['singleton'] extends true ? true : false; + optional: TConfig['optional'] extends true ? true : false; + } + > + | ExtensionInput< + TExtensionData, + { + singleton: TConfig['singleton'] extends true ? true : false; + optional: TConfig['optional'] extends true ? true : false; + } + >; }