diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index 5bcaaba1fb..1fca11e482 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -17,7 +17,7 @@ import { createBackendPlugin, coreServices, } from '@backstage/backend-plugin-api'; -import { Entity, EntityPolicy } from '@backstage/catalog-model'; +import { Entity, EntityPolicy, Validators } from '@backstage/catalog-model'; import { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder'; import { CatalogAnalysisExtensionPoint, @@ -36,6 +36,7 @@ import { ScmLocationAnalyzer, } from '@backstage/plugin-catalog-node'; import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { merge } from 'lodash'; class CatalogProcessingExtensionPointImpl implements CatalogProcessingExtensionPoint @@ -128,28 +129,22 @@ class CatalogPermissionExtensionPointImpl class CatalogModelExtensionPointImpl implements CatalogModelExtensionPoint { #entityPolicies = new Array(); - #replaced = false; + #fieldValidators: Partial = {}; addEntityPolicies(...policies: Array>) { this.#entityPolicies.push(...policies.flat()); } - replaceEntityPolicies(...policies: Array) { - if (this.#replaced) { - throw new Error( - `You've already replaced the entity policies. If you want to add more entity policies, see 'addEntityPolicies'.`, - ); - } - this.#entityPolicies = [...policies]; - this.#replaced = true; + setFieldValidators(validators: Partial): void { + merge(this.#fieldValidators, validators); } get entityPolicies() { return this.#entityPolicies; } - get replaced() { - return this.#replaced; + get fieldValidators() { + return this.#fieldValidators; } } @@ -224,12 +219,8 @@ export const catalogPlugin = createBackendPlugin({ ); builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers); builder.addPermissionRules(...permissionExtensions.permissionRules); - - if (modelExtensions.replaced) { - builder.replaceEntityPolicies(modelExtensions.entityPolicies); - } else { - builder.addEntityPolicy(...modelExtensions.entityPolicies); - } + builder.addEntityPolicy(...modelExtensions.entityPolicies); + builder.setFieldFormatValidators(modelExtensions.fieldValidators); const { processingEngine, router } = await builder.build(); diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 7c63e51c69..004a46445e 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -15,7 +15,7 @@ */ import { createExtensionPoint } from '@backstage/backend-plugin-api'; -import { Entity, EntityPolicy } from '@backstage/catalog-model'; +import { Entity, EntityPolicy, Validators } from '@backstage/catalog-model'; import { CatalogProcessor, EntitiesSearchFilter, @@ -47,11 +47,22 @@ export interface CatalogProcessingExtensionPoint { /** @alpha */ export interface CatalogModelExtensionPoint { + /** + * @deprecated Use `policyToProcessorTransformer` from `@backstage/plugin-catalog-backend` + * and `CatalogProcessingExtensionPoint.addProcessor` instead. + */ addEntityPolicies( ...policies: Array> ): void; - replaceEntityPolicies(...policies: Array): void; + /** + * Sets the validator function to use for one or more special fields of an + * entity. This is useful if the default rules for formatting of fields are + * not sufficient. + * + * @param validators - The (subset of) validators to set + */ + setFieldValidators(validators: Partial): void; } /**