@backstage/plugin-scaffolder-node 0.13.3-next.0 → 0.13.3-next.2
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 +19 -0
- package/dist/index.d.ts +1 -1
- package/dist/scaffolderService.cjs.js +5 -0
- package/dist/scaffolderService.cjs.js.map +1 -1
- package/dist/testUtils.d.ts +2 -2
- package/dist/types/{scaffolderService.d-Dr6l5aNU.d.ts → scaffolderService.d-DWailCc7.d.ts} +1 -0
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder-node
|
|
2
2
|
|
|
3
|
+
## 0.13.3-next.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @backstage/backend-test-utils@1.11.3-next.2
|
|
9
|
+
- @backstage/backend-plugin-api@1.9.1-next.1
|
|
10
|
+
- @backstage/plugin-scaffolder-common@2.2.0-next.1
|
|
11
|
+
|
|
12
|
+
## 0.13.3-next.1
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 77bee9f: Added optional `status` filter to `ScaffolderService.listTasks`, allowing callers to retrieve tasks matching a specific status.
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
- @backstage/catalog-model@1.8.1-next.1
|
|
19
|
+
- @backstage/backend-test-utils@1.11.3-next.1
|
|
20
|
+
- @backstage/plugin-permission-common@0.9.9-next.1
|
|
21
|
+
|
|
3
22
|
## 0.13.3-next.0
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { SpawnOptionsWithoutStdio } from 'node:child_process';
|
|
|
11
11
|
import { Writable } from 'node:stream';
|
|
12
12
|
import { ScmIntegrations, ScmIntegrationRegistry } from '@backstage/integration';
|
|
13
13
|
export { T as TemplateFilter, a as TemplateGlobal } from './types/types.d-C0fXdKnD.js';
|
|
14
|
-
export { S as ScaffolderService, a as ScaffolderServiceRequestOptions, s as scaffolderServiceRef } from './types/scaffolderService.d-
|
|
14
|
+
export { S as ScaffolderService, a as ScaffolderServiceRequestOptions, s as scaffolderServiceRef } from './types/scaffolderService.d-DWailCc7.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* TaskSecrets
|
|
@@ -51,6 +51,11 @@ class DefaultScaffolderService {
|
|
|
51
51
|
if (request.offset !== void 0) {
|
|
52
52
|
params.set("offset", String(request.offset));
|
|
53
53
|
}
|
|
54
|
+
if (request.status !== void 0) {
|
|
55
|
+
for (const s of [request.status].flat()) {
|
|
56
|
+
params.append("status", s);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
54
59
|
const query = params.toString();
|
|
55
60
|
const url = `${baseUrl}/v2/tasks${query ? `?${query}` : ""}`;
|
|
56
61
|
const response = await fetch(url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolderService.cjs.js","sources":["../src/scaffolderService.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 AuthService,\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n DiscoveryService,\n} from '@backstage/backend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n ListActionsResponse,\n ListTemplatingExtensionsResponse,\n LogEvent,\n ScaffolderClient,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n ScaffolderRequestOptions,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderTask,\n ScaffolderTaskStatus,\n} from '@backstage/plugin-scaffolder-common';\nimport type { TemplateParameterSchema } from '@backstage/plugin-scaffolder-common';\n\n/**\n * @public\n */\nexport interface ScaffolderServiceRequestOptions {\n credentials: BackstageCredentials;\n}\n\n/**\n * A backend service interface for the scaffolder that uses\n * {@link @backstage/backend-plugin-api#BackstageCredentials} instead of tokens.\n *\n * @public\n */\nexport interface ScaffolderService {\n getTemplateParameterSchema(\n request: { templateRef: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<TemplateParameterSchema>;\n\n scaffold(\n request: ScaffolderScaffoldOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderScaffoldResponse>;\n\n getTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderTask>;\n\n cancelTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ status?: ScaffolderTaskStatus }>;\n\n retry(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ id: string }>;\n\n listTasks(\n request: {\n createdBy?: string;\n limit?: number;\n offset?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ items: ScaffolderTask[]; totalItems: number }>;\n\n listActions(\n request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListActionsResponse>;\n\n listTemplatingExtensions(\n request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListTemplatingExtensionsResponse>;\n\n getLogs(\n request: {\n taskId: string;\n after?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<LogEvent[]>;\n\n dryRun(\n request: ScaffolderDryRunOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderDryRunResponse>;\n\n autocomplete(\n request: {\n token: string;\n provider: string;\n resource: string;\n context: Record<string, string>;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ results: { title?: string; id: string }[] }>;\n}\n\nclass DefaultScaffolderService implements ScaffolderService {\n readonly #auth: AuthService;\n readonly #client: ScaffolderClient;\n readonly #discovery: DiscoveryService;\n\n constructor(options: {\n auth: AuthService;\n client: ScaffolderClient;\n discovery: DiscoveryService;\n }) {\n this.#auth = options.auth;\n this.#client = options.client;\n this.#discovery = options.discovery;\n }\n\n async getTemplateParameterSchema(\n request: { templateRef: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<TemplateParameterSchema> {\n return this.#client.getTemplateParameterSchema(\n request.templateRef,\n await this.#getOptions(options),\n );\n }\n\n async scaffold(\n request: ScaffolderScaffoldOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n return this.#client.scaffold(request, await this.#getOptions(options));\n }\n\n async getTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderTask> {\n return this.#client.getTask(\n request.taskId,\n await this.#getOptions(options),\n );\n }\n\n async cancelTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ status?: ScaffolderTaskStatus }> {\n return this.#client.cancelTask(\n request.taskId,\n await this.#getOptions(options),\n );\n }\n\n async retry(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ id: string }> {\n return this.#client.retry(request.taskId, await this.#getOptions(options));\n }\n\n async listTasks(\n request: {\n createdBy?: string;\n limit?: number;\n offset?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ items: ScaffolderTask[]; totalItems: number }> {\n const { token } = await this.#getOptions(options);\n const baseUrl = await this.#discovery.getBaseUrl('scaffolder');\n\n const params = new URLSearchParams();\n if (request.createdBy) {\n params.set('createdBy', request.createdBy);\n }\n if (request.limit !== undefined) {\n params.set('limit', String(request.limit));\n }\n if (request.offset !== undefined) {\n params.set('offset', String(request.offset));\n }\n\n const query = params.toString();\n const url = `${baseUrl}/v2/tasks${query ? `?${query}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const body = await response.json();\n return {\n items: body.tasks,\n totalItems: body.totalTasks ?? 0,\n };\n }\n\n async listActions(\n _request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListActionsResponse> {\n return this.#client.listActions(\n options ? await this.#getOptions(options) : {},\n );\n }\n\n async listTemplatingExtensions(\n _request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListTemplatingExtensionsResponse> {\n return this.#client.listTemplatingExtensions(\n options ? await this.#getOptions(options) : {},\n );\n }\n\n async getLogs(\n request: {\n taskId: string;\n after?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<LogEvent[]> {\n const { token } = await this.#getOptions(options);\n const baseUrl = await this.#discovery.getBaseUrl('scaffolder');\n\n const params = new URLSearchParams();\n if (request.after !== undefined) {\n params.set('after', String(request.after));\n }\n\n const query = params.toString();\n const taskId = encodeURIComponent(request.taskId);\n const url = `${baseUrl}/v2/tasks/${taskId}/events${\n query ? `?${query}` : ''\n }`;\n\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n async dryRun(\n request: ScaffolderDryRunOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderDryRunResponse> {\n return this.#client.dryRun(request, await this.#getOptions(options));\n }\n\n async autocomplete(\n request: {\n token: string;\n provider: string;\n resource: string;\n context: Record<string, string>;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ results: { title?: string; id: string }[] }> {\n return this.#client.autocomplete(request, await this.#getOptions(options));\n }\n\n async #getOptions(\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderRequestOptions> {\n return this.#auth.getPluginRequestToken({\n onBehalfOf: options.credentials,\n targetPluginId: 'scaffolder',\n });\n }\n}\n\n/**\n * A service ref for the scaffolder client, to be used by backend plugins\n * and modules that need to interact with the scaffolder API.\n *\n * @public\n */\nexport const scaffolderServiceRef = createServiceRef<ScaffolderService>({\n id: 'scaffolder-client',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n auth: coreServices.auth,\n discovery: coreServices.discovery,\n config: coreServices.rootConfig,\n },\n async factory({ auth, discovery, config }) {\n const integrations = ScmIntegrations.fromConfig(config);\n const client = new ScaffolderClient({\n discoveryApi: discovery,\n fetchApi: { fetch },\n scmIntegrationsApi: integrations,\n });\n return new DefaultScaffolderService({\n auth,\n client,\n discovery,\n });\n },\n }),\n});\n"],"names":["ResponseError","createServiceRef","createServiceFactory","coreServices","ScmIntegrations","ScaffolderClient"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scaffolderService.cjs.js","sources":["../src/scaffolderService.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 AuthService,\n BackstageCredentials,\n coreServices,\n createServiceFactory,\n createServiceRef,\n DiscoveryService,\n} from '@backstage/backend-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n ListActionsResponse,\n ListTemplatingExtensionsResponse,\n LogEvent,\n ScaffolderClient,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n ScaffolderRequestOptions,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderTask,\n ScaffolderTaskStatus,\n} from '@backstage/plugin-scaffolder-common';\nimport type { TemplateParameterSchema } from '@backstage/plugin-scaffolder-common';\n\n/**\n * @public\n */\nexport interface ScaffolderServiceRequestOptions {\n credentials: BackstageCredentials;\n}\n\n/**\n * A backend service interface for the scaffolder that uses\n * {@link @backstage/backend-plugin-api#BackstageCredentials} instead of tokens.\n *\n * @public\n */\nexport interface ScaffolderService {\n getTemplateParameterSchema(\n request: { templateRef: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<TemplateParameterSchema>;\n\n scaffold(\n request: ScaffolderScaffoldOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderScaffoldResponse>;\n\n getTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderTask>;\n\n cancelTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ status?: ScaffolderTaskStatus }>;\n\n retry(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ id: string }>;\n\n listTasks(\n request: {\n createdBy?: string;\n limit?: number;\n offset?: number;\n status?: ScaffolderTaskStatus | ScaffolderTaskStatus[];\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ items: ScaffolderTask[]; totalItems: number }>;\n\n listActions(\n request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListActionsResponse>;\n\n listTemplatingExtensions(\n request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListTemplatingExtensionsResponse>;\n\n getLogs(\n request: {\n taskId: string;\n after?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<LogEvent[]>;\n\n dryRun(\n request: ScaffolderDryRunOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderDryRunResponse>;\n\n autocomplete(\n request: {\n token: string;\n provider: string;\n resource: string;\n context: Record<string, string>;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ results: { title?: string; id: string }[] }>;\n}\n\nclass DefaultScaffolderService implements ScaffolderService {\n readonly #auth: AuthService;\n readonly #client: ScaffolderClient;\n readonly #discovery: DiscoveryService;\n\n constructor(options: {\n auth: AuthService;\n client: ScaffolderClient;\n discovery: DiscoveryService;\n }) {\n this.#auth = options.auth;\n this.#client = options.client;\n this.#discovery = options.discovery;\n }\n\n async getTemplateParameterSchema(\n request: { templateRef: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<TemplateParameterSchema> {\n return this.#client.getTemplateParameterSchema(\n request.templateRef,\n await this.#getOptions(options),\n );\n }\n\n async scaffold(\n request: ScaffolderScaffoldOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n return this.#client.scaffold(request, await this.#getOptions(options));\n }\n\n async getTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderTask> {\n return this.#client.getTask(\n request.taskId,\n await this.#getOptions(options),\n );\n }\n\n async cancelTask(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ status?: ScaffolderTaskStatus }> {\n return this.#client.cancelTask(\n request.taskId,\n await this.#getOptions(options),\n );\n }\n\n async retry(\n request: { taskId: string },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ id: string }> {\n return this.#client.retry(request.taskId, await this.#getOptions(options));\n }\n\n async listTasks(\n request: {\n createdBy?: string;\n limit?: number;\n offset?: number;\n status?: ScaffolderTaskStatus | ScaffolderTaskStatus[];\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ items: ScaffolderTask[]; totalItems: number }> {\n const { token } = await this.#getOptions(options);\n const baseUrl = await this.#discovery.getBaseUrl('scaffolder');\n\n const params = new URLSearchParams();\n if (request.createdBy) {\n params.set('createdBy', request.createdBy);\n }\n if (request.limit !== undefined) {\n params.set('limit', String(request.limit));\n }\n if (request.offset !== undefined) {\n params.set('offset', String(request.offset));\n }\n if (request.status !== undefined) {\n for (const s of [request.status].flat()) {\n params.append('status', s);\n }\n }\n\n const query = params.toString();\n const url = `${baseUrl}/v2/tasks${query ? `?${query}` : ''}`;\n\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const body = await response.json();\n return {\n items: body.tasks,\n totalItems: body.totalTasks ?? 0,\n };\n }\n\n async listActions(\n _request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListActionsResponse> {\n return this.#client.listActions(\n options ? await this.#getOptions(options) : {},\n );\n }\n\n async listTemplatingExtensions(\n _request?: {},\n options?: ScaffolderServiceRequestOptions,\n ): Promise<ListTemplatingExtensionsResponse> {\n return this.#client.listTemplatingExtensions(\n options ? await this.#getOptions(options) : {},\n );\n }\n\n async getLogs(\n request: {\n taskId: string;\n after?: number;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<LogEvent[]> {\n const { token } = await this.#getOptions(options);\n const baseUrl = await this.#discovery.getBaseUrl('scaffolder');\n\n const params = new URLSearchParams();\n if (request.after !== undefined) {\n params.set('after', String(request.after));\n }\n\n const query = params.toString();\n const taskId = encodeURIComponent(request.taskId);\n const url = `${baseUrl}/v2/tasks/${taskId}/events${\n query ? `?${query}` : ''\n }`;\n\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n async dryRun(\n request: ScaffolderDryRunOptions,\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderDryRunResponse> {\n return this.#client.dryRun(request, await this.#getOptions(options));\n }\n\n async autocomplete(\n request: {\n token: string;\n provider: string;\n resource: string;\n context: Record<string, string>;\n },\n options: ScaffolderServiceRequestOptions,\n ): Promise<{ results: { title?: string; id: string }[] }> {\n return this.#client.autocomplete(request, await this.#getOptions(options));\n }\n\n async #getOptions(\n options: ScaffolderServiceRequestOptions,\n ): Promise<ScaffolderRequestOptions> {\n return this.#auth.getPluginRequestToken({\n onBehalfOf: options.credentials,\n targetPluginId: 'scaffolder',\n });\n }\n}\n\n/**\n * A service ref for the scaffolder client, to be used by backend plugins\n * and modules that need to interact with the scaffolder API.\n *\n * @public\n */\nexport const scaffolderServiceRef = createServiceRef<ScaffolderService>({\n id: 'scaffolder-client',\n defaultFactory: async service =>\n createServiceFactory({\n service,\n deps: {\n auth: coreServices.auth,\n discovery: coreServices.discovery,\n config: coreServices.rootConfig,\n },\n async factory({ auth, discovery, config }) {\n const integrations = ScmIntegrations.fromConfig(config);\n const client = new ScaffolderClient({\n discoveryApi: discovery,\n fetchApi: { fetch },\n scmIntegrationsApi: integrations,\n });\n return new DefaultScaffolderService({\n auth,\n client,\n discovery,\n });\n },\n }),\n});\n"],"names":["ResponseError","createServiceRef","createServiceFactory","coreServices","ScmIntegrations","ScaffolderClient"],"mappings":"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"}
|
package/dist/testUtils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as ScaffolderService } from './types/scaffolderService.d-
|
|
2
|
-
export { a as ScaffolderServiceRequestOptions } from './types/scaffolderService.d-
|
|
1
|
+
import { S as ScaffolderService } from './types/scaffolderService.d-DWailCc7.js';
|
|
2
|
+
export { a as ScaffolderServiceRequestOptions } from './types/scaffolderService.d-DWailCc7.js';
|
|
3
3
|
import * as _backstage_backend_test_utils from '@backstage/backend-test-utils';
|
|
4
4
|
import '@backstage/backend-plugin-api';
|
|
5
5
|
import '@backstage/plugin-scaffolder-common';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder-node",
|
|
3
|
-
"version": "0.13.3-next.
|
|
3
|
+
"version": "0.13.3-next.2",
|
|
4
4
|
"description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library",
|
|
@@ -70,13 +70,13 @@
|
|
|
70
70
|
"test": "backstage-cli package test"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@backstage/backend-plugin-api": "1.9.1-next.
|
|
74
|
-
"@backstage/catalog-model": "1.8.1-next.
|
|
73
|
+
"@backstage/backend-plugin-api": "1.9.1-next.1",
|
|
74
|
+
"@backstage/catalog-model": "1.8.1-next.1",
|
|
75
75
|
"@backstage/errors": "1.3.1-next.0",
|
|
76
|
-
"@backstage/integration": "2.0.2-next.
|
|
77
|
-
"@backstage/plugin-permission-common": "0.9.9-next.
|
|
76
|
+
"@backstage/integration": "2.0.2-next.1",
|
|
77
|
+
"@backstage/plugin-permission-common": "0.9.9-next.1",
|
|
78
78
|
"@backstage/plugin-permission-node": "0.10.13-next.0",
|
|
79
|
-
"@backstage/plugin-scaffolder-common": "2.
|
|
79
|
+
"@backstage/plugin-scaffolder-common": "2.2.0-next.1",
|
|
80
80
|
"@backstage/types": "1.2.2",
|
|
81
81
|
"@isomorphic-git/pgp-plugin": "^0.0.7",
|
|
82
82
|
"concat-stream": "^2.0.0",
|
|
@@ -93,14 +93,14 @@
|
|
|
93
93
|
"zod-to-json-schema": "^3.25.1"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@backstage/backend-test-utils": "1.11.3-next.
|
|
97
|
-
"@backstage/cli": "0.36.2-next.
|
|
96
|
+
"@backstage/backend-test-utils": "1.11.3-next.2",
|
|
97
|
+
"@backstage/cli": "0.36.2-next.1",
|
|
98
98
|
"@backstage/config": "1.3.8-next.0",
|
|
99
99
|
"@types/lodash": "^4.14.151",
|
|
100
100
|
"msw": "^1.0.0"
|
|
101
101
|
},
|
|
102
102
|
"peerDependencies": {
|
|
103
|
-
"@backstage/backend-test-utils": "1.11.3-next.
|
|
103
|
+
"@backstage/backend-test-utils": "1.11.3-next.2"
|
|
104
104
|
},
|
|
105
105
|
"peerDependenciesMeta": {
|
|
106
106
|
"@backstage/backend-test-utils": {
|