@backstage/backend-defaults 0.11.0-next.2 → 0.11.1-next.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/config.d.ts +86 -0
  3. package/dist/CreateBackend.cjs.js +5 -5
  4. package/dist/CreateBackend.cjs.js.map +1 -1
  5. package/dist/alpha/entrypoints/actions/DefaultActionsService.cjs.js.map +1 -0
  6. package/dist/{entrypoints → alpha/entrypoints}/actions/actionsServiceFactory.cjs.js +2 -1
  7. package/dist/alpha/entrypoints/actions/actionsServiceFactory.cjs.js.map +1 -0
  8. package/dist/{entrypoints → alpha/entrypoints}/actionsRegistry/DefaultActionsRegistryService.cjs.js +9 -2
  9. package/dist/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.cjs.js.map +1 -0
  10. package/dist/{entrypoints → alpha/entrypoints}/actionsRegistry/actionsRegistryServiceFactory.cjs.js +2 -1
  11. package/dist/alpha/entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js.map +1 -0
  12. package/dist/alpha.cjs.js +10 -0
  13. package/dist/alpha.cjs.js.map +1 -0
  14. package/dist/alpha.d.ts +14 -0
  15. package/dist/entrypoints/auth/helpers.cjs.js +111 -33
  16. package/dist/entrypoints/auth/helpers.cjs.js.map +1 -1
  17. package/dist/entrypoints/httpRouter/http/createRateLimitMiddleware.cjs.js +23 -0
  18. package/dist/entrypoints/httpRouter/http/createRateLimitMiddleware.cjs.js.map +1 -0
  19. package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js +2 -0
  20. package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js.map +1 -1
  21. package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js +31 -0
  22. package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js.map +1 -1
  23. package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js +1 -0
  24. package/dist/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.cjs.js.map +1 -1
  25. package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js +6 -4
  26. package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js.map +1 -1
  27. package/dist/lib/RateLimitStoreFactory.cjs.js +37 -0
  28. package/dist/lib/RateLimitStoreFactory.cjs.js.map +1 -0
  29. package/dist/lib/rateLimitMiddleware.cjs.js +62 -0
  30. package/dist/lib/rateLimitMiddleware.cjs.js.map +1 -0
  31. package/dist/package.json.cjs.js +7 -9
  32. package/dist/package.json.cjs.js.map +1 -1
  33. package/dist/rootHttpRouter.d.ts +11 -0
  34. package/package.json +20 -26
  35. package/dist/actions.cjs.js +0 -8
  36. package/dist/actions.cjs.js.map +0 -1
  37. package/dist/actions.d.ts +0 -8
  38. package/dist/actionsRegistry.cjs.js +0 -8
  39. package/dist/actionsRegistry.cjs.js.map +0 -1
  40. package/dist/actionsRegistry.d.ts +0 -8
  41. package/dist/entrypoints/actions/DefaultActionsService.cjs.js.map +0 -1
  42. package/dist/entrypoints/actions/actionsServiceFactory.cjs.js.map +0 -1
  43. package/dist/entrypoints/actionsRegistry/DefaultActionsRegistryService.cjs.js.map +0 -1
  44. package/dist/entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js.map +0 -1
  45. /package/dist/{entrypoints → alpha/entrypoints}/actions/DefaultActionsService.cjs.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-defaults",
3
- "version": "0.11.0-next.2",
3
+ "version": "0.11.1-next.0",
4
4
  "description": "Backend defaults used by Backstage backend apps",
5
5
  "backstage": {
6
6
  "role": "node-library"
@@ -24,16 +24,6 @@
24
24
  "types": "./dist/index.d.ts",
25
25
  "default": "./dist/index.cjs.js"
26
26
  },
27
- "./actions": {
28
- "require": "./dist/actions.cjs.js",
29
- "types": "./dist/actions.d.ts",
30
- "default": "./dist/actions.cjs.js"
31
- },
32
- "./actionsRegistry": {
33
- "require": "./dist/actionsRegistry.cjs.js",
34
- "types": "./dist/actionsRegistry.d.ts",
35
- "default": "./dist/actionsRegistry.cjs.js"
36
- },
37
27
  "./auditor": {
38
28
  "require": "./dist/auditor.cjs.js",
39
29
  "types": "./dist/auditor.d.ts",
@@ -129,18 +119,17 @@
129
119
  "types": "./dist/userInfo.d.ts",
130
120
  "default": "./dist/userInfo.cjs.js"
131
121
  },
122
+ "./alpha": {
123
+ "require": "./dist/alpha.cjs.js",
124
+ "types": "./dist/alpha.d.ts",
125
+ "default": "./dist/alpha.cjs.js"
126
+ },
132
127
  "./package.json": "./package.json"
133
128
  },
134
129
  "main": "./dist/index.cjs.js",
135
130
  "types": "./dist/index.d.ts",
136
131
  "typesVersions": {
137
132
  "*": {
138
- "actions": [
139
- "dist/actions.d.ts"
140
- ],
141
- "actionsRegistry": [
142
- "dist/actionsRegistry.d.ts"
143
- ],
144
133
  "auditor": [
145
134
  "dist/auditor.d.ts"
146
135
  ],
@@ -198,6 +187,9 @@
198
187
  "userInfo": [
199
188
  "dist/userInfo.d.ts"
200
189
  ],
190
+ "alpha": [
191
+ "dist/alpha.d.ts"
192
+ ],
201
193
  "package.json": [
202
194
  "package.json"
203
195
  ]
@@ -224,18 +216,18 @@
224
216
  "@aws-sdk/credential-providers": "^3.350.0",
225
217
  "@aws-sdk/types": "^3.347.0",
226
218
  "@azure/storage-blob": "^12.5.0",
227
- "@backstage/backend-app-api": "1.2.4-next.2",
219
+ "@backstage/backend-app-api": "1.2.4",
228
220
  "@backstage/backend-dev-utils": "0.1.5",
229
- "@backstage/backend-plugin-api": "1.4.0-next.1",
221
+ "@backstage/backend-plugin-api": "1.4.0",
230
222
  "@backstage/cli-node": "0.2.13",
231
223
  "@backstage/config": "1.3.2",
232
224
  "@backstage/config-loader": "1.10.1",
233
225
  "@backstage/errors": "1.2.7",
234
- "@backstage/integration": "1.17.0",
226
+ "@backstage/integration": "1.17.1-next.0",
235
227
  "@backstage/integration-aws-node": "0.1.16",
236
- "@backstage/plugin-auth-node": "0.6.4-next.1",
237
- "@backstage/plugin-events-node": "0.4.12-next.1",
238
- "@backstage/plugin-permission-node": "0.10.1-next.1",
228
+ "@backstage/plugin-auth-node": "0.6.4",
229
+ "@backstage/plugin-events-node": "0.4.12",
230
+ "@backstage/plugin-permission-node": "0.10.1",
239
231
  "@backstage/types": "1.2.1",
240
232
  "@google-cloud/storage": "^7.0.0",
241
233
  "@keyv/memcache": "^2.0.1",
@@ -256,6 +248,7 @@
256
248
  "cron": "^3.0.0",
257
249
  "express": "^4.17.1",
258
250
  "express-promise-router": "^4.1.0",
251
+ "express-rate-limit": "^7.5.0",
259
252
  "fs-extra": "^11.2.0",
260
253
  "git-url-parse": "^15.0.0",
261
254
  "helmet": "^6.0.0",
@@ -275,6 +268,7 @@
275
268
  "pg": "^8.11.3",
276
269
  "pg-connection-string": "^2.3.0",
277
270
  "pg-format": "^1.0.4",
271
+ "rate-limit-redis": "^4.2.0",
278
272
  "raw-body": "^2.4.1",
279
273
  "selfsigned": "^2.0.0",
280
274
  "tar": "^6.1.12",
@@ -289,9 +283,9 @@
289
283
  },
290
284
  "devDependencies": {
291
285
  "@aws-sdk/util-stream-node": "^3.350.0",
292
- "@backstage/backend-plugin-api": "1.4.0-next.1",
293
- "@backstage/backend-test-utils": "1.6.0-next.2",
294
- "@backstage/cli": "0.33.0-next.1",
286
+ "@backstage/backend-plugin-api": "1.4.0",
287
+ "@backstage/backend-test-utils": "1.7.0-next.0",
288
+ "@backstage/cli": "0.33.1-next.0",
295
289
  "@google-cloud/cloud-sql-connector": "^1.4.0",
296
290
  "@types/archiver": "^6.0.0",
297
291
  "@types/base64-stream": "^1.0.2",
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- var actionsServiceFactory = require('./entrypoints/actions/actionsServiceFactory.cjs.js');
4
-
5
-
6
-
7
- exports.actionsServiceFactory = actionsServiceFactory.actionsServiceFactory;
8
- //# sourceMappingURL=actions.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actions.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
package/dist/actions.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
-
3
- /**
4
- * @public
5
- */
6
- declare const actionsServiceFactory: _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api.ActionsService, "plugin", "singleton">;
7
-
8
- export { actionsServiceFactory };
@@ -1,8 +0,0 @@
1
- 'use strict';
2
-
3
- var actionsRegistryServiceFactory = require('./entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js');
4
-
5
-
6
-
7
- exports.actionsRegistryServiceFactory = actionsRegistryServiceFactory.actionsRegistryServiceFactory;
8
- //# sourceMappingURL=actionsRegistry.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"actionsRegistry.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,8 +0,0 @@
1
- import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
-
3
- /**
4
- * @public
5
- */
6
- declare const actionsRegistryServiceFactory: _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api.ActionsRegistryService, "plugin", "singleton">;
7
-
8
- export { actionsRegistryServiceFactory };
@@ -1 +0,0 @@
1
- {"version":3,"file":"DefaultActionsService.cjs.js","sources":["../../../src/entrypoints/actions/DefaultActionsService.ts"],"sourcesContent":["/*\n * Copyright 2025 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 ActionsService,\n ActionsServiceAction,\n AuthService,\n BackstageCredentials,\n DiscoveryService,\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { JsonObject } from '@backstage/types';\n\nexport class DefaultActionsService implements ActionsService {\n private constructor(\n private readonly discovery: DiscoveryService,\n private readonly config: RootConfigService,\n private readonly logger: LoggerService,\n private readonly auth: AuthService,\n ) {}\n\n static create({\n discovery,\n config,\n logger,\n auth,\n }: {\n discovery: DiscoveryService;\n config: RootConfigService;\n logger: LoggerService;\n auth: AuthService;\n }) {\n return new DefaultActionsService(discovery, config, logger, auth);\n }\n\n async list({ credentials }: { credentials: BackstageCredentials }) {\n const pluginSources =\n this.config.getOptionalStringArray('backend.actions.pluginSources') ?? [];\n\n const remoteActionsList = await Promise.all(\n pluginSources.map(async source => {\n try {\n const response = await this.makeRequest({\n path: `/.backstage/actions/v1/actions`,\n pluginId: source,\n credentials,\n });\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n const { actions } = (await response.json()) as {\n actions: ActionsServiceAction;\n };\n\n return actions;\n } catch (error) {\n this.logger.warn(`Failed to fetch actions from ${source}`, error);\n return [];\n }\n }),\n );\n\n return { actions: remoteActionsList.flat() };\n }\n\n async invoke(opts: {\n id: string;\n input?: JsonObject;\n credentials: BackstageCredentials;\n }) {\n const pluginId = this.pluginIdFromActionId(opts.id);\n const response = await this.makeRequest({\n path: `/.backstage/actions/v1/actions/${encodeURIComponent(\n opts.id,\n )}/invoke`,\n pluginId,\n credentials: opts.credentials,\n options: {\n method: 'POST',\n body: JSON.stringify(opts.input),\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const { output } = await response.json();\n return { output };\n }\n\n private async makeRequest(opts: {\n path: string;\n pluginId: string;\n options?: RequestInit;\n credentials: BackstageCredentials;\n }) {\n const { path, pluginId, credentials, options } = opts;\n const baseUrl = await this.discovery.getBaseUrl(pluginId);\n\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: credentials,\n targetPluginId: opts.pluginId,\n });\n\n return fetch(`${baseUrl}${path}`, {\n ...options,\n headers: {\n ...options?.headers,\n Authorization: `Bearer ${token}`,\n },\n });\n }\n\n private pluginIdFromActionId(id: string): string {\n const colonIndex = id.indexOf(':');\n if (colonIndex === -1) {\n throw new Error(`Invalid action id: ${id}`);\n }\n return id.substring(0, colonIndex);\n }\n}\n"],"names":["ResponseError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"actionsServiceFactory.cjs.js","sources":["../../../src/entrypoints/actions/actionsServiceFactory.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { createServiceFactory } from '@backstage/backend-plugin-api';\nimport { coreServices } from '@backstage/backend-plugin-api';\nimport { DefaultActionsService } from './DefaultActionsService';\n\n/**\n * @public\n */\nexport const actionsServiceFactory = createServiceFactory({\n service: coreServices.actions,\n deps: {\n discovery: coreServices.discovery,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n auth: coreServices.auth,\n },\n factory: ({ discovery, config, logger, auth }) =>\n DefaultActionsService.create({\n discovery,\n config,\n logger,\n auth,\n }),\n});\n"],"names":["createServiceFactory","coreServices","DefaultActionsService"],"mappings":";;;;;AAsBO,MAAM,wBAAwBA,qCAAqB,CAAA;AAAA,EACxD,SAASC,6BAAa,CAAA,OAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,WAAWA,6BAAa,CAAA,SAAA;AAAA,IACxB,QAAQA,6BAAa,CAAA,UAAA;AAAA,IACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,IACrB,MAAMA,6BAAa,CAAA;AAAA,GACrB;AAAA,EACA,OAAA,EAAS,CAAC,EAAE,SAAA,EAAW,QAAQ,MAAQ,EAAA,IAAA,EACrC,KAAAC,2CAAA,CAAsB,MAAO,CAAA;AAAA,IAC3B,SAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD;AACL,CAAC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DefaultActionsRegistryService.cjs.js","sources":["../../../src/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n ActionsRegistryActionOptions,\n ActionsRegistryService,\n AuthService,\n HttpAuthService,\n LoggerService,\n PluginMetadataService,\n} from '@backstage/backend-plugin-api';\nimport PromiseRouter from 'express-promise-router';\nimport { Router, json } from 'express';\nimport { z, ZodType } from 'zod';\nimport zodToJsonSchema from 'zod-to-json-schema';\nimport {\n ForwardedError,\n InputError,\n NotAllowedError,\n NotFoundError,\n} from '@backstage/errors';\n\nexport class DefaultActionsRegistryService implements ActionsRegistryService {\n private actions: Map<string, ActionsRegistryActionOptions<any, any>> =\n new Map();\n\n private constructor(\n private readonly logger: LoggerService,\n private readonly httpAuth: HttpAuthService,\n private readonly auth: AuthService,\n private readonly metadata: PluginMetadataService,\n ) {}\n\n static create({\n httpAuth,\n logger,\n auth,\n metadata,\n }: {\n httpAuth: HttpAuthService;\n logger: LoggerService;\n auth: AuthService;\n metadata: PluginMetadataService;\n }): DefaultActionsRegistryService {\n return new DefaultActionsRegistryService(logger, httpAuth, auth, metadata);\n }\n\n createRouter(): Router {\n const router = PromiseRouter();\n router.use(json());\n\n router.get('/.backstage/actions/v1/actions', (_, res) => {\n return res.json({\n actions: Array.from(this.actions.entries()).map(([id, action]) => ({\n id,\n ...action,\n schema: {\n input: action.schema?.input\n ? zodToJsonSchema(action.schema.input(z))\n : zodToJsonSchema(z.any()),\n output: action.schema?.output\n ? zodToJsonSchema(action.schema.output(z))\n : zodToJsonSchema(z.any()),\n },\n })),\n });\n });\n\n router.post(\n '/.backstage/actions/v1/actions/:actionId/invoke',\n async (req, res) => {\n const credentials = await this.httpAuth.credentials(req);\n if (this.auth.isPrincipal(credentials, 'user')) {\n if (!credentials.principal.actor) {\n throw new NotAllowedError(\n `Actions must be invoked by a service, not a user`,\n );\n }\n } else if (this.auth.isPrincipal(credentials, 'none')) {\n throw new NotAllowedError(\n `Actions must be invoked by a service, not an anonymous request`,\n );\n }\n\n const action = this.actions.get(req.params.actionId);\n\n if (!action) {\n throw new NotFoundError(`Action \"${req.params.actionId}\" not found`);\n }\n\n const input = action.schema?.input\n ? action.schema.input(z).safeParse(req.body)\n : ({ success: true, data: undefined } as const);\n\n if (!input.success) {\n throw new InputError(\n `Invalid input to action \"${req.params.actionId}\"`,\n input.error,\n );\n }\n\n try {\n const result = await action.action({\n input: input.data,\n credentials,\n logger: this.logger,\n });\n\n const output = action.schema?.output\n ? action.schema.output(z).safeParse(result?.output)\n : ({ success: true, data: result?.output } as const);\n\n if (!output.success) {\n throw new InputError(\n `Invalid output from action \"${req.params.actionId}\"`,\n output.error,\n );\n }\n\n res.json({ output: output.data });\n } catch (error) {\n throw new ForwardedError(\n `Failed execution of action \"${req.params.actionId}\"`,\n error,\n );\n }\n },\n );\n return router;\n }\n\n register<TInputSchema extends ZodType, TOutputSchema extends ZodType>(\n options: ActionsRegistryActionOptions<TInputSchema, TOutputSchema>,\n ): void {\n const id = `${this.metadata.getId()}:${options.name}`;\n\n if (this.actions.has(id)) {\n throw new Error(`Action with id \"${id}\" is already registered`);\n }\n\n this.actions.set(id, options);\n }\n}\n"],"names":["PromiseRouter","json","zodToJsonSchema","z","NotAllowedError","NotFoundError","InputError","ForwardedError"],"mappings":";;;;;;;;;;;;;AAmCO,MAAM,6BAAgE,CAAA;AAAA,EAInE,WACW,CAAA,MAAA,EACA,QACA,EAAA,IAAA,EACA,QACjB,EAAA;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA;AAChB,EARK,OAAA,uBACF,GAAI,EAAA;AAAA,EASV,OAAO,MAAO,CAAA;AAAA,IACZ,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GAMgC,EAAA;AAChC,IAAA,OAAO,IAAI,6BAAA,CAA8B,MAAQ,EAAA,QAAA,EAAU,MAAM,QAAQ,CAAA;AAAA;AAC3E,EAEA,YAAuB,GAAA;AACrB,IAAA,MAAM,SAASA,uBAAc,EAAA;AAC7B,IAAO,MAAA,CAAA,GAAA,CAAIC,cAAM,CAAA;AAEjB,IAAA,MAAA,CAAO,GAAI,CAAA,gCAAA,EAAkC,CAAC,CAAA,EAAG,GAAQ,KAAA;AACvD,MAAA,OAAO,IAAI,IAAK,CAAA;AAAA,QACd,OAAS,EAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,EAAS,CAAA,CAAE,GAAI,CAAA,CAAC,CAAC,EAAA,EAAI,MAAM,CAAO,MAAA;AAAA,UACjE,EAAA;AAAA,UACA,GAAG,MAAA;AAAA,UACH,MAAQ,EAAA;AAAA,YACN,KAAO,EAAA,MAAA,CAAO,MAAQ,EAAA,KAAA,GAClBC,iCAAgB,MAAO,CAAA,MAAA,CAAO,KAAM,CAAAC,KAAC,CAAC,CAAA,GACtCD,gCAAgB,CAAAC,KAAA,CAAE,KAAK,CAAA;AAAA,YAC3B,MAAQ,EAAA,MAAA,CAAO,MAAQ,EAAA,MAAA,GACnBD,iCAAgB,MAAO,CAAA,MAAA,CAAO,MAAO,CAAAC,KAAC,CAAC,CAAA,GACvCD,gCAAgB,CAAAC,KAAA,CAAE,KAAK;AAAA;AAC7B,SACA,CAAA;AAAA,OACH,CAAA;AAAA,KACF,CAAA;AAED,IAAO,MAAA,CAAA,IAAA;AAAA,MACL,iDAAA;AAAA,MACA,OAAO,KAAK,GAAQ,KAAA;AAClB,QAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,YAAY,GAAG,CAAA;AACvD,QAAA,IAAI,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,WAAA,EAAa,MAAM,CAAG,EAAA;AAC9C,UAAI,IAAA,CAAC,WAAY,CAAA,SAAA,CAAU,KAAO,EAAA;AAChC,YAAA,MAAM,IAAIC,sBAAA;AAAA,cACR,CAAA,gDAAA;AAAA,aACF;AAAA;AACF,mBACS,IAAK,CAAA,IAAA,CAAK,WAAY,CAAA,WAAA,EAAa,MAAM,CAAG,EAAA;AACrD,UAAA,MAAM,IAAIA,sBAAA;AAAA,YACR,CAAA,8DAAA;AAAA,WACF;AAAA;AAGF,QAAA,MAAM,SAAS,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,CAAI,OAAO,QAAQ,CAAA;AAEnD,QAAA,IAAI,CAAC,MAAQ,EAAA;AACX,UAAA,MAAM,IAAIC,oBAAc,CAAA,CAAA,QAAA,EAAW,GAAI,CAAA,MAAA,CAAO,QAAQ,CAAa,WAAA,CAAA,CAAA;AAAA;AAGrE,QAAA,MAAM,QAAQ,MAAO,CAAA,MAAA,EAAQ,KACzB,GAAA,MAAA,CAAO,OAAO,KAAM,CAAAF,KAAC,CAAE,CAAA,SAAA,CAAU,IAAI,IAAI,CAAA,GACxC,EAAE,OAAS,EAAA,IAAA,EAAM,MAAM,KAAU,CAAA,EAAA;AAEtC,QAAI,IAAA,CAAC,MAAM,OAAS,EAAA;AAClB,UAAA,MAAM,IAAIG,iBAAA;AAAA,YACR,CAAA,yBAAA,EAA4B,GAAI,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,YAC/C,KAAM,CAAA;AAAA,WACR;AAAA;AAGF,QAAI,IAAA;AACF,UAAM,MAAA,MAAA,GAAS,MAAM,MAAA,CAAO,MAAO,CAAA;AAAA,YACjC,OAAO,KAAM,CAAA,IAAA;AAAA,YACb,WAAA;AAAA,YACA,QAAQ,IAAK,CAAA;AAAA,WACd,CAAA;AAED,UAAA,MAAM,SAAS,MAAO,CAAA,MAAA,EAAQ,SAC1B,MAAO,CAAA,MAAA,CAAO,OAAOH,KAAC,CAAA,CAAE,SAAU,CAAA,MAAA,EAAQ,MAAM,CAC/C,GAAA,EAAE,SAAS,IAAM,EAAA,IAAA,EAAM,QAAQ,MAAO,EAAA;AAE3C,UAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,YAAA,MAAM,IAAIG,iBAAA;AAAA,cACR,CAAA,4BAAA,EAA+B,GAAI,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,cAClD,MAAO,CAAA;AAAA,aACT;AAAA;AAGF,UAAA,GAAA,CAAI,IAAK,CAAA,EAAE,MAAQ,EAAA,MAAA,CAAO,MAAM,CAAA;AAAA,iBACzB,KAAO,EAAA;AACd,UAAA,MAAM,IAAIC,qBAAA;AAAA,YACR,CAAA,4BAAA,EAA+B,GAAI,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA,CAAA;AAAA,YAClD;AAAA,WACF;AAAA;AACF;AACF,KACF;AACA,IAAO,OAAA,MAAA;AAAA;AACT,EAEA,SACE,OACM,EAAA;AACN,IAAM,MAAA,EAAA,GAAK,GAAG,IAAK,CAAA,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAEnD,IAAA,IAAI,IAAK,CAAA,OAAA,CAAQ,GAAI,CAAA,EAAE,CAAG,EAAA;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAmB,gBAAA,EAAA,EAAE,CAAyB,uBAAA,CAAA,CAAA;AAAA;AAGhE,IAAK,IAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,EAAA,EAAI,OAAO,CAAA;AAAA;AAEhC;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"actionsRegistryServiceFactory.cjs.js","sources":["../../../src/entrypoints/actionsRegistry/actionsRegistryServiceFactory.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { DefaultActionsRegistryService } from './DefaultActionsRegistryService';\n\n/**\n * @public\n */\nexport const actionsRegistryServiceFactory = createServiceFactory({\n service: coreServices.actionsRegistry,\n deps: {\n metadata: coreServices.pluginMetadata,\n httpRouter: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n logger: coreServices.logger,\n auth: coreServices.auth,\n },\n factory: ({ metadata, httpRouter, httpAuth, logger, auth }) => {\n const actionsRegistryService = DefaultActionsRegistryService.create({\n httpAuth,\n logger,\n auth,\n metadata,\n });\n\n httpRouter.use(actionsRegistryService.createRouter());\n\n return actionsRegistryService;\n },\n});\n"],"names":["createServiceFactory","coreServices","DefaultActionsRegistryService"],"mappings":";;;;;AAyBO,MAAM,gCAAgCA,qCAAqB,CAAA;AAAA,EAChE,SAASC,6BAAa,CAAA,eAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACJ,UAAUA,6BAAa,CAAA,cAAA;AAAA,IACvB,YAAYA,6BAAa,CAAA,UAAA;AAAA,IACzB,UAAUA,6BAAa,CAAA,QAAA;AAAA,IACvB,QAAQA,6BAAa,CAAA,MAAA;AAAA,IACrB,MAAMA,6BAAa,CAAA;AAAA,GACrB;AAAA,EACA,OAAA,EAAS,CAAC,EAAE,QAAA,EAAU,YAAY,QAAU,EAAA,MAAA,EAAQ,MAAW,KAAA;AAC7D,IAAM,MAAA,sBAAA,GAAyBC,4DAA8B,MAAO,CAAA;AAAA,MAClE,QAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAW,UAAA,CAAA,GAAA,CAAI,sBAAuB,CAAA,YAAA,EAAc,CAAA;AAEpD,IAAO,OAAA,sBAAA;AAAA;AAEX,CAAC;;;;"}