diff --git a/apps/rush-lib/package.json b/apps/rush-lib/package.json index 909746fe1d7..b6154dc49ff 100644 --- a/apps/rush-lib/package.json +++ b/apps/rush-lib/package.json @@ -18,7 +18,6 @@ }, "license": "MIT", "dependencies": { - "@aws-sdk/client-s3": "~3.3.0", "@azure/identity": "~1.2.0", "@azure/storage-blob": "~12.3.0", "@pnpm/link-bins": "~5.3.7", diff --git a/apps/rush-lib/src/api/BuildCacheConfiguration.ts b/apps/rush-lib/src/api/BuildCacheConfiguration.ts index 34835cb9c7b..e131595d88f 100644 --- a/apps/rush-lib/src/api/BuildCacheConfiguration.ts +++ b/apps/rush-lib/src/api/BuildCacheConfiguration.ts @@ -26,11 +26,11 @@ import type { AzureEnvironmentNames, AzureStorageBuildCacheProvider } from '../logic/buildCache/AzureStorageBuildCacheProvider'; -const AmazonS3BuildCacheProviderModule: typeof import('../logic/buildCache/AmazonS3BuildCacheProvider') = Import.lazy( - '../logic/buildCache/AmazonS3BuildCacheProvider', +const AmazonS3BuildCacheProviderModule: typeof import('../logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider') = Import.lazy( + '../logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider', require ); -import type { AmazonS3BuildCacheProvider } from '../logic/buildCache/AmazonS3BuildCacheProvider'; +import type { AmazonS3BuildCacheProvider } from '../logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider'; /** * Describes the file structure for the "common/config/rush/build-cache.json" config file. diff --git a/apps/rush-lib/src/logic/base/BaseInstallManager.ts b/apps/rush-lib/src/logic/base/BaseInstallManager.ts index 22f30da01d8..834431e0a5c 100644 --- a/apps/rush-lib/src/logic/base/BaseInstallManager.ts +++ b/apps/rush-lib/src/logic/base/BaseInstallManager.ts @@ -610,7 +610,7 @@ export abstract class BaseInstallManager { webClient.userAgent = `pnpm/? npm/? node/${process.version} ${os.platform()} ${os.arch()}`; webClient.accept = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'; - const response: WebClientResponse = await webClient.fetch(queryUrl); + const response: WebClientResponse = await webClient.fetchAsync(queryUrl); if (!response.ok) { throw new Error('Failed to query'); } @@ -634,7 +634,7 @@ export abstract class BaseInstallManager { // Make sure the tarball wasn't deleted from the CDN webClient.accept = '*/*'; - const response2: fetch.Response = await webClient.fetch(url); + const response2: fetch.Response = await webClient.fetchAsync(url); if (!response2.ok) { if (response2.status === 404) { diff --git a/apps/rush-lib/src/logic/buildCache/AmazonS3BuildCacheProvider.ts b/apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider.ts similarity index 60% rename from apps/rush-lib/src/logic/buildCache/AmazonS3BuildCacheProvider.ts rename to apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider.ts index fd487e667b1..48c977db54f 100644 --- a/apps/rush-lib/src/logic/buildCache/AmazonS3BuildCacheProvider.ts +++ b/apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3BuildCacheProvider.ts @@ -1,21 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. // See LICENSE in the project root for license information. -import { Readable } from 'stream'; import { Terminal } from '@rushstack/node-core-library'; -import { S3Client, GetObjectCommand, PutObjectCommand, GetObjectCommandOutput } from '@aws-sdk/client-s3'; -// import { defaultProvider as awsCredentialsProvider } from '@aws-sdk/credential-provider-node'; - -import { EnvironmentConfiguration, EnvironmentVariableNames } from '../../api/EnvironmentConfiguration'; -import { CloudBuildCacheProviderBase } from './CloudBuildCacheProviderBase'; -import { CredentialCache, ICredentialCacheEntry } from '../CredentialCache'; -import { RushConstants } from '../RushConstants'; -import { Utilities } from '../../utilities/Utilities'; - -interface IAmazonS3Credentials { - accessKeyId: string; - secretAccessKey: string; -} + +import { EnvironmentConfiguration, EnvironmentVariableNames } from '../../../api/EnvironmentConfiguration'; +import { CloudBuildCacheProviderBase } from '../CloudBuildCacheProviderBase'; +import { CredentialCache, ICredentialCacheEntry } from '../../CredentialCache'; +import { RushConstants } from '../../RushConstants'; +import { AmazonS3Client, IAmazonS3Credentials } from './AmazonS3Client'; export interface IAmazonS3BuildCacheProviderOptions { s3Bucket: string; @@ -25,8 +17,7 @@ export interface IAmazonS3BuildCacheProviderOptions { } export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { - private readonly _s3Bucket: string; - private readonly _s3Region: string; + private readonly _options: IAmazonS3BuildCacheProviderOptions; private readonly _s3Prefix: string | undefined; private readonly _environmentWriteCredential: string | undefined; private readonly _isCacheWriteAllowedByConfiguration: boolean; @@ -36,36 +27,19 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { return this._isCacheWriteAllowedByConfiguration || !!this._environmentWriteCredential; } - private __s3Client: S3Client | undefined; + private __s3Client: AmazonS3Client | undefined; public constructor(options: IAmazonS3BuildCacheProviderOptions) { super(); - this._s3Bucket = options.s3Bucket; - this._s3Region = options.s3Region; + this._options = options; this._s3Prefix = options.s3Prefix; this._environmentWriteCredential = EnvironmentConfiguration.buildCacheWriteCredential; this._isCacheWriteAllowedByConfiguration = options.isCacheWriteAllowed; } - private _deserializeCredentials(credentialString: string | undefined): IAmazonS3Credentials | undefined { - if (!credentialString) { - return undefined; - } - - const splitIndex: number = credentialString.indexOf(':'); - if (splitIndex === -1) { - throw new Error('Amazon S3 credential is in an unexpected format.'); - } - - return { - accessKeyId: credentialString.substring(0, splitIndex), - secretAccessKey: credentialString.substring(splitIndex + 1) - }; - } - private get _credentialCacheId(): string { if (!this.__credentialCacheId) { - const cacheIdParts: string[] = ['aws-s3', this._s3Region, this._s3Bucket]; + const cacheIdParts: string[] = ['aws-s3', this._options.s3Region, this._options.s3Bucket]; if (this._isCacheWriteAllowedByConfiguration) { cacheIdParts.push('cacheWriteAllowed'); @@ -77,9 +51,9 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { return this.__credentialCacheId; } - private async _getS3ClientAsync(): Promise { + private async _getS3ClientAsync(): Promise { if (!this.__s3Client) { - let credentials: IAmazonS3Credentials | undefined = this._deserializeCredentials( + let credentials: IAmazonS3Credentials | undefined = AmazonS3Client.tryDeserializeCredentials( this._environmentWriteCredential ); if (!credentials) { @@ -101,29 +75,19 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { `Update the credentials by running "rush ${RushConstants.updateCloudCredentialsCommandName}".` ); } else { - credentials = this._deserializeCredentials(cacheEntry?.credential); + credentials = AmazonS3Client.tryDeserializeCredentials(cacheEntry?.credential); } - } else { - // This logic was temporarily disabled to eliminate the dependency on @aws-sdk/credential-provider-node - // which caused this issue: - // - // "[rush] Broken peer dependency error when installing @microsoft/rush-lib" - // https://github.com/microsoft/rushstack/issues/2547 - - // try { - // credentials = await awsCredentialsProvider()(); - // } catch { + } else if (this._isCacheWriteAllowedByConfiguration) { throw new Error( "An Amazon S3 credential hasn't been provided, or has expired. " + `Update the credentials by running "rush ${RushConstants.updateCloudCredentialsCommandName}", ` + `or provide an : pair in the ` + `${EnvironmentVariableNames.RUSH_BUILD_CACHE_WRITE_CREDENTIAL} environment variable` ); - // } } } - this.__s3Client = new S3Client({ region: this._s3Region, credentials }); + this.__s3Client = new AmazonS3Client(credentials, this._options); } return this.__s3Client; @@ -134,24 +98,9 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { cacheId: string ): Promise { try { - const client: S3Client = await this._getS3ClientAsync(); - const fetchResult: GetObjectCommandOutput | undefined = await client.send( - new GetObjectCommand({ - Bucket: this._s3Bucket, - Key: this._s3Prefix ? `${this._s3Prefix}/${cacheId}` : cacheId - }) - ); - if (fetchResult === undefined) { - return undefined; - } - - return await Utilities.readStreamToBufferAsync(fetchResult.Body as Readable); + const client: AmazonS3Client = await this._getS3ClientAsync(); + return await client.getObjectAsync(this._s3Prefix ? `${this._s3Prefix}/${cacheId}` : cacheId); } catch (e) { - if (e.name === 'NoSuchKey') { - // No object was uploaded with that name/key - return undefined; - } - terminal.writeWarningLine(`Error getting cache entry from S3: ${e}`); return undefined; } @@ -160,7 +109,7 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { public async trySetCacheEntryBufferAsync( terminal: Terminal, cacheId: string, - entryStream: Buffer + objectBuffer: Buffer ): Promise { if (!this.isCacheWriteAllowed) { terminal.writeErrorLine('Writing to S3 cache is not allowed in the current configuration.'); @@ -168,14 +117,8 @@ export class AmazonS3BuildCacheProvider extends CloudBuildCacheProviderBase { } try { - const client: S3Client = await this._getS3ClientAsync(); - await client.send( - new PutObjectCommand({ - Bucket: this._s3Bucket, - Key: this._s3Prefix ? `${this._s3Prefix}/${cacheId}` : cacheId, - Body: entryStream - }) - ); + const client: AmazonS3Client = await this._getS3ClientAsync(); + await client.uploadObjectAsync(this._s3Prefix ? `${this._s3Prefix}/${cacheId}` : cacheId, objectBuffer); return true; } catch (e) { terminal.writeWarningLine(`Error uploading cache entry to S3: ${e}`); diff --git a/apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3Client.ts b/apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3Client.ts new file mode 100644 index 00000000000..275d80e472e --- /dev/null +++ b/apps/rush-lib/src/logic/buildCache/AmazonS3/AmazonS3Client.ts @@ -0,0 +1,252 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import * as crypto from 'crypto'; +import * as fetch from 'node-fetch'; + +import { IAmazonS3BuildCacheProviderOptions } from './AmazonS3BuildCacheProvider'; +import { IPutFetchOptions, IGetFetchOptions, WebClient } from '../../../utilities/WebClient'; + +const CONTENT_HASH_HEADER_NAME: 'x-amz-content-sha256' = 'x-amz-content-sha256'; +const DATE_HEADER_NAME: 'x-amz-date' = 'x-amz-date'; +const HOST_HEADER_NAME: 'host' = 'host'; + +export interface IAmazonS3Credentials { + accessKeyId: string; + secretAccessKey: string; +} + +interface IIsoDateString { + date: string; + dateTime: string; +} + +export class AmazonS3Client { + private readonly _credentials: IAmazonS3Credentials | undefined; + private readonly _s3Bucket: string; + private readonly _s3Region: string; + + private readonly _webClient: WebClient; + + public constructor( + credentials: IAmazonS3Credentials | undefined, + options: IAmazonS3BuildCacheProviderOptions + ) { + this._credentials = credentials; + + this._validateBucketName(options.s3Bucket); + + this._s3Bucket = options.s3Bucket; + this._s3Region = options.s3Region; + + this._webClient = new WebClient(); + } + + public static tryDeserializeCredentials( + credentialString: string | undefined + ): IAmazonS3Credentials | undefined { + if (!credentialString) { + return undefined; + } + + const splitIndex: number = credentialString.indexOf(':'); + if (splitIndex === -1) { + throw new Error('Amazon S3 credential is in an unexpected format.'); + } + + return { + accessKeyId: credentialString.substring(0, splitIndex), + secretAccessKey: credentialString.substring(splitIndex + 1) + }; + } + + public async getObjectAsync(objectName: string): Promise { + const response: fetch.Response = await this._makeRequestAsync('GET', objectName); + if (response.ok) { + return await response.buffer(); + } else if (response.status === 404) { + return undefined; + } else if (response.status === 403 && !this._credentials) { + return undefined; + } else { + this._throwS3Error(response); + } + } + + public async uploadObjectAsync(objectName: string, objectBuffer: Buffer): Promise { + if (!this._credentials) { + throw new Error('Credentials are required to upload objects to S3.'); + } + + const response: fetch.Response = await this._makeRequestAsync('PUT', objectName, objectBuffer); + if (!response.ok) { + this._throwS3Error(response); + } + } + + private async _makeRequestAsync( + verb: 'GET' | 'PUT', + objectName: string, + body?: Buffer + ): Promise { + const isoDateString: IIsoDateString = this._getIsoDateString(); + const bodyHash: string = this._getSha256(body); + const host: string = `${this._s3Bucket}.s3.amazonaws.com`; + + const headers: fetch.Headers = new fetch.Headers(); + headers.set(DATE_HEADER_NAME, isoDateString.dateTime); + headers.set(CONTENT_HASH_HEADER_NAME, bodyHash); + + if (this._credentials) { + // Compute the authorization header. See https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html + const signedHeaderNames: string = `${HOST_HEADER_NAME};${CONTENT_HASH_HEADER_NAME};${DATE_HEADER_NAME}`; + // The canonical request looks like this: + // GET + // /test.txt + // + // host:examplebucket.s3.amazonaws.com + // range:bytes=0-9 + // x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + // x-amz-date:20130524T000000Z + // + // host;range;x-amz-content-sha256;x-amz-date + // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + const canonicalRequest: string = [ + verb, + `/${objectName}`, + '', // we don't use query strings for these requests + `${HOST_HEADER_NAME}:${host}`, + `${CONTENT_HASH_HEADER_NAME}:${bodyHash}`, + `${DATE_HEADER_NAME}:${isoDateString.dateTime}`, + '', + signedHeaderNames, + bodyHash + ].join('\n'); + const canonicalRequestHash: string = this._getSha256(canonicalRequest); + + const scope: string = `${isoDateString.date}/${this._s3Region}/s3/aws4_request`; + // The string to sign looks like this: + // AWS4-HMAC-SHA256 + // 20130524T423589Z + // 20130524/us-east-1/s3/aws4_request + // 7344ae5b7ee6c3e7e6b0fe0640412a37625d1fbfff95c48bbb2dc43964946972 + const stringToSign: string = [ + 'AWS4-HMAC-SHA256', + isoDateString.dateTime, + scope, + canonicalRequestHash + ].join('\n'); + + const dateKey: Buffer = this._getSha256Hmac( + `AWS4${this._credentials.secretAccessKey}`, + isoDateString.date + ); + const dateRegionKey: Buffer = this._getSha256Hmac(dateKey, this._s3Region); + const dateRegionServiceKey: Buffer = this._getSha256Hmac(dateRegionKey, 's3'); + const signingKey: Buffer = this._getSha256Hmac(dateRegionServiceKey, 'aws4_request'); + const signature: string = this._getSha256Hmac(signingKey, stringToSign, 'hex'); + + const authorizationHeader: string = `AWS4-HMAC-SHA256 Credential=${this._credentials.accessKeyId}/${scope},SignedHeaders=${signedHeaderNames},Signature=${signature}`; + + headers.set('Authorization', authorizationHeader); + } + + const webFetchOptions: IGetFetchOptions | IPutFetchOptions = { + verb, + headers + }; + if (verb === 'PUT') { + (webFetchOptions as IPutFetchOptions).body = body; + } + + const response: fetch.Response = await this._webClient.fetchAsync( + `https://${host}/${objectName}`, + webFetchOptions + ); + + return response; + } + + public _getSha256Hmac(key: string | Buffer, data: string): Buffer; + public _getSha256Hmac(key: string | Buffer, data: string, encoding: 'hex'): string; + public _getSha256Hmac(key: string | Buffer, data: string, encoding?: 'hex'): Buffer | string { + const hash: crypto.Hash = crypto.createHmac('sha256', key); + hash.update(data); + if (encoding) { + return hash.digest(encoding); + } else { + return hash.digest(); + } + } + + private _getSha256(data?: string | Buffer): string { + if (data) { + const hash: crypto.Hash = crypto.createHash('sha256'); + hash.update(data); + return hash.digest('hex'); + } else { + // This is the null SHA256 hash + return 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'; + } + } + + private _getIsoDateString(date: Date = new Date()): IIsoDateString { + let dateString: string = date.toISOString(); + dateString = dateString.replace(/[-:]/g, ''); // Remove separator characters + dateString = dateString.substring(0, 15); // Drop milliseconds + + // dateTime is an ISO8601 date. It looks like "20130524T423589" + // date is an ISO date. It looks like "20130524" + return { + dateTime: `${dateString}Z`, + date: dateString.substring(0, 8) + }; + } + + private _throwS3Error(response: fetch.Response): never { + throw new Error(`Amazon S3 responded with status code ${response.status} (${response.statusText})`); + } + + /** + * Validates a S3 bucket name. + * {@link https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-s3-bucket-naming-requirements.html} + */ + private _validateBucketName(s3BucketName: string): void { + if (!s3BucketName) { + throw new Error('A S3 bucket name must be provided'); + } + + if (!s3BucketName.match(/^[a-z\d-.]{3,63}$/)) { + throw new Error( + `The bucket name "${s3BucketName}" is invalid. A S3 bucket name must only contain lowercase ` + + 'alphanumerical characters, dashes, and periods and must be between 3 and 63 characters long.' + ); + } + + if (!s3BucketName.match(/^[a-z\d]/)) { + throw new Error( + `The bucket name "${s3BucketName}" is invalid. A S3 bucket name must start with a lowercase ` + + 'alphanumerical character.' + ); + } + + if (s3BucketName.match(/-$/)) { + throw new Error( + `The bucket name "${s3BucketName}" is invalid. A S3 bucket name must not end in a dash.` + ); + } + + if (s3BucketName.match(/(\.\.)|(\.-)|(-\.)/)) { + throw new Error( + `The bucket name "${s3BucketName}" is invalid. A S3 bucket name must not have consecutive periods or ` + + 'dashes adjacent to periods.' + ); + } + + if (s3BucketName.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) { + throw new Error( + `The bucket name "${s3BucketName}" is invalid. A S3 bucket name must not be formatted as an IP address.` + ); + } + } +} diff --git a/apps/rush-lib/src/logic/buildCache/test/AmazonS3BuildCacheProvider.test.ts b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3BuildCacheProvider.test.ts similarity index 93% rename from apps/rush-lib/src/logic/buildCache/test/AmazonS3BuildCacheProvider.test.ts rename to apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3BuildCacheProvider.test.ts index 88c440a1be7..97eb4ea0fb8 100644 --- a/apps/rush-lib/src/logic/buildCache/test/AmazonS3BuildCacheProvider.test.ts +++ b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3BuildCacheProvider.test.ts @@ -1,11 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. // See LICENSE in the project root for license information. -import { EnvironmentConfiguration } from '../../../api/EnvironmentConfiguration'; -import { AmazonS3BuildCacheProvider } from '../AmazonS3BuildCacheProvider'; import { StringBufferTerminalProvider, Terminal } from '@rushstack/node-core-library'; -import { RushUserConfiguration } from '../../../api/RushUserConfiguration'; -import { CredentialCache } from '../../CredentialCache'; + +import { EnvironmentConfiguration } from '../../../../api/EnvironmentConfiguration'; +import { AmazonS3BuildCacheProvider } from '../AmazonS3BuildCacheProvider'; +import { RushUserConfiguration } from '../../../../api/RushUserConfiguration'; +import { CredentialCache } from '../../../CredentialCache'; describe('AmazonS3BuildCacheProvider', () => { let buildCacheWriteCredentialEnvValue: string | undefined; diff --git a/apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3Client.test.ts b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3Client.test.ts new file mode 100644 index 00000000000..3ba01f7e90a --- /dev/null +++ b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/AmazonS3Client.test.ts @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import { IAmazonS3BuildCacheProviderOptions } from '../AmazonS3BuildCacheProvider'; +import { AmazonS3Client } from '../AmazonS3Client'; + +const DUMMY_OPTIONS: Omit = { + s3Region: 'us-east-1', + isCacheWriteAllowed: true +}; + +describe('AmazonS3Client', () => { + it('Rejects invalid S3 bucket names', () => { + expect( + () => new AmazonS3Client(undefined, { s3Bucket: undefined!, ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: '-abc', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'a!bc', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'a', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: '10.10.10.10', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'abc..d', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'abc.-d', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'abc-.d', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + + expect( + () => new AmazonS3Client(undefined, { s3Bucket: 'abc-', ...DUMMY_OPTIONS }) + ).toThrowErrorMatchingSnapshot(); + }); + + it('Accepts valid S3 bucket names', () => { + expect(() => new AmazonS3Client(undefined, { s3Bucket: 'abc123', ...DUMMY_OPTIONS })).not.toThrow(); + + expect(() => new AmazonS3Client(undefined, { s3Bucket: 'abc', ...DUMMY_OPTIONS })).not.toThrow(); + + expect(() => new AmazonS3Client(undefined, { s3Bucket: 'foo-bar-baz', ...DUMMY_OPTIONS })).not.toThrow(); + + expect(() => new AmazonS3Client(undefined, { s3Bucket: 'foo.bar.baz', ...DUMMY_OPTIONS })).not.toThrow(); + }); + + it('Does not allow upload without credentials', async () => { + const client: AmazonS3Client = new AmazonS3Client(undefined, { + s3Bucket: 'foo.bar.baz', + ...DUMMY_OPTIONS + }); + try { + await client.uploadObjectAsync('temp', undefined!); + fail('Expected an exception to be thrown'); + } catch (e) { + expect(e).toMatchSnapshot(); + } + }); +}); diff --git a/apps/rush-lib/src/logic/buildCache/test/__snapshots__/AmazonS3BuildCacheProvider.test.ts.snap b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/__snapshots__/AmazonS3BuildCacheProvider.test.ts.snap similarity index 100% rename from apps/rush-lib/src/logic/buildCache/test/__snapshots__/AmazonS3BuildCacheProvider.test.ts.snap rename to apps/rush-lib/src/logic/buildCache/AmazonS3/test/__snapshots__/AmazonS3BuildCacheProvider.test.ts.snap diff --git a/apps/rush-lib/src/logic/buildCache/AmazonS3/test/__snapshots__/AmazonS3Client.test.ts.snap b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/__snapshots__/AmazonS3Client.test.ts.snap new file mode 100644 index 00000000000..1744ac182e7 --- /dev/null +++ b/apps/rush-lib/src/logic/buildCache/AmazonS3/test/__snapshots__/AmazonS3Client.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`AmazonS3Client Does not allow upload without credentials 1`] = `[Error: Credentials are required to upload objects to S3.]`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 1`] = `"A S3 bucket name must be provided"`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 2`] = `"The bucket name \\"-abc\\" is invalid. A S3 bucket name must start with a lowercase alphanumerical character."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 3`] = `"The bucket name \\"a!bc\\" is invalid. A S3 bucket name must only contain lowercase alphanumerical characters, dashes, and periods and must be between 3 and 63 characters long."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 4`] = `"The bucket name \\"a\\" is invalid. A S3 bucket name must only contain lowercase alphanumerical characters, dashes, and periods and must be between 3 and 63 characters long."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 5`] = `"The bucket name \\"10.10.10.10\\" is invalid. A S3 bucket name must not be formatted as an IP address."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 6`] = `"The bucket name \\"abc..d\\" is invalid. A S3 bucket name must not have consecutive periods or dashes adjacent to periods."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 7`] = `"The bucket name \\"abc.-d\\" is invalid. A S3 bucket name must not have consecutive periods or dashes adjacent to periods."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 8`] = `"The bucket name \\"abc-.d\\" is invalid. A S3 bucket name must not have consecutive periods or dashes adjacent to periods."`; + +exports[`AmazonS3Client Rejects invalid S3 bucket names 9`] = `"The bucket name \\"abc-\\" is invalid. A S3 bucket name must not end in a dash."`; diff --git a/apps/rush-lib/src/logic/setup/SetupPackageRegistry.ts b/apps/rush-lib/src/logic/setup/SetupPackageRegistry.ts index af1f3f5354f..16d102d269e 100644 --- a/apps/rush-lib/src/logic/setup/SetupPackageRegistry.ts +++ b/apps/rush-lib/src/logic/setup/SetupPackageRegistry.ts @@ -297,7 +297,7 @@ export class SetupPackageRegistry { let response: WebClientResponse; try { - response = await webClient.fetch(queryUrl); + response = await webClient.fetchAsync(queryUrl); } catch (e) { console.log(e.toString()); return; diff --git a/apps/rush-lib/src/utilities/WebClient.ts b/apps/rush-lib/src/utilities/WebClient.ts index 5449abde39f..db1338872b3 100644 --- a/apps/rush-lib/src/utilities/WebClient.ts +++ b/apps/rush-lib/src/utilities/WebClient.ts @@ -8,10 +8,21 @@ const createHttpsProxyAgent: typeof import('https-proxy-agent') = Import.lazy('h export type WebClientResponse = fetch.Response; -export interface IWebFetchOptions { +export interface IWebFetchOptionsBase { + timeoutMs?: number; + verb?: 'GET' | 'PUT'; headers?: fetch.Headers; } +export interface IGetFetchOptions extends IWebFetchOptionsBase { + verb: 'GET' | never; +} + +export interface IPutFetchOptions extends IWebFetchOptionsBase { + verb: 'PUT'; + body?: Buffer; +} + export enum WebClientProxy { None, Detect, @@ -41,16 +52,15 @@ export class WebClient { ); } - public async fetch(url: string, options?: IWebFetchOptions): Promise { - if (!options) { - options = {}; - } - + public async fetchAsync( + url: string, + options?: IGetFetchOptions | IPutFetchOptions + ): Promise { const headers: fetch.Headers = new fetch.Headers(); WebClient.mergeHeaders(headers, this.standardHeaders); - if (options.headers) { + if (options?.headers) { WebClient.mergeHeaders(headers, options.headers); } @@ -85,10 +95,18 @@ export class WebClient { agent = createHttpsProxyAgent(proxyUrl); } - return await fetch.default(url, { + const timeoutMs: number = options?.timeoutMs !== undefined ? options.timeoutMs : 15 * 1000; // 15 seconds + const requestInit: fetch.RequestInit = { + method: options?.verb, headers: headers, agent: agent, - timeout: 15 * 1000 // 15 seconds - }); + timeout: timeoutMs + }; + const putOptions: IPutFetchOptions | undefined = options as IPutFetchOptions | undefined; + if (putOptions?.body) { + requestInit.body = putOptions.body; + } + + return await fetch.default(url, requestInit); } } diff --git a/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-16-05-08.json b/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-16-05-08.json new file mode 100644 index 00000000000..f7964550518 --- /dev/null +++ b/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-16-05-08.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@microsoft/rush", + "comment": "Replace the AWS dependencies with use of the Amazon S3 REST API.", + "type": "none" + } + ], + "packageName": "@microsoft/rush", + "email": "iclanton@users.noreply.github.com" +} \ No newline at end of file diff --git a/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-17-00-43.json b/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-17-00-43.json new file mode 100644 index 00000000000..5876e2c376b --- /dev/null +++ b/common/changes/@microsoft/rush/ianc-s3-rest_2021-03-17-00-43.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@microsoft/rush", + "comment": "Add support for anonymous read from an Amazon S3-hosted cache.", + "type": "none" + } + ], + "packageName": "@microsoft/rush", + "email": "iclanton@users.noreply.github.com" +} \ No newline at end of file diff --git a/common/config/rush/nonbrowser-approved-packages.json b/common/config/rush/nonbrowser-approved-packages.json index cd91716f85b..bdba6789b26 100644 --- a/common/config/rush/nonbrowser-approved-packages.json +++ b/common/config/rush/nonbrowser-approved-packages.json @@ -2,22 +2,6 @@ { "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/approved-packages.schema.json", "packages": [ - { - "name": "@aws-sdk/client-s3", - "allowedCategories": ["libraries"] - }, - { - "name": "@aws-sdk/credential-provider-node", - "allowedCategories": ["libraries"] - }, - { - "name": "@aws-sdk/node-http-handler", - "allowedCategories": ["libraries"] - }, - { - "name": "@aws-sdk/types", - "allowedCategories": ["libraries"] - }, { "name": "@azure/identity", "allowedCategories": ["libraries"] diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 9c9f57365c4..1596816c93d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -227,8 +227,6 @@ importers: semver: ~7.3.0 ../../apps/rush-lib: dependencies: - '@aws-sdk/client-s3': 3.3.0 - '@aws-sdk/credential-provider-node': 3.4.1 '@azure/identity': 1.2.3 '@azure/storage-blob': 12.3.0 '@pnpm/link-bins': 5.3.22 @@ -292,8 +290,6 @@ importers: jest: 25.4.0 typescript: 4.1.5 specifiers: - '@aws-sdk/client-s3': ~3.3.0 - '@aws-sdk/credential-provider-node': ~3.4.1 '@azure/identity': ~1.2.0 '@azure/storage-blob': ~12.3.0 '@pnpm/link-bins': ~5.3.7 @@ -2419,770 +2415,6 @@ importers: lodash: ~4.17.15 lockfileVersion: 5.2 packages: - /@aws-crypto/crc32/1.0.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-wr4EyCv3ZfLH3Sg7FErV6e/cLhpk9rUP/l5322y8PRgpQsItdieaLbtE4aDOR+dxl8U7BG9FIwWXH4TleTDZ9A== - /@aws-crypto/ie11-detection/1.0.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA== - /@aws-crypto/sha256-browser/1.1.0: - dependencies: - '@aws-crypto/ie11-detection': 1.0.0 - '@aws-crypto/sha256-js': 1.1.0 - '@aws-crypto/supports-web-crypto': 1.0.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-locate-window': 3.6.1 - '@aws-sdk/util-utf8-browser': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg== - /@aws-crypto/sha256-js/1.1.0: - dependencies: - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-utf8-browser': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA== - /@aws-crypto/supports-web-crypto/1.0.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g== - /@aws-sdk/abort-controller/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-hOsgg1fxdle9Fo4aqYCHBnrMoJEwk+sjEZUtl/dwcD4a6wW3Ono9bIC0R8QEJbOQoLqQ5X+JFiQIB2+dIIokNg== - /@aws-sdk/chunked-blob-reader-native/3.1.0: - dependencies: - '@aws-sdk/util-base64-browser': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-ghBtZkhUWgy51/651l/GUR/qhdqjFR3GSCsz0B7qisrXc8ZNsd7OlXfnTfYNoySxD3XKpbcxsncytH4Hkxgi4A== - /@aws-sdk/chunked-blob-reader/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-/2fxbKwta8ZiSj59B8F3FyVRszo1/VOhpCeL16gmRRNV73rM3IqJD+xOaDdkc/sFYyBeWn/UhwgD98kxae9XsQ== - /@aws-sdk/client-s3/3.3.0: - dependencies: - '@aws-crypto/sha256-browser': 1.1.0 - '@aws-crypto/sha256-js': 1.1.0 - '@aws-sdk/config-resolver': 3.3.0 - '@aws-sdk/credential-provider-node': 3.3.0 - '@aws-sdk/eventstream-serde-browser': 3.3.0 - '@aws-sdk/eventstream-serde-config-resolver': 3.3.0 - '@aws-sdk/eventstream-serde-node': 3.3.0 - '@aws-sdk/fetch-http-handler': 3.3.0 - '@aws-sdk/hash-blob-browser': 3.3.0 - '@aws-sdk/hash-node': 3.3.0 - '@aws-sdk/hash-stream-node': 3.3.0 - '@aws-sdk/invalid-dependency': 3.3.0 - '@aws-sdk/md5-js': 3.3.0 - '@aws-sdk/middleware-apply-body-checksum': 3.3.0 - '@aws-sdk/middleware-bucket-endpoint': 3.3.0 - '@aws-sdk/middleware-content-length': 3.3.0 - '@aws-sdk/middleware-expect-continue': 3.3.0 - '@aws-sdk/middleware-host-header': 3.3.0 - '@aws-sdk/middleware-location-constraint': 3.3.0 - '@aws-sdk/middleware-logger': 3.3.0 - '@aws-sdk/middleware-retry': 3.3.0 - '@aws-sdk/middleware-sdk-s3': 3.3.0 - '@aws-sdk/middleware-serde': 3.3.0 - '@aws-sdk/middleware-signing': 3.3.0 - '@aws-sdk/middleware-ssec': 3.3.0 - '@aws-sdk/middleware-stack': 3.1.0 - '@aws-sdk/middleware-user-agent': 3.3.0 - '@aws-sdk/node-config-provider': 3.3.0 - '@aws-sdk/node-http-handler': 3.3.0 - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/smithy-client': 3.3.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/url-parser': 3.3.0 - '@aws-sdk/url-parser-native': 3.3.0 - '@aws-sdk/util-base64-browser': 3.1.0 - '@aws-sdk/util-base64-node': 3.1.0 - '@aws-sdk/util-body-length-browser': 3.1.0 - '@aws-sdk/util-body-length-node': 3.1.0 - '@aws-sdk/util-user-agent-browser': 3.3.0 - '@aws-sdk/util-user-agent-node': 3.3.0 - '@aws-sdk/util-utf8-browser': 3.1.0 - '@aws-sdk/util-utf8-node': 3.1.0 - '@aws-sdk/util-waiter': 3.3.0 - '@aws-sdk/xml-builder': 3.1.0 - fast-xml-parser: 3.18.0 - tslib: 2.1.0 - dev: false - engines: - node: '>=10.0.0' - resolution: - integrity: sha512-beUL3kDEVY/aE8xPuXn5NFto9PaRO5oxLMKzcCj46P+L4wt9Tm8F6EEsr3XZT31r7YzBbu2TuhSqg4erUZQGEQ== - /@aws-sdk/config-resolver/3.3.0: - dependencies: - '@aws-sdk/signature-v4': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-d/1NjyzGl8/GyeTnhxTY1ewLBdOR9qGHcWIGukYsWllnyW/G5IwPuG0uGGCKZpBkvHcGZhZZMEfHuiEqdrLm9g== - /@aws-sdk/credential-provider-env/3.3.0: - dependencies: - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-kyqZMlGdH/05IhuXLBUXtj5+hhRfYiHFcJLc3ts/uiwCixswVHPAYHgyWm9ajFkmWtpz6ih+0LoYryhPbYu01A== - /@aws-sdk/credential-provider-env/3.4.1: - dependencies: - '@aws-sdk/property-provider': 3.4.1 - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-MwQRbsgq+skGinT/zP0fCxFrgOLXca64Z7H04gpDwLY1gCaqpWLR30r8zYkoNUZM/S72s3bec5DXxJd18BFpGA== - /@aws-sdk/credential-provider-imds/3.3.0: - dependencies: - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-Cx0YMnO/ScGQVDns006bLbqOxNURGN2Xm21bCY0l0ZUJCdJ2va1/9q1rljDyw2KvdzZNQVRQII3uUgj/Oq/K+g== - /@aws-sdk/credential-provider-imds/3.4.1: - dependencies: - '@aws-sdk/property-provider': 3.4.1 - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-UfwixtJCjMXodKoQW9NygdIPWrpginZQdjAyaDaRaLZ48ahcj3U0J+mrqs8qTilubO4cl+Oj0DORdfnyR2iIcA== - /@aws-sdk/credential-provider-ini/3.3.0: - dependencies: - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/shared-ini-file-loader': 3.1.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-zawNFJoasXiaV5n0H3/KNOi7mAZ7mHpG1+nBEkoWhZ31lIUM9+heGPcxKCbf/pMQjiOebUqL1OpWe4uSWxIVMw== - /@aws-sdk/credential-provider-ini/3.4.1: - dependencies: - '@aws-sdk/property-provider': 3.4.1 - '@aws-sdk/shared-ini-file-loader': 3.4.1 - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-q/2cGi+F4/NnAqX6T9O2RPQLxgKTC05Fs2HT+xtg5BHNKmrl6YCkm5Xi3VBdoZ+gcyaTqyXEvnyotZvg7pXWnQ== - /@aws-sdk/credential-provider-node/3.3.0: - dependencies: - '@aws-sdk/credential-provider-env': 3.3.0 - '@aws-sdk/credential-provider-imds': 3.3.0 - '@aws-sdk/credential-provider-ini': 3.3.0 - '@aws-sdk/credential-provider-process': 3.3.0 - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>=10.0.0' - resolution: - integrity: sha512-PPBNzPq8fHk9dEQTTE4iJi6ZWtmo057Lc+I8Rlzmvz6NthK9iKiU819tfaxVBb6ZR7bLP0BuDiCi4G1lD+rQnQ== - /@aws-sdk/credential-provider-node/3.4.1: - dependencies: - '@aws-sdk/credential-provider-env': 3.4.1 - '@aws-sdk/credential-provider-imds': 3.4.1 - '@aws-sdk/credential-provider-ini': 3.4.1 - '@aws-sdk/credential-provider-process': 3.4.1 - '@aws-sdk/property-provider': 3.4.1 - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>=10.0.0' - resolution: - integrity: sha512-8qRIpyuKxAjH4LNcAt4hpMPCsaiIMFzlJHyq+xXo303KYWZ79lpkKL1jumKlhnoJreCdGy1X/hJAlgiZinPYag== - /@aws-sdk/credential-provider-process/3.3.0: - dependencies: - '@aws-sdk/credential-provider-ini': 3.3.0 - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/shared-ini-file-loader': 3.1.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-7oOF1j6ydUq43P3SsasiIpbxMKCmT0C+XwggHTGiVxNtX+QZiH1vdMf8otA7puLEey0iY5wTAIEcZhC6HenojA== - /@aws-sdk/credential-provider-process/3.4.1: - dependencies: - '@aws-sdk/credential-provider-ini': 3.4.1 - '@aws-sdk/property-provider': 3.4.1 - '@aws-sdk/shared-ini-file-loader': 3.4.1 - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-BfRjSUSkxSTcbyUV4+fNIjVnq+ht2tc9E7j8+q6q8f5Ny4RgsIIjA+wMPZQUsm3TL/hyJl9sPkzEyk1y58iwqA== - /@aws-sdk/eventstream-marshaller/3.3.0: - dependencies: - '@aws-crypto/crc32': 1.0.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-hex-encoding': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-4xDaQP4EJXBsfmLA65NbgEBSVkqXVs6EkyWJ+hRWj7a/V6gYhlVShOBpleG62Yo4y064zropoDltRbr98cYBog== - /@aws-sdk/eventstream-serde-browser/3.3.0: - dependencies: - '@aws-sdk/eventstream-marshaller': 3.3.0 - '@aws-sdk/eventstream-serde-universal': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-P7ropKNwAEaGhtjacFnHO2dnwZfnYqfe0nESQUwKCZ8BFZAEAIadh3i86QgBcAx9//Ib91x6h4biPsSiDV0poQ== - /@aws-sdk/eventstream-serde-config-resolver/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-C8DFaFRqA+cA4Jo8v75ZCZX5pCAwxL1DG7qINH40SZzEbDOUsFjEfFJnM0EWOcUx/apZ7/BVcEcyNLnSvC7NhQ== - /@aws-sdk/eventstream-serde-node/3.3.0: - dependencies: - '@aws-sdk/eventstream-marshaller': 3.3.0 - '@aws-sdk/eventstream-serde-universal': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-OOTQRVuxP6RWmGLuGBs3jN4zfut5eJXu5Nobb1uyKDsUAzMBVQc4ZKz0KP/CJobP/23n/RTGTu7SC9FXALyusg== - /@aws-sdk/eventstream-serde-universal/3.3.0: - dependencies: - '@aws-sdk/eventstream-marshaller': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-J6fqSM7g7Y2kzGrVAnpq4Zs47MNWVdaGeXuumfUaOILpqWR6h4sHp6EwS7L+QnFlUxyR8ZR7HWA/TKBr28iv4Q== - /@aws-sdk/fetch-http-handler/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/querystring-builder': 3.3.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-base64-browser': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-V1XwKOc2WzPuBwg70yEjr3P1bJPgD7yoRBdNn7cqte5LNWl3OVI5+DeLm+ztCvMsj4Y87klqhyrtQkxaxwdkGw== - /@aws-sdk/hash-blob-browser/3.3.0: - dependencies: - '@aws-sdk/chunked-blob-reader': 3.1.0 - '@aws-sdk/chunked-blob-reader-native': 3.1.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-LHgSuJNcIj9R4NCFOGcrMTMpkV3jNJw5psRAUeukr4cJkD7eKJ8odmvsbj+b7VmQuM0osDHWx8v+CzH/+FbJ3w== - /@aws-sdk/hash-node/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-buffer-from': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-sKrcmKoBqwhGmc7M0zae/YO06ueqh0uktZriQO+JpdIpG9MAiduqr9z3VR8IDhkCsznQqf6xRU5fdiaL6bcy9A== - /@aws-sdk/hash-stream-node/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-AQf76JY+UdS69zwjd3QKLdQDM1A1h3rmcvENjC8ar6zz7jH1XmuY5/T5Ii81u5xLaz0Ztswsu0cn9YCAkaueIg== - /@aws-sdk/invalid-dependency/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-gYPEnnMft3bT1/v4xLjvqU4Os+mVqAhg5FCQGmnk2keWuaTX3SVKDr5XEt4mg7WuP81/ldunvlgAF2RdULGn1Q== - /@aws-sdk/is-array-buffer/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-wE6Am+/FKuINc/aypXiBiLAatlSyxYQ9wGGQHf2iYOX5d5bHLOVKPoRwcqSCaiaR32aRcS7R+IhgxeBy+ajsMQ== - /@aws-sdk/md5-js/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-utf8-browser': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-zfYUnkMPQnBZtJLKUE1YbEBM5a0Ra5KaPUhoA+ghcSVsxhuxBa+PHvMg5RxQtHz0kHKvzBu18DWkEhs76rg9gw== - /@aws-sdk/middleware-apply-body-checksum/3.3.0: - dependencies: - '@aws-sdk/is-array-buffer': 3.1.0 - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-XHcyDZHZ19ZhR1VNiAyJk+xjngOP6oUtWsy/Gh42Zwrb9jIwG9R4wZ2E610yIh8pGiNmlPMtackUfrwszBHPjg== - /@aws-sdk/middleware-bucket-endpoint/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-arn-parser': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-CIl0cZDNPVRSLcUtguW/edrTO+IAEX/8pu2W5CyWw/oT2h7oDUAWRi1ZuAoMGBCeK46JaWplEGtYVM2SvBBSOA== - /@aws-sdk/middleware-content-length/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-QSNTYBs8uGEtAxG9/97Jjfw1jI9Dyk8HUILX1pwDaZ9X+a0O/cdotqHbvwE1sylAlZl+clm2TDoKeLnaOHWRhg== - /@aws-sdk/middleware-expect-continue/3.3.0: - dependencies: - '@aws-sdk/middleware-header-default': 3.3.0 - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-5kCIObFXSrmgzb97ClTLSiBXrX7iRNxlussU+SKHXvTY97KLQCEzriz8r9tJ470brs0wPWaE42bUxp0lOrzSfA== - /@aws-sdk/middleware-header-default/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-m7Fg4nJ2W+i1K5AQxCD0tJxaH3xRkqqoHTWP8lR9KIsN7j4cbUynRW5BYxS/OjcAKEQkoyIfHjZEEMVm/J45Ww== - /@aws-sdk/middleware-host-header/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-3rt5mfo0HFmKBcHQOsBLi0snVWnnbhqu0wuZmralffQLOZ7xl8p2213hwIGHt24aefjMFG+907cwoact1vEulg== - /@aws-sdk/middleware-location-constraint/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-sWtokFgtnI/IyQGTiivlSpkL8tN8aF7V5e01xhprq9yIt1Dvqv1Xwn79T1fqvF9EbOvkOKxiLTbFxgPY8VaaYg== - /@aws-sdk/middleware-logger/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-ySRUXK2UcGto73JDxeNjne/e7NvEoUtETS+U3+euD4DDUr+Bh9LRim7XxjkPciSE3VINVxZEP2C92XLYAQHcCA== - /@aws-sdk/middleware-retry/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/service-error-classification': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - uuid: 3.4.0 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-62XOdoCS9+ZEUfccMkGVXHENsaMnIJ+IjQEwp6i79CVz8v387yVZRCb/cpATHILb2eLz+HsSiQvWiK3vZbTeDw== - /@aws-sdk/middleware-sdk-s3/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-arn-parser': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-Nt3ht9rk1rNRROKOQDtZQC9WgEllbGCnMe/CqKk3ZGAxl7Wqdx2/iePR5z5zzjL379u452GqmAfo7LVgLGXeLQ== - /@aws-sdk/middleware-serde/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-BLXJSj1erTlId6rj7I8YVGfJv82mDc2n52REYiR5Bnb7ob7ZBUlt5QFfLXC3HgCGIHT8ks7Kh7liTaIGXu1MVg== - /@aws-sdk/middleware-signing/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/signature-v4': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-6SdBgzibJLtOrBI8ANIVunsO2mPj2bNmaAGutLU5AOg313uaZWVZWhRkBvmk6KryH3B74EueOgI2+M2FWd6Ruw== - /@aws-sdk/middleware-ssec/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-o2r/Ewfa/Okv8p9cI7sVbtMSsP6hGy0xJ01Ezq60mw14Nz1igtfoTrq8LMEWtAXcpW3WoU7JXujb+Ler3c6S4A== - /@aws-sdk/middleware-stack/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-lin0C0xPspT/orPMWWHMYG/7Z128NsSj6Khs4G6TH+2rIixXxQtHLen8H2dSPNIYXnLaxvtUDl5VuqjRt+s2Ow== - /@aws-sdk/middleware-user-agent/3.3.0: - dependencies: - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-7kH0kpjcgtaxDnR5cdCHnOtsg35fMU8dnqcciTUUNIO619P4GFUROom0IpWMTDHeee4uGDTbJJ8j+dZL06/1bA== - /@aws-sdk/node-config-provider/3.3.0: - dependencies: - '@aws-sdk/property-provider': 3.3.0 - '@aws-sdk/shared-ini-file-loader': 3.1.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-5zxRyXu8oQuTOMFNPbeDsbR9Dm9XyZGAvK4WFmMm9XGfD04H9kllYVluGNo7fpV59DRsd+n8ft6g2kXm2PaMRg== - /@aws-sdk/node-http-handler/3.3.0: - dependencies: - '@aws-sdk/abort-controller': 3.3.0 - '@aws-sdk/protocol-http': 3.3.0 - '@aws-sdk/querystring-builder': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-24oLdrLfKPV8BtszIjxzc+SxBVrUDv7p8WmTHd9IdBWCU3BATcsJpAF6piRJ7o/VzJwvjHrk41Fum6iBNAXsLQ== - /@aws-sdk/property-provider/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-JTyjtXVNhFczL9IfgwXD55F6DqXL50PhfZxFW92t5dDj5VtWpOL74BbuxHQxHBgnQv1FKLr6N9cr7gfXWexDug== - /@aws-sdk/property-provider/3.4.1: - dependencies: - '@aws-sdk/types': 3.4.1 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-MAh+7ZmFKXWOrlhtvOnMOU9Xe/fHnLG5b7UduV/yduXQ2X+CqKJlBKX2ZuUNP7/7r46E89pasNzr80G0JWcv/A== - /@aws-sdk/protocol-http/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-fAQ0iN489Sg3bHgVt1oRqPke3oEtWTPk/7LjVtx58+C5LdO4ynnERanB6YRG4NE+eeta92Ea/d+rmggfS/WQ2g== - /@aws-sdk/querystring-builder/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-uri-escape': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-2cTxRX3/p/GXNbyIPt3+Jn2TA4tI8dUpwLB5va1/W4YJ7baNoyKCZGFbGh9N3bsdl6x9MBk+wg8qemoXjNkr6g== - /@aws-sdk/querystring-parser/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-2tJ8Vj6mJNDrDx0tMXgE7GpwRhsrmXlUD4KI2m33BKzgB6vPl+iKappD/FSFheINpScVWP1oCV2+XgBLuZ25eQ== - /@aws-sdk/service-error-classification/3.3.0: - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-5sVE9AhvwTrlz3vm50oaVOFFjY5WGt2TOyqcV290l6TifHbJwxd5+sDq5e9wVowCiYaKB5KiRLHIn1F2pIhDTw== - /@aws-sdk/shared-ini-file-loader/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-5MxZ/CnSaWvecwtLWmcskMe41zBnAkckQRl+xKygl8wLD/q0goWcmMkA4Sx9fyFnGQtGN/+nNvu0dlG2Arxmvw== - /@aws-sdk/shared-ini-file-loader/3.4.1: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-8FDYkJH0pQjfUWIugQz7fhWYmb5f5oo34jch6Wcsg4MrX2v0Ffw2/rpov/f+3l1U5g9d0T+rlFWxg1ZB6JM6hQ== - /@aws-sdk/signature-v4/3.3.0: - dependencies: - '@aws-sdk/is-array-buffer': 3.1.0 - '@aws-sdk/types': 3.1.0 - '@aws-sdk/util-hex-encoding': 3.1.0 - '@aws-sdk/util-uri-escape': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-l12hSwBam5Leghj4DsgJp28cDu4IFwCGSNJrNndt3CffN5RpCgayuVBnQpHtOnO01Eu728/zA3z4DKu9xXhn9Q== - /@aws-sdk/smithy-client/3.3.0: - dependencies: - '@aws-sdk/middleware-stack': 3.1.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-8cwSvHLlvPlQww1TnK9eu/vL7u4kWYM6C8N9mU+ug3SwvuqwIDTCYV8n6Gf+0gvu7m/J0PrIAKk32gnYPI1u6Q== - /@aws-sdk/types/3.1.0: - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-4Az7cemXCN4Qp8EheNkZTJJqIG0dvCT2KAreJLoclcVTcEFw2rzlATUnSeia1YTRsVd6aNxD001Ug7f3vYcQkw== - /@aws-sdk/types/3.4.1: - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-HqDPRdMzseVD4I/8Bb8TBAzg2X0U7oDiPfvYcvZt8fpVO2SwBOiLMh9tiEnRin48uRBbQMAw8D8wmCpyU78Dvg== - /@aws-sdk/url-parser-native/3.3.0: - dependencies: - '@aws-sdk/querystring-parser': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - url: 0.11.0 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-vdAjz9NKpJkJyyFhAw0BtsZBGtWuPiorVKJver1DK5R7Ckk9zS4Wz+bY33KKqffFApyepFdu289TdMShSCOQPw== - /@aws-sdk/url-parser/3.3.0: - dependencies: - '@aws-sdk/querystring-parser': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-HkzZJHOlvpedNxt67NQMF1cbo53bvw9rAUuOaLyw6eBZKYD/qYsUwoUwCMnnpOw7AnRKx6N7oYyYR/sAkciTXw== - /@aws-sdk/util-arn-parser/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-xXL/nadq5mqEw6Mrv1ghoODuyWWsAxvr+rRNgDJOav6mypgEOiLb0ybkqinrH1ogTkAYbegs+uaWxgSPBe9ZSA== - /@aws-sdk/util-base64-browser/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-xkodj0VnkHl1gdYI9Nl4E2Ed+atM3xBTNaedoGnmqoyosMjPRJCpU8uFBmdiF4e+GGPsXlYe9oA/hLyJFxmeSQ== - /@aws-sdk/util-base64-node/3.1.0: - dependencies: - '@aws-sdk/util-buffer-from': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-FEtnINw2MeD3LAtyGcofah5D8j6OjpmwNKibr7mIgosRO++iVyXe2xa6iOoptZFn5pIU0C4fkJn5o+kjBhRafA== - /@aws-sdk/util-body-length-browser/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-vzKDD/p1gcA05jeLmn6+6HdOY4G6Axyp6dj1R1nVeFpPPx6KkFsNGL9/CoaRT2TGv1fHBoDXsve9JRaCxrER4Q== - /@aws-sdk/util-body-length-node/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-MfJoU2wFWkOmbjWDepq5bDGYZlpvtBi2Vs8ZeTcm/4+q+3L9tJ/Zb/Ofx5oeRg9VhCsAjvceQTdX+CAyP8byXA== - /@aws-sdk/util-buffer-from/3.1.0: - dependencies: - '@aws-sdk/is-array-buffer': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-UeC4VKmWYgTXjNdLVHfurrdhznnoxWLUFx8xspyRd58BhSZ5vc5HiiKTPX/CGxzAP/qZG668PaoOJucwmEam4g== - /@aws-sdk/util-hex-encoding/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-MPOsUY3USCUBaqZ3ifgE9il/liVxEKsz6dYQ08pdtWRzZx2CT7kWslQeNAT565pMvktnvdLjfzBw2FwnSI6nqg== - /@aws-sdk/util-locate-window/3.6.1: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-xXJmtCNa1Sku2JkCx0RHRyXmTMBAraup6L14a5vgLrV2TNL89HRy2iybbe/6LqG8hg9QC3HFtr3QsXQXrsBI8Q== - /@aws-sdk/util-uri-escape/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-1ZcXVJpsA6uW3tDTQI+Rpawqh76fyHpFc55ST8VGyMgmCzlJzBpYG0ck1kqVRSUP7YyvkJQvHfcm+U6doL5Xkw== - /@aws-sdk/util-user-agent-browser/3.3.0: - dependencies: - '@aws-sdk/types': 3.1.0 - bowser: 2.11.0 - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-IXl5CStrW9gxZjENIkHHcnskeTKY1rFg0HVkNesjgdxX+Ly8RfpQ5VK1yXn84gz9mQbnDPXTyfh/NHt3uUpKfQ== - /@aws-sdk/util-user-agent-node/3.3.0: - dependencies: - '@aws-sdk/node-config-provider': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-EVGCqLWu4mmtqmdorW8aKA0Kc9pbAYgIMhmXN5vH277qQJGwx2TC5yuNeufoLWdk5rIb+MdXLi1CqmtyHd7mYw== - /@aws-sdk/util-utf8-browser/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - resolution: - integrity: sha512-vJP20me+Wc1RJHq+Y+gFD25aWhbQte+Qkyh3SOKQ+YvNaMcaeVwOV7b3Y3ItBuMdutHLJWmbJ2wF6dhhpy1kOA== - /@aws-sdk/util-utf8-node/3.1.0: - dependencies: - '@aws-sdk/util-buffer-from': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-lrBLkROMh9kTjHOguusqLvTX5+5O5CVpAGeISZlW6CCx2pMHtVRyE9cdNuRI8aJpyZsU12j8SoaKDUPGD+ixzw== - /@aws-sdk/util-waiter/3.3.0: - dependencies: - '@aws-sdk/abort-controller': 3.3.0 - '@aws-sdk/types': 3.1.0 - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-2oehLAHXws1tCFXQff7s/v0LExnFQVII4EXCJNyWDRWFA1uge4GtmyoJ6C8svyMI9y6vaACj997+le3z2uAgIA== - /@aws-sdk/xml-builder/3.1.0: - dependencies: - tslib: 1.14.1 - dev: false - engines: - node: '>= 10.0.0' - resolution: - integrity: sha512-F6liCbWPMbnJq8d0qgzuXwG5O7jg1hhgiG71TTn83rnc6vFzyw2o0C+ztiqSZsbAq7r2PlEfBPWVD32gTFIXXw== /@azure/abort-controller/1.0.2: dependencies: tslib: 2.1.0 @@ -5569,10 +4801,6 @@ packages: /boolbase/1.0.0: resolution: integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24= - /bowser/2.11.0: - dev: false - resolution: - integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== /brace-expansion/1.1.11: dependencies: balanced-match: 1.0.0 @@ -6921,11 +6149,11 @@ packages: /entities/2.2.0: resolution: integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - /env-paths/2.2.0: + /env-paths/2.2.1: engines: node: '>=6' resolution: - integrity: sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== /errno/0.1.8: dependencies: prr: 1.0.1 @@ -7521,11 +6749,6 @@ packages: /fast-levenshtein/2.0.6: resolution: integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - /fast-xml-parser/3.18.0: - dev: false - hasBin: true - resolution: - integrity: sha512-tRrwShhppv0K5GKEtuVs92W0VGDaVltZAwtHbpjNF+JOT7cjIFySBGTEOmdBslXYyWYaZwEX/g4Su8ZeKg0LKQ== /fastparse/1.1.2: resolution: integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== @@ -10815,7 +10038,7 @@ packages: integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== /node-gyp/7.1.2: dependencies: - env-paths: 2.2.0 + env-paths: 2.2.1 glob: 7.1.6 graceful-fs: 4.2.6 nopt: 5.0.0 diff --git a/common/config/rush/pnpmfile.js b/common/config/rush/pnpmfile.js index 585bd9ccfb5..65f7295b542 100644 --- a/common/config/rush/pnpmfile.js +++ b/common/config/rush/pnpmfile.js @@ -36,9 +36,5 @@ function readPackage(packageJson, context) { packageJson.dependencies['ajv'] = '~6.12.5'; } - if (packageJson.name === '@aws-sdk/middleware-retry') { - delete packageJson.dependencies['react-native-get-random-values']; - } - return packageJson; } diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 678fc874e27..7784597fa32 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "a4cc4cc604144523d906e4fb88968f454bd4dd82", + "pnpmShrinkwrapHash": "33032d34ac194c762c36f3665faba0f374ad3c7a", "preferredVersionsHash": "2519e88d149a9cb84227de92c71a8d8063bdcfd4" }