@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 +12 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.cjs.js +12 -3
- package/dist/alpha.cjs.js.map +1 -1
- package/dist/alpha.d.ts +1 -1
- package/dist/cjs/{CatalogBuilder-0288ac0b.cjs.js → CatalogBuilder-B30bgu7A.cjs.js} +63 -51
- package/dist/cjs/{CatalogBuilder-0288ac0b.cjs.js.map → CatalogBuilder-B30bgu7A.cjs.js.map} +1 -1
- package/dist/index.cjs.js +7 -9
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/package.json +3 -3
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
|
package/alpha/package.json
CHANGED
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-
|
|
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
|
|
255
|
+
exports.default = catalogPlugin;
|
|
247
256
|
//# sourceMappingURL=alpha.cjs.js.map
|
package/dist/alpha.cjs.js.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAM,EAAE,UAAA,EAAY,yBAA0B,EAAA,GAAIA,2CAAuB,CAAA;AAAA,EACvE,QAAU,EAAA,SAAA;AAAA,EACV,YAAc,EAAAC,kCAAA;AAAA,EACd,KAAO,EAAAC,8BAAA;AACT,CAAC,CAAA,CAAA;AAQM,MAAM,iBAAoB,GAAA,WAAA;AAiC1B,MAAM,gCAAmC,GAAA;;;;;;;;;;;;;;;;;;;;ACjEhD,IAAA,WAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,iBAAA,CAAA;AAyCA,MAAM,mCAEN,CAAA;AAAA,EAFA,WAAA,GAAA;AAGE,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,IAAI,KAAwB,EAAA,CAAA,CAAA;AAC1C,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAmB,IAAI,KAAsB,EAAA,CAAA,CAAA;AAC7C,IAAA,YAAA,CAAA,IAAA,EAAA,qBAAA,EAA6D,EAAC,CAAA,CAAA;AAC9D,IAAA,YAAA,CAAA,IAAA,EAAA,yBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKA,gBACK,UACG,EAAA;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,WAAY,CAAA,CAAA,IAAA,CAAK,GAAG,UAAA,CAAW,MAAM,CAAA,CAAA;AAAA,GAC5C;AAAA,EAEA,qBACK,SACG,EAAA;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,IAAA,CAAK,GAAG,SAAA,CAAU,MAAM,CAAA,CAAA;AAAA,GAChD;AAAA,EAEA,sBAAA,CAAuB,KAAa,QAA+B,EAAA;AACjE,IAAA,IAAI,OAAO,YAAK,CAAA,IAAA,EAAA,qBAAA,CAAA;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,+BAA+B,GAAG,CAAA,oDAAA,CAAA;AAAA,OACpC,CAAA;AACF,IAAK,YAAA,CAAA,IAAA,EAAA,qBAAA,CAAA,CAAsB,GAAG,CAAI,GAAA,QAAA,CAAA;AAAA,GACpC;AAAA,EAEA,4BACE,OAIA,EAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,yBAA4B,EAAA,OAAA,CAAA,CAAA;AAAA,GACnC;AAAA,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,oBAAuB,GAAA;AACzB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,qBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,wBAA2B,GAAA;AAC7B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,yBAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AApDE,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,qBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,yBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAmDF,MAAM,iCAEN,CAAA;AAAA,EAFA,WAAA,GAAA;AAGE,IAAA,YAAA,CAAA,IAAA,EAAA,kBAAA,EAAqB,IAAI,KAA2B,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEpD,oBAAoB,QAAqC,EAAA;AACvD,IAAK,YAAA,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAmB,KAAK,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA,EAEA,IAAI,iBAAoB,GAAA;AACtB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AATE,kBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAWF,MAAM,mCAEN,CAAA;AAAA,EAFA,WAAA,GAAA;AAGE,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAmB,IAAI,KAAkC,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAEzD,sBACK,KAGG,EAAA;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,GAC5C;AAAA,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AAbE,gBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAeF,MAAM,8BAAqE,CAAA;AAAA,EAA3E,WAAA,GAAA;AACE,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAwC,EAAC,CAAA,CAAA;AAUzC,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EARA,mBAAmB,UAAuC,EAAA;AACxD,IAAMC,YAAA,CAAA,YAAA,CAAA,IAAA,EAAK,mBAAkB,UAAU,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAIA,oBAAoB,MAAsC,EAAA;AACxD,IAAA,IAAI,mBAAK,iBAAmB,CAAA,EAAA;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oEAAA;AAAA,OACF,CAAA;AAAA,KACF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAoB,EAAA,MAAA,CAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,IAAI,gBAAmB,GAAA;AACrB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AAxBE,gBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAUA,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAoBK,MAAM,gBAAgBC,oCAAoB,CAAA;AAAA,EAC/C,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAM,MAAA,oBAAA,GAAuB,IAAI,mCAAoC,EAAA,CAAA;AAErE,IAAI,GAAA,CAAA,sBAAA;AAAA,MACFC,uCAAA;AAAA,MACA,oBAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,kBAAA,GAAqB,IAAI,iCAAkC,EAAA,CAAA;AACjE,IAAI,GAAA,CAAA,sBAAA;AAAA,MACFC,qCAAA;AAAA,MACA,kBAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,oBAAA,GAAuB,IAAI,mCAAoC,EAAA,CAAA;AACrE,IAAI,GAAA,CAAA,sBAAA;AAAA,MACFC,uCAAA;AAAA,MACA,oBAAA;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,eAAA,GAAkB,IAAI,8BAA+B,EAAA,CAAA;AAC3D,IAAI,GAAA,CAAA,sBAAA,CAAuBC,oCAA4B,eAAe,CAAA,CAAA;AAEtE,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,MAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,SAAA;AAAA,QACrB,aAAaA,6BAAa,CAAA,WAAA;AAAA,QAC1B,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,YAAYA,6BAAa,CAAA,UAAA;AAAA,QACzB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,MAAMA,6BAAa,CAAA,IAAA;AAAA,QACnB,UAAUA,6BAAa,CAAA,QAAA;AAAA,OACzB;AAAA,MACA,MAAM,IAAK,CAAA;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,OACC,EAAA;AACD,QAAM,MAAA,aAAA,GAAgBC,oCAAsB,MAAM,CAAA,CAAA;AAClD,QAAM,MAAA,OAAA,GAAU,MAAMC,6BAAA,CAAe,MAAO,CAAA;AAAA,UAC1C,MAAA;AAAA,UACA,MAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAQ,EAAA,aAAA;AAAA,UACR,SAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,SACD,CAAA,CAAA;AACD,QAAA,IAAI,qBAAqB,wBAA0B,EAAA;AACjD,UAAA,OAAA,CAAQ,SAAU,CAAA;AAAA,YAChB,mBAAmB,oBAAqB,CAAA,wBAAA;AAAA,WACzC,CAAA,CAAA;AAAA,SACH;AACA,QAAQ,OAAA,CAAA,YAAA,CAAa,GAAG,oBAAA,CAAqB,UAAU,CAAA,CAAA;AACvD,QAAQ,OAAA,CAAA,iBAAA,CAAkB,GAAG,oBAAA,CAAqB,eAAe,CAAA,CAAA;AAEjE,QAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACpC,UAAQ,OAAA,CAAA,mBAAA,CAAoB,gBAAgB,gBAAgB,CAAA,CAAA;AAAA,SAC9D;AAEA,QAAO,MAAA,CAAA,OAAA,CAAQ,oBAAqB,CAAA,oBAAoB,CAAE,CAAA,OAAA;AAAA,UACxD,CAAC,CAAC,GAAK,EAAA,QAAQ,MAAM,OAAQ,CAAA,sBAAA,CAAuB,KAAK,QAAQ,CAAA;AAAA,SACnE,CAAA;AACA,QAAQ,OAAA,CAAA,oBAAA,CAAqB,GAAG,kBAAA,CAAmB,iBAAiB,CAAA,CAAA;AACpE,QAAQ,OAAA,CAAA,kBAAA,CAAmB,GAAG,oBAAA,CAAqB,eAAe,CAAA,CAAA;AAClE,QAAQ,OAAA,CAAA,wBAAA,CAAyB,gBAAgB,eAAe,CAAA,CAAA;AAEhE,QAAA,MAAM,EAAE,gBAAkB,EAAA,MAAA,EAAW,GAAA,MAAM,QAAQ,KAAM,EAAA,CAAA;AAEzD,QAAA,MAAM,iBAAiB,KAAM,EAAA,CAAA;AAC7B,QAAA,SAAA,CAAU,eAAgB,CAAA,MAAM,gBAAiB,CAAA,IAAA,EAAM,CAAA,CAAA;AACvD,QAAA,UAAA,CAAW,IAAI,MAAM,CAAA,CAAA;AAAA,OACvB;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;;;;;"}
|
|
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
|
|
37
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
38
38
|
|
|
39
|
-
function
|
|
40
|
-
if (e && 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
|
|
53
|
+
n.default = e;
|
|
54
54
|
return Object.freeze(n);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
var lodash__default = /*#__PURE__*/
|
|
58
|
-
var codeowners__namespace = /*#__PURE__*/
|
|
59
|
-
var parseGitUrl__default = /*#__PURE__*/
|
|
60
|
-
var fs__default = /*#__PURE__*/
|
|
61
|
-
var g__default = /*#__PURE__*/
|
|
62
|
-
var path__default = /*#__PURE__*/
|
|
63
|
-
var yaml__default = /*#__PURE__*/
|
|
64
|
-
var limiterFactory__default = /*#__PURE__*/
|
|
65
|
-
var stableStringify__default = /*#__PURE__*/
|
|
66
|
-
var uniq__default = /*#__PURE__*/
|
|
67
|
-
var splitToChunks__default = /*#__PURE__*/
|
|
68
|
-
var yn__default = /*#__PURE__*/
|
|
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
|
|
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
|
|
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
|
|
453
|
-
const normalizedFilePath = path__default
|
|
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
|
|
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
|
|
669
|
+
const { filepath } = parseGitUrl__default.default(location);
|
|
670
670
|
if (filepath == null ? void 0 : filepath.match(/[*?]/)) {
|
|
671
|
-
const limiter = limiterFactory__default
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1752
|
-
const orphanRelationIds = uniq__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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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-
|
|
7375
|
+
//# sourceMappingURL=CatalogBuilder-B30bgu7A.cjs.js.map
|