diff --git a/.changeset/move-extension-factory-middleware-app-api.md b/.changeset/move-extension-factory-middleware-app-api.md new file mode 100644 index 0000000000..6cc77a5d26 --- /dev/null +++ b/.changeset/move-extension-factory-middleware-app-api.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': patch +--- + +Added the `ExtensionFactoryMiddleware` type as a public export. diff --git a/.changeset/move-extension-factory-middleware-plugin-api.md b/.changeset/move-extension-factory-middleware-plugin-api.md new file mode 100644 index 0000000000..607da295a3 --- /dev/null +++ b/.changeset/move-extension-factory-middleware-plugin-api.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-plugin-api': patch +--- + +Deprecated the `ExtensionFactoryMiddleware` type, which has been moved to `@backstage/frontend-app-api`. diff --git a/packages/frontend-app-api/report.api.md b/packages/frontend-app-api/report.api.md index 47677b8916..bf69cc83e6 100644 --- a/packages/frontend-app-api/report.api.md +++ b/packages/frontend-app-api/report.api.md @@ -4,10 +4,13 @@ ```ts import { ApiHolder } from '@backstage/core-plugin-api'; +import { ApiHolder as ApiHolder_2 } from '@backstage/frontend-plugin-api'; import { AppNode } from '@backstage/frontend-plugin-api'; import { AppTree } from '@backstage/frontend-plugin-api'; import { ConfigApi } from '@backstage/core-plugin-api'; -import { ExtensionFactoryMiddleware } from '@backstage/frontend-plugin-api'; +import { ExtensionDataContainer } from '@backstage/frontend-plugin-api'; +import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionDataValue } from '@backstage/frontend-plugin-api'; import { ExternalRouteRef } from '@backstage/frontend-plugin-api'; import { FrontendFeature } from '@backstage/frontend-plugin-api'; import { FrontendPlugin } from '@backstage/frontend-plugin-api'; @@ -176,6 +179,18 @@ export type CreateSpecializedAppOptions = { }; }; +// @public (undocumented) +export type ExtensionFactoryMiddleware = ( + originalFactory: (contextOverrides?: { + config?: JsonObject; + }) => ExtensionDataContainer, + context: { + node: AppNode; + apis: ApiHolder_2; + config?: JsonObject; + }, +) => Iterable>; + // @public export type FrontendPluginInfoResolver = (ctx: { packageJson(): Promise; diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts index b1da35313e..fcef41daec 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts @@ -19,7 +19,6 @@ import { Extension, ExtensionDataRef, ExtensionDefinition, - ExtensionFactoryMiddleware, ExtensionInput, PortableSchema, ResolvedExtensionInput, @@ -29,6 +28,7 @@ import { createExtensionInput, createFrontendPlugin, } from '@backstage/frontend-plugin-api'; +import { ExtensionFactoryMiddleware } from '../wiring/types'; import { createAppNodeInstance, instantiateAppNodeTree, diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts index 070cf1d687..9e8e3cc2eb 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts @@ -18,10 +18,10 @@ import { ApiHolder, ExtensionDataContainer, ExtensionDataRef, - ExtensionFactoryMiddleware, ExtensionInput, ResolvedExtensionInputs, } from '@backstage/frontend-plugin-api'; +import { ExtensionFactoryMiddleware } from '../wiring/types'; import mapValues from 'lodash/mapValues'; import { AppNode, AppNodeInstance } from '@backstage/frontend-plugin-api'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports diff --git a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx index a5195d853c..680ba6dce5 100644 --- a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx +++ b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx @@ -29,9 +29,9 @@ import { createApiFactory, routeResolutionApiRef, AppNode, - ExtensionFactoryMiddleware, FrontendFeature, } from '@backstage/frontend-plugin-api'; +import { ExtensionFactoryMiddleware } from './types'; import { AnyApiFactory, ApiHolder, diff --git a/packages/frontend-app-api/src/wiring/index.ts b/packages/frontend-app-api/src/wiring/index.ts index 1e18859ddd..cae2117df5 100644 --- a/packages/frontend-app-api/src/wiring/index.ts +++ b/packages/frontend-app-api/src/wiring/index.ts @@ -20,3 +20,4 @@ export { } from './createSpecializedApp'; export { type FrontendPluginInfoResolver } from './createPluginInfoAttacher'; export { type AppError, type AppErrorTypes } from './createErrorCollector'; +export { type ExtensionFactoryMiddleware } from './types'; diff --git a/packages/frontend-app-api/src/wiring/types.ts b/packages/frontend-app-api/src/wiring/types.ts new file mode 100644 index 0000000000..0bb7497179 --- /dev/null +++ b/packages/frontend-app-api/src/wiring/types.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { JsonObject } from '@backstage/types'; +import { + ApiHolder, + AppNode, + ExtensionDataContainer, + ExtensionDataRef, + ExtensionDataValue, +} from '@backstage/frontend-plugin-api'; + +/** @public */ +export type ExtensionFactoryMiddleware = ( + originalFactory: (contextOverrides?: { + config?: JsonObject; + }) => ExtensionDataContainer, + context: { + node: AppNode; + apis: ApiHolder; + config?: JsonObject; + }, +) => Iterable>; diff --git a/packages/frontend-defaults/report.api.md b/packages/frontend-defaults/report.api.md index cfe4f55b2d..72bd0d785e 100644 --- a/packages/frontend-defaults/report.api.md +++ b/packages/frontend-defaults/report.api.md @@ -8,7 +8,7 @@ import { AppErrorTypes } from '@backstage/frontend-app-api'; import { Config } from '@backstage/config'; import { ConfigApi } from '@backstage/frontend-plugin-api'; import { CreateAppRouteBinder } from '@backstage/frontend-app-api'; -import { ExtensionFactoryMiddleware } from '@backstage/frontend-plugin-api'; +import { ExtensionFactoryMiddleware } from '@backstage/frontend-app-api'; import { FrontendFeature } from '@backstage/frontend-plugin-api'; import { FrontendFeatureLoader } from '@backstage/frontend-plugin-api'; import { FrontendPluginInfoResolver } from '@backstage/frontend-app-api'; diff --git a/packages/frontend-defaults/src/createApp.tsx b/packages/frontend-defaults/src/createApp.tsx index fe96b50e31..220a7b743f 100644 --- a/packages/frontend-defaults/src/createApp.tsx +++ b/packages/frontend-defaults/src/createApp.tsx @@ -18,7 +18,6 @@ import { JSX, lazy, ReactNode, Suspense } from 'react'; import { ConfigApi, coreExtensionData, - ExtensionFactoryMiddleware, FrontendFeature, FrontendFeatureLoader, } from '@backstage/frontend-plugin-api'; @@ -31,6 +30,7 @@ import { ConfigReader } from '@backstage/config'; import { CreateAppRouteBinder, createSpecializedApp, + ExtensionFactoryMiddleware, FrontendPluginInfoResolver, } from '@backstage/frontend-app-api'; import appPlugin from '@backstage/plugin-app'; diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index 15450efbdd..0ce1c78757 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -1215,7 +1215,7 @@ export type ExtensionDefinitionParameters = { params?: object | ExtensionBlueprintDefineParams; }; -// @public (undocumented) +// @public @deprecated (undocumented) export type ExtensionFactoryMiddleware = ( originalFactory: (contextOverrides?: { config?: JsonObject; diff --git a/packages/frontend-plugin-api/src/wiring/types.ts b/packages/frontend-plugin-api/src/wiring/types.ts index 0b59e7a7fb..d462803820 100644 --- a/packages/frontend-plugin-api/src/wiring/types.ts +++ b/packages/frontend-plugin-api/src/wiring/types.ts @@ -60,7 +60,10 @@ export type ExtensionDataContainer = : never; }; -/** @public */ +/** + * @public + * @deprecated Moved to {@link @backstage/frontend-app-api#ExtensionFactoryMiddleware} + */ export type ExtensionFactoryMiddleware = ( originalFactory: (contextOverrides?: { config?: JsonObject;