diff --git a/.changeset/orange-gorillas-clean.md b/.changeset/orange-gorillas-clean.md new file mode 100644 index 0000000000..d346adce6c --- /dev/null +++ b/.changeset/orange-gorillas-clean.md @@ -0,0 +1,26 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +'@backstage/plugin-tech-insights-node': patch +--- + +Move `FactRetrieverRegistry` and `PersistenceContext` to `@backstage/plugin-tech-insights-node`. + +Original exports are marked as deprecated and re-export the moved types. + +Please replace uses like + +```ts +import { + FactRetrieverRegistry, + PersistenceContext, +} from '@backstage/plugin-tech-insights-backend'; +``` + +with + +```ts +import { + FactRetrieverRegistry, + PersistenceContext, +} from '@backstage/plugin-tech-insights-node'; +``` diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index fd12dfed24..631e792141 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -13,14 +13,14 @@ import { FactCheckerFactory } from '@backstage/plugin-tech-insights-node'; import { FactLifecycle } from '@backstage/plugin-tech-insights-node'; import { FactRetriever } from '@backstage/plugin-tech-insights-node'; import { FactRetrieverRegistration } from '@backstage/plugin-tech-insights-node'; -import { FactSchema } from '@backstage/plugin-tech-insights-common'; +import { FactRetrieverRegistry as FactRetrieverRegistry_2 } from '@backstage/plugin-tech-insights-node'; import { HumanDuration } from '@backstage/types'; import { Logger } from 'winston'; +import { PersistenceContext as PersistenceContext_2 } from '@backstage/plugin-tech-insights-node'; import { PluginDatabaseManager } from '@backstage/backend-common'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { TechInsightCheck } from '@backstage/plugin-tech-insights-node'; -import { TechInsightsStore } from '@backstage/plugin-tech-insights-node'; import { TokenManager } from '@backstage/backend-common'; // @public @@ -64,30 +64,17 @@ export type FactRetrieverRegistrationOptions = { initialDelay?: Duration | HumanDuration; }; -// @public (undocumented) -export interface FactRetrieverRegistry { - // (undocumented) - get(retrieverReference: string): Promise; - // (undocumented) - getSchemas(): Promise; - // (undocumented) - listRegistrations(): Promise; - // (undocumented) - listRetrievers(): Promise; - // (undocumented) - register(registration: FactRetrieverRegistration): Promise; -} +// @public @deprecated (undocumented) +export type FactRetrieverRegistry = FactRetrieverRegistry_2; // @public export const initializePersistenceContext: ( database: PluginDatabaseManager, options?: PersistenceContextOptions, -) => Promise; +) => Promise; -// @public -export type PersistenceContext = { - techInsightsStore: TechInsightsStore; -}; +// @public @deprecated (undocumented) +export type PersistenceContext = PersistenceContext_2; // @public export type PersistenceContextOptions = { @@ -102,7 +89,7 @@ export interface RouterOptions< config: Config; factChecker?: FactChecker; logger: Logger; - persistenceContext: PersistenceContext; + persistenceContext: PersistenceContext_2; } // @public @@ -114,7 +101,7 @@ export type TechInsightsContext< CheckResultType extends CheckResult, > = { factChecker?: FactChecker; - persistenceContext: PersistenceContext; + persistenceContext: PersistenceContext_2; factRetrieverEngine: FactRetrieverEngine; }; @@ -130,11 +117,11 @@ export interface TechInsightsOptions< // (undocumented) discovery: PluginEndpointDiscovery; factCheckerFactory?: FactCheckerFactory; - factRetrieverRegistry?: FactRetrieverRegistry; + factRetrieverRegistry?: FactRetrieverRegistry_2; factRetrievers?: FactRetrieverRegistration[]; // (undocumented) logger: Logger; - persistenceContext?: PersistenceContext; + persistenceContext?: PersistenceContext_2; // (undocumented) scheduler: PluginTaskScheduler; // (undocumented) diff --git a/plugins/tech-insights-backend/src/deprecated.ts b/plugins/tech-insights-backend/src/deprecated.ts new file mode 100644 index 0000000000..1074e6f910 --- /dev/null +++ b/plugins/tech-insights-backend/src/deprecated.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2024 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 { + FactRetrieverRegistry as FactRetrieverRegistry_, + PersistenceContext as PersistenceContext_, +} from '@backstage/plugin-tech-insights-node'; + +/** + * @public + * @deprecated Use FactRetrieverRegistry from `@backstage/plugin-tech-insights-node` instead. + */ +export type FactRetrieverRegistry = FactRetrieverRegistry_; + +/** + * @public + * @deprecated Use PersistenceContext from `@backstage/plugin-tech-insights-node` instead. + */ +export type PersistenceContext = PersistenceContext_; diff --git a/plugins/tech-insights-backend/src/index.ts b/plugins/tech-insights-backend/src/index.ts index 2e87a53dfd..a582a04ebf 100644 --- a/plugins/tech-insights-backend/src/index.ts +++ b/plugins/tech-insights-backend/src/index.ts @@ -15,4 +15,5 @@ */ export { techInsightsPlugin as default } from './plugin'; +export * from './deprecated'; export * from './service'; diff --git a/plugins/tech-insights-backend/src/plugin/plugin.ts b/plugins/tech-insights-backend/src/plugin/plugin.ts index f443075a74..6da1ac1637 100644 --- a/plugins/tech-insights-backend/src/plugin/plugin.ts +++ b/plugins/tech-insights-backend/src/plugin/plugin.ts @@ -24,9 +24,13 @@ import { FactCheckerFactory, FactRetriever, FactRetrieverRegistration, + FactRetrieverRegistry, + PersistenceContext, TechInsightCheck, techInsightsFactCheckerFactoryExtensionPoint, + techInsightsFactRetrieverRegistryExtensionPoint, techInsightsFactRetrieversExtensionPoint, + techInsightsPersistenceContextExtensionPoint, } from '@backstage/plugin-tech-insights-node'; import { buildTechInsightsContext, @@ -57,6 +61,16 @@ export const techInsightsPlugin = createBackendPlugin({ }, }); + let factRetrieverRegistry: FactRetrieverRegistry | undefined = undefined; + env.registerExtensionPoint( + techInsightsFactRetrieverRegistryExtensionPoint, + { + setFactRetrieverRegistry(registry: FactRetrieverRegistry): void { + factRetrieverRegistry = registry; + }, + }, + ); + // initialized with built-in fact retrievers // only added as registration if there is config for them const addedFactRetrievers: Record = { @@ -72,6 +86,13 @@ export const techInsightsPlugin = createBackendPlugin({ }, }); + let persistenceContext: PersistenceContext | undefined = undefined; + env.registerExtensionPoint(techInsightsPersistenceContextExtensionPoint, { + setPersistenceContext(context: PersistenceContext): void { + persistenceContext = context; + }, + }); + env.registerInit({ deps: { config: coreServices.rootConfig, @@ -109,8 +130,10 @@ export const techInsightsPlugin = createBackendPlugin({ database, discovery, factCheckerFactory, + factRetrieverRegistry, factRetrievers, logger: winstonLogger, + persistenceContext, scheduler, tokenManager, }); diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts index 677b778b9b..3bbaf9edf5 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -17,11 +17,11 @@ import { FactRetriever, FactRetrieverRegistration, + FactRetrieverRegistry, FactSchemaDefinition, TechInsightFact, TechInsightsStore, } from '@backstage/plugin-tech-insights-node'; -import { FactRetrieverRegistry } from './FactRetrieverRegistry'; import { DefaultFactRetrieverEngine, FactRetrieverEngine, diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts index b723fcd7f5..04035ca8c7 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts @@ -18,10 +18,10 @@ import { FactRetriever, FactRetrieverContext, FactRetrieverRegistration, + FactRetrieverRegistry, TechInsightFact, TechInsightsStore, } from '@backstage/plugin-tech-insights-node'; -import { FactRetrieverRegistry } from './FactRetrieverRegistry'; import { Logger } from 'winston'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Duration } from 'luxon'; diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 8796f1511a..42caca6b20 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -17,22 +17,11 @@ import { FactRetriever, FactRetrieverRegistration, + FactRetrieverRegistry, } from '@backstage/plugin-tech-insights-node'; import { FactSchema } from '@backstage/plugin-tech-insights-common'; import { ConflictError, NotFoundError } from '@backstage/errors'; -/** - * @public - * - */ -export interface FactRetrieverRegistry { - register(registration: FactRetrieverRegistration): Promise; - get(retrieverReference: string): Promise; - listRetrievers(): Promise; - listRegistrations(): Promise; - getSchemas(): Promise; -} - /** * A basic in memory fact retriever registry. * diff --git a/plugins/tech-insights-backend/src/service/fact/index.ts b/plugins/tech-insights-backend/src/service/fact/index.ts index 0eeb498481..b3df648a8e 100644 --- a/plugins/tech-insights-backend/src/service/fact/index.ts +++ b/plugins/tech-insights-backend/src/service/fact/index.ts @@ -17,5 +17,4 @@ export { createFactRetrieverRegistration } from './createFactRetriever'; export type { FactRetrieverRegistrationOptions } from './createFactRetriever'; export type { FactRetrieverEngine } from './FactRetrieverEngine'; -export type { FactRetrieverRegistry } from './FactRetrieverRegistry'; export * from './factRetrievers'; diff --git a/plugins/tech-insights-backend/src/service/persistence/index.ts b/plugins/tech-insights-backend/src/service/persistence/index.ts index 64cc876026..d87f91e1b0 100644 --- a/plugins/tech-insights-backend/src/service/persistence/index.ts +++ b/plugins/tech-insights-backend/src/service/persistence/index.ts @@ -15,7 +15,4 @@ */ export { initializePersistenceContext } from './persistenceContext'; -export type { - PersistenceContext, - PersistenceContextOptions, -} from './persistenceContext'; +export type { PersistenceContextOptions } from './persistenceContext'; diff --git a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts index 07badb038c..3ddae3197f 100644 --- a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts +++ b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts @@ -20,22 +20,13 @@ import { } from '@backstage/backend-common'; import { Logger } from 'winston'; import { TechInsightsDatabase } from './TechInsightsDatabase'; -import { TechInsightsStore } from '@backstage/plugin-tech-insights-node'; +import { PersistenceContext } from '@backstage/plugin-tech-insights-node'; const migrationsDir = resolvePackagePath( '@backstage/plugin-tech-insights-backend', 'migrations', ); -/** - * A Container for persistence related components in TechInsights - * - * @public - */ -export type PersistenceContext = { - techInsightsStore: TechInsightsStore; -}; - /** * A Container for persistence context initialization options * diff --git a/plugins/tech-insights-backend/src/service/router.test.ts b/plugins/tech-insights-backend/src/service/router.test.ts index 6935338a56..bf4313748f 100644 --- a/plugins/tech-insights-backend/src/service/router.test.ts +++ b/plugins/tech-insights-backend/src/service/router.test.ts @@ -24,8 +24,10 @@ import { import { ConfigReader } from '@backstage/config'; import request from 'supertest'; import express from 'express'; -import { PersistenceContext } from './persistence/persistenceContext'; -import { TechInsightsStore } from '@backstage/plugin-tech-insights-node'; +import { + PersistenceContext, + TechInsightsStore, +} from '@backstage/plugin-tech-insights-node'; import { DateTime } from 'luxon'; import { Knex } from 'knex'; import { TaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/tech-insights-backend/src/service/router.ts b/plugins/tech-insights-backend/src/service/router.ts index 5e58df1b20..53c1351ffa 100644 --- a/plugins/tech-insights-backend/src/service/router.ts +++ b/plugins/tech-insights-backend/src/service/router.ts @@ -19,13 +19,13 @@ import Router from 'express-promise-router'; import { Config } from '@backstage/config'; import { FactChecker, + PersistenceContext, TechInsightCheck, } from '@backstage/plugin-tech-insights-node'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { Logger } from 'winston'; import { DateTime } from 'luxon'; -import { PersistenceContext } from './persistence/persistenceContext'; import { CompoundEntityRef, parseEntityRef, diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts index 20693d0a7d..4f49e0031b 100644 --- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts +++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts @@ -19,10 +19,7 @@ import { FactRetrieverEngine, } from './fact/FactRetrieverEngine'; import { Logger } from 'winston'; -import { - DefaultFactRetrieverRegistry, - FactRetrieverRegistry, -} from './fact/FactRetrieverRegistry'; +import { DefaultFactRetrieverRegistry } from './fact/FactRetrieverRegistry'; import { Config } from '@backstage/config'; import { PluginDatabaseManager, @@ -33,12 +30,11 @@ import { FactChecker, FactCheckerFactory, FactRetrieverRegistration, + FactRetrieverRegistry, + PersistenceContext, TechInsightCheck, } from '@backstage/plugin-tech-insights-node'; -import { - initializePersistenceContext, - PersistenceContext, -} from './persistence/persistenceContext'; +import { initializePersistenceContext } from './persistence'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; import { PluginTaskScheduler } from '@backstage/backend-tasks'; diff --git a/plugins/tech-insights-node/api-report.md b/plugins/tech-insights-node/api-report.md index 0d0d835b95..13056b5eaa 100644 --- a/plugins/tech-insights-node/api-report.md +++ b/plugins/tech-insights-node/api-report.md @@ -80,6 +80,20 @@ export type FactRetrieverRegistration = { initialDelay?: Duration | HumanDuration; }; +// @public (undocumented) +export interface FactRetrieverRegistry { + // (undocumented) + get(retrieverReference: string): Promise; + // (undocumented) + getSchemas(): Promise; + // (undocumented) + listRegistrations(): Promise; + // (undocumented) + listRetrievers(): Promise; + // (undocumented) + register(registration: FactRetrieverRegistration): Promise; +} + // @public export type FactSchemaDefinition = Omit; @@ -93,6 +107,11 @@ export type MaxItems = { maxItems: number; }; +// @public +export type PersistenceContext = { + techInsightsStore: TechInsightsStore; +}; + // @public export interface TechInsightCheck { description: string; @@ -152,6 +171,15 @@ export interface TechInsightsFactCheckerFactoryExtensionPoint { // @public export const techInsightsFactCheckerFactoryExtensionPoint: ExtensionPoint; +// @public (undocumented) +export interface TechInsightsFactRetrieverRegistryExtensionPoint { + // (undocumented) + setFactRetrieverRegistry(registry: FactRetrieverRegistry): void; +} + +// @public +export const techInsightsFactRetrieverRegistryExtensionPoint: ExtensionPoint; + // @public (undocumented) export interface TechInsightsFactRetrieversExtensionPoint { // (undocumented) @@ -161,6 +189,15 @@ export interface TechInsightsFactRetrieversExtensionPoint { // @public export const techInsightsFactRetrieversExtensionPoint: ExtensionPoint; +// @public (undocumented) +export interface TechInsightsPersistenceContextExtensionPoint { + // (undocumented) + setPersistenceContext(context: PersistenceContext): void; +} + +// @public +export const techInsightsPersistenceContextExtensionPoint: ExtensionPoint; + // @public export interface TechInsightsStore { getFactsBetweenTimestampsByIds( diff --git a/plugins/tech-insights-node/src/extensionPoints.ts b/plugins/tech-insights-node/src/extensionPoints.ts index 527aac7d5d..e1f581a840 100644 --- a/plugins/tech-insights-node/src/extensionPoints.ts +++ b/plugins/tech-insights-node/src/extensionPoints.ts @@ -16,8 +16,9 @@ import { createExtensionPoint } from '@backstage/backend-plugin-api'; import { CheckResult } from '@backstage/plugin-tech-insights-common'; -import { FactRetriever } from './facts'; import { FactCheckerFactory, TechInsightCheck } from './checks'; +import { FactRetriever, FactRetrieverRegistry } from './facts'; +import { PersistenceContext } from './persistence'; /** * @public @@ -57,3 +58,37 @@ export const techInsightsFactCheckerFactoryExtensionPoint = createExtensionPoint({ id: 'tech-insights.fact-checker-factory', }); + +/** + * @public + */ +export interface TechInsightsFactRetrieverRegistryExtensionPoint { + setFactRetrieverRegistry(registry: FactRetrieverRegistry): void; +} + +/** + * An extension point that allows other plugins or modules to set a custom FactRetrieverRegistry. + * + * @public + */ +export const techInsightsFactRetrieverRegistryExtensionPoint = + createExtensionPoint({ + id: 'tech-insights.fact-retriever-registry', + }); + +/** + * @public + */ +export interface TechInsightsPersistenceContextExtensionPoint { + setPersistenceContext(context: PersistenceContext): void; +} + +/** + * An extension point that allows other plugins or modules to set a custom PersistenceContext. + * + * @public + */ +export const techInsightsPersistenceContextExtensionPoint = + createExtensionPoint({ + id: 'tech-insights.persistence-context', + }); diff --git a/plugins/tech-insights-node/src/facts.ts b/plugins/tech-insights-node/src/facts.ts index b35ad756ed..9257ea789e 100644 --- a/plugins/tech-insights-node/src/facts.ts +++ b/plugins/tech-insights-node/src/facts.ts @@ -230,3 +230,14 @@ export type FactRetrieverRegistration = { */ initialDelay?: Duration | HumanDuration; }; + +/** + * @public + */ +export interface FactRetrieverRegistry { + register(registration: FactRetrieverRegistration): Promise; + get(retrieverReference: string): Promise; + listRetrievers(): Promise; + listRegistrations(): Promise; + getSchemas(): Promise; +} diff --git a/plugins/tech-insights-node/src/persistence.ts b/plugins/tech-insights-node/src/persistence.ts index 73abb6c5af..391d23bae5 100644 --- a/plugins/tech-insights-node/src/persistence.ts +++ b/plugins/tech-insights-node/src/persistence.ts @@ -22,6 +22,15 @@ import { import { DateTime } from 'luxon'; import { FactSchema } from '@backstage/plugin-tech-insights-common'; +/** + * A Container for persistence related components in TechInsights + * + * @public + */ +export type PersistenceContext = { + techInsightsStore: TechInsightsStore; +}; + /** * TechInsights Database *