@backstage/backend-defaults 0.10.0-next.3 → 0.10.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.
- package/CHANGELOG.md +49 -0
- package/config.d.ts +10 -0
- package/dist/CreateBackend.cjs.js +4 -0
- package/dist/CreateBackend.cjs.js.map +1 -1
- package/dist/actions.cjs.js +8 -0
- package/dist/actions.cjs.js.map +1 -0
- package/dist/actions.d.ts +8 -0
- package/dist/actionsRegistry.cjs.js +8 -0
- package/dist/actionsRegistry.cjs.js.map +1 -0
- package/dist/actionsRegistry.d.ts +8 -0
- package/dist/entrypoints/actions/DefaultActionsService.cjs.js +90 -0
- package/dist/entrypoints/actions/DefaultActionsService.cjs.js.map +1 -0
- package/dist/entrypoints/actions/actionsServiceFactory.cjs.js +23 -0
- package/dist/entrypoints/actions/actionsServiceFactory.cjs.js.map +1 -0
- package/dist/entrypoints/actionsRegistry/DefaultActionsRegistryService.cjs.js +105 -0
- package/dist/entrypoints/actionsRegistry/DefaultActionsRegistryService.cjs.js.map +1 -0
- package/dist/entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js +28 -0
- package/dist/entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js.map +1 -0
- package/dist/package.json.cjs.js +11 -2
- package/dist/package.json.cjs.js.map +1 -1
- package/package.json +30 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# @backstage/backend-defaults
|
|
2
2
|
|
|
3
|
+
## 0.10.1-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c999c25: Added some default implementations for the `ActionsService` and `ActionsRegistryService` that allow registration of actions for a particular plugin.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/backend-plugin-api@1.4.0-next.0
|
|
10
|
+
- @backstage/backend-app-api@1.2.4-next.0
|
|
11
|
+
- @backstage/cli-node@0.2.13
|
|
12
|
+
- @backstage/config-loader@1.10.1
|
|
13
|
+
- @backstage/plugin-auth-node@0.6.4-next.0
|
|
14
|
+
- @backstage/plugin-events-node@0.4.12-next.0
|
|
15
|
+
- @backstage/plugin-permission-node@0.10.1-next.0
|
|
16
|
+
|
|
17
|
+
## 0.10.0
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- d385854: **BREAKING**: The `DefaultSchedulerService` constructor options now requires `RootLifecycleService`, `HttpRouterService`, and `PluginMetadataService` fields.
|
|
22
|
+
|
|
23
|
+
The scheduler will register a REST API for listing and triggering tasks. Please see [the scheduler documentation](https://backstage.io/docs/backend-system/core-services/scheduler) for more details about this API.
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- 1e06afd: `GithubUrlReader`'s search detects glob-patterns supported by `minimatch`, instead of just detecting
|
|
28
|
+
`*` and `?` characters.
|
|
29
|
+
|
|
30
|
+
For example, this allows to search for patterns like `{C,c}atalog-info.yaml`.
|
|
31
|
+
|
|
32
|
+
- acea1d4: update documentation
|
|
33
|
+
- 72d019d: Removed various typos
|
|
34
|
+
- c6bc67d: Added Valkey support alongside Redis in backend-defaults cache clients, using the new Keyv Valkey package. Also extended backend-test-utils to support Valkey in tests.
|
|
35
|
+
- 36f77e9: Bug fix: Pass user provided token through to gitlab url resolvers
|
|
36
|
+
- 0e7a640: The `GithubUrlReader` will now use the token from `options` when fetching repo details
|
|
37
|
+
- Updated dependencies
|
|
38
|
+
- @backstage/integration@1.17.0
|
|
39
|
+
- @backstage/backend-app-api@1.2.3
|
|
40
|
+
- @backstage/plugin-auth-node@0.6.3
|
|
41
|
+
- @backstage/backend-plugin-api@1.3.1
|
|
42
|
+
- @backstage/plugin-permission-node@0.10.0
|
|
43
|
+
- @backstage/config-loader@1.10.1
|
|
44
|
+
- @backstage/integration-aws-node@0.1.16
|
|
45
|
+
- @backstage/cli-node@0.2.13
|
|
46
|
+
- @backstage/config@1.3.2
|
|
47
|
+
- @backstage/backend-dev-utils@0.1.5
|
|
48
|
+
- @backstage/errors@1.2.7
|
|
49
|
+
- @backstage/types@1.2.1
|
|
50
|
+
- @backstage/plugin-events-node@0.4.11
|
|
51
|
+
|
|
3
52
|
## 0.10.0-next.3
|
|
4
53
|
|
|
5
54
|
### Patch Changes
|
package/config.d.ts
CHANGED
|
@@ -121,6 +121,16 @@ export interface Config {
|
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Options used by the default actions service.
|
|
126
|
+
*/
|
|
127
|
+
actions?: {
|
|
128
|
+
/**
|
|
129
|
+
* List of plugin sources to load actions from.
|
|
130
|
+
*/
|
|
131
|
+
pluginSources?: string[];
|
|
132
|
+
};
|
|
133
|
+
|
|
124
134
|
/**
|
|
125
135
|
* Options used by the default auth, httpAuth and userInfo services.
|
|
126
136
|
*/
|
|
@@ -21,8 +21,12 @@ var scheduler = require('@backstage/backend-defaults/scheduler');
|
|
|
21
21
|
var urlReader = require('@backstage/backend-defaults/urlReader');
|
|
22
22
|
var userInfo = require('@backstage/backend-defaults/userInfo');
|
|
23
23
|
var pluginEventsNode = require('@backstage/plugin-events-node');
|
|
24
|
+
var actionsRegistryServiceFactory = require('./entrypoints/actionsRegistry/actionsRegistryServiceFactory.cjs.js');
|
|
25
|
+
var actionsServiceFactory = require('./entrypoints/actions/actionsServiceFactory.cjs.js');
|
|
24
26
|
|
|
25
27
|
const defaultServiceFactories = [
|
|
28
|
+
actionsRegistryServiceFactory.actionsRegistryServiceFactory,
|
|
29
|
+
actionsServiceFactory.actionsServiceFactory,
|
|
26
30
|
auditor.auditorServiceFactory,
|
|
27
31
|
auth.authServiceFactory,
|
|
28
32
|
cache.cacheServiceFactory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateBackend.cjs.js","sources":["../src/CreateBackend.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 { Backend, createSpecializedBackend } from '@backstage/backend-app-api';\nimport { auditorServiceFactory } from '@backstage/backend-defaults/auditor';\nimport { authServiceFactory } from '@backstage/backend-defaults/auth';\nimport { cacheServiceFactory } from '@backstage/backend-defaults/cache';\nimport { databaseServiceFactory } from '@backstage/backend-defaults/database';\nimport { discoveryServiceFactory } from '@backstage/backend-defaults/discovery';\nimport { httpAuthServiceFactory } from '@backstage/backend-defaults/httpAuth';\nimport { httpRouterServiceFactory } from '@backstage/backend-defaults/httpRouter';\nimport { lifecycleServiceFactory } from '@backstage/backend-defaults/lifecycle';\nimport { loggerServiceFactory } from '@backstage/backend-defaults/logger';\nimport { permissionsServiceFactory } from '@backstage/backend-defaults/permissions';\nimport { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';\nimport { rootConfigServiceFactory } from '@backstage/backend-defaults/rootConfig';\nimport { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth';\nimport { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle';\nimport { rootLoggerServiceFactory } from '@backstage/backend-defaults/rootLogger';\nimport { schedulerServiceFactory } from '@backstage/backend-defaults/scheduler';\nimport { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader';\nimport { userInfoServiceFactory } from '@backstage/backend-defaults/userInfo';\nimport { eventsServiceFactory } from '@backstage/plugin-events-node';\n\nexport const defaultServiceFactories = [\n auditorServiceFactory,\n authServiceFactory,\n cacheServiceFactory,\n rootConfigServiceFactory,\n databaseServiceFactory,\n discoveryServiceFactory,\n httpAuthServiceFactory,\n httpRouterServiceFactory,\n lifecycleServiceFactory,\n loggerServiceFactory,\n permissionsServiceFactory,\n permissionsRegistryServiceFactory,\n rootHealthServiceFactory,\n rootHttpRouterServiceFactory,\n rootLifecycleServiceFactory,\n rootLoggerServiceFactory,\n schedulerServiceFactory,\n userInfoServiceFactory,\n urlReaderServiceFactory,\n eventsServiceFactory,\n];\n\n/**\n * @public\n */\nexport function createBackend(): Backend {\n return createSpecializedBackend({ defaultServiceFactories });\n}\n"],"names":["auditorServiceFactory","authServiceFactory","cacheServiceFactory","rootConfigServiceFactory","databaseServiceFactory","discoveryServiceFactory","httpAuthServiceFactory","httpRouterServiceFactory","lifecycleServiceFactory","loggerServiceFactory","permissionsServiceFactory","permissionsRegistryServiceFactory","rootHealthServiceFactory","rootHttpRouterServiceFactory","rootLifecycleServiceFactory","rootLoggerServiceFactory","schedulerServiceFactory","userInfoServiceFactory","urlReaderServiceFactory","eventsServiceFactory","createSpecializedBackend"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CreateBackend.cjs.js","sources":["../src/CreateBackend.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 { Backend, createSpecializedBackend } from '@backstage/backend-app-api';\nimport { auditorServiceFactory } from '@backstage/backend-defaults/auditor';\nimport { authServiceFactory } from '@backstage/backend-defaults/auth';\nimport { cacheServiceFactory } from '@backstage/backend-defaults/cache';\nimport { databaseServiceFactory } from '@backstage/backend-defaults/database';\nimport { discoveryServiceFactory } from '@backstage/backend-defaults/discovery';\nimport { httpAuthServiceFactory } from '@backstage/backend-defaults/httpAuth';\nimport { httpRouterServiceFactory } from '@backstage/backend-defaults/httpRouter';\nimport { lifecycleServiceFactory } from '@backstage/backend-defaults/lifecycle';\nimport { loggerServiceFactory } from '@backstage/backend-defaults/logger';\nimport { permissionsServiceFactory } from '@backstage/backend-defaults/permissions';\nimport { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';\nimport { rootConfigServiceFactory } from '@backstage/backend-defaults/rootConfig';\nimport { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth';\nimport { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { rootLifecycleServiceFactory } from '@backstage/backend-defaults/rootLifecycle';\nimport { rootLoggerServiceFactory } from '@backstage/backend-defaults/rootLogger';\nimport { schedulerServiceFactory } from '@backstage/backend-defaults/scheduler';\nimport { urlReaderServiceFactory } from '@backstage/backend-defaults/urlReader';\nimport { userInfoServiceFactory } from '@backstage/backend-defaults/userInfo';\nimport { eventsServiceFactory } from '@backstage/plugin-events-node';\nimport { actionsRegistryServiceFactory } from './entrypoints/actionsRegistry';\nimport { actionsServiceFactory } from './entrypoints/actions';\n\nexport const defaultServiceFactories = [\n actionsRegistryServiceFactory,\n actionsServiceFactory,\n auditorServiceFactory,\n authServiceFactory,\n cacheServiceFactory,\n rootConfigServiceFactory,\n databaseServiceFactory,\n discoveryServiceFactory,\n httpAuthServiceFactory,\n httpRouterServiceFactory,\n lifecycleServiceFactory,\n loggerServiceFactory,\n permissionsServiceFactory,\n permissionsRegistryServiceFactory,\n rootHealthServiceFactory,\n rootHttpRouterServiceFactory,\n rootLifecycleServiceFactory,\n rootLoggerServiceFactory,\n schedulerServiceFactory,\n userInfoServiceFactory,\n urlReaderServiceFactory,\n eventsServiceFactory,\n];\n\n/**\n * @public\n */\nexport function createBackend(): Backend {\n return createSpecializedBackend({ defaultServiceFactories });\n}\n"],"names":["actionsRegistryServiceFactory","actionsServiceFactory","auditorServiceFactory","authServiceFactory","cacheServiceFactory","rootConfigServiceFactory","databaseServiceFactory","discoveryServiceFactory","httpAuthServiceFactory","httpRouterServiceFactory","lifecycleServiceFactory","loggerServiceFactory","permissionsServiceFactory","permissionsRegistryServiceFactory","rootHealthServiceFactory","rootHttpRouterServiceFactory","rootLifecycleServiceFactory","rootLoggerServiceFactory","schedulerServiceFactory","userInfoServiceFactory","urlReaderServiceFactory","eventsServiceFactory","createSpecializedBackend"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwCO,MAAM,uBAA0B,GAAA;AAAA,EACrCA,2DAAA;AAAA,EACAC,2CAAA;AAAA,EACAC,6BAAA;AAAA,EACAC,uBAAA;AAAA,EACAC,yBAAA;AAAA,EACAC,mCAAA;AAAA,EACAC,+BAAA;AAAA,EACAC,iCAAA;AAAA,EACAC,+BAAA;AAAA,EACAC,mCAAA;AAAA,EACAC,iCAAA;AAAA,EACAC,2BAAA;AAAA,EACAC,qCAAA;AAAA,EACAC,qDAAA;AAAA,EACAC,mCAAA;AAAA,EACAC,2CAAA;AAAA,EACAC,yCAAA;AAAA,EACAC,mCAAA;AAAA,EACAC,iCAAA;AAAA,EACAC,+BAAA;AAAA,EACAC,iCAAA;AAAA,EACAC;AACF;AAKO,SAAS,aAAyB,GAAA;AACvC,EAAO,OAAAC,sCAAA,CAAyB,EAAE,uBAAA,EAAyB,CAAA;AAC7D;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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 };
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionsRegistry.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
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 };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
|
|
5
|
+
class DefaultActionsService {
|
|
6
|
+
constructor(discovery, config, logger, auth) {
|
|
7
|
+
this.discovery = discovery;
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
this.auth = auth;
|
|
11
|
+
}
|
|
12
|
+
static create({
|
|
13
|
+
discovery,
|
|
14
|
+
config,
|
|
15
|
+
logger,
|
|
16
|
+
auth
|
|
17
|
+
}) {
|
|
18
|
+
return new DefaultActionsService(discovery, config, logger, auth);
|
|
19
|
+
}
|
|
20
|
+
async list({ credentials }) {
|
|
21
|
+
const pluginSources = this.config.getOptionalStringArray("backend.actions.pluginSources") ?? [];
|
|
22
|
+
const remoteActionsList = await Promise.all(
|
|
23
|
+
pluginSources.map(async (source) => {
|
|
24
|
+
try {
|
|
25
|
+
const response = await this.makeRequest({
|
|
26
|
+
path: `/.backstage/actions/v1/actions`,
|
|
27
|
+
pluginId: source,
|
|
28
|
+
credentials
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw await errors.ResponseError.fromResponse(response);
|
|
32
|
+
}
|
|
33
|
+
const { actions } = await response.json();
|
|
34
|
+
return actions;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
this.logger.warn(`Failed to fetch actions from ${source}`, error);
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
return { actions: remoteActionsList.flat() };
|
|
42
|
+
}
|
|
43
|
+
async invoke(opts) {
|
|
44
|
+
const pluginId = this.pluginIdFromActionId(opts.id);
|
|
45
|
+
const response = await this.makeRequest({
|
|
46
|
+
path: `/.backstage/actions/v1/actions/${encodeURIComponent(
|
|
47
|
+
opts.id
|
|
48
|
+
)}/invoke`,
|
|
49
|
+
pluginId,
|
|
50
|
+
credentials: opts.credentials,
|
|
51
|
+
options: {
|
|
52
|
+
method: "POST",
|
|
53
|
+
body: JSON.stringify(opts.input),
|
|
54
|
+
headers: {
|
|
55
|
+
"Content-Type": "application/json"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
throw await errors.ResponseError.fromResponse(response);
|
|
61
|
+
}
|
|
62
|
+
const { output } = await response.json();
|
|
63
|
+
return { output };
|
|
64
|
+
}
|
|
65
|
+
async makeRequest(opts) {
|
|
66
|
+
const { path, pluginId, credentials, options } = opts;
|
|
67
|
+
const baseUrl = await this.discovery.getBaseUrl(pluginId);
|
|
68
|
+
const { token } = await this.auth.getPluginRequestToken({
|
|
69
|
+
onBehalfOf: credentials,
|
|
70
|
+
targetPluginId: opts.pluginId
|
|
71
|
+
});
|
|
72
|
+
return fetch(`${baseUrl}${path}`, {
|
|
73
|
+
...options,
|
|
74
|
+
headers: {
|
|
75
|
+
...options?.headers,
|
|
76
|
+
Authorization: `Bearer ${token}`
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
pluginIdFromActionId(id) {
|
|
81
|
+
const colonIndex = id.indexOf(":");
|
|
82
|
+
if (colonIndex === -1) {
|
|
83
|
+
throw new Error(`Invalid action id: ${id}`);
|
|
84
|
+
}
|
|
85
|
+
return id.substring(0, colonIndex);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exports.DefaultActionsService = DefaultActionsService;
|
|
90
|
+
//# sourceMappingURL=DefaultActionsService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var DefaultActionsService = require('./DefaultActionsService.cjs.js');
|
|
5
|
+
|
|
6
|
+
const actionsServiceFactory = backendPluginApi.createServiceFactory({
|
|
7
|
+
service: backendPluginApi.coreServices.actions,
|
|
8
|
+
deps: {
|
|
9
|
+
discovery: backendPluginApi.coreServices.discovery,
|
|
10
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
11
|
+
logger: backendPluginApi.coreServices.logger,
|
|
12
|
+
auth: backendPluginApi.coreServices.auth
|
|
13
|
+
},
|
|
14
|
+
factory: ({ discovery, config, logger, auth }) => DefaultActionsService.DefaultActionsService.create({
|
|
15
|
+
discovery,
|
|
16
|
+
config,
|
|
17
|
+
logger,
|
|
18
|
+
auth
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
exports.actionsServiceFactory = actionsServiceFactory;
|
|
23
|
+
//# sourceMappingURL=actionsServiceFactory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;;;;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Router = require('express-promise-router');
|
|
4
|
+
var express = require('express');
|
|
5
|
+
var zod = require('zod');
|
|
6
|
+
var zodToJsonSchema = require('zod-to-json-schema');
|
|
7
|
+
var errors = require('@backstage/errors');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
12
|
+
var zodToJsonSchema__default = /*#__PURE__*/_interopDefaultCompat(zodToJsonSchema);
|
|
13
|
+
|
|
14
|
+
class DefaultActionsRegistryService {
|
|
15
|
+
constructor(logger, httpAuth, auth, metadata) {
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
this.httpAuth = httpAuth;
|
|
18
|
+
this.auth = auth;
|
|
19
|
+
this.metadata = metadata;
|
|
20
|
+
}
|
|
21
|
+
actions = /* @__PURE__ */ new Map();
|
|
22
|
+
static create({
|
|
23
|
+
httpAuth,
|
|
24
|
+
logger,
|
|
25
|
+
auth,
|
|
26
|
+
metadata
|
|
27
|
+
}) {
|
|
28
|
+
return new DefaultActionsRegistryService(logger, httpAuth, auth, metadata);
|
|
29
|
+
}
|
|
30
|
+
createRouter() {
|
|
31
|
+
const router = Router__default.default();
|
|
32
|
+
router.use(express.json());
|
|
33
|
+
router.get("/.backstage/actions/v1/actions", (_, res) => {
|
|
34
|
+
return res.json({
|
|
35
|
+
actions: Array.from(this.actions.entries()).map(([id, action]) => ({
|
|
36
|
+
id,
|
|
37
|
+
...action,
|
|
38
|
+
schema: {
|
|
39
|
+
input: action.schema?.input ? zodToJsonSchema__default.default(action.schema.input(zod.z)) : zodToJsonSchema__default.default(zod.z.any()),
|
|
40
|
+
output: action.schema?.output ? zodToJsonSchema__default.default(action.schema.output(zod.z)) : zodToJsonSchema__default.default(zod.z.any())
|
|
41
|
+
}
|
|
42
|
+
}))
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
router.post(
|
|
46
|
+
"/.backstage/actions/v1/actions/:actionId/invoke",
|
|
47
|
+
async (req, res) => {
|
|
48
|
+
const credentials = await this.httpAuth.credentials(req);
|
|
49
|
+
if (this.auth.isPrincipal(credentials, "user")) {
|
|
50
|
+
if (!credentials.principal.actor) {
|
|
51
|
+
throw new errors.NotAllowedError(
|
|
52
|
+
`Actions must be invoked by a service, not a user`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
} else if (this.auth.isPrincipal(credentials, "none")) {
|
|
56
|
+
throw new errors.NotAllowedError(
|
|
57
|
+
`Actions must be invoked by a service, not an anonymous request`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
const action = this.actions.get(req.params.actionId);
|
|
61
|
+
if (!action) {
|
|
62
|
+
throw new errors.NotFoundError(`Action "${req.params.actionId}" not found`);
|
|
63
|
+
}
|
|
64
|
+
const input = action.schema?.input ? action.schema.input(zod.z).safeParse(req.body) : { success: true, data: void 0 };
|
|
65
|
+
if (!input.success) {
|
|
66
|
+
throw new errors.InputError(
|
|
67
|
+
`Invalid input to action "${req.params.actionId}"`,
|
|
68
|
+
input.error
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const result = await action.action({
|
|
73
|
+
input: input.data,
|
|
74
|
+
credentials,
|
|
75
|
+
logger: this.logger
|
|
76
|
+
});
|
|
77
|
+
const output = action.schema?.output ? action.schema.output(zod.z).safeParse(result?.output) : { success: true, data: result?.output };
|
|
78
|
+
if (!output.success) {
|
|
79
|
+
throw new errors.InputError(
|
|
80
|
+
`Invalid output from action "${req.params.actionId}"`,
|
|
81
|
+
output.error
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
res.json({ output: output.data });
|
|
85
|
+
} catch (error) {
|
|
86
|
+
throw new errors.ForwardedError(
|
|
87
|
+
`Failed execution of action "${req.params.actionId}"`,
|
|
88
|
+
error
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
return router;
|
|
94
|
+
}
|
|
95
|
+
register(options) {
|
|
96
|
+
const id = `${this.metadata.getId()}:${options.name}`;
|
|
97
|
+
if (this.actions.has(id)) {
|
|
98
|
+
throw new Error(`Action with id "${id}" is already registered`);
|
|
99
|
+
}
|
|
100
|
+
this.actions.set(id, options);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.DefaultActionsRegistryService = DefaultActionsRegistryService;
|
|
105
|
+
//# sourceMappingURL=DefaultActionsRegistryService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var DefaultActionsRegistryService = require('./DefaultActionsRegistryService.cjs.js');
|
|
5
|
+
|
|
6
|
+
const actionsRegistryServiceFactory = backendPluginApi.createServiceFactory({
|
|
7
|
+
service: backendPluginApi.coreServices.actionsRegistry,
|
|
8
|
+
deps: {
|
|
9
|
+
metadata: backendPluginApi.coreServices.pluginMetadata,
|
|
10
|
+
httpRouter: backendPluginApi.coreServices.httpRouter,
|
|
11
|
+
httpAuth: backendPluginApi.coreServices.httpAuth,
|
|
12
|
+
logger: backendPluginApi.coreServices.logger,
|
|
13
|
+
auth: backendPluginApi.coreServices.auth
|
|
14
|
+
},
|
|
15
|
+
factory: ({ metadata, httpRouter, httpAuth, logger, auth }) => {
|
|
16
|
+
const actionsRegistryService = DefaultActionsRegistryService.DefaultActionsRegistryService.create({
|
|
17
|
+
httpAuth,
|
|
18
|
+
logger,
|
|
19
|
+
auth,
|
|
20
|
+
metadata
|
|
21
|
+
});
|
|
22
|
+
httpRouter.use(actionsRegistryService.createRouter());
|
|
23
|
+
return actionsRegistryService;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
exports.actionsRegistryServiceFactory = actionsRegistryServiceFactory;
|
|
28
|
+
//# sourceMappingURL=actionsRegistryServiceFactory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;;;;"}
|
package/dist/package.json.cjs.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var name = "@backstage/backend-defaults";
|
|
6
|
-
var version = "0.10.
|
|
6
|
+
var version = "0.10.1-next.0";
|
|
7
7
|
var description = "Backend defaults used by Backstage backend apps";
|
|
8
8
|
var backstage = {
|
|
9
9
|
role: "node-library"
|
|
@@ -23,6 +23,8 @@ var repository = {
|
|
|
23
23
|
var license = "Apache-2.0";
|
|
24
24
|
var exports$1 = {
|
|
25
25
|
".": "./src/index.ts",
|
|
26
|
+
"./actions": "./src/entrypoints/actions/index.ts",
|
|
27
|
+
"./actionsRegistry": "./src/entrypoints/actionsRegistry/index.ts",
|
|
26
28
|
"./auditor": "./src/entrypoints/auditor/index.ts",
|
|
27
29
|
"./auth": "./src/entrypoints/auth/index.ts",
|
|
28
30
|
"./cache": "./src/entrypoints/cache/index.ts",
|
|
@@ -48,6 +50,12 @@ var main = "src/index.ts";
|
|
|
48
50
|
var types = "src/index.ts";
|
|
49
51
|
var typesVersions = {
|
|
50
52
|
"*": {
|
|
53
|
+
actions: [
|
|
54
|
+
"src/entrypoints/actions/index.ts"
|
|
55
|
+
],
|
|
56
|
+
actionsRegistry: [
|
|
57
|
+
"src/entrypoints/actionsRegistry/index.ts"
|
|
58
|
+
],
|
|
51
59
|
auditor: [
|
|
52
60
|
"src/entrypoints/auditor/index.ts"
|
|
53
61
|
],
|
|
@@ -191,7 +199,8 @@ var dependencies = {
|
|
|
191
199
|
"winston-transport": "^4.5.0",
|
|
192
200
|
yauzl: "^3.0.0",
|
|
193
201
|
yn: "^4.0.0",
|
|
194
|
-
zod: "^3.22.4"
|
|
202
|
+
zod: "^3.22.4",
|
|
203
|
+
"zod-to-json-schema": "^3.20.4"
|
|
195
204
|
};
|
|
196
205
|
var devDependencies = {
|
|
197
206
|
"@aws-sdk/util-stream-node": "^3.350.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-defaults",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.1-next.0",
|
|
4
4
|
"description": "Backend defaults used by Backstage backend apps",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -24,6 +24,16 @@
|
|
|
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
|
+
},
|
|
27
37
|
"./auditor": {
|
|
28
38
|
"require": "./dist/auditor.cjs.js",
|
|
29
39
|
"types": "./dist/auditor.d.ts",
|
|
@@ -125,6 +135,12 @@
|
|
|
125
135
|
"types": "./dist/index.d.ts",
|
|
126
136
|
"typesVersions": {
|
|
127
137
|
"*": {
|
|
138
|
+
"actions": [
|
|
139
|
+
"dist/actions.d.ts"
|
|
140
|
+
],
|
|
141
|
+
"actionsRegistry": [
|
|
142
|
+
"dist/actionsRegistry.d.ts"
|
|
143
|
+
],
|
|
128
144
|
"auditor": [
|
|
129
145
|
"dist/auditor.d.ts"
|
|
130
146
|
],
|
|
@@ -208,18 +224,18 @@
|
|
|
208
224
|
"@aws-sdk/credential-providers": "^3.350.0",
|
|
209
225
|
"@aws-sdk/types": "^3.347.0",
|
|
210
226
|
"@azure/storage-blob": "^12.5.0",
|
|
211
|
-
"@backstage/backend-app-api": "1.2.
|
|
227
|
+
"@backstage/backend-app-api": "1.2.4-next.0",
|
|
212
228
|
"@backstage/backend-dev-utils": "0.1.5",
|
|
213
|
-
"@backstage/backend-plugin-api": "1.
|
|
229
|
+
"@backstage/backend-plugin-api": "1.4.0-next.0",
|
|
214
230
|
"@backstage/cli-node": "0.2.13",
|
|
215
231
|
"@backstage/config": "1.3.2",
|
|
216
|
-
"@backstage/config-loader": "1.10.1
|
|
232
|
+
"@backstage/config-loader": "1.10.1",
|
|
217
233
|
"@backstage/errors": "1.2.7",
|
|
218
|
-
"@backstage/integration": "1.17.0
|
|
219
|
-
"@backstage/integration-aws-node": "0.1.16
|
|
220
|
-
"@backstage/plugin-auth-node": "0.6.
|
|
221
|
-
"@backstage/plugin-events-node": "0.4.
|
|
222
|
-
"@backstage/plugin-permission-node": "0.10.
|
|
234
|
+
"@backstage/integration": "1.17.0",
|
|
235
|
+
"@backstage/integration-aws-node": "0.1.16",
|
|
236
|
+
"@backstage/plugin-auth-node": "0.6.4-next.0",
|
|
237
|
+
"@backstage/plugin-events-node": "0.4.12-next.0",
|
|
238
|
+
"@backstage/plugin-permission-node": "0.10.1-next.0",
|
|
223
239
|
"@backstage/types": "1.2.1",
|
|
224
240
|
"@google-cloud/storage": "^7.0.0",
|
|
225
241
|
"@keyv/memcache": "^2.0.1",
|
|
@@ -268,13 +284,14 @@
|
|
|
268
284
|
"winston-transport": "^4.5.0",
|
|
269
285
|
"yauzl": "^3.0.0",
|
|
270
286
|
"yn": "^4.0.0",
|
|
271
|
-
"zod": "^3.22.4"
|
|
287
|
+
"zod": "^3.22.4",
|
|
288
|
+
"zod-to-json-schema": "^3.20.4"
|
|
272
289
|
},
|
|
273
290
|
"devDependencies": {
|
|
274
291
|
"@aws-sdk/util-stream-node": "^3.350.0",
|
|
275
|
-
"@backstage/backend-plugin-api": "1.
|
|
276
|
-
"@backstage/backend-test-utils": "1.
|
|
277
|
-
"@backstage/cli": "0.32.1
|
|
292
|
+
"@backstage/backend-plugin-api": "1.4.0-next.0",
|
|
293
|
+
"@backstage/backend-test-utils": "1.6.0-next.0",
|
|
294
|
+
"@backstage/cli": "0.32.1",
|
|
278
295
|
"@google-cloud/cloud-sql-connector": "^1.4.0",
|
|
279
296
|
"@types/archiver": "^6.0.0",
|
|
280
297
|
"@types/base64-stream": "^1.0.2",
|