@backstage/backend-app-api 1.7.2 → 1.7.3-next.1
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 +17 -0
- package/dist/backend-internal/src/wiring/helpers.cjs.js +13 -6
- package/dist/backend-internal/src/wiring/helpers.cjs.js.map +1 -1
- package/dist/connections-node/src/DefaultConnectionsService.cjs.js +291 -0
- package/dist/connections-node/src/DefaultConnectionsService.cjs.js.map +1 -0
- package/dist/connections-node/src/combineConnectionSources.cjs.js +26 -0
- package/dist/connections-node/src/combineConnectionSources.cjs.js.map +1 -0
- package/dist/connections-node/src/getLegacyIntegrations.cjs.js +339 -0
- package/dist/connections-node/src/getLegacyIntegrations.cjs.js.map +1 -0
- package/dist/connections-node/src/lookup.cjs.js +16 -0
- package/dist/connections-node/src/lookup.cjs.js.map +1 -0
- package/dist/connections-node/src/lookupStrategies.cjs.js +26 -0
- package/dist/connections-node/src/lookupStrategies.cjs.js.map +1 -0
- package/dist/connections-node/src/service.cjs.js +34 -0
- package/dist/connections-node/src/service.cjs.js.map +1 -0
- package/dist/wiring/BackendInitializer.cjs.js +95 -74
- package/dist/wiring/BackendInitializer.cjs.js.map +1 -1
- package/dist/wiring/BackstageBackend.cjs.js +1 -1
- package/dist/wiring/BackstageBackend.cjs.js.map +1 -1
- package/dist/wiring/ServiceRegistry.cjs.js +34 -18
- package/dist/wiring/ServiceRegistry.cjs.js.map +1 -1
- package/dist/wiring/validateBackendFeature.cjs.js +215 -0
- package/dist/wiring/validateBackendFeature.cjs.js.map +1 -0
- package/package.json +10 -9
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function getLegacyIntegrations(config) {
|
|
4
|
+
const integrations = config.getOptionalConfig("integrations");
|
|
5
|
+
if (!integrations) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return [
|
|
9
|
+
...convertAwsCodeCommit(
|
|
10
|
+
integrations.getOptionalConfigArray("awsCodeCommit") ?? []
|
|
11
|
+
),
|
|
12
|
+
...convertAwsS3(integrations.getOptionalConfigArray("awsS3") ?? []),
|
|
13
|
+
...convertAzure(integrations.getOptionalConfigArray("azure") ?? []),
|
|
14
|
+
...convertAzureBlobStorage(
|
|
15
|
+
integrations.getOptionalConfigArray("azureBlobStorage") ?? []
|
|
16
|
+
),
|
|
17
|
+
...convertBitbucketCloud(
|
|
18
|
+
integrations.getOptionalConfigArray("bitbucketCloud") ?? []
|
|
19
|
+
),
|
|
20
|
+
...convertBitbucketServer(
|
|
21
|
+
integrations.getOptionalConfigArray("bitbucketServer") ?? []
|
|
22
|
+
),
|
|
23
|
+
...convertGerrit(integrations.getOptionalConfigArray("gerrit") ?? []),
|
|
24
|
+
...convertGitea(integrations.getOptionalConfigArray("gitea") ?? []),
|
|
25
|
+
...convertGithub(integrations.getOptionalConfigArray("github") ?? []),
|
|
26
|
+
...convertGitlab(integrations.getOptionalConfigArray("gitlab") ?? []),
|
|
27
|
+
...convertGoogleGcs(integrations.getOptionalConfigArray("googleGcs") ?? []),
|
|
28
|
+
...convertHarness(integrations.getOptionalConfigArray("harness") ?? [])
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
function convertGithub(entries) {
|
|
32
|
+
return entries.map((entry) => {
|
|
33
|
+
const auth = [];
|
|
34
|
+
const token = entry.getOptionalString("token");
|
|
35
|
+
if (token !== void 0) {
|
|
36
|
+
auth.push({ method: "token", token });
|
|
37
|
+
}
|
|
38
|
+
for (const app of entry.getOptionalConfigArray("apps") ?? []) {
|
|
39
|
+
auth.push(convertGithubApp(app));
|
|
40
|
+
}
|
|
41
|
+
return omitUndefined({
|
|
42
|
+
type: "github",
|
|
43
|
+
host: entry.getOptionalString("host"),
|
|
44
|
+
apiBaseUrl: entry.getOptionalString("apiBaseUrl"),
|
|
45
|
+
rawBaseUrl: entry.getOptionalString("rawBaseUrl"),
|
|
46
|
+
auth: withNoneAuthFallback(auth)
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function convertGitlab(entries) {
|
|
51
|
+
return entries.map((entry) => {
|
|
52
|
+
const auth = [];
|
|
53
|
+
const token = entry.getOptionalString("token");
|
|
54
|
+
if (token !== void 0) {
|
|
55
|
+
auth.push({ method: "token", token });
|
|
56
|
+
}
|
|
57
|
+
return omitUndefined({
|
|
58
|
+
type: "gitlab",
|
|
59
|
+
host: entry.getOptionalString("host"),
|
|
60
|
+
apiBaseUrl: entry.getOptionalString("apiBaseUrl"),
|
|
61
|
+
baseUrl: entry.getOptionalString("baseUrl"),
|
|
62
|
+
auth: withNoneAuthFallback(auth)
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function convertGithubApp(app) {
|
|
67
|
+
return omitUndefined({
|
|
68
|
+
method: "app",
|
|
69
|
+
appId: app.getOptional("appId"),
|
|
70
|
+
privateKey: app.getOptionalString("privateKey"),
|
|
71
|
+
clientId: app.getOptionalString("clientId"),
|
|
72
|
+
clientSecret: app.getOptionalString("clientSecret"),
|
|
73
|
+
webhookSecret: app.getOptionalString("webhookSecret"),
|
|
74
|
+
orgs: app.getOptionalStringArray("allowedInstallationOwners"),
|
|
75
|
+
publicAccess: app.getOptionalBoolean("publicAccess")
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function convertAzure(entries) {
|
|
79
|
+
return entries.map((entry) => {
|
|
80
|
+
const auth = [];
|
|
81
|
+
for (const credential of entry.getOptionalConfigArray("credentials") ?? []) {
|
|
82
|
+
const converted = convertAzureCredential(credential);
|
|
83
|
+
if (converted) {
|
|
84
|
+
auth.push(converted);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return omitUndefined({
|
|
88
|
+
type: "azure",
|
|
89
|
+
host: entry.getOptionalString("host"),
|
|
90
|
+
auth: withNoneAuthFallback(auth)
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function convertAzureCredential(credential) {
|
|
95
|
+
const orgs = credential.getOptionalStringArray("organizations");
|
|
96
|
+
const personalAccessToken = credential.getOptionalString(
|
|
97
|
+
"personalAccessToken"
|
|
98
|
+
);
|
|
99
|
+
if (personalAccessToken !== void 0) {
|
|
100
|
+
return omitUndefined({
|
|
101
|
+
method: "pat",
|
|
102
|
+
personalAccessToken,
|
|
103
|
+
orgs
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const clientSecret = credential.getOptionalString("clientSecret");
|
|
107
|
+
if (clientSecret !== void 0) {
|
|
108
|
+
return omitUndefined({
|
|
109
|
+
method: "clientCredentials",
|
|
110
|
+
clientId: credential.getOptionalString("clientId"),
|
|
111
|
+
clientSecret,
|
|
112
|
+
tenantId: credential.getOptionalString("tenantId"),
|
|
113
|
+
orgs
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const clientId = credential.getOptionalString("clientId");
|
|
117
|
+
if (clientId !== void 0) {
|
|
118
|
+
return omitUndefined({
|
|
119
|
+
method: "managedIdentity",
|
|
120
|
+
clientId,
|
|
121
|
+
tenantId: credential.getOptionalString("tenantId"),
|
|
122
|
+
managedIdentityClientId: credential.getOptionalString(
|
|
123
|
+
"managedIdentityClientId"
|
|
124
|
+
),
|
|
125
|
+
orgs
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return void 0;
|
|
129
|
+
}
|
|
130
|
+
function convertBitbucketCloud(entries) {
|
|
131
|
+
return entries.map((entry) => {
|
|
132
|
+
const username = entry.getOptionalString("username");
|
|
133
|
+
const auth = [];
|
|
134
|
+
const token = entry.getOptionalString("token");
|
|
135
|
+
if (username !== void 0 && token !== void 0) {
|
|
136
|
+
auth.push({ method: "token", username, token });
|
|
137
|
+
}
|
|
138
|
+
const appPassword = entry.getOptionalString("appPassword");
|
|
139
|
+
if (username !== void 0 && appPassword !== void 0) {
|
|
140
|
+
auth.push({ method: "appPassword", username, appPassword });
|
|
141
|
+
}
|
|
142
|
+
const clientId = entry.getOptionalString("clientId");
|
|
143
|
+
const clientSecret = entry.getOptionalString("clientSecret");
|
|
144
|
+
if (clientId !== void 0 && clientSecret !== void 0) {
|
|
145
|
+
auth.push({ method: "oauth", clientId, clientSecret });
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
type: "bitbucket-cloud",
|
|
149
|
+
host: "bitbucket.org",
|
|
150
|
+
auth: withNoneAuthFallback(auth)
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
function convertBitbucketServer(entries) {
|
|
155
|
+
return entries.map((entry) => {
|
|
156
|
+
const auth = [];
|
|
157
|
+
const token = entry.getOptionalString("token");
|
|
158
|
+
if (token !== void 0) {
|
|
159
|
+
auth.push({ method: "token", token });
|
|
160
|
+
}
|
|
161
|
+
const username = entry.getOptionalString("username");
|
|
162
|
+
const password = entry.getOptionalString("password");
|
|
163
|
+
if (username !== void 0 && password !== void 0) {
|
|
164
|
+
auth.push({ method: "basic", username, password });
|
|
165
|
+
}
|
|
166
|
+
return omitUndefined({
|
|
167
|
+
type: "bitbucket-server",
|
|
168
|
+
host: entry.getOptionalString("host"),
|
|
169
|
+
apiBaseUrl: entry.getOptionalString("apiBaseUrl"),
|
|
170
|
+
auth: withNoneAuthFallback(auth)
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
function convertGerrit(entries) {
|
|
175
|
+
return entries.map((entry) => {
|
|
176
|
+
const auth = [];
|
|
177
|
+
const username = entry.getOptionalString("username");
|
|
178
|
+
const password = entry.getOptionalString("password");
|
|
179
|
+
if (username !== void 0 && password !== void 0) {
|
|
180
|
+
auth.push({ method: "basic", username, password });
|
|
181
|
+
}
|
|
182
|
+
return omitUndefined({
|
|
183
|
+
type: "gerrit",
|
|
184
|
+
host: entry.getOptionalString("host"),
|
|
185
|
+
baseUrl: entry.getOptionalString("baseUrl"),
|
|
186
|
+
gitilesBaseUrl: entry.getOptionalString("gitilesBaseUrl"),
|
|
187
|
+
cloneUrl: entry.getOptionalString("cloneUrl"),
|
|
188
|
+
auth: withNoneAuthFallback(auth)
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
function convertGitea(entries) {
|
|
193
|
+
return entries.map((entry) => {
|
|
194
|
+
const auth = [];
|
|
195
|
+
const username = entry.getOptionalString("username");
|
|
196
|
+
const password = entry.getOptionalString("password");
|
|
197
|
+
if (username !== void 0 && password !== void 0) {
|
|
198
|
+
auth.push({ method: "basic", username, password });
|
|
199
|
+
}
|
|
200
|
+
return omitUndefined({
|
|
201
|
+
type: "gitea",
|
|
202
|
+
host: entry.getOptionalString("host"),
|
|
203
|
+
baseUrl: entry.getOptionalString("baseUrl"),
|
|
204
|
+
auth: withNoneAuthFallback(auth)
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function convertHarness(entries) {
|
|
209
|
+
return entries.map((entry) => {
|
|
210
|
+
const auth = [];
|
|
211
|
+
const token = entry.getOptionalString("token");
|
|
212
|
+
if (token !== void 0) {
|
|
213
|
+
const apiKey = entry.getOptionalString("apiKey");
|
|
214
|
+
auth.push(omitUndefined({ method: "token", token, apiKey }));
|
|
215
|
+
}
|
|
216
|
+
return omitUndefined({
|
|
217
|
+
type: "harness",
|
|
218
|
+
host: entry.getOptionalString("host"),
|
|
219
|
+
auth
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
function convertAwsCodeCommit(entries) {
|
|
224
|
+
return entries.map((entry) => {
|
|
225
|
+
const auth = [];
|
|
226
|
+
const accessKeyId = entry.getOptionalString("accessKeyId");
|
|
227
|
+
const secretAccessKey = entry.getOptionalString("secretAccessKey");
|
|
228
|
+
if (accessKeyId !== void 0 && secretAccessKey !== void 0) {
|
|
229
|
+
auth.push({ method: "accessKey", accessKeyId, secretAccessKey });
|
|
230
|
+
}
|
|
231
|
+
const roleArn = entry.getOptionalString("roleArn");
|
|
232
|
+
if (roleArn !== void 0) {
|
|
233
|
+
auth.push(
|
|
234
|
+
omitUndefined({
|
|
235
|
+
method: "assumeRole",
|
|
236
|
+
roleArn,
|
|
237
|
+
externalId: entry.getOptionalString("externalId")
|
|
238
|
+
})
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const region = entry.getString("region");
|
|
242
|
+
const host = entry.getOptionalString("host") ?? `${region}.console.aws.amazon.com`;
|
|
243
|
+
return { type: "aws-codecommit", host, region, auth };
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function convertAwsS3(entries) {
|
|
247
|
+
return entries.map((entry) => {
|
|
248
|
+
const auth = [];
|
|
249
|
+
const accessKeyId = entry.getOptionalString("accessKeyId");
|
|
250
|
+
const secretAccessKey = entry.getOptionalString("secretAccessKey");
|
|
251
|
+
if (accessKeyId !== void 0 && secretAccessKey !== void 0) {
|
|
252
|
+
auth.push({ method: "accessKey", accessKeyId, secretAccessKey });
|
|
253
|
+
}
|
|
254
|
+
const roleArn = entry.getOptionalString("roleArn");
|
|
255
|
+
if (roleArn !== void 0) {
|
|
256
|
+
auth.push(
|
|
257
|
+
omitUndefined({
|
|
258
|
+
method: "assumeRole",
|
|
259
|
+
roleArn,
|
|
260
|
+
externalId: entry.getOptionalString("externalId")
|
|
261
|
+
})
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
const endpoint = entry.getOptionalString("endpoint");
|
|
265
|
+
const host = endpoint ? new URL(endpoint).host : "amazonaws.com";
|
|
266
|
+
return omitUndefined({
|
|
267
|
+
type: "aws-s3",
|
|
268
|
+
host,
|
|
269
|
+
endpoint,
|
|
270
|
+
s3ForcePathStyle: entry.getOptionalBoolean("s3ForcePathStyle"),
|
|
271
|
+
auth: withNoneAuthFallback(auth)
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
function convertAzureBlobStorage(entries) {
|
|
276
|
+
return entries.map((entry) => {
|
|
277
|
+
const auth = [];
|
|
278
|
+
const accountKey = entry.getOptionalString("accountKey");
|
|
279
|
+
if (accountKey !== void 0) {
|
|
280
|
+
auth.push({ method: "accountKey", accountKey });
|
|
281
|
+
}
|
|
282
|
+
const sasToken = entry.getOptionalString("sasToken");
|
|
283
|
+
if (sasToken !== void 0) {
|
|
284
|
+
auth.push({ method: "sasToken", sasToken });
|
|
285
|
+
}
|
|
286
|
+
const connectionString = entry.getOptionalString("connectionString");
|
|
287
|
+
if (connectionString !== void 0) {
|
|
288
|
+
auth.push({ method: "connectionString", connectionString });
|
|
289
|
+
}
|
|
290
|
+
if (entry.has("aadCredential")) {
|
|
291
|
+
auth.push({
|
|
292
|
+
method: "aadCredential",
|
|
293
|
+
clientId: entry.getString("aadCredential.clientId"),
|
|
294
|
+
tenantId: entry.getString("aadCredential.tenantId"),
|
|
295
|
+
clientSecret: entry.getString("aadCredential.clientSecret")
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const endpoint = entry.getOptionalString("endpoint");
|
|
299
|
+
const host = endpoint ? new URL(endpoint).host : entry.getOptionalString("host") ?? "blob.core.windows.net";
|
|
300
|
+
return omitUndefined({
|
|
301
|
+
type: "azure-blob-storage",
|
|
302
|
+
host,
|
|
303
|
+
accountName: entry.getOptionalString("accountName"),
|
|
304
|
+
endpoint,
|
|
305
|
+
endpointSuffix: entry.getOptionalString("endpointSuffix"),
|
|
306
|
+
auth: withNoneAuthFallback(auth)
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
function convertGoogleGcs(entries) {
|
|
311
|
+
return entries.map((entry) => {
|
|
312
|
+
const auth = [];
|
|
313
|
+
const clientEmail = entry.getOptionalString("clientEmail");
|
|
314
|
+
const privateKey = entry.getOptionalString("privateKey");
|
|
315
|
+
if (clientEmail !== void 0 && privateKey !== void 0) {
|
|
316
|
+
auth.push({ method: "serviceAccount", clientEmail, privateKey });
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
type: "google-gcs",
|
|
320
|
+
host: "storage.cloud.google.com",
|
|
321
|
+
auth: withNoneAuthFallback(auth)
|
|
322
|
+
};
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
function withNoneAuthFallback(auth) {
|
|
326
|
+
return auth.length > 0 ? auth : [{ method: "none" }];
|
|
327
|
+
}
|
|
328
|
+
function omitUndefined(input) {
|
|
329
|
+
const out = {};
|
|
330
|
+
for (const [key, value] of Object.entries(input)) {
|
|
331
|
+
if (value !== void 0) {
|
|
332
|
+
out[key] = value;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return out;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
exports.getLegacyIntegrations = getLegacyIntegrations;
|
|
339
|
+
//# sourceMappingURL=getLegacyIntegrations.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getLegacyIntegrations.cjs.js","sources":["../../../../connections-node/src/getLegacyIntegrations.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { RootConfigService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { JsonObject, JsonValue } from '@backstage/types';\n\n/**\n * Reads legacy `integrations.*` config and converts each entry to a connection\n * object in the same shape as `connections:` config. The result is a list of\n * unvalidated JsonObjects; the caller is expected to run them through the\n * normal connection-schema validation alongside the rest of the connections\n * config.\n */\nexport function getLegacyIntegrations(config: RootConfigService): JsonObject[] {\n const integrations = config.getOptionalConfig('integrations');\n if (!integrations) {\n return [];\n }\n\n return [\n ...convertAwsCodeCommit(\n integrations.getOptionalConfigArray('awsCodeCommit') ?? [],\n ),\n ...convertAwsS3(integrations.getOptionalConfigArray('awsS3') ?? []),\n ...convertAzure(integrations.getOptionalConfigArray('azure') ?? []),\n ...convertAzureBlobStorage(\n integrations.getOptionalConfigArray('azureBlobStorage') ?? [],\n ),\n ...convertBitbucketCloud(\n integrations.getOptionalConfigArray('bitbucketCloud') ?? [],\n ),\n ...convertBitbucketServer(\n integrations.getOptionalConfigArray('bitbucketServer') ?? [],\n ),\n ...convertGerrit(integrations.getOptionalConfigArray('gerrit') ?? []),\n ...convertGitea(integrations.getOptionalConfigArray('gitea') ?? []),\n ...convertGithub(integrations.getOptionalConfigArray('github') ?? []),\n ...convertGitlab(integrations.getOptionalConfigArray('gitlab') ?? []),\n ...convertGoogleGcs(integrations.getOptionalConfigArray('googleGcs') ?? []),\n ...convertHarness(integrations.getOptionalConfigArray('harness') ?? []),\n ];\n}\n\nfunction convertGithub(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const token = entry.getOptionalString('token');\n if (token !== undefined) {\n auth.push({ method: 'token', token });\n }\n\n for (const app of entry.getOptionalConfigArray('apps') ?? []) {\n auth.push(convertGithubApp(app));\n }\n\n return omitUndefined({\n type: 'github',\n host: entry.getOptionalString('host'),\n apiBaseUrl: entry.getOptionalString('apiBaseUrl'),\n rawBaseUrl: entry.getOptionalString('rawBaseUrl'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertGitlab(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const token = entry.getOptionalString('token');\n if (token !== undefined) {\n auth.push({ method: 'token', token });\n }\n\n return omitUndefined({\n type: 'gitlab',\n host: entry.getOptionalString('host'),\n apiBaseUrl: entry.getOptionalString('apiBaseUrl'),\n baseUrl: entry.getOptionalString('baseUrl'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertGithubApp(app: Config): JsonObject {\n return omitUndefined({\n method: 'app',\n appId: app.getOptional<JsonValue>('appId'),\n privateKey: app.getOptionalString('privateKey'),\n clientId: app.getOptionalString('clientId'),\n clientSecret: app.getOptionalString('clientSecret'),\n webhookSecret: app.getOptionalString('webhookSecret'),\n orgs: app.getOptionalStringArray('allowedInstallationOwners'),\n publicAccess: app.getOptionalBoolean('publicAccess'),\n });\n}\n\nfunction convertAzure(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n for (const credential of entry.getOptionalConfigArray('credentials') ??\n []) {\n const converted = convertAzureCredential(credential);\n if (converted) {\n auth.push(converted);\n }\n }\n\n return omitUndefined({\n type: 'azure',\n host: entry.getOptionalString('host'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertAzureCredential(credential: Config): JsonObject | undefined {\n const orgs = credential.getOptionalStringArray('organizations');\n const personalAccessToken = credential.getOptionalString(\n 'personalAccessToken',\n );\n if (personalAccessToken !== undefined) {\n return omitUndefined({\n method: 'pat',\n personalAccessToken,\n orgs,\n });\n }\n\n const clientSecret = credential.getOptionalString('clientSecret');\n if (clientSecret !== undefined) {\n return omitUndefined({\n method: 'clientCredentials',\n clientId: credential.getOptionalString('clientId'),\n clientSecret,\n tenantId: credential.getOptionalString('tenantId'),\n orgs,\n });\n }\n\n const clientId = credential.getOptionalString('clientId');\n if (clientId !== undefined) {\n return omitUndefined({\n method: 'managedIdentity',\n clientId,\n tenantId: credential.getOptionalString('tenantId'),\n managedIdentityClientId: credential.getOptionalString(\n 'managedIdentityClientId',\n ),\n orgs,\n });\n }\n\n return undefined;\n}\n\nfunction convertBitbucketCloud(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const username = entry.getOptionalString('username');\n const auth: JsonObject[] = [];\n\n const token = entry.getOptionalString('token');\n if (username !== undefined && token !== undefined) {\n auth.push({ method: 'token', username, token });\n }\n\n const appPassword = entry.getOptionalString('appPassword');\n if (username !== undefined && appPassword !== undefined) {\n auth.push({ method: 'appPassword', username, appPassword });\n }\n\n const clientId = entry.getOptionalString('clientId');\n const clientSecret = entry.getOptionalString('clientSecret');\n if (clientId !== undefined && clientSecret !== undefined) {\n auth.push({ method: 'oauth', clientId, clientSecret });\n }\n\n return {\n type: 'bitbucket-cloud',\n host: 'bitbucket.org',\n auth: withNoneAuthFallback(auth),\n };\n });\n}\n\nfunction convertBitbucketServer(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const token = entry.getOptionalString('token');\n if (token !== undefined) {\n auth.push({ method: 'token', token });\n }\n\n const username = entry.getOptionalString('username');\n const password = entry.getOptionalString('password');\n if (username !== undefined && password !== undefined) {\n auth.push({ method: 'basic', username, password });\n }\n\n return omitUndefined({\n type: 'bitbucket-server',\n host: entry.getOptionalString('host'),\n apiBaseUrl: entry.getOptionalString('apiBaseUrl'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertGerrit(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const username = entry.getOptionalString('username');\n const password = entry.getOptionalString('password');\n if (username !== undefined && password !== undefined) {\n auth.push({ method: 'basic', username, password });\n }\n\n return omitUndefined({\n type: 'gerrit',\n host: entry.getOptionalString('host'),\n baseUrl: entry.getOptionalString('baseUrl'),\n gitilesBaseUrl: entry.getOptionalString('gitilesBaseUrl'),\n cloneUrl: entry.getOptionalString('cloneUrl'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertGitea(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const username = entry.getOptionalString('username');\n const password = entry.getOptionalString('password');\n if (username !== undefined && password !== undefined) {\n auth.push({ method: 'basic', username, password });\n }\n\n return omitUndefined({\n type: 'gitea',\n host: entry.getOptionalString('host'),\n baseUrl: entry.getOptionalString('baseUrl'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertHarness(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const token = entry.getOptionalString('token');\n if (token !== undefined) {\n const apiKey = entry.getOptionalString('apiKey');\n auth.push(omitUndefined({ method: 'token', token, apiKey }));\n }\n\n return omitUndefined({\n type: 'harness',\n host: entry.getOptionalString('host'),\n auth,\n });\n });\n}\n\nfunction convertAwsCodeCommit(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const accessKeyId = entry.getOptionalString('accessKeyId');\n const secretAccessKey = entry.getOptionalString('secretAccessKey');\n if (accessKeyId !== undefined && secretAccessKey !== undefined) {\n auth.push({ method: 'accessKey', accessKeyId, secretAccessKey });\n }\n\n const roleArn = entry.getOptionalString('roleArn');\n if (roleArn !== undefined) {\n auth.push(\n omitUndefined({\n method: 'assumeRole',\n roleArn,\n externalId: entry.getOptionalString('externalId'),\n }),\n );\n }\n\n const region = entry.getString('region');\n const host =\n entry.getOptionalString('host') ?? `${region}.console.aws.amazon.com`;\n\n return { type: 'aws-codecommit', host, region, auth };\n });\n}\n\nfunction convertAwsS3(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const accessKeyId = entry.getOptionalString('accessKeyId');\n const secretAccessKey = entry.getOptionalString('secretAccessKey');\n if (accessKeyId !== undefined && secretAccessKey !== undefined) {\n auth.push({ method: 'accessKey', accessKeyId, secretAccessKey });\n }\n\n const roleArn = entry.getOptionalString('roleArn');\n if (roleArn !== undefined) {\n auth.push(\n omitUndefined({\n method: 'assumeRole',\n roleArn,\n externalId: entry.getOptionalString('externalId'),\n }),\n );\n }\n\n const endpoint = entry.getOptionalString('endpoint');\n const host = endpoint ? new URL(endpoint).host : 'amazonaws.com';\n\n return omitUndefined({\n type: 'aws-s3',\n host,\n endpoint,\n s3ForcePathStyle: entry.getOptionalBoolean('s3ForcePathStyle'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertAzureBlobStorage(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const accountKey = entry.getOptionalString('accountKey');\n if (accountKey !== undefined) {\n auth.push({ method: 'accountKey', accountKey });\n }\n\n const sasToken = entry.getOptionalString('sasToken');\n if (sasToken !== undefined) {\n auth.push({ method: 'sasToken', sasToken });\n }\n\n const connectionString = entry.getOptionalString('connectionString');\n if (connectionString !== undefined) {\n auth.push({ method: 'connectionString', connectionString });\n }\n\n if (entry.has('aadCredential')) {\n auth.push({\n method: 'aadCredential',\n clientId: entry.getString('aadCredential.clientId'),\n tenantId: entry.getString('aadCredential.tenantId'),\n clientSecret: entry.getString('aadCredential.clientSecret'),\n });\n }\n\n const endpoint = entry.getOptionalString('endpoint');\n const host = endpoint\n ? new URL(endpoint).host\n : entry.getOptionalString('host') ?? 'blob.core.windows.net';\n\n return omitUndefined({\n type: 'azure-blob-storage',\n host,\n accountName: entry.getOptionalString('accountName'),\n endpoint,\n endpointSuffix: entry.getOptionalString('endpointSuffix'),\n auth: withNoneAuthFallback(auth),\n });\n });\n}\n\nfunction convertGoogleGcs(entries: Config[]): JsonObject[] {\n return entries.map(entry => {\n const auth: JsonObject[] = [];\n\n const clientEmail = entry.getOptionalString('clientEmail');\n const privateKey = entry.getOptionalString('privateKey');\n if (clientEmail !== undefined && privateKey !== undefined) {\n auth.push({ method: 'serviceAccount', clientEmail, privateKey });\n }\n\n return {\n type: 'google-gcs',\n host: 'storage.cloud.google.com',\n auth: withNoneAuthFallback(auth),\n };\n });\n}\n\nfunction withNoneAuthFallback(auth: JsonObject[]): JsonObject[] {\n return auth.length > 0 ? auth : [{ method: 'none' }];\n}\n\nfunction omitUndefined(\n input: Record<string, JsonValue | undefined>,\n): JsonObject {\n const out: JsonObject = {};\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined) {\n out[key] = value;\n }\n }\n return out;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var connections = require('@backstage/connections');
|
|
4
|
+
|
|
5
|
+
const connectionTypesMap = new Map(Object.entries(connections.connectionTypes));
|
|
6
|
+
function getConnectionType(key) {
|
|
7
|
+
return connectionTypesMap.get(key);
|
|
8
|
+
}
|
|
9
|
+
function isConnectionTypeKey(value) {
|
|
10
|
+
if (!value) return false;
|
|
11
|
+
return connectionTypesMap.has(value);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.getConnectionType = getConnectionType;
|
|
15
|
+
exports.isConnectionTypeKey = isConnectionTypeKey;
|
|
16
|
+
//# sourceMappingURL=lookup.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup.cjs.js","sources":["../../../../connections-node/src/lookup.ts"],"sourcesContent":["/*\n * Copyright 2026 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 LookupConnectionType,\n ConnectionTypeKey,\n connectionTypes,\n} from '@backstage/connections';\n\nconst connectionTypesMap = new Map(Object.entries(connectionTypes));\n\nexport function getConnectionType<T extends ConnectionTypeKey>(\n key: T,\n): LookupConnectionType<T> {\n return connectionTypesMap.get(key) as LookupConnectionType<T>;\n}\n\nexport function isConnectionTypeKey(\n value: string | undefined,\n): value is ConnectionTypeKey {\n if (!value) return false;\n\n return connectionTypesMap.has(value);\n}\n"],"names":["connectionTypes"],"mappings":";;;;AAqBA,MAAM,qBAAqB,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQA,2BAAe,CAAC,CAAA;AAE3D,SAAS,kBACd,GAAA,EACyB;AACzB,EAAA,OAAO,kBAAA,CAAmB,IAAI,GAAG,CAAA;AACnC;AAEO,SAAS,oBACd,KAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,OAAO,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACrC;;;;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
|
|
5
|
+
const lookupStrategies = {
|
|
6
|
+
host: {
|
|
7
|
+
identityField: "host",
|
|
8
|
+
identityFromQuery(query) {
|
|
9
|
+
try {
|
|
10
|
+
return new URL(query.url).host;
|
|
11
|
+
} catch {
|
|
12
|
+
throw new errors.InputError(
|
|
13
|
+
`Invalid url "${query.url}" passed to ConnectionsService.find`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
aws: {
|
|
19
|
+
identityFromQuery(_query) {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
exports.lookupStrategies = lookupStrategies;
|
|
26
|
+
//# sourceMappingURL=lookupStrategies.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookupStrategies.cjs.js","sources":["../../../../connections-node/src/lookupStrategies.ts"],"sourcesContent":["/*\n * Copyright 2026 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 { InputError } from '@backstage/errors';\n\n/**\n * The definitions of all lookup strategies, keyed by the `lookupStrategy` of\n * each connection type. Each definition knows how to derive the identity to\n * match connections against from the query passed to `ConnectionsService.find`.\n *\n * @internal\n */\nexport const lookupStrategies = {\n host: {\n identityField: 'host' as const,\n identityFromQuery(query: { url: string }): string | undefined {\n try {\n return new URL(query.url).host;\n } catch {\n throw new InputError(\n `Invalid url \"${query.url}\" passed to ConnectionsService.find`,\n );\n }\n },\n },\n aws: {\n identityFromQuery(_query: {\n accountId?: string;\n arn?: string;\n }): string | undefined {\n return undefined;\n },\n },\n};\n"],"names":["InputError"],"mappings":";;;;AAwBO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,aAAA,EAAe,MAAA;AAAA,IACf,kBAAkB,KAAA,EAA4C;AAC5D,MAAA,IAAI;AACF,QAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAIA,iBAAA;AAAA,UACR,CAAA,aAAA,EAAgB,MAAM,GAAG,CAAA,mCAAA;AAAA,SAC3B;AAAA,MACF;AAAA,IACF;AAAA,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,kBAAkB,MAAA,EAGK;AACrB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var DefaultConnectionsService = require('./DefaultConnectionsService.cjs.js');
|
|
5
|
+
|
|
6
|
+
function createConnectionsServiceFactory(service) {
|
|
7
|
+
return backendPluginApi.createServiceFactory({
|
|
8
|
+
service,
|
|
9
|
+
deps: {
|
|
10
|
+
pluginMetadata: backendPluginApi.coreServices.pluginMetadata,
|
|
11
|
+
rootLogger: backendPluginApi.coreServices.rootLogger,
|
|
12
|
+
logger: backendPluginApi.coreServices.logger,
|
|
13
|
+
config: backendPluginApi.coreServices.rootConfig
|
|
14
|
+
},
|
|
15
|
+
async createRootContext({ rootLogger, config }) {
|
|
16
|
+
return DefaultConnectionsService.DefaultConnectionsService.create({ logger: rootLogger, config });
|
|
17
|
+
},
|
|
18
|
+
async factory({ logger, pluginMetadata }, connectionsService) {
|
|
19
|
+
const pluginId = pluginMetadata.getId();
|
|
20
|
+
return connectionsService.forPlugin(pluginId, { logger });
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const connectionsServiceRef = backendPluginApi.createServiceRef({
|
|
25
|
+
id: "core.connections",
|
|
26
|
+
scope: "plugin",
|
|
27
|
+
defaultFactory: async (service) => createConnectionsServiceFactory(service)
|
|
28
|
+
});
|
|
29
|
+
createConnectionsServiceFactory(
|
|
30
|
+
connectionsServiceRef
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
exports.connectionsServiceRef = connectionsServiceRef;
|
|
34
|
+
//# sourceMappingURL=service.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.cjs.js","sources":["../../../../connections-node/src/service.ts"],"sourcesContent":["/*\n * Copyright 2026 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 createServiceRef,\n type ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport type { ConnectionsService } from '@backstage/connections';\nimport { DefaultConnectionsService } from './DefaultConnectionsService';\n\nfunction createConnectionsServiceFactory<\n TInstances extends 'singleton' | 'multiton',\n>(service: ServiceRef<ConnectionsService, 'plugin', TInstances>) {\n return createServiceFactory({\n service,\n deps: {\n pluginMetadata: coreServices.pluginMetadata,\n rootLogger: coreServices.rootLogger,\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n },\n async createRootContext({ rootLogger, config }) {\n return DefaultConnectionsService.create({ logger: rootLogger, config });\n },\n\n async factory({ logger, pluginMetadata }, connectionsService) {\n const pluginId = pluginMetadata.getId();\n return connectionsService.forPlugin(pluginId, { logger });\n },\n });\n}\n\n/** @public */\nexport const connectionsServiceRef = createServiceRef<ConnectionsService>({\n id: 'core.connections',\n scope: 'plugin',\n defaultFactory: async service => createConnectionsServiceFactory(service),\n});\n\n/** @public */\nexport const connectionsServiceFactory = createConnectionsServiceFactory(\n connectionsServiceRef,\n);\n"],"names":["createServiceFactory","coreServices","DefaultConnectionsService","createServiceRef"],"mappings":";;;;;AAyBA,SAAS,gCAEP,OAAA,EAA+D;AAC/D,EAAA,OAAOA,qCAAA,CAAqB;AAAA,IAC1B,OAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,gBAAgBC,6BAAA,CAAa,cAAA;AAAA,MAC7B,YAAYA,6BAAA,CAAa,UAAA;AAAA,MACzB,QAAQA,6BAAA,CAAa,MAAA;AAAA,MACrB,QAAQA,6BAAA,CAAa;AAAA,KACvB;AAAA,IACA,MAAM,iBAAA,CAAkB,EAAE,UAAA,EAAY,QAAO,EAAG;AAC9C,MAAA,OAAOC,oDAA0B,MAAA,CAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAQ,CAAA;AAAA,IACxE,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAQ,cAAA,IAAkB,kBAAA,EAAoB;AAC5D,MAAA,MAAM,QAAA,GAAW,eAAe,KAAA,EAAM;AACtC,MAAA,OAAO,kBAAA,CAAmB,SAAA,CAAU,QAAA,EAAU,EAAE,QAAQ,CAAA;AAAA,IAC1D;AAAA,GACD,CAAA;AACH;AAGO,MAAM,wBAAwBC,iCAAA,CAAqC;AAAA,EACxE,EAAA,EAAI,kBAAA;AAAA,EACJ,KAAA,EAAO,QAAA;AAAA,EACP,cAAA,EAAgB,OAAM,OAAA,KAAW,+BAAA,CAAgC,OAAO;AAC1E,CAAC;AAGwC,+BAAA;AAAA,EACvC;AACF;;;;"}
|