frontend-plugin-api: add OverridableFrontendPlugin type

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2025-08-15 20:27:17 +02:00
parent a1127c8c93
commit 12b6db78eb
23 changed files with 103 additions and 67 deletions
+32 -17
View File
@@ -719,7 +719,7 @@ export function createFrontendPlugin<
TExtensions extends readonly ExtensionDefinition[] = [],
>(
options: PluginOptions<TId, TRoutes, TExternalRoutes, TExtensions>,
): FrontendPlugin<
): OverridableFrontendPlugin<
TRoutes,
TExternalRoutes,
MakeSortedExtensionsMap<TExtensions[number], TId>
@@ -880,7 +880,7 @@ export interface ExtensionBlueprint<
// (undocumented)
make<
TName extends string | undefined,
TParamsInput extends AnyParamsInput_2<NonNullable<T['params']>>,
TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,
>(args: {
name?: TName;
attachTo?: ExtensionAttachToSpec;
@@ -932,7 +932,7 @@ export interface ExtensionBlueprint<
};
factory(
originalFactory: <
TParamsInput extends AnyParamsInput_2<NonNullable<T['params']>>,
TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,
>(
params: TParamsInput extends ExtensionBlueprintDefineParams
? TParamsInput
@@ -1122,7 +1122,7 @@ export type ExtensionDefinition<
}
>;
},
TParamsInput extends AnyParamsInput<NonNullable<T['params']>>,
TParamsInput extends AnyParamsInput_2<NonNullable<T['params']>>,
>(
args: Expand<
{
@@ -1141,7 +1141,7 @@ export type ExtensionDefinition<
};
factory?(
originalFactory: <
TFactoryParamsReturn extends AnyParamsInput<
TFactoryParamsReturn extends AnyParamsInput_2<
NonNullable<T['params']>
>,
>(
@@ -1328,28 +1328,16 @@ export interface FrontendPlugin<
} = {
[name in string]: ExternalRouteRef;
},
TExtensionMap extends {
[id in string]: ExtensionDefinition;
} = {
[id in string]: ExtensionDefinition;
},
> {
// (undocumented)
readonly $$type: '@backstage/FrontendPlugin';
// (undocumented)
readonly externalRoutes: TExternalRoutes;
// (undocumented)
getExtension<TId extends keyof TExtensionMap>(id: TId): TExtensionMap[TId];
// (undocumented)
readonly id: string;
info(): Promise<FrontendPluginInfo>;
// (undocumented)
readonly routes: TRoutes;
// (undocumented)
withOverrides(options: {
extensions: Array<ExtensionDefinition>;
info?: FrontendPluginInfoOptions;
}): FrontendPlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
// @public
@@ -1530,6 +1518,33 @@ export { oneloginAuthApiRef };
export { OpenIdConnectApi };
// @public
export interface OverridableFrontendPlugin<
TRoutes extends {
[name in string]: RouteRef | SubRouteRef;
} = {
[name in string]: RouteRef | SubRouteRef;
},
TExternalRoutes extends {
[name in string]: ExternalRouteRef;
} = {
[name in string]: ExternalRouteRef;
},
TExtensionMap extends {
[id in string]: ExtensionDefinition;
} = {
[id in string]: ExtensionDefinition;
},
> extends FrontendPlugin<TRoutes, TExternalRoutes> {
// (undocumented)
getExtension<TId extends keyof TExtensionMap>(id: TId): TExtensionMap[TId];
// (undocumented)
withOverrides(options: {
extensions: Array<ExtensionDefinition>;
info?: FrontendPluginInfoOptions;
}): OverridableFrontendPlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
// @public
export const PageBlueprint: ExtensionBlueprint<{
kind: 'page';
@@ -88,8 +88,12 @@ export type FrontendPluginInfoOptions = {
manifest?: () => Promise<JsonObject>;
};
/** @public */
export interface FrontendPlugin<
/**
* A variant of the {@link FrontendPlugin} interface that can also be used to install overrides for the plugin.
*
* @public
*/
export interface OverridableFrontendPlugin<
TRoutes extends { [name in string]: RouteRef | SubRouteRef } = {
[name in string]: RouteRef | SubRouteRef;
},
@@ -99,6 +103,26 @@ export interface FrontendPlugin<
TExtensionMap extends { [id in string]: ExtensionDefinition } = {
[id in string]: ExtensionDefinition;
},
> extends FrontendPlugin<TRoutes, TExternalRoutes> {
getExtension<TId extends keyof TExtensionMap>(id: TId): TExtensionMap[TId];
withOverrides(options: {
extensions: Array<ExtensionDefinition>;
/**
* Overrides the original info loaders of the plugin one by one.
*/
info?: FrontendPluginInfoOptions;
}): OverridableFrontendPlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
/** @public */
export interface FrontendPlugin<
TRoutes extends { [name in string]: RouteRef | SubRouteRef } = {
[name in string]: RouteRef | SubRouteRef;
},
TExternalRoutes extends { [name in string]: ExternalRouteRef } = {
[name in string]: ExternalRouteRef;
},
> {
readonly $$type: '@backstage/FrontendPlugin';
readonly id: string;
@@ -109,15 +133,6 @@ export interface FrontendPlugin<
* Loads the plugin info.
*/
info(): Promise<FrontendPluginInfo>;
getExtension<TId extends keyof TExtensionMap>(id: TId): TExtensionMap[TId];
withOverrides(options: {
extensions: Array<ExtensionDefinition>;
/**
* Overrides the original info loaders of the plugin one by one.
*/
info?: FrontendPluginInfoOptions;
}): FrontendPlugin<TRoutes, TExternalRoutes, TExtensionMap>;
}
/** @public */
@@ -172,7 +187,7 @@ export function createFrontendPlugin<
TExtensions extends readonly ExtensionDefinition[] = [],
>(
options: PluginOptions<TId, TRoutes, TExternalRoutes, TExtensions>,
): FrontendPlugin<
): OverridableFrontendPlugin<
TRoutes,
TExternalRoutes,
MakeSortedExtensionsMap<TExtensions[number], TId>
@@ -39,6 +39,7 @@ export {
export {
createFrontendPlugin,
type FrontendPlugin,
type OverridableFrontendPlugin,
type PluginOptions,
type FrontendPluginInfo,
type FrontendPluginInfoOptions,