@backstage/plugin-catalog-backend 1.18.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage/plugin-catalog-backend
2
2
 
3
+ ## 1.19.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9c7fb30: Added the ability to inject custom permissions from modules, on `CatalogBuilder` and `CatalogPermissionExtensionPoint`
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @backstage/plugin-catalog-node@1.9.0
13
+ - @backstage/plugin-search-backend-module-catalog@0.1.19
14
+
3
15
  ## 1.18.0
4
16
 
5
17
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-backend",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "main": "../dist/alpha.cjs.js",
5
5
  "types": "../dist/alpha.d.ts"
6
6
  }
package/dist/alpha.cjs.js CHANGED
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var alpha = require('@backstage/plugin-catalog-common/alpha');
6
6
  var pluginPermissionNode = require('@backstage/plugin-permission-node');
7
- var CatalogBuilder = require('./cjs/CatalogBuilder-0288ac0b.cjs.js');
7
+ var CatalogBuilder = require('./cjs/CatalogBuilder-B30bgu7A.cjs.js');
8
8
  var backendPluginApi = require('@backstage/backend-plugin-api');
9
9
  var alpha$1 = require('@backstage/plugin-catalog-node/alpha');
10
10
  var backendCommon = require('@backstage/backend-common');
@@ -65,7 +65,7 @@ var __privateSet = (obj, member, value, setter) => {
65
65
  setter ? setter.call(obj, value) : member.set(obj, value);
66
66
  return value;
67
67
  };
68
- var _processors, _entityProviders, _placeholderResolvers, _onProcessingErrorHandler, _locationAnalyzers, _permissionRules, _fieldValidators, _entityDataParser;
68
+ var _processors, _entityProviders, _placeholderResolvers, _onProcessingErrorHandler, _locationAnalyzers, _permissions, _permissionRules, _fieldValidators, _entityDataParser;
69
69
  class CatalogProcessingExtensionPointImpl {
70
70
  constructor() {
71
71
  __privateAdd(this, _processors, new Array());
@@ -120,15 +120,23 @@ class CatalogAnalysisExtensionPointImpl {
120
120
  _locationAnalyzers = new WeakMap();
121
121
  class CatalogPermissionExtensionPointImpl {
122
122
  constructor() {
123
+ __privateAdd(this, _permissions, new Array());
123
124
  __privateAdd(this, _permissionRules, new Array());
124
125
  }
126
+ addPermissions(...permission) {
127
+ __privateGet(this, _permissions).push(...permission.flat());
128
+ }
125
129
  addPermissionRules(...rules) {
126
130
  __privateGet(this, _permissionRules).push(...rules.flat());
127
131
  }
132
+ get permissions() {
133
+ return __privateGet(this, _permissions);
134
+ }
128
135
  get permissionRules() {
129
136
  return __privateGet(this, _permissionRules);
130
137
  }
131
138
  }
139
+ _permissions = new WeakMap();
132
140
  _permissionRules = new WeakMap();
133
141
  class CatalogModelExtensionPointImpl {
134
142
  constructor() {
@@ -228,6 +236,7 @@ const catalogPlugin = backendPluginApi.createBackendPlugin({
228
236
  ([key, resolver]) => builder.setPlaceholderResolver(key, resolver)
229
237
  );
230
238
  builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers);
239
+ builder.addPermissions(...permissionExtensions.permissions);
231
240
  builder.addPermissionRules(...permissionExtensions.permissionRules);
232
241
  builder.setFieldFormatValidators(modelExtensions.fieldValidators);
233
242
  const { processingEngine, router } = await builder.build();
@@ -243,5 +252,5 @@ exports.createCatalogPermissionRule = CatalogBuilder.createCatalogPermissionRule
243
252
  exports.permissionRules = CatalogBuilder.permissionRules;
244
253
  exports.catalogConditions = catalogConditions;
245
254
  exports.createCatalogConditionalDecision = createCatalogConditionalDecision;
246
- exports["default"] = catalogPlugin;
255
+ exports.default = catalogPlugin;
247
256
  //# sourceMappingURL=alpha.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.cjs.js","sources":["../src/permissions/conditionExports.ts","../src/service/CatalogPlugin.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RESOURCE_TYPE_CATALOG_ENTITY } from '@backstage/plugin-catalog-common/alpha';\nimport { createConditionExports } from '@backstage/plugin-permission-node';\nimport { permissionRules } from './rules';\n\nconst { conditions, createConditionalDecision } = createConditionExports({\n pluginId: 'catalog',\n resourceType: RESOURCE_TYPE_CATALOG_ENTITY,\n rules: permissionRules,\n});\n\n/**\n * These conditions are used when creating conditional decisions for catalog\n * entities that are returned by authorization policies.\n *\n * @alpha\n */\nexport const catalogConditions = conditions;\n\n/**\n * `createCatalogConditionalDecision` can be used when authoring policies to\n * create conditional decisions. It requires a permission of type\n * `ResourcePermission<'catalog-entity'>` to be passed as the first parameter.\n * It's recommended that you use the provided `isResourcePermission` and\n * `isPermission` helper methods to narrow the type of the permission passed to\n * the handle method as shown below.\n *\n * ```\n * // MyAuthorizationPolicy.ts\n * ...\n * import { createCatalogPolicyDecision } from '@backstage/plugin-catalog-backend';\n * import { RESOURCE_TYPE_CATALOG_ENTITY } from '@backstage/plugin-catalog-common';\n *\n * class MyAuthorizationPolicy implements PermissionPolicy {\n * async handle(request, user) {\n * ...\n *\n * if (isResourcePermission(request.permission, RESOURCE_TYPE_CATALOG_ENTITY)) {\n * return createCatalogConditionalDecision(\n * request.permission,\n * { anyOf: [...insert conditions here...] }\n * );\n * }\n *\n * ...\n * }\n * ```\n *\n * @alpha\n */\nexport const createCatalogConditionalDecision = createConditionalDecision;\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createBackendPlugin,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { Entity, Validators } from '@backstage/catalog-model';\nimport { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder';\nimport {\n CatalogAnalysisExtensionPoint,\n catalogAnalysisExtensionPoint,\n CatalogProcessingExtensionPoint,\n catalogProcessingExtensionPoint,\n CatalogPermissionExtensionPoint,\n catalogPermissionExtensionPoint,\n CatalogModelExtensionPoint,\n catalogModelExtensionPoint,\n} from '@backstage/plugin-catalog-node/alpha';\nimport {\n CatalogProcessor,\n CatalogProcessorParser,\n EntityProvider,\n PlaceholderResolver,\n ScmLocationAnalyzer,\n} from '@backstage/plugin-catalog-node';\nimport { loggerToWinstonLogger } from '@backstage/backend-common';\nimport { merge } from 'lodash';\n\nclass CatalogProcessingExtensionPointImpl\n implements CatalogProcessingExtensionPoint\n{\n #processors = new Array<CatalogProcessor>();\n #entityProviders = new Array<EntityProvider>();\n #placeholderResolvers: Record<string, PlaceholderResolver> = {};\n #onProcessingErrorHandler?: (event: {\n unprocessedEntity: Entity;\n errors: Error[];\n }) => Promise<void> | void;\n\n addProcessor(\n ...processors: Array<CatalogProcessor | Array<CatalogProcessor>>\n ): void {\n this.#processors.push(...processors.flat());\n }\n\n addEntityProvider(\n ...providers: Array<EntityProvider | Array<EntityProvider>>\n ): void {\n this.#entityProviders.push(...providers.flat());\n }\n\n addPlaceholderResolver(key: string, resolver: PlaceholderResolver) {\n if (key in this.#placeholderResolvers)\n throw new Error(\n `A placeholder resolver for '${key}' has already been set up, please check your config.`,\n );\n this.#placeholderResolvers[key] = resolver;\n }\n\n setOnProcessingErrorHandler(\n handler: (event: {\n unprocessedEntity: Entity;\n errors: Error[];\n }) => Promise<void> | void,\n ) {\n this.#onProcessingErrorHandler = handler;\n }\n\n get processors() {\n return this.#processors;\n }\n\n get entityProviders() {\n return this.#entityProviders;\n }\n\n get placeholderResolvers() {\n return this.#placeholderResolvers;\n }\n\n get onProcessingErrorHandler() {\n return this.#onProcessingErrorHandler;\n }\n}\n\nclass CatalogAnalysisExtensionPointImpl\n implements CatalogAnalysisExtensionPoint\n{\n #locationAnalyzers = new Array<ScmLocationAnalyzer>();\n\n addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void {\n this.#locationAnalyzers.push(analyzer);\n }\n\n get locationAnalyzers() {\n return this.#locationAnalyzers;\n }\n}\n\nclass CatalogPermissionExtensionPointImpl\n implements CatalogPermissionExtensionPoint\n{\n #permissionRules = new Array<CatalogPermissionRuleInput>();\n\n addPermissionRules(\n ...rules: Array<\n CatalogPermissionRuleInput | Array<CatalogPermissionRuleInput>\n >\n ): void {\n this.#permissionRules.push(...rules.flat());\n }\n\n get permissionRules() {\n return this.#permissionRules;\n }\n}\n\nclass CatalogModelExtensionPointImpl implements CatalogModelExtensionPoint {\n #fieldValidators: Partial<Validators> = {};\n\n setFieldValidators(validators: Partial<Validators>): void {\n merge(this.#fieldValidators, validators);\n }\n\n get fieldValidators() {\n return this.#fieldValidators;\n }\n\n #entityDataParser?: CatalogProcessorParser;\n\n setEntityDataParser(parser: CatalogProcessorParser): void {\n if (this.#entityDataParser) {\n throw new Error(\n 'Attempted to install second EntityDataParser. Only one can be set.',\n );\n }\n this.#entityDataParser = parser;\n }\n\n get entityDataParser() {\n return this.#entityDataParser;\n }\n}\n\n/**\n * Catalog plugin\n * @alpha\n */\nexport const catalogPlugin = createBackendPlugin({\n pluginId: 'catalog',\n register(env) {\n const processingExtensions = new CatalogProcessingExtensionPointImpl();\n // plugins depending on this API will be initialized before this plugins init method is executed.\n env.registerExtensionPoint(\n catalogProcessingExtensionPoint,\n processingExtensions,\n );\n\n const analysisExtensions = new CatalogAnalysisExtensionPointImpl();\n env.registerExtensionPoint(\n catalogAnalysisExtensionPoint,\n analysisExtensions,\n );\n\n const permissionExtensions = new CatalogPermissionExtensionPointImpl();\n env.registerExtensionPoint(\n catalogPermissionExtensionPoint,\n permissionExtensions,\n );\n\n const modelExtensions = new CatalogModelExtensionPointImpl();\n env.registerExtensionPoint(catalogModelExtensionPoint, modelExtensions);\n\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n reader: coreServices.urlReader,\n permissions: coreServices.permissions,\n database: coreServices.database,\n httpRouter: coreServices.httpRouter,\n lifecycle: coreServices.lifecycle,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n logger,\n config,\n reader,\n database,\n permissions,\n httpRouter,\n lifecycle,\n scheduler,\n discovery,\n auth,\n httpAuth,\n }) {\n const winstonLogger = loggerToWinstonLogger(logger);\n const builder = await CatalogBuilder.create({\n config,\n reader,\n permissions,\n database,\n scheduler,\n logger: winstonLogger,\n discovery,\n auth,\n httpAuth,\n });\n if (processingExtensions.onProcessingErrorHandler) {\n builder.subscribe({\n onProcessingError: processingExtensions.onProcessingErrorHandler,\n });\n }\n builder.addProcessor(...processingExtensions.processors);\n builder.addEntityProvider(...processingExtensions.entityProviders);\n\n if (modelExtensions.entityDataParser) {\n builder.setEntityDataParser(modelExtensions.entityDataParser);\n }\n\n Object.entries(processingExtensions.placeholderResolvers).forEach(\n ([key, resolver]) => builder.setPlaceholderResolver(key, resolver),\n );\n builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers);\n builder.addPermissionRules(...permissionExtensions.permissionRules);\n builder.setFieldFormatValidators(modelExtensions.fieldValidators);\n\n const { processingEngine, router } = await builder.build();\n\n await processingEngine.start();\n lifecycle.addShutdownHook(() => processingEngine.stop());\n httpRouter.use(router);\n },\n });\n },\n});\n"],"names":["createConditionExports","RESOURCE_TYPE_CATALOG_ENTITY","permissionRules","merge","createBackendPlugin","catalogProcessingExtensionPoint","catalogAnalysisExtensionPoint","catalogPermissionExtensionPoint","catalogModelExtensionPoint","coreServices","loggerToWinstonLogger","CatalogBuilder"],"mappings":"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"}
1
+ {"version":3,"file":"alpha.cjs.js","sources":["../src/permissions/conditionExports.ts","../src/service/CatalogPlugin.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RESOURCE_TYPE_CATALOG_ENTITY } from '@backstage/plugin-catalog-common/alpha';\nimport { createConditionExports } from '@backstage/plugin-permission-node';\nimport { permissionRules } from './rules';\n\nconst { conditions, createConditionalDecision } = createConditionExports({\n pluginId: 'catalog',\n resourceType: RESOURCE_TYPE_CATALOG_ENTITY,\n rules: permissionRules,\n});\n\n/**\n * These conditions are used when creating conditional decisions for catalog\n * entities that are returned by authorization policies.\n *\n * @alpha\n */\nexport const catalogConditions = conditions;\n\n/**\n * `createCatalogConditionalDecision` can be used when authoring policies to\n * create conditional decisions. It requires a permission of type\n * `ResourcePermission<'catalog-entity'>` to be passed as the first parameter.\n * It's recommended that you use the provided `isResourcePermission` and\n * `isPermission` helper methods to narrow the type of the permission passed to\n * the handle method as shown below.\n *\n * ```\n * // MyAuthorizationPolicy.ts\n * ...\n * import { createCatalogPolicyDecision } from '@backstage/plugin-catalog-backend';\n * import { RESOURCE_TYPE_CATALOG_ENTITY } from '@backstage/plugin-catalog-common';\n *\n * class MyAuthorizationPolicy implements PermissionPolicy {\n * async handle(request, user) {\n * ...\n *\n * if (isResourcePermission(request.permission, RESOURCE_TYPE_CATALOG_ENTITY)) {\n * return createCatalogConditionalDecision(\n * request.permission,\n * { anyOf: [...insert conditions here...] }\n * );\n * }\n *\n * ...\n * }\n * ```\n *\n * @alpha\n */\nexport const createCatalogConditionalDecision = createConditionalDecision;\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createBackendPlugin,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { Entity, Validators } from '@backstage/catalog-model';\nimport { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder';\nimport {\n CatalogAnalysisExtensionPoint,\n catalogAnalysisExtensionPoint,\n CatalogProcessingExtensionPoint,\n catalogProcessingExtensionPoint,\n CatalogPermissionExtensionPoint,\n catalogPermissionExtensionPoint,\n CatalogModelExtensionPoint,\n catalogModelExtensionPoint,\n} from '@backstage/plugin-catalog-node/alpha';\nimport {\n CatalogProcessor,\n CatalogProcessorParser,\n EntityProvider,\n PlaceholderResolver,\n ScmLocationAnalyzer,\n} from '@backstage/plugin-catalog-node';\nimport { loggerToWinstonLogger } from '@backstage/backend-common';\nimport { merge } from 'lodash';\nimport { Permission } from '@backstage/plugin-permission-common';\n\nclass CatalogProcessingExtensionPointImpl\n implements CatalogProcessingExtensionPoint\n{\n #processors = new Array<CatalogProcessor>();\n #entityProviders = new Array<EntityProvider>();\n #placeholderResolvers: Record<string, PlaceholderResolver> = {};\n #onProcessingErrorHandler?: (event: {\n unprocessedEntity: Entity;\n errors: Error[];\n }) => Promise<void> | void;\n\n addProcessor(\n ...processors: Array<CatalogProcessor | Array<CatalogProcessor>>\n ): void {\n this.#processors.push(...processors.flat());\n }\n\n addEntityProvider(\n ...providers: Array<EntityProvider | Array<EntityProvider>>\n ): void {\n this.#entityProviders.push(...providers.flat());\n }\n\n addPlaceholderResolver(key: string, resolver: PlaceholderResolver) {\n if (key in this.#placeholderResolvers)\n throw new Error(\n `A placeholder resolver for '${key}' has already been set up, please check your config.`,\n );\n this.#placeholderResolvers[key] = resolver;\n }\n\n setOnProcessingErrorHandler(\n handler: (event: {\n unprocessedEntity: Entity;\n errors: Error[];\n }) => Promise<void> | void,\n ) {\n this.#onProcessingErrorHandler = handler;\n }\n\n get processors() {\n return this.#processors;\n }\n\n get entityProviders() {\n return this.#entityProviders;\n }\n\n get placeholderResolvers() {\n return this.#placeholderResolvers;\n }\n\n get onProcessingErrorHandler() {\n return this.#onProcessingErrorHandler;\n }\n}\n\nclass CatalogAnalysisExtensionPointImpl\n implements CatalogAnalysisExtensionPoint\n{\n #locationAnalyzers = new Array<ScmLocationAnalyzer>();\n\n addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void {\n this.#locationAnalyzers.push(analyzer);\n }\n\n get locationAnalyzers() {\n return this.#locationAnalyzers;\n }\n}\n\nclass CatalogPermissionExtensionPointImpl\n implements CatalogPermissionExtensionPoint\n{\n #permissions = new Array<Permission>();\n #permissionRules = new Array<CatalogPermissionRuleInput>();\n\n addPermissions(...permission: Array<Permission | Array<Permission>>): void {\n this.#permissions.push(...permission.flat());\n }\n\n addPermissionRules(\n ...rules: Array<\n CatalogPermissionRuleInput | Array<CatalogPermissionRuleInput>\n >\n ): void {\n this.#permissionRules.push(...rules.flat());\n }\n\n get permissions() {\n return this.#permissions;\n }\n\n get permissionRules() {\n return this.#permissionRules;\n }\n}\n\nclass CatalogModelExtensionPointImpl implements CatalogModelExtensionPoint {\n #fieldValidators: Partial<Validators> = {};\n\n setFieldValidators(validators: Partial<Validators>): void {\n merge(this.#fieldValidators, validators);\n }\n\n get fieldValidators() {\n return this.#fieldValidators;\n }\n\n #entityDataParser?: CatalogProcessorParser;\n\n setEntityDataParser(parser: CatalogProcessorParser): void {\n if (this.#entityDataParser) {\n throw new Error(\n 'Attempted to install second EntityDataParser. Only one can be set.',\n );\n }\n this.#entityDataParser = parser;\n }\n\n get entityDataParser() {\n return this.#entityDataParser;\n }\n}\n\n/**\n * Catalog plugin\n * @alpha\n */\nexport const catalogPlugin = createBackendPlugin({\n pluginId: 'catalog',\n register(env) {\n const processingExtensions = new CatalogProcessingExtensionPointImpl();\n // plugins depending on this API will be initialized before this plugins init method is executed.\n env.registerExtensionPoint(\n catalogProcessingExtensionPoint,\n processingExtensions,\n );\n\n const analysisExtensions = new CatalogAnalysisExtensionPointImpl();\n env.registerExtensionPoint(\n catalogAnalysisExtensionPoint,\n analysisExtensions,\n );\n\n const permissionExtensions = new CatalogPermissionExtensionPointImpl();\n env.registerExtensionPoint(\n catalogPermissionExtensionPoint,\n permissionExtensions,\n );\n\n const modelExtensions = new CatalogModelExtensionPointImpl();\n env.registerExtensionPoint(catalogModelExtensionPoint, modelExtensions);\n\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n reader: coreServices.urlReader,\n permissions: coreServices.permissions,\n database: coreServices.database,\n httpRouter: coreServices.httpRouter,\n lifecycle: coreServices.lifecycle,\n scheduler: coreServices.scheduler,\n discovery: coreServices.discovery,\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n },\n async init({\n logger,\n config,\n reader,\n database,\n permissions,\n httpRouter,\n lifecycle,\n scheduler,\n discovery,\n auth,\n httpAuth,\n }) {\n const winstonLogger = loggerToWinstonLogger(logger);\n const builder = await CatalogBuilder.create({\n config,\n reader,\n permissions,\n database,\n scheduler,\n logger: winstonLogger,\n discovery,\n auth,\n httpAuth,\n });\n if (processingExtensions.onProcessingErrorHandler) {\n builder.subscribe({\n onProcessingError: processingExtensions.onProcessingErrorHandler,\n });\n }\n builder.addProcessor(...processingExtensions.processors);\n builder.addEntityProvider(...processingExtensions.entityProviders);\n\n if (modelExtensions.entityDataParser) {\n builder.setEntityDataParser(modelExtensions.entityDataParser);\n }\n\n Object.entries(processingExtensions.placeholderResolvers).forEach(\n ([key, resolver]) => builder.setPlaceholderResolver(key, resolver),\n );\n builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers);\n builder.addPermissions(...permissionExtensions.permissions);\n builder.addPermissionRules(...permissionExtensions.permissionRules);\n builder.setFieldFormatValidators(modelExtensions.fieldValidators);\n\n const { processingEngine, router } = await builder.build();\n\n await processingEngine.start();\n lifecycle.addShutdownHook(() => processingEngine.stop());\n httpRouter.use(router);\n },\n });\n },\n});\n"],"names":["createConditionExports","RESOURCE_TYPE_CATALOG_ENTITY","permissionRules","merge","createBackendPlugin","catalogProcessingExtensionPoint","catalogAnalysisExtensionPoint","catalogPermissionExtensionPoint","catalogModelExtensionPoint","coreServices","loggerToWinstonLogger","CatalogBuilder"],"mappings":"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"}
package/dist/alpha.d.ts CHANGED
@@ -123,4 +123,4 @@ declare const permissionRules: {
123
123
  */
124
124
  declare const catalogPlugin: () => _backstage_backend_plugin_api.BackendFeature;
125
125
 
126
- export { CatalogPermissionRule, catalogConditions, createCatalogConditionalDecision, createCatalogPermissionRule, catalogPlugin as default, permissionRules };
126
+ export { type CatalogPermissionRule, catalogConditions, createCatalogConditionalDecision, createCatalogPermissionRule, catalogPlugin as default, permissionRules };
@@ -34,10 +34,10 @@ var minimatch = require('minimatch');
34
34
  var config = require('@backstage/config');
35
35
  var pluginPermissionNode = require('@backstage/plugin-permission-node');
36
36
 
37
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
37
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
38
38
 
39
- function _interopNamespace(e) {
40
- if (e && e.__esModule) return e;
39
+ function _interopNamespaceCompat(e) {
40
+ if (e && typeof e === 'object' && 'default' in e) return e;
41
41
  var n = Object.create(null);
42
42
  if (e) {
43
43
  Object.keys(e).forEach(function (k) {
@@ -50,29 +50,29 @@ function _interopNamespace(e) {
50
50
  }
51
51
  });
52
52
  }
53
- n["default"] = e;
53
+ n.default = e;
54
54
  return Object.freeze(n);
55
55
  }
56
56
 
57
- var lodash__default = /*#__PURE__*/_interopDefaultLegacy(lodash);
58
- var codeowners__namespace = /*#__PURE__*/_interopNamespace(codeowners);
59
- var parseGitUrl__default = /*#__PURE__*/_interopDefaultLegacy(parseGitUrl);
60
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
61
- var g__default = /*#__PURE__*/_interopDefaultLegacy(g);
62
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
63
- var yaml__default = /*#__PURE__*/_interopDefaultLegacy(yaml);
64
- var limiterFactory__default = /*#__PURE__*/_interopDefaultLegacy(limiterFactory);
65
- var stableStringify__default = /*#__PURE__*/_interopDefaultLegacy(stableStringify);
66
- var uniq__default = /*#__PURE__*/_interopDefaultLegacy(uniq);
67
- var splitToChunks__default = /*#__PURE__*/_interopDefaultLegacy(splitToChunks);
68
- var yn__default = /*#__PURE__*/_interopDefaultLegacy(yn);
57
+ var lodash__default = /*#__PURE__*/_interopDefaultCompat(lodash);
58
+ var codeowners__namespace = /*#__PURE__*/_interopNamespaceCompat(codeowners);
59
+ var parseGitUrl__default = /*#__PURE__*/_interopDefaultCompat(parseGitUrl);
60
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
61
+ var g__default = /*#__PURE__*/_interopDefaultCompat(g);
62
+ var path__default = /*#__PURE__*/_interopDefaultCompat(path);
63
+ var yaml__default = /*#__PURE__*/_interopDefaultCompat(yaml);
64
+ var limiterFactory__default = /*#__PURE__*/_interopDefaultCompat(limiterFactory);
65
+ var stableStringify__default = /*#__PURE__*/_interopDefaultCompat(stableStringify);
66
+ var uniq__default = /*#__PURE__*/_interopDefaultCompat(uniq);
67
+ var splitToChunks__default = /*#__PURE__*/_interopDefaultCompat(splitToChunks);
68
+ var yn__default = /*#__PURE__*/_interopDefaultCompat(yn);
69
69
 
70
70
  const USER_PATTERN = /^@.*/;
71
71
  const GROUP_PATTERN = /^@.*\/.*/;
72
72
  const EMAIL_PATTERN = /^.*@.*\..*$/;
73
73
  function resolveCodeOwner(contents, catalogInfoFileUrl) {
74
74
  const codeOwnerEntries = codeowners__namespace.parse(contents);
75
- const { filepath } = parseGitUrl__default["default"](catalogInfoFileUrl);
75
+ const { filepath } = parseGitUrl__default.default(catalogInfoFileUrl);
76
76
  const match = codeowners__namespace.matchFile(filepath, codeOwnerEntries);
77
77
  return match ? normalizeCodeOwner(match.owners[0]) : void 0;
78
78
  }
@@ -435,7 +435,7 @@ class BuiltinKindsEntityProcessor {
435
435
  }
436
436
  }
437
437
 
438
- const glob = util.promisify(g__default["default"]);
438
+ const glob = util.promisify(g__default.default);
439
439
  const LOCATION_TYPE = "file";
440
440
  class FileReaderProcessor {
441
441
  getProcessorName() {
@@ -449,8 +449,8 @@ class FileReaderProcessor {
449
449
  const fileMatches = await glob(location.target);
450
450
  if (fileMatches.length > 0) {
451
451
  for (const fileMatch of fileMatches) {
452
- const data = await fs__default["default"].readFile(fileMatch);
453
- const normalizedFilePath = path__default["default"].normalize(fileMatch);
452
+ const data = await fs__default.default.readFile(fileMatch);
453
+ const normalizedFilePath = path__default.default.normalize(fileMatch);
454
454
  for await (const parseResult of parser({
455
455
  data,
456
456
  location: {
@@ -542,7 +542,7 @@ async function yamlPlaceholderResolver(params) {
542
542
  params.emit(pluginCatalogNode.processingResult.refresh(`url:${url}`));
543
543
  let documents;
544
544
  try {
545
- documents = yaml__default["default"].parseAllDocuments(content).filter((d) => d);
545
+ documents = yaml__default.default.parseAllDocuments(content).filter((d) => d);
546
546
  } catch (e) {
547
547
  throw new Error(
548
548
  `Placeholder $${params.key} failed to parse YAML data at ${params.value}, ${e}`
@@ -666,9 +666,9 @@ class UrlReaderProcessor {
666
666
  return true;
667
667
  }
668
668
  async doRead(location, etag) {
669
- const { filepath } = parseGitUrl__default["default"](location);
669
+ const { filepath } = parseGitUrl__default.default(location);
670
670
  if (filepath == null ? void 0 : filepath.match(/[*?]/)) {
671
- const limiter = limiterFactory__default["default"](5);
671
+ const limiter = limiterFactory__default.default(5);
672
672
  const response = await this.options.reader.search(location, { etag });
673
673
  const output = response.files.map(async (file) => ({
674
674
  url: file.url,
@@ -688,7 +688,7 @@ function* parseEntityYaml(data, location) {
688
688
  var _a;
689
689
  let documents;
690
690
  try {
691
- documents = yaml__default["default"].parseAllDocuments(data.toString("utf8")).filter((d) => d);
691
+ documents = yaml__default.default.parseAllDocuments(data.toString("utf8")).filter((d) => d);
692
692
  } catch (e) {
693
693
  const loc = catalogModel.stringifyLocationRef(location);
694
694
  const message = `Failed to parse YAML at ${loc}, ${e}`;
@@ -702,7 +702,7 @@ function* parseEntityYaml(data, location) {
702
702
  yield pluginCatalogNode.processingResult.generalError(location, message);
703
703
  } else {
704
704
  const json = document.toJSON();
705
- if (lodash__default["default"].isPlainObject(json)) {
705
+ if (lodash__default.default.isPlainObject(json)) {
706
706
  yield pluginCatalogNode.processingResult.entity(location, json);
707
707
  } else if (json === null) ; else {
708
708
  const message = `Expected object at root, got ${typeof json}`;
@@ -756,7 +756,7 @@ function toAbsoluteUrl(integrations, base, type, target) {
756
756
  try {
757
757
  if (type === "file") {
758
758
  if (target.startsWith(".")) {
759
- return path__default["default"].join(path__default["default"].dirname(base.target), target);
759
+ return path__default.default.join(path__default.default.dirname(base.target), target);
760
760
  }
761
761
  return target;
762
762
  } else if (type === "url") {
@@ -866,7 +866,7 @@ class ConfigLocationEntityProvider {
866
866
  const entity = locationSpecToLocationEntity({
867
867
  location: {
868
868
  type,
869
- target: type === "file" ? path__default["default"].resolve(target) : target
869
+ target: type === "file" ? path__default.default.resolve(target) : target
870
870
  }
871
871
  });
872
872
  const locationKey = getEntityLocationRef(entity);
@@ -1014,7 +1014,7 @@ class RepoLocationAnalyzer {
1014
1014
  }
1015
1015
  async analyzeLocation(request) {
1016
1016
  const integration = this.scmIntegrations.byUrl(request.location.target);
1017
- const { owner, name } = parseGitUrl__default["default"](request.location.target);
1017
+ const { owner, name } = parseGitUrl__default.default(request.location.target);
1018
1018
  let annotationPrefix;
1019
1019
  switch (integration == null ? void 0 : integration.type) {
1020
1020
  case "azure":
@@ -1263,7 +1263,7 @@ async function updateUnprocessedEntity(options) {
1263
1263
  }
1264
1264
 
1265
1265
  function generateStableHash$1(entity) {
1266
- return crypto.createHash("sha1").update(stableStringify__default["default"]({ ...entity })).digest("hex");
1266
+ return crypto.createHash("sha1").update(stableStringify__default.default({ ...entity })).digest("hex");
1267
1267
  }
1268
1268
 
1269
1269
  const CATALOG_CONFLICTS_TOPIC = "experimental.catalog.conflict";
@@ -1423,7 +1423,7 @@ class DefaultProcessingDatabase {
1423
1423
  }
1424
1424
  }
1425
1425
  deduplicateRelations(rows) {
1426
- return lodash__default["default"].uniqBy(
1426
+ return lodash__default.default.uniqBy(
1427
1427
  rows,
1428
1428
  (r) => `${r.source_entity_ref}:${r.target_entity_ref}:${r.type}`
1429
1429
  );
@@ -1718,7 +1718,7 @@ function split(input) {
1718
1718
  if (!input) {
1719
1719
  return [];
1720
1720
  }
1721
- return splitToChunks__default["default"](Array.isArray(input) ? input : [...input], 200);
1721
+ return splitToChunks__default.default(Array.isArray(input) ? input : [...input], 200);
1722
1722
  }
1723
1723
 
1724
1724
  async function deleteOrphanedEntities(options) {
@@ -1748,8 +1748,8 @@ async function deleteOrphanedEntities(options) {
1748
1748
  if (!candidates.length) {
1749
1749
  break;
1750
1750
  }
1751
- const orphanIds = uniq__default["default"](candidates.map((r) => r.entityId));
1752
- const orphanRelationIds = uniq__default["default"](
1751
+ const orphanIds = uniq__default.default(candidates.map((r) => r.entityId));
1752
+ const orphanRelationIds = uniq__default.default(
1753
1753
  candidates.map((r) => r.relationSourceId).filter(Boolean)
1754
1754
  );
1755
1755
  total += orphanIds.length;
@@ -1859,7 +1859,7 @@ class DefaultCatalogProcessingEngine {
1859
1859
  track.markProcessorsCompleted(result);
1860
1860
  if (result.ok) {
1861
1861
  const { ttl: _, ...stateWithoutTtl } = state != null ? state : {};
1862
- if (stableStringify__default["default"](stateWithoutTtl) !== stableStringify__default["default"](result.state)) {
1862
+ if (stableStringify__default.default(stateWithoutTtl) !== stableStringify__default.default(result.state)) {
1863
1863
  await this.processingDatabase.transaction(async (tx) => {
1864
1864
  await this.processingDatabase.updateEntityCache(tx, {
1865
1865
  id,
@@ -1897,7 +1897,7 @@ class DefaultCatalogProcessingEngine {
1897
1897
  entityRef
1898
1898
  })
1899
1899
  );
1900
- hashBuilder = hashBuilder.update(stableStringify__default["default"]({ ...result.completedEntity })).update(stableStringify__default["default"]([...result.deferredEntities])).update(stableStringify__default["default"]([...result.relations])).update(stableStringify__default["default"]([...result.refreshKeys])).update(stableStringify__default["default"]([...parents]));
1900
+ hashBuilder = hashBuilder.update(stableStringify__default.default({ ...result.completedEntity })).update(stableStringify__default.default([...result.deferredEntities])).update(stableStringify__default.default([...result.relations])).update(stableStringify__default.default([...result.refreshKeys])).update(stableStringify__default.default([...parents]));
1901
1901
  }
1902
1902
  const resultHash = hashBuilder.digest("hex");
1903
1903
  if (resultHash === previousResultHash) {
@@ -2233,7 +2233,7 @@ async function requireRequestBody(req) {
2233
2233
  const body = req.body;
2234
2234
  if (!body) {
2235
2235
  throw new errors.InputError("Missing request body");
2236
- } else if (!lodash__default["default"].isPlainObject(body)) {
2236
+ } else if (!lodash__default.default.isPlainObject(body)) {
2237
2237
  throw new errors.InputError("Expected body to be a JSON object");
2238
2238
  } else if (Object.keys(body).length === 0) {
2239
2239
  throw new errors.InputError("Empty request body");
@@ -3176,7 +3176,7 @@ class DefaultCatalogProcessingOrchestrator {
3176
3176
  targets.push(...entity.spec.targets);
3177
3177
  }
3178
3178
  for (const maybeRelativeTarget of targets) {
3179
- if (type === "file" && maybeRelativeTarget.endsWith(path__default["default"].sep)) {
3179
+ if (type === "file" && maybeRelativeTarget.endsWith(path__default.default.sep)) {
3180
3180
  context.collector.generic()(
3181
3181
  pluginCatalogNode.processingResult.inputError(
3182
3182
  context.location,
@@ -3427,7 +3427,7 @@ async function markDeferredStitchCompleted(option) {
3427
3427
 
3428
3428
  const BATCH_SIZE$1 = 50;
3429
3429
  function generateStableHash(entity) {
3430
- return crypto.createHash("sha1").update(stableStringify__default["default"]({ ...entity })).digest("hex");
3430
+ return crypto.createHash("sha1").update(stableStringify__default.default({ ...entity })).digest("hex");
3431
3431
  }
3432
3432
 
3433
3433
  const scriptProtocolPattern = (
@@ -3679,7 +3679,7 @@ const _DefaultStitcher = class _DefaultStitcher {
3679
3679
  }
3680
3680
  }
3681
3681
  if (entityIds) {
3682
- const chunks = splitToChunks__default["default"](
3682
+ const chunks = splitToChunks__default.default(
3683
3683
  Array.isArray(entityIds) ? entityIds : [...entityIds],
3684
3684
  100
3685
3685
  );
@@ -3833,7 +3833,7 @@ function parseEntityFilterString(filterString) {
3833
3833
  function getPathArrayAndValue(input, field) {
3834
3834
  return field.split(".").reduce(
3835
3835
  ([pathArray, inputSubset], pathPart, index, fieldParts) => {
3836
- if (lodash__default["default"].hasIn(inputSubset, pathPart)) {
3836
+ if (lodash__default.default.hasIn(inputSubset, pathPart)) {
3837
3837
  return [pathArray.concat(pathPart), inputSubset[pathPart]];
3838
3838
  } else if (fieldParts[index + 1] !== void 0) {
3839
3839
  fieldParts[index + 1] = `${pathPart}.${fieldParts[index + 1]}`;
@@ -3866,7 +3866,7 @@ function parseEntityTransformParams(params, extra) {
3866
3866
  for (const field of fields) {
3867
3867
  const [pathArray, value] = getPathArrayAndValue(input, field);
3868
3868
  if (value !== void 0) {
3869
- lodash__default["default"].set(output, pathArray, value);
3869
+ lodash__default.default.set(output, pathArray, value);
3870
3870
  }
3871
3871
  }
3872
3872
  return output;
@@ -5642,7 +5642,7 @@ async function createRouter(options) {
5642
5642
  if (locationService) {
5643
5643
  router.post("/locations", async (req, res) => {
5644
5644
  const location = await validateRequestBody(req, locationInput);
5645
- const dryRun = yn__default["default"](req.query.dryRun, { default: false });
5645
+ const dryRun = yn__default.default(req.query.dryRun, { default: false });
5646
5646
  if (!dryRun) {
5647
5647
  disallowReadonlyMode(readonlyEnabled);
5648
5648
  }
@@ -5948,7 +5948,7 @@ function resolveTarget(type, target) {
5948
5948
  if (type !== "file") {
5949
5949
  return target;
5950
5950
  }
5951
- return path__default["default"].resolve(target);
5951
+ return path__default.default.resolve(target);
5952
5952
  }
5953
5953
 
5954
5954
  var __defProp$1 = Object.defineProperty;
@@ -6417,13 +6417,13 @@ class AuthorizedLocationService {
6417
6417
  async function deleteWithEagerPruningOfChildren(options) {
6418
6418
  const { knex, entityRefs, sourceKey } = options;
6419
6419
  let removedCount = 0;
6420
- for (const refs of lodash__default["default"].chunk(entityRefs, 1e3)) {
6420
+ for (const refs of lodash__default.default.chunk(entityRefs, 1e3)) {
6421
6421
  const { orphanEntityRefs } = await findDescendantsThatWouldHaveBeenOrphanedByDeletion({
6422
6422
  knex: options.knex,
6423
6423
  refs,
6424
6424
  sourceKey
6425
6425
  });
6426
- for (const refsToDelete of lodash__default["default"].chunk(orphanEntityRefs, 1e3)) {
6426
+ for (const refsToDelete of lodash__default.default.chunk(orphanEntityRefs, 1e3)) {
6427
6427
  await markEntitiesAffectedByDeletionForStitching({
6428
6428
  knex: options.knex,
6429
6429
  entityRefs: refsToDelete
@@ -6516,7 +6516,7 @@ async function markEntitiesAffectedByDeletionForStitching(options) {
6516
6516
  "relations.source_entity_ref",
6517
6517
  "refresh_state.entity_ref"
6518
6518
  ).whereIn("relations.target_entity_ref", entityRefs).then((rows) => rows.map((row) => row.entity_id));
6519
- for (const ids of lodash__default["default"].chunk(affectedIds, 1e3)) {
6519
+ for (const ids of lodash__default.default.chunk(affectedIds, 1e3)) {
6520
6520
  await knex.table("final_entities").update({
6521
6521
  hash: "force-stitching"
6522
6522
  }).whereIn("entity_id", ids);
@@ -6573,7 +6573,7 @@ class DefaultProviderDatabase {
6573
6573
  );
6574
6574
  }
6575
6575
  if (toAdd.length) {
6576
- for (const chunk of lodash__default["default"].chunk(toAdd, 50)) {
6576
+ for (const chunk of lodash__default.default.chunk(toAdd, 50)) {
6577
6577
  try {
6578
6578
  await tx.batchInsert(
6579
6579
  "refresh_state",
@@ -6801,6 +6801,7 @@ class CatalogBuilder {
6801
6801
  __publicField(this, "onProcessingError");
6802
6802
  __publicField(this, "processingInterval");
6803
6803
  __publicField(this, "locationAnalyzer");
6804
+ __publicField(this, "permissions");
6804
6805
  __publicField(this, "permissionRules");
6805
6806
  __publicField(this, "allowedLocationType");
6806
6807
  __publicField(this, "legacySingleProcessorValidation", false);
@@ -6815,6 +6816,7 @@ class CatalogBuilder {
6815
6816
  this.locationAnalyzers = [];
6816
6817
  this.processorsReplace = false;
6817
6818
  this.parser = void 0;
6819
+ this.permissions = [...alpha.catalogPermissions];
6818
6820
  this.permissionRules = Object.values(permissionRules);
6819
6821
  this.allowedLocationType = ["url"];
6820
6822
  this.processingInterval = CatalogBuilder.getDefaultProcessingInterval(
@@ -6910,7 +6912,7 @@ class CatalogBuilder {
6910
6912
  * @param validators - The (subset of) validators to set
6911
6913
  */
6912
6914
  setFieldFormatValidators(validators) {
6913
- lodash__default["default"].merge(this.fieldFormatValidators, validators);
6915
+ lodash__default.default.merge(this.fieldFormatValidators, validators);
6914
6916
  return this;
6915
6917
  }
6916
6918
  /**
@@ -6993,6 +6995,16 @@ class CatalogBuilder {
6993
6995
  this.parser = parser;
6994
6996
  return this;
6995
6997
  }
6998
+ /**
6999
+ * Adds additional permissions. See
7000
+ * {@link @backstage/plugin-permission-node#Permission}.
7001
+ *
7002
+ * @param permissions - Additional permissions
7003
+ */
7004
+ addPermissions(...permissions) {
7005
+ this.permissions.push(...permissions.flat());
7006
+ return this;
7007
+ }
6996
7008
  /**
6997
7009
  * Adds additional permission rules. Permission rules are used to evaluate
6998
7010
  * catalog resources against queries. See
@@ -7122,12 +7134,12 @@ class CatalogBuilder {
7122
7134
  (resourceRef) => entitiesByRef[catalogModel.stringifyEntityRef(catalogModel.parseEntityRef(resourceRef))]
7123
7135
  );
7124
7136
  },
7125
- permissions: alpha.catalogPermissions,
7137
+ permissions: this.permissions,
7126
7138
  rules: this.permissionRules
7127
7139
  });
7128
7140
  const locationStore = new DefaultLocationStore(dbClient);
7129
7141
  const configLocationProvider = new ConfigLocationEntityProvider(config);
7130
- const entityProviders = lodash__default["default"].uniqBy(
7142
+ const entityProviders = lodash__default.default.uniqBy(
7131
7143
  [...this.entityProviders, locationStore, configLocationProvider],
7132
7144
  (provider) => provider.getProviderName()
7133
7145
  );
@@ -7360,4 +7372,4 @@ exports.createCatalogPermissionRule = createCatalogPermissionRule;
7360
7372
  exports.createRandomProcessingInterval = createRandomProcessingInterval;
7361
7373
  exports.parseEntityYaml = parseEntityYaml;
7362
7374
  exports.permissionRules = permissionRules;
7363
- //# sourceMappingURL=CatalogBuilder-0288ac0b.cjs.js.map
7375
+ //# sourceMappingURL=CatalogBuilder-B30bgu7A.cjs.js.map