@backstage/backend-defaults 0.5.3 → 0.6.0-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 +67 -0
- package/config.d.ts +34 -6
- package/dist/auth.cjs.js +1 -0
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.d.ts +27 -1
- package/dist/cache.d.ts +0 -1
- package/dist/database.d.ts +1 -1
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js +4 -1
- package/dist/entrypoints/auth/DefaultAuthService.cjs.js.map +1 -1
- package/dist/entrypoints/auth/authServiceFactory.cjs.js +30 -9
- package/dist/entrypoints/auth/authServiceFactory.cjs.js.map +1 -1
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js +6 -10
- package/dist/entrypoints/auth/plugin/PluginTokenHandler.cjs.js.map +1 -1
- package/dist/entrypoints/cache/CacheManager.cjs.js +20 -19
- package/dist/entrypoints/cache/CacheManager.cjs.js.map +1 -1
- package/dist/entrypoints/database/connectors/postgres.cjs.js +40 -6
- package/dist/entrypoints/database/connectors/postgres.cjs.js.map +1 -1
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js +22 -9
- package/dist/entrypoints/httpAuth/httpAuthServiceFactory.cjs.js.map +1 -1
- package/dist/entrypoints/httpRouter/http/createAuthIntegrationRouter.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/http/createCredentialsBarrier.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/http/createLifecycleMiddleware.cjs.js.map +1 -0
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js +4 -4
- package/dist/entrypoints/httpRouter/httpRouterServiceFactory.cjs.js.map +1 -1
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js +36 -13
- package/dist/entrypoints/rootHttpRouter/http/MiddlewareFactory.cjs.js.map +1 -1
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js +9 -3
- package/dist/entrypoints/rootLogger/WinstonLogger.cjs.js.map +1 -1
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js +15 -0
- package/dist/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.cjs.js +156 -0
- package/dist/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.cjs.js.map +1 -0
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js +5 -11
- package/dist/entrypoints/urlReader/lib/AzureUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js +5 -14
- package/dist/entrypoints/urlReader/lib/BitbucketCloudUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js +5 -14
- package/dist/entrypoints/urlReader/lib/BitbucketServerUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js +5 -14
- package/dist/entrypoints/urlReader/lib/BitbucketUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js +2 -10
- package/dist/entrypoints/urlReader/lib/FetchUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js +4 -9
- package/dist/entrypoints/urlReader/lib/GiteaUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js +7 -16
- package/dist/entrypoints/urlReader/lib/GitlabUrlReader.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js +16 -2
- package/dist/entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js +2 -0
- package/dist/entrypoints/urlReader/lib/UrlReaders.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js +23 -4
- package/dist/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.cjs.js.map +1 -1
- package/dist/entrypoints/urlReader/lib/util.cjs.js +29 -1
- package/dist/entrypoints/urlReader/lib/util.cjs.js.map +1 -1
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js +1 -6
- package/dist/entrypoints/userInfo/DefaultUserInfoService.cjs.js.map +1 -1
- package/dist/httpAuth.cjs.js +1 -0
- package/dist/httpAuth.cjs.js.map +1 -1
- package/dist/httpAuth.d.ts +36 -2
- package/dist/httpRouter.cjs.js +8 -0
- package/dist/httpRouter.cjs.js.map +1 -1
- package/dist/httpRouter.d.ts +62 -1
- package/dist/package.json.cjs.js +20 -6
- package/dist/package.json.cjs.js.map +1 -1
- package/dist/urlReader.cjs.js +2 -0
- package/dist/urlReader.cjs.js.map +1 -1
- package/dist/urlReader.d.ts +41 -5
- package/package.json +33 -23
- package/dist/entrypoints/httpRouter/createAuthIntegrationRouter.cjs.js.map +0 -1
- package/dist/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.cjs.js.map +0 -1
- package/dist/entrypoints/httpRouter/createCredentialsBarrier.cjs.js.map +0 -1
- package/dist/entrypoints/httpRouter/createLifecycleMiddleware.cjs.js.map +0 -1
- /package/dist/entrypoints/httpRouter/{createAuthIntegrationRouter.cjs.js → http/createAuthIntegrationRouter.cjs.js} +0 -0
- /package/dist/entrypoints/httpRouter/{createCookieAuthRefreshMiddleware.cjs.js → http/createCookieAuthRefreshMiddleware.cjs.js} +0 -0
- /package/dist/entrypoints/httpRouter/{createCredentialsBarrier.cjs.js → http/createCredentialsBarrier.cjs.js} +0 -0
- /package/dist/entrypoints/httpRouter/{createLifecycleMiddleware.cjs.js → http/createLifecycleMiddleware.cjs.js} +0 -0
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.
|
|
6
|
+
var version = "0.6.0-next.1";
|
|
7
7
|
var description = "Backend defaults used by Backstage backend apps";
|
|
8
8
|
var backstage = {
|
|
9
9
|
role: "node-library"
|
|
@@ -122,6 +122,8 @@ var dependencies = {
|
|
|
122
122
|
"@aws-sdk/client-s3": "^3.350.0",
|
|
123
123
|
"@aws-sdk/credential-providers": "^3.350.0",
|
|
124
124
|
"@aws-sdk/types": "^3.347.0",
|
|
125
|
+
"@azure/identity": "^4.0.0",
|
|
126
|
+
"@azure/storage-blob": "^12.5.0",
|
|
125
127
|
"@backstage/backend-app-api": "workspace:^",
|
|
126
128
|
"@backstage/backend-dev-utils": "workspace:^",
|
|
127
129
|
"@backstage/backend-plugin-api": "workspace:^",
|
|
@@ -137,8 +139,8 @@ var dependencies = {
|
|
|
137
139
|
"@backstage/plugin-permission-node": "workspace:^",
|
|
138
140
|
"@backstage/types": "workspace:^",
|
|
139
141
|
"@google-cloud/storage": "^7.0.0",
|
|
140
|
-
"@keyv/memcache": "^
|
|
141
|
-
"@keyv/redis": "^
|
|
142
|
+
"@keyv/memcache": "^2.0.1",
|
|
143
|
+
"@keyv/redis": "^4.0.1",
|
|
142
144
|
"@manypkg/get-packages": "^1.1.3",
|
|
143
145
|
"@octokit/rest": "^19.0.3",
|
|
144
146
|
"@opentelemetry/api": "^1.3.0",
|
|
@@ -159,14 +161,13 @@ var dependencies = {
|
|
|
159
161
|
helmet: "^6.0.0",
|
|
160
162
|
"isomorphic-git": "^1.23.0",
|
|
161
163
|
jose: "^5.0.0",
|
|
162
|
-
keyv: "^
|
|
164
|
+
keyv: "^5.2.1",
|
|
163
165
|
knex: "^3.0.0",
|
|
164
166
|
lodash: "^4.17.21",
|
|
165
167
|
logform: "^2.3.2",
|
|
166
168
|
luxon: "^3.0.0",
|
|
167
169
|
minimatch: "^9.0.0",
|
|
168
170
|
minimist: "^1.2.5",
|
|
169
|
-
morgan: "^1.10.0",
|
|
170
171
|
mysql2: "^3.0.0",
|
|
171
172
|
"node-fetch": "^2.7.0",
|
|
172
173
|
"node-forge": "^1.3.1",
|
|
@@ -187,16 +188,24 @@ var dependencies = {
|
|
|
187
188
|
yn: "^4.0.0",
|
|
188
189
|
zod: "^3.22.4"
|
|
189
190
|
};
|
|
191
|
+
var peerDependencies = {
|
|
192
|
+
"@google-cloud/cloud-sql-connector": "^1.4.0"
|
|
193
|
+
};
|
|
194
|
+
var peerDependenciesMeta = {
|
|
195
|
+
"@google-cloud/cloud-sql-connector": {
|
|
196
|
+
optional: true
|
|
197
|
+
}
|
|
198
|
+
};
|
|
190
199
|
var devDependencies = {
|
|
191
200
|
"@aws-sdk/util-stream-node": "^3.350.0",
|
|
192
201
|
"@backstage/backend-plugin-api": "workspace:^",
|
|
193
202
|
"@backstage/backend-test-utils": "workspace:^",
|
|
194
203
|
"@backstage/cli": "workspace:^",
|
|
204
|
+
"@google-cloud/cloud-sql-connector": "^1.4.0",
|
|
195
205
|
"@types/archiver": "^6.0.0",
|
|
196
206
|
"@types/base64-stream": "^1.0.2",
|
|
197
207
|
"@types/concat-stream": "^2.0.0",
|
|
198
208
|
"@types/http-errors": "^2.0.0",
|
|
199
|
-
"@types/morgan": "^1.9.0",
|
|
200
209
|
"@types/node-forge": "^1.3.0",
|
|
201
210
|
"@types/pg-format": "^1.0.5",
|
|
202
211
|
"@types/stoppable": "^1.1.0",
|
|
@@ -204,6 +213,7 @@ var devDependencies = {
|
|
|
204
213
|
"aws-sdk-client-mock": "^4.0.0",
|
|
205
214
|
"http-errors": "^2.0.0",
|
|
206
215
|
msw: "^1.0.0",
|
|
216
|
+
"node-mocks-http": "^1.0.0",
|
|
207
217
|
supertest: "^7.0.0",
|
|
208
218
|
"wait-for-expect": "^3.0.2"
|
|
209
219
|
};
|
|
@@ -225,6 +235,8 @@ var packageinfo = {
|
|
|
225
235
|
files: files,
|
|
226
236
|
scripts: scripts,
|
|
227
237
|
dependencies: dependencies,
|
|
238
|
+
peerDependencies: peerDependencies,
|
|
239
|
+
peerDependenciesMeta: peerDependenciesMeta,
|
|
228
240
|
devDependencies: devDependencies,
|
|
229
241
|
configSchema: configSchema
|
|
230
242
|
};
|
|
@@ -242,6 +254,8 @@ exports.keywords = keywords;
|
|
|
242
254
|
exports.license = license;
|
|
243
255
|
exports.main = main;
|
|
244
256
|
exports.name = name;
|
|
257
|
+
exports.peerDependencies = peerDependencies;
|
|
258
|
+
exports.peerDependenciesMeta = peerDependenciesMeta;
|
|
245
259
|
exports.publishConfig = publishConfig;
|
|
246
260
|
exports.repository = repository;
|
|
247
261
|
exports.scripts = scripts;
|
|
@@ -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/dist/urlReader.cjs.js
CHANGED
|
@@ -10,6 +10,7 @@ var GitlabUrlReader = require('./entrypoints/urlReader/lib/GitlabUrlReader.cjs.j
|
|
|
10
10
|
var GiteaUrlReader = require('./entrypoints/urlReader/lib/GiteaUrlReader.cjs.js');
|
|
11
11
|
var HarnessUrlReader = require('./entrypoints/urlReader/lib/HarnessUrlReader.cjs.js');
|
|
12
12
|
var AwsS3UrlReader = require('./entrypoints/urlReader/lib/AwsS3UrlReader.cjs.js');
|
|
13
|
+
var AzureBlobStorageUrlReader = require('./entrypoints/urlReader/lib/AzureBlobStorageUrlReader.cjs.js');
|
|
13
14
|
var FetchUrlReader = require('./entrypoints/urlReader/lib/FetchUrlReader.cjs.js');
|
|
14
15
|
var ReadUrlResponseFactory = require('./entrypoints/urlReader/lib/ReadUrlResponseFactory.cjs.js');
|
|
15
16
|
var UrlReaders = require('./entrypoints/urlReader/lib/UrlReaders.cjs.js');
|
|
@@ -27,6 +28,7 @@ exports.GitlabUrlReader = GitlabUrlReader.GitlabUrlReader;
|
|
|
27
28
|
exports.GiteaUrlReader = GiteaUrlReader.GiteaUrlReader;
|
|
28
29
|
exports.HarnessUrlReader = HarnessUrlReader.HarnessUrlReader;
|
|
29
30
|
exports.AwsS3UrlReader = AwsS3UrlReader.AwsS3UrlReader;
|
|
31
|
+
exports.AzureBlobStorageUrlReader = AzureBlobStorageUrlReader.AzureBlobStorageUrlReader;
|
|
30
32
|
exports.FetchUrlReader = FetchUrlReader.FetchUrlReader;
|
|
31
33
|
exports.ReadUrlResponseFactory = ReadUrlResponseFactory.ReadUrlResponseFactory;
|
|
32
34
|
exports.UrlReaders = UrlReaders.UrlReaders;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlReader.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"urlReader.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/urlReader.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
|
|
3
|
-
import { RootConfigService, LoggerService, UrlReaderServiceReadTreeResponse,
|
|
4
|
-
import { AzureIntegration, AzureDevOpsCredentialsProvider, BitbucketCloudIntegration, BitbucketIntegration, BitbucketServerIntegration, GerritIntegration, GithubIntegration, GithubCredentialsProvider, GitLabIntegration, GiteaIntegration, HarnessIntegration, AwsS3Integration } from '@backstage/integration';
|
|
3
|
+
import { UrlReaderService, RootConfigService, LoggerService, UrlReaderServiceReadTreeResponse, UrlReaderServiceReadUrlOptions, UrlReaderServiceReadUrlResponse, UrlReaderServiceReadTreeOptions, UrlReaderServiceSearchOptions, UrlReaderServiceSearchResponse } from '@backstage/backend-plugin-api';
|
|
4
|
+
import { AzureIntegration, AzureDevOpsCredentialsProvider, BitbucketCloudIntegration, BitbucketIntegration, BitbucketServerIntegration, GerritIntegration, GithubIntegration, GithubCredentialsProvider, GitLabIntegration, GiteaIntegration, HarnessIntegration, AwsS3Integration, AzureCredentialsManager, AzureBlobStorageIntergation } from '@backstage/integration';
|
|
5
5
|
import { Readable } from 'stream';
|
|
6
6
|
import { AwsCredentialsManager } from '@backstage/integration-aws-node';
|
|
7
7
|
|
|
@@ -47,6 +47,17 @@ type ReadTreeResponseFactoryOptions = {
|
|
|
47
47
|
filter?: (path: string, info?: {
|
|
48
48
|
size: number;
|
|
49
49
|
}) => boolean;
|
|
50
|
+
} | {
|
|
51
|
+
/** A response from a fetch request */
|
|
52
|
+
response: Response;
|
|
53
|
+
/** If unset, the files at the root of the tree will be read. Subpath must not contain the name of the top level directory. */
|
|
54
|
+
subpath?: string;
|
|
55
|
+
/** etag of the blob, to optionally override what the response header may or may not say */
|
|
56
|
+
etag?: string;
|
|
57
|
+
/** Filter passed on from the ReadTreeOptions */
|
|
58
|
+
filter?: (path: string, info?: {
|
|
59
|
+
size: number;
|
|
60
|
+
}) => boolean;
|
|
50
61
|
};
|
|
51
62
|
/**
|
|
52
63
|
* Options that control {@link ReadTreeResponseFactory.fromReadableArray}
|
|
@@ -334,6 +345,27 @@ declare class AwsS3UrlReader implements UrlReaderService {
|
|
|
334
345
|
toString(): string;
|
|
335
346
|
}
|
|
336
347
|
|
|
348
|
+
/**
|
|
349
|
+
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for Azure storage accounts urls.
|
|
350
|
+
*
|
|
351
|
+
* @public
|
|
352
|
+
*/
|
|
353
|
+
declare class AzureBlobStorageUrlReader implements UrlReaderService {
|
|
354
|
+
private readonly credsManager;
|
|
355
|
+
private readonly integration;
|
|
356
|
+
private readonly deps;
|
|
357
|
+
static factory: ReaderFactory;
|
|
358
|
+
constructor(credsManager: AzureCredentialsManager, integration: AzureBlobStorageIntergation, deps: {
|
|
359
|
+
treeResponseFactory: ReadTreeResponseFactory;
|
|
360
|
+
});
|
|
361
|
+
private createContainerClient;
|
|
362
|
+
read(url: string): Promise<Buffer>;
|
|
363
|
+
readUrl(url: string, options?: UrlReaderServiceReadUrlOptions): Promise<UrlReaderServiceReadUrlResponse>;
|
|
364
|
+
readTree(url: string, options?: UrlReaderServiceReadTreeOptions): Promise<UrlReaderServiceReadTreeResponse>;
|
|
365
|
+
search(): Promise<UrlReaderServiceSearchResponse>;
|
|
366
|
+
toString(): string;
|
|
367
|
+
}
|
|
368
|
+
|
|
337
369
|
/**
|
|
338
370
|
* A {@link @backstage/backend-plugin-api#UrlReaderService} that does a plain fetch of the URL.
|
|
339
371
|
*
|
|
@@ -368,13 +400,17 @@ declare class FetchUrlReader implements UrlReaderService {
|
|
|
368
400
|
*/
|
|
369
401
|
declare class ReadUrlResponseFactory {
|
|
370
402
|
/**
|
|
371
|
-
* Resolves a
|
|
403
|
+
* Resolves a UrlReaderServiceReadUrlResponse from a Readable stream.
|
|
372
404
|
*/
|
|
373
405
|
static fromReadable(stream: Readable, options?: ReadUrlResponseFactoryFromStreamOptions): Promise<UrlReaderServiceReadUrlResponse>;
|
|
374
406
|
/**
|
|
375
|
-
* Resolves a
|
|
407
|
+
* Resolves a UrlReaderServiceReadUrlResponse from an old-style NodeJS.ReadableStream.
|
|
376
408
|
*/
|
|
377
409
|
static fromNodeJSReadable(oldStyleStream: NodeJS.ReadableStream, options?: ReadUrlResponseFactoryFromStreamOptions): Promise<UrlReaderServiceReadUrlResponse>;
|
|
410
|
+
/**
|
|
411
|
+
* Resolves a UrlReaderServiceReadUrlResponse from a native fetch response body.
|
|
412
|
+
*/
|
|
413
|
+
static fromResponse(response: Response): Promise<UrlReaderServiceReadUrlResponse>;
|
|
378
414
|
}
|
|
379
415
|
|
|
380
416
|
/**
|
|
@@ -437,4 +473,4 @@ declare const urlReaderFactoriesServiceRef: _backstage_backend_plugin_api.Servic
|
|
|
437
473
|
*/
|
|
438
474
|
declare const urlReaderServiceFactory: _backstage_backend_plugin_api.ServiceFactory<_backstage_backend_plugin_api.UrlReaderService, "plugin", "singleton">;
|
|
439
475
|
|
|
440
|
-
export { AwsS3UrlReader, AzureUrlReader, BitbucketCloudUrlReader, BitbucketServerUrlReader, BitbucketUrlReader, FetchUrlReader, type FromReadableArrayOptions, GerritUrlReader, GiteaUrlReader, GithubUrlReader, GitlabUrlReader, HarnessUrlReader, type ReadTreeResponseFactory, type ReadTreeResponseFactoryOptions, ReadUrlResponseFactory, type ReadUrlResponseFactoryFromStreamOptions, type ReaderFactory, type UrlReaderPredicateTuple, UrlReaders, type UrlReadersOptions, urlReaderFactoriesServiceRef, urlReaderServiceFactory };
|
|
476
|
+
export { AwsS3UrlReader, AzureBlobStorageUrlReader, AzureUrlReader, BitbucketCloudUrlReader, BitbucketServerUrlReader, BitbucketUrlReader, FetchUrlReader, type FromReadableArrayOptions, GerritUrlReader, GiteaUrlReader, GithubUrlReader, GitlabUrlReader, HarnessUrlReader, type ReadTreeResponseFactory, type ReadTreeResponseFactoryOptions, ReadUrlResponseFactory, type ReadUrlResponseFactoryFromStreamOptions, type ReaderFactory, type UrlReaderPredicateTuple, UrlReaders, type UrlReadersOptions, urlReaderFactoriesServiceRef, urlReaderServiceFactory };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-defaults",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-next.1",
|
|
4
4
|
"description": "Backend defaults used by Backstage backend apps",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -191,23 +191,25 @@
|
|
|
191
191
|
"@aws-sdk/client-s3": "^3.350.0",
|
|
192
192
|
"@aws-sdk/credential-providers": "^3.350.0",
|
|
193
193
|
"@aws-sdk/types": "^3.347.0",
|
|
194
|
-
"@
|
|
195
|
-
"@
|
|
196
|
-
"@backstage/backend-
|
|
197
|
-
"@backstage/
|
|
198
|
-
"@backstage/
|
|
199
|
-
"@backstage/
|
|
200
|
-
"@backstage/
|
|
201
|
-
"@backstage/
|
|
202
|
-
"@backstage/
|
|
203
|
-
"@backstage/
|
|
204
|
-
"@backstage/
|
|
205
|
-
"@backstage/
|
|
206
|
-
"@backstage/plugin-
|
|
207
|
-
"@backstage/
|
|
194
|
+
"@azure/identity": "^4.0.0",
|
|
195
|
+
"@azure/storage-blob": "^12.5.0",
|
|
196
|
+
"@backstage/backend-app-api": "1.1.0-next.1",
|
|
197
|
+
"@backstage/backend-dev-utils": "0.1.5",
|
|
198
|
+
"@backstage/backend-plugin-api": "1.1.0-next.1",
|
|
199
|
+
"@backstage/cli-common": "0.1.15",
|
|
200
|
+
"@backstage/cli-node": "0.2.11-next.0",
|
|
201
|
+
"@backstage/config": "1.3.0",
|
|
202
|
+
"@backstage/config-loader": "1.9.3-next.0",
|
|
203
|
+
"@backstage/errors": "1.2.5",
|
|
204
|
+
"@backstage/integration": "1.16.0-next.0",
|
|
205
|
+
"@backstage/integration-aws-node": "0.1.13",
|
|
206
|
+
"@backstage/plugin-auth-node": "0.5.5-next.1",
|
|
207
|
+
"@backstage/plugin-events-node": "0.4.6-next.1",
|
|
208
|
+
"@backstage/plugin-permission-node": "0.8.6-next.1",
|
|
209
|
+
"@backstage/types": "1.2.0",
|
|
208
210
|
"@google-cloud/storage": "^7.0.0",
|
|
209
|
-
"@keyv/memcache": "^
|
|
210
|
-
"@keyv/redis": "^
|
|
211
|
+
"@keyv/memcache": "^2.0.1",
|
|
212
|
+
"@keyv/redis": "^4.0.1",
|
|
211
213
|
"@manypkg/get-packages": "^1.1.3",
|
|
212
214
|
"@octokit/rest": "^19.0.3",
|
|
213
215
|
"@opentelemetry/api": "^1.3.0",
|
|
@@ -228,14 +230,13 @@
|
|
|
228
230
|
"helmet": "^6.0.0",
|
|
229
231
|
"isomorphic-git": "^1.23.0",
|
|
230
232
|
"jose": "^5.0.0",
|
|
231
|
-
"keyv": "^
|
|
233
|
+
"keyv": "^5.2.1",
|
|
232
234
|
"knex": "^3.0.0",
|
|
233
235
|
"lodash": "^4.17.21",
|
|
234
236
|
"logform": "^2.3.2",
|
|
235
237
|
"luxon": "^3.0.0",
|
|
236
238
|
"minimatch": "^9.0.0",
|
|
237
239
|
"minimist": "^1.2.5",
|
|
238
|
-
"morgan": "^1.10.0",
|
|
239
240
|
"mysql2": "^3.0.0",
|
|
240
241
|
"node-fetch": "^2.7.0",
|
|
241
242
|
"node-forge": "^1.3.1",
|
|
@@ -256,16 +257,24 @@
|
|
|
256
257
|
"yn": "^4.0.0",
|
|
257
258
|
"zod": "^3.22.4"
|
|
258
259
|
},
|
|
260
|
+
"peerDependencies": {
|
|
261
|
+
"@google-cloud/cloud-sql-connector": "^1.4.0"
|
|
262
|
+
},
|
|
263
|
+
"peerDependenciesMeta": {
|
|
264
|
+
"@google-cloud/cloud-sql-connector": {
|
|
265
|
+
"optional": true
|
|
266
|
+
}
|
|
267
|
+
},
|
|
259
268
|
"devDependencies": {
|
|
260
269
|
"@aws-sdk/util-stream-node": "^3.350.0",
|
|
261
|
-
"@backstage/backend-plugin-api": "
|
|
262
|
-
"@backstage/backend-test-utils": "
|
|
263
|
-
"@backstage/cli": "
|
|
270
|
+
"@backstage/backend-plugin-api": "1.1.0-next.1",
|
|
271
|
+
"@backstage/backend-test-utils": "1.2.0-next.1",
|
|
272
|
+
"@backstage/cli": "0.29.3-next.1",
|
|
273
|
+
"@google-cloud/cloud-sql-connector": "^1.4.0",
|
|
264
274
|
"@types/archiver": "^6.0.0",
|
|
265
275
|
"@types/base64-stream": "^1.0.2",
|
|
266
276
|
"@types/concat-stream": "^2.0.0",
|
|
267
277
|
"@types/http-errors": "^2.0.0",
|
|
268
|
-
"@types/morgan": "^1.9.0",
|
|
269
278
|
"@types/node-forge": "^1.3.0",
|
|
270
279
|
"@types/pg-format": "^1.0.5",
|
|
271
280
|
"@types/stoppable": "^1.1.0",
|
|
@@ -273,6 +282,7 @@
|
|
|
273
282
|
"aws-sdk-client-mock": "^4.0.0",
|
|
274
283
|
"http-errors": "^2.0.0",
|
|
275
284
|
"msw": "^1.0.0",
|
|
285
|
+
"node-mocks-http": "^1.0.0",
|
|
276
286
|
"supertest": "^7.0.0",
|
|
277
287
|
"wait-for-expect": "^3.0.2"
|
|
278
288
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createAuthIntegrationRouter.cjs.js","sources":["../../../src/entrypoints/httpRouter/createAuthIntegrationRouter.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { AuthService } from '@backstage/backend-plugin-api';\nimport express from 'express';\nimport Router from 'express-promise-router';\n\nexport function createAuthIntegrationRouter(options: {\n auth: AuthService;\n}): express.Router {\n const router = Router();\n\n router.get('/.backstage/auth/v1/jwks.json', async (_req, res) => {\n const { keys } = await options.auth.listPublicServiceKeys();\n\n res.json({ keys });\n });\n\n return router;\n}\n"],"names":["Router"],"mappings":";;;;;;;;AAoBO,SAAS,4BAA4B,OAEzB,EAAA;AACjB,EAAA,MAAM,SAASA,uBAAO,EAAA;AAEtB,EAAA,MAAA,CAAO,GAAI,CAAA,+BAAA,EAAiC,OAAO,IAAA,EAAM,GAAQ,KAAA;AAC/D,IAAA,MAAM,EAAE,IAAK,EAAA,GAAI,MAAM,OAAA,CAAQ,KAAK,qBAAsB,EAAA;AAE1D,IAAI,GAAA,CAAA,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AAAA,GAClB,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createCookieAuthRefreshMiddleware.cjs.js","sources":["../../../src/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { AuthService, HttpAuthService } from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\n\nconst WELL_KNOWN_COOKIE_PATH_V1 = '/.backstage/auth/v1/cookie';\n\n/**\n * @public\n * Creates a middleware that can be used to refresh the cookie for the user.\n */\nexport function createCookieAuthRefreshMiddleware(options: {\n auth: AuthService;\n httpAuth: HttpAuthService;\n}) {\n const { auth, httpAuth } = options;\n const router = Router();\n\n // Endpoint that sets the cookie for the user\n router.get(WELL_KNOWN_COOKIE_PATH_V1, async (_, res) => {\n const { expiresAt } = await httpAuth.issueUserCookie(res);\n res.json({ expiresAt: expiresAt.toISOString() });\n });\n\n // Endpoint that removes the cookie for the user\n router.delete(WELL_KNOWN_COOKIE_PATH_V1, async (_, res) => {\n const credentials = await auth.getNoneCredentials();\n await httpAuth.issueUserCookie(res, { credentials });\n res.status(204).end();\n });\n\n return router;\n}\n"],"names":["Router"],"mappings":";;;;;;;;AAmBA,MAAM,yBAA4B,GAAA,4BAAA;AAM3B,SAAS,kCAAkC,OAG/C,EAAA;AACD,EAAM,MAAA,EAAE,IAAM,EAAA,QAAA,EAAa,GAAA,OAAA;AAC3B,EAAA,MAAM,SAASA,uBAAO,EAAA;AAGtB,EAAA,MAAA,CAAO,GAAI,CAAA,yBAAA,EAA2B,OAAO,CAAA,EAAG,GAAQ,KAAA;AACtD,IAAA,MAAM,EAAE,SAAU,EAAA,GAAI,MAAM,QAAA,CAAS,gBAAgB,GAAG,CAAA;AACxD,IAAA,GAAA,CAAI,KAAK,EAAE,SAAA,EAAW,SAAU,CAAA,WAAA,IAAe,CAAA;AAAA,GAChD,CAAA;AAGD,EAAA,MAAA,CAAO,MAAO,CAAA,yBAAA,EAA2B,OAAO,CAAA,EAAG,GAAQ,KAAA;AACzD,IAAM,MAAA,WAAA,GAAc,MAAM,IAAA,CAAK,kBAAmB,EAAA;AAClD,IAAA,MAAM,QAAS,CAAA,eAAA,CAAgB,GAAK,EAAA,EAAE,aAAa,CAAA;AACnD,IAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,GAAI,EAAA;AAAA,GACrB,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createCredentialsBarrier.cjs.js","sources":["../../../src/entrypoints/httpRouter/createCredentialsBarrier.ts"],"sourcesContent":["/*\n * Copyright 2024 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 HttpAuthService,\n HttpRouterServiceAuthPolicy,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport { RequestHandler } from 'express';\nimport { pathToRegexp } from 'path-to-regexp';\n\nexport function createPathPolicyPredicate(policyPath: string) {\n if (policyPath === '/' || policyPath === '*') {\n return () => true;\n }\n\n const { regexp: pathRegex } = pathToRegexp(policyPath, {\n end: false,\n });\n\n return (path: string): boolean => {\n return pathRegex.test(path);\n };\n}\n\nexport function createCredentialsBarrier(options: {\n httpAuth: HttpAuthService;\n config: RootConfigService;\n}): {\n middleware: RequestHandler;\n addAuthPolicy: (policy: HttpRouterServiceAuthPolicy) => void;\n} {\n const { httpAuth, config } = options;\n\n const disableDefaultAuthPolicy = config.getOptionalBoolean(\n 'backend.auth.dangerouslyDisableDefaultAuthPolicy',\n );\n\n if (disableDefaultAuthPolicy) {\n return {\n middleware: (_req, _res, next) => next(),\n addAuthPolicy: () => {},\n };\n }\n\n const unauthenticatedPredicates = new Array<(path: string) => boolean>();\n const cookiePredicates = new Array<(path: string) => boolean>();\n\n const middleware: RequestHandler = (req, _, next) => {\n const allowsUnauthenticated = unauthenticatedPredicates.some(predicate =>\n predicate(req.path),\n );\n\n if (allowsUnauthenticated) {\n next();\n return;\n }\n\n const allowsCookie = cookiePredicates.some(predicate =>\n predicate(req.path),\n );\n\n httpAuth\n .credentials(req, {\n allow: ['user', 'service'],\n allowLimitedAccess: allowsCookie,\n })\n .then(\n () => next(),\n err => next(err),\n );\n };\n\n const addAuthPolicy = (policy: HttpRouterServiceAuthPolicy) => {\n if (policy.allow === 'unauthenticated') {\n unauthenticatedPredicates.push(createPathPolicyPredicate(policy.path));\n } else if (policy.allow === 'user-cookie') {\n cookiePredicates.push(createPathPolicyPredicate(policy.path));\n } else {\n throw new Error('Invalid auth policy');\n }\n };\n\n return { middleware, addAuthPolicy };\n}\n"],"names":["pathToRegexp"],"mappings":";;;;AAwBO,SAAS,0BAA0B,UAAoB,EAAA;AAC5D,EAAI,IAAA,UAAA,KAAe,GAAO,IAAA,UAAA,KAAe,GAAK,EAAA;AAC5C,IAAA,OAAO,MAAM,IAAA;AAAA;AAGf,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAU,EAAA,GAAIA,0BAAa,UAAY,EAAA;AAAA,IACrD,GAAK,EAAA;AAAA,GACN,CAAA;AAED,EAAA,OAAO,CAAC,IAA0B,KAAA;AAChC,IAAO,OAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,GAC5B;AACF;AAEO,SAAS,yBAAyB,OAMvC,EAAA;AACA,EAAM,MAAA,EAAE,QAAU,EAAA,MAAA,EAAW,GAAA,OAAA;AAE7B,EAAA,MAAM,2BAA2B,MAAO,CAAA,kBAAA;AAAA,IACtC;AAAA,GACF;AAEA,EAAA,IAAI,wBAA0B,EAAA;AAC5B,IAAO,OAAA;AAAA,MACL,UAAY,EAAA,CAAC,IAAM,EAAA,IAAA,EAAM,SAAS,IAAK,EAAA;AAAA,MACvC,eAAe,MAAM;AAAA;AAAC,KACxB;AAAA;AAGF,EAAM,MAAA,yBAAA,GAA4B,IAAI,KAAiC,EAAA;AACvE,EAAM,MAAA,gBAAA,GAAmB,IAAI,KAAiC,EAAA;AAE9D,EAAA,MAAM,UAA6B,GAAA,CAAC,GAAK,EAAA,CAAA,EAAG,IAAS,KAAA;AACnD,IAAA,MAAM,wBAAwB,yBAA0B,CAAA,IAAA;AAAA,MAAK,CAAA,SAAA,KAC3D,SAAU,CAAA,GAAA,CAAI,IAAI;AAAA,KACpB;AAEA,IAAA,IAAI,qBAAuB,EAAA;AACzB,MAAK,IAAA,EAAA;AACL,MAAA;AAAA;AAGF,IAAA,MAAM,eAAe,gBAAiB,CAAA,IAAA;AAAA,MAAK,CAAA,SAAA,KACzC,SAAU,CAAA,GAAA,CAAI,IAAI;AAAA,KACpB;AAEA,IAAA,QAAA,CACG,YAAY,GAAK,EAAA;AAAA,MAChB,KAAA,EAAO,CAAC,MAAA,EAAQ,SAAS,CAAA;AAAA,MACzB,kBAAoB,EAAA;AAAA,KACrB,CACA,CAAA,IAAA;AAAA,MACC,MAAM,IAAK,EAAA;AAAA,MACX,CAAA,GAAA,KAAO,KAAK,GAAG;AAAA,KACjB;AAAA,GACJ;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,MAAwC,KAAA;AAC7D,IAAI,IAAA,MAAA,CAAO,UAAU,iBAAmB,EAAA;AACtC,MAAA,yBAAA,CAA0B,IAAK,CAAA,yBAAA,CAA0B,MAAO,CAAA,IAAI,CAAC,CAAA;AAAA,KACvE,MAAA,IAAW,MAAO,CAAA,KAAA,KAAU,aAAe,EAAA;AACzC,MAAA,gBAAA,CAAiB,IAAK,CAAA,yBAAA,CAA0B,MAAO,CAAA,IAAI,CAAC,CAAA;AAAA,KACvD,MAAA;AACL,MAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA;AAAA;AACvC,GACF;AAEA,EAAO,OAAA,EAAE,YAAY,aAAc,EAAA;AACrC;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createLifecycleMiddleware.cjs.js","sources":["../../../src/entrypoints/httpRouter/createLifecycleMiddleware.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 { LifecycleService } from '@backstage/backend-plugin-api';\nimport { ServiceUnavailableError } from '@backstage/errors';\nimport { HumanDuration, durationToMilliseconds } from '@backstage/types';\nimport { RequestHandler } from 'express';\n\nexport const DEFAULT_TIMEOUT = { seconds: 5 };\n\n/**\n * Options for {@link createLifecycleMiddleware}.\n * @internal\n */\nexport interface LifecycleMiddlewareOptions {\n lifecycle: LifecycleService;\n /**\n * The maximum time that paused requests will wait for the service to start, before returning an error.\n *\n * Defaults to 5 seconds.\n */\n startupRequestPauseTimeout?: HumanDuration;\n}\n\n/**\n * Creates a middleware that pauses requests until the service has started.\n *\n * @remarks\n *\n * Requests that arrive before the service has started will be paused until startup is complete.\n * If the service does not start within the provided timeout, the request will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * If the service is shutting down, all requests will be rejected with a\n * {@link @backstage/errors#ServiceUnavailableError}.\n *\n * @internal\n */\nexport function createLifecycleMiddleware(\n options: LifecycleMiddlewareOptions,\n): RequestHandler {\n const { lifecycle, startupRequestPauseTimeout = DEFAULT_TIMEOUT } = options;\n\n let state: 'init' | 'up' | 'down' = 'init';\n const waiting = new Set<{\n next: (err?: Error) => void;\n timeout: NodeJS.Timeout;\n }>();\n\n lifecycle.addStartupHook(async () => {\n if (state === 'init') {\n state = 'up';\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next();\n }\n waiting.clear();\n }\n });\n\n lifecycle.addShutdownHook(async () => {\n state = 'down';\n\n for (const item of waiting) {\n clearTimeout(item.timeout);\n item.next(new ServiceUnavailableError('Service is shutting down'));\n }\n waiting.clear();\n });\n\n const timeoutMs = durationToMilliseconds(startupRequestPauseTimeout);\n\n return (_req, _res, next) => {\n if (state === 'up') {\n next();\n return;\n } else if (state === 'down') {\n next(new ServiceUnavailableError('Service is shutting down'));\n return;\n }\n\n const item = {\n next,\n timeout: setTimeout(() => {\n if (waiting.delete(item)) {\n next(new ServiceUnavailableError('Service has not started up yet'));\n }\n }, timeoutMs),\n };\n\n waiting.add(item);\n };\n}\n"],"names":["ServiceUnavailableError","durationToMilliseconds"],"mappings":";;;;;AAqBa,MAAA,eAAA,GAAkB,EAAE,OAAA,EAAS,CAAE;AA8BrC,SAAS,0BACd,OACgB,EAAA;AAChB,EAAA,MAAM,EAAE,SAAA,EAAW,0BAA6B,GAAA,eAAA,EAAoB,GAAA,OAAA;AAEpE,EAAA,IAAI,KAAgC,GAAA,MAAA;AACpC,EAAM,MAAA,OAAA,uBAAc,GAGjB,EAAA;AAEH,EAAA,SAAA,CAAU,eAAe,YAAY;AACnC,IAAA,IAAI,UAAU,MAAQ,EAAA;AACpB,MAAQ,KAAA,GAAA,IAAA;AACR,MAAA,KAAA,MAAW,QAAQ,OAAS,EAAA;AAC1B,QAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AACzB,QAAA,IAAA,CAAK,IAAK,EAAA;AAAA;AAEZ,MAAA,OAAA,CAAQ,KAAM,EAAA;AAAA;AAChB,GACD,CAAA;AAED,EAAA,SAAA,CAAU,gBAAgB,YAAY;AACpC,IAAQ,KAAA,GAAA,MAAA;AAER,IAAA,KAAA,MAAW,QAAQ,OAAS,EAAA;AAC1B,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AACzB,MAAA,IAAA,CAAK,IAAK,CAAA,IAAIA,8BAAwB,CAAA,0BAA0B,CAAC,CAAA;AAAA;AAEnE,IAAA,OAAA,CAAQ,KAAM,EAAA;AAAA,GACf,CAAA;AAED,EAAM,MAAA,SAAA,GAAYC,6BAAuB,0BAA0B,CAAA;AAEnE,EAAO,OAAA,CAAC,IAAM,EAAA,IAAA,EAAM,IAAS,KAAA;AAC3B,IAAA,IAAI,UAAU,IAAM,EAAA;AAClB,MAAK,IAAA,EAAA;AACL,MAAA;AAAA,KACF,MAAA,IAAW,UAAU,MAAQ,EAAA;AAC3B,MAAK,IAAA,CAAA,IAAID,8BAAwB,CAAA,0BAA0B,CAAC,CAAA;AAC5D,MAAA;AAAA;AAGF,IAAA,MAAM,IAAO,GAAA;AAAA,MACX,IAAA;AAAA,MACA,OAAA,EAAS,WAAW,MAAM;AACxB,QAAI,IAAA,OAAA,CAAQ,MAAO,CAAA,IAAI,CAAG,EAAA;AACxB,UAAK,IAAA,CAAA,IAAIA,8BAAwB,CAAA,gCAAgC,CAAC,CAAA;AAAA;AACpE,SACC,SAAS;AAAA,KACd;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,GAClB;AACF;;;;;"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|