From 7d87b4f6ad1c7c4a36dbd62a27c1130ca405344d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 20 Sep 2025 23:09:02 +0200 Subject: [PATCH] frontend-plugin-api: add OverridableExtensionDefinition Signed-off-by: Patrik Oldsberg --- .changeset/plenty-spiders-lead.md | 5 +++++ .../src/wiring/InternalExtensionDefinition.ts | 4 ++-- .../src/wiring/createExtension.ts | 21 ++++++++++++------- .../src/wiring/createExtensionBlueprint.ts | 10 ++++----- .../src/wiring/createFrontendPlugin.ts | 9 ++++++-- .../frontend-plugin-api/src/wiring/index.ts | 3 ++- 6 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 .changeset/plenty-spiders-lead.md diff --git a/.changeset/plenty-spiders-lead.md b/.changeset/plenty-spiders-lead.md new file mode 100644 index 0000000000..48db0d5522 --- /dev/null +++ b/.changeset/plenty-spiders-lead.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': minor +--- + +Renamed `ExtensionDefinition` to `OverridableExtensionDefinition` and introduced a slimmer `ExtensionDefinition` type that does not include override methods. The overridable type is generally used as an output type, while plain `ExtensionDefinition`s are used for input. This reduces type conflicts across different of `@backstage/frontend-plugin-api`, improving long-term compatibility. diff --git a/packages/frontend-internal/src/wiring/InternalExtensionDefinition.ts b/packages/frontend-internal/src/wiring/InternalExtensionDefinition.ts index 54953c169a..b7c3674f9a 100644 --- a/packages/frontend-internal/src/wiring/InternalExtensionDefinition.ts +++ b/packages/frontend-internal/src/wiring/InternalExtensionDefinition.ts @@ -20,7 +20,7 @@ import { ExtensionDefinitionAttachTo, ExtensionDataValue, ExtensionDataRef, - ExtensionDefinition, + OverridableExtensionDefinition, ExtensionDefinitionParameters, ExtensionInput, PortableSchema, @@ -29,7 +29,7 @@ import { import { OpaqueType } from '@internal/opaque'; export const OpaqueExtensionDefinition = OpaqueType.create<{ - public: ExtensionDefinition; + public: OverridableExtensionDefinition; versions: | { readonly version: 'v1'; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 0fec40f4c9..0268cadf51 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -233,12 +233,17 @@ type AnyParamsInput = ) => ReturnType>); /** @public */ -export type ExtensionDefinition< - T extends ExtensionDefinitionParameters = ExtensionDefinitionParameters, -> = { +export interface ExtensionDefinition< + TParams extends ExtensionDefinitionParameters = ExtensionDefinitionParameters, +> { $$type: '@backstage/ExtensionDefinition'; - readonly T: T; + readonly T: TParams; +} +/** @public */ +export interface OverridableExtensionDefinition< + T extends ExtensionDefinitionParameters = ExtensionDefinitionParameters, +> extends ExtensionDefinition { /** * References to the inputs of this extension, which can be used to attach child extensions. */ @@ -327,7 +332,7 @@ export type ExtensionDefinition< : UNewOutput, UFactoryOutput >, - ): ExtensionDefinition<{ + ): OverridableExtensionDefinition<{ kind: T['kind']; name: T['name']; output: ExtensionDataRef extends UNewOutput ? T['output'] : UNewOutput; @@ -346,7 +351,7 @@ export type ExtensionDefinition< }> >; }>; -}; +} /** * @internal @@ -425,7 +430,7 @@ export function createExtension< UFactoryOutput, UParentInputs >, -): ExtensionDefinition<{ +): OverridableExtensionDefinition<{ config: string extends keyof TConfigSchema ? {} : { @@ -638,7 +643,7 @@ export function createExtension< return deduplicatedResult.values(); }, - }) as ExtensionDefinition; + }) as OverridableExtensionDefinition; }, }); } diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts index f9a3731743..70b6209ae3 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.ts @@ -19,7 +19,7 @@ import { Expand } from '@backstage/types'; import { OpaqueType } from '@internal/opaque'; import { ExtensionDefinitionAttachTo, - ExtensionDefinition, + OverridableExtensionDefinition, ResolvedExtensionInputs, VerifyExtensionFactoryOutput, createExtension, @@ -226,7 +226,7 @@ export interface ExtensionBlueprint< : T['params'] extends ExtensionBlueprintDefineParams ? 'Error: This blueprint uses advanced parameter types and requires you to pass parameters as using the following callback syntax: `.make({ params: defineParams => defineParams() })`' : T['params']; - }): ExtensionDefinition<{ + }): OverridableExtensionDefinition<{ kind: T['kind']; name: string | undefined extends TName ? undefined : TName; config: T['config']; @@ -303,7 +303,7 @@ export interface ExtensionBlueprint< : UNewOutput, UFactoryOutput >; - }): ExtensionDefinition<{ + }): OverridableExtensionDefinition<{ config: (string extends keyof TExtensionConfigSchema ? {} : { @@ -514,7 +514,7 @@ export function createExtensionBlueprint< unwrapParams(args.params, ctx, defineParams, options.kind), ctx, ) as Iterable>, - }) as ExtensionDefinition; + }) as OverridableExtensionDefinition; }, makeWithOverrides(args) { return createExtension({ @@ -572,7 +572,7 @@ export function createExtensionBlueprint< }, ) as Iterable>; }, - }) as ExtensionDefinition; + }) as OverridableExtensionDefinition; }, } as ExtensionBlueprint<{ kind: TKind; diff --git a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts index 5555a0b47c..68b5826baa 100644 --- a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts @@ -18,7 +18,10 @@ import { OpaqueExtensionDefinition, OpaqueFrontendPlugin, } from '@internal/frontend'; -import { ExtensionDefinition } from './createExtension'; +import { + ExtensionDefinition, + OverridableExtensionDefinition, +} from './createExtension'; import { Extension, resolveExtensionDefinition, @@ -104,7 +107,9 @@ export interface OverridableFrontendPlugin< [id in string]: ExtensionDefinition; }, > extends FrontendPlugin { - getExtension(id: TId): TExtensionMap[TId]; + getExtension( + id: TId, + ): OverridableExtensionDefinition; withOverrides(options: { extensions: Array; diff --git a/packages/frontend-plugin-api/src/wiring/index.ts b/packages/frontend-plugin-api/src/wiring/index.ts index 1bbdf68b13..6ce1bb4998 100644 --- a/packages/frontend-plugin-api/src/wiring/index.ts +++ b/packages/frontend-plugin-api/src/wiring/index.ts @@ -15,12 +15,13 @@ */ export { coreExtensionData } from './coreExtensionData'; +export { createExtension } from './createExtension'; export { - createExtension, type ExtensionDefinition, type ExtensionDefinitionAttachTo, type ExtensionDefinitionParameters, type CreateExtensionOptions, + type OverridableExtensionDefinition, type ResolvedExtensionInput, type ResolvedExtensionInputs, } from './createExtension';