From 6bfe44430684c7e0dff1253dfcb37fb38de0ffe2 Mon Sep 17 00:00:00 2001 From: Michal Kimle Date: Fri, 17 Feb 2023 12:56:52 +0100 Subject: [PATCH 1/3] Update AWS SDK for airnode-node --- packages/airnode-node/package.json | 4 +- .../src/adapters/http/worker.test.ts | 86 +- packages/airnode-node/src/evm/workers.test.ts | 86 +- .../src/workers/cloud-platforms/aws.test.ts | 96 +- .../src/workers/cloud-platforms/aws.ts | 94 +- yarn.lock | 958 +++++++++++++++++- 6 files changed, 1119 insertions(+), 205 deletions(-) diff --git a/packages/airnode-node/package.json b/packages/airnode-node/package.json index d0d94bc1f2..49c177c61e 100644 --- a/packages/airnode-node/package.json +++ b/packages/airnode-node/package.json @@ -31,7 +31,7 @@ "@api3/airnode-validator": "^0.10.0", "@api3/ois": "2.0.0", "@api3/promise-utils": "^0.3.0", - "aws-sdk": "^2.1333.0", + "@aws-sdk/client-lambda": "^3.272.0", "date-fns": "^2.29.3", "dotenv": "^16.0.3", "ethers": "^5.7.2", @@ -48,6 +48,8 @@ "@types/lodash": "^4.14.191", "@types/node": "^18.15.0", "@types/yargs": "^17.0.22", + "aws-sdk-client-mock": "^2.0.1", + "aws-sdk-client-mock-jest": "^2.0.1", "copyfiles": "^2.4.1", "jest": "^29.5.0", "rimraf": "^4.4.0", diff --git a/packages/airnode-node/src/adapters/http/worker.test.ts b/packages/airnode-node/src/adapters/http/worker.test.ts index 1139423264..aae8295352 100644 --- a/packages/airnode-node/src/adapters/http/worker.test.ts +++ b/packages/airnode-node/src/adapters/http/worker.test.ts @@ -1,13 +1,12 @@ -const invokeMock = jest.fn(); -jest.mock('aws-sdk', () => ({ - Lambda: jest.fn().mockImplementation(() => ({ - invoke: invokeMock, - })), -})); - +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; import { logger, LogOptions, setLogOptions } from '@api3/airnode-utilities'; import * as worker from './worker'; import * as fixtures from '../../../test/fixtures'; +import { encodeUtf8 } from '../../workers/cloud-platforms/aws'; + +const mockLambdaClient = mockClient(LambdaClient); describe('spawnNewApiCall', () => { const logOptions: LogOptions = { @@ -17,30 +16,33 @@ describe('spawnNewApiCall', () => { }; setLogOptions(logOptions); + const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall(); + const mockInvokeCommandInput = { + FunctionName: 'airnode-local02cce763-run', + Payload: encodeUtf8(JSON.stringify({ aggregatedApiCall, logOptions, functionName: 'callApi' })), + }; + + beforeEach(() => { + mockLambdaClient.reset(); + }); + it('handles remote AWS calls', async () => { - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: true, data: { value: '0x123' } }) }) }) - ); - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall(); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).resolves({ + Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: true, data: { value: '0x123' } }) })), + }); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); const [logs, res] = await worker.spawnNewApiCall(aggregatedApiCall, workerOpts); expect(logs).toEqual([]); expect(res).toEqual({ value: '0x123' }); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ aggregatedApiCall, logOptions, functionName: 'callApi' }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the worker rejects', async () => { - invokeMock.mockImplementationOnce((_params, callback) => callback(new Error('Something went wrong'), null)); - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall(); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).rejects(new Error('Something went wrong')); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); @@ -49,42 +51,29 @@ describe('spawnNewApiCall', () => { { level: 'ERROR', message: 'Unable to call API endpoint:convertToUSD', error: new Error('Something went wrong') }, ]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ aggregatedApiCall, logOptions, functionName: 'callApi' }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the response has an error log', async () => { const errorLog = logger.pend('ERROR', 'Something went wrong'); - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: false, errorLog }) }) }) - ); - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall(); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).resolves({ + Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: false, errorLog }) })), + }); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); const [logs, res] = await worker.spawnNewApiCall(aggregatedApiCall, workerOpts); expect(logs).toEqual([errorLog]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ aggregatedApiCall, logOptions, functionName: 'callApi' }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the response is not ok', async () => { - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: false }) }) }) - ); + mockLambdaClient + .on(InvokeCommand, mockInvokeCommandInput) + .resolves({ Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: false }) })) }); + const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall(); const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, @@ -92,13 +81,6 @@ describe('spawnNewApiCall', () => { const [logs, res] = await worker.spawnNewApiCall(aggregatedApiCall, workerOpts); expect(logs).toEqual([{ level: 'ERROR', message: 'Unable to call API endpoint:convertToUSD' }]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ aggregatedApiCall, logOptions, functionName: 'callApi' }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); }); diff --git a/packages/airnode-node/src/evm/workers.test.ts b/packages/airnode-node/src/evm/workers.test.ts index 7027648bd0..af605fdd18 100644 --- a/packages/airnode-node/src/evm/workers.test.ts +++ b/packages/airnode-node/src/evm/workers.test.ts @@ -1,13 +1,12 @@ -const invokeMock = jest.fn(); -jest.mock('aws-sdk', () => ({ - Lambda: jest.fn().mockImplementation(() => ({ - invoke: invokeMock, - })), -})); - +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; import { logger } from '@api3/airnode-utilities'; import * as worker from './workers'; import * as fixtures from '../../test/fixtures'; +import { encodeUtf8 } from '../workers/cloud-platforms/aws'; + +const mockLambdaClient = mockClient(LambdaClient); const workers = ['spawnNewProvider', 'spawnProviderRequestProcessor'] as ReadonlyArray; @@ -24,31 +23,33 @@ const providerErrorForWorker = { workers.forEach((workerType) => { describe(`${workerType} worker`, () => { fixtures.setEnvVariables({ AIRNODE_WALLET_PRIVATE_KEY: fixtures.getAirnodeWalletPrivateKey() }); + const state = fixtures.buildEVMProviderSponsorState(); + const mockInvokeCommandInput = { + FunctionName: serverlessFunctionName, + Payload: encodeUtf8(JSON.stringify({ state, functionName: functionNames[workerType] })), + }; + + beforeEach(() => { + mockLambdaClient.reset(); + }); it('handles remote AWS calls', async () => { - const state = fixtures.buildEVMProviderSponsorState(); - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: true, data: state }) }) }) - ); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).resolves({ + Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: true, data: state }) })), + }); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); const [logs, res] = await worker[workerType](state, workerOpts); expect(logs).toEqual([]); expect(res).toEqual(state); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: serverlessFunctionName, - Payload: JSON.stringify({ state, functionName: functionNames[workerType] }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the worker rejects', async () => { - const state = fixtures.buildEVMProviderSponsorState(); - invokeMock.mockImplementationOnce((_params, callback) => callback(new Error('Something went wrong'), null)); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).rejects(new Error('Something went wrong')); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); @@ -61,57 +62,36 @@ workers.forEach((workerType) => { }, ]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: serverlessFunctionName, - Payload: JSON.stringify({ state, functionName: functionNames[workerType] }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the response has an error log', async () => { - const state = fixtures.buildEVMProviderSponsorState(); const errorLog = logger.pend('ERROR', 'Something went wrong'); - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: false, errorLog }) }) }) - ); + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).resolves({ + Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: false, errorLog }) })), + }); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); const [logs, res] = await worker[workerType](state, workerOpts); expect(logs).toEqual([errorLog]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: serverlessFunctionName, - Payload: JSON.stringify({ state, functionName: functionNames[workerType] }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('returns an error if the response is not ok', async () => { - const state = fixtures.buildEVMProviderSponsorState(); - invokeMock.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ ok: false }) }) }) - ); + mockLambdaClient + .on(InvokeCommand, mockInvokeCommandInput) + .resolves({ Payload: encodeUtf8(JSON.stringify({ body: JSON.stringify({ ok: false }) })) }); + const workerOpts = fixtures.buildWorkerOptions({ cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, }); const [logs, res] = await worker[workerType](state, workerOpts); expect(logs).toEqual([{ level: 'ERROR', message: providerErrorForWorker[workerType] }]); expect(res).toEqual(null); - expect(invokeMock).toHaveBeenCalledTimes(1); - expect(invokeMock).toHaveBeenCalledWith( - { - FunctionName: serverlessFunctionName, - Payload: JSON.stringify({ state, functionName: functionNames[workerType] }), - }, - expect.anything() - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); }); }); diff --git a/packages/airnode-node/src/workers/cloud-platforms/aws.test.ts b/packages/airnode-node/src/workers/cloud-platforms/aws.test.ts index caddcad7cf..070f26b8da 100644 --- a/packages/airnode-node/src/workers/cloud-platforms/aws.test.ts +++ b/packages/airnode-node/src/workers/cloud-platforms/aws.test.ts @@ -1,66 +1,62 @@ -const invokeMock = jest.fn(); -jest.mock('aws-sdk', () => ({ - Lambda: jest.fn().mockImplementation(() => ({ - invoke: invokeMock, - })), -})); - -import AWS from 'aws-sdk'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; import * as aws from './aws'; import * as fixtures from '../../../test/fixtures'; import { WorkerParameters } from '../../types'; +const mockLambdaClient = mockClient(LambdaClient); + +const encodingTestString = 'test string'; +const encodingTestByteArray = new Uint8Array([116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 103]); + +describe('encodeUtf8', () => { + it('converts input string into a byte stream with UTF-8 encoding', () => { + expect(aws.encodeUtf8(encodingTestString)).toEqual(encodingTestByteArray); + }); +}); + +describe('decodeUtf8', () => { + it('converts a byte stream with UTF-8 encoding into a string', () => { + expect(aws.decodeUtf8(encodingTestByteArray)).toEqual(encodingTestString); + }); +}); + describe('spawn', () => { fixtures.setEnvVariables({ AIRNODE_WALLET_PRIVATE_KEY: fixtures.getAirnodeWalletPrivateKey() }); + const state = fixtures.buildEVMProviderState(); + const workerOpts = fixtures.buildWorkerOptions({ + cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, + }); + const logOptions = fixtures.buildLogOptions(); + const parameters: WorkerParameters = { + ...workerOpts, + payload: { functionName: 'initializeProvider', state, logOptions }, + }; + const mockInvokeCommandInput = { + FunctionName: 'airnode-local02cce763-run', + Payload: aws.encodeUtf8(JSON.stringify({ functionName: 'initializeProvider', state, logOptions })), + }; + + beforeEach(() => { + mockLambdaClient.reset(); + }); + it('derives the function name, invokes and returns the response', async () => { - const lambda = new AWS.Lambda(); - const invoke = lambda.invoke as jest.Mock; - invoke.mockImplementationOnce((_params, callback) => - callback(null, { Payload: JSON.stringify({ body: JSON.stringify({ value: 7777 }) }) }) - ); - const state = fixtures.buildEVMProviderState(); - const workerOpts = fixtures.buildWorkerOptions({ - cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, - }); - const logOptions = fixtures.buildLogOptions(); - const parameters: WorkerParameters = { - ...workerOpts, - payload: { functionName: 'initializeProvider', state, logOptions }, - }; + mockLambdaClient + .on(InvokeCommand, mockInvokeCommandInput) + .resolves({ Payload: aws.encodeUtf8(JSON.stringify({ body: JSON.stringify({ value: 7777 }) })) }); + const res = await aws.spawn(parameters); expect(res).toEqual({ value: 7777 }); - expect(invoke).toHaveBeenCalledTimes(1); - expect(invoke).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ functionName: 'initializeProvider', state, logOptions }), - }, - expect.any(Function) - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); it('throws an error if the lambda returns an error', async () => { - const lambda = new AWS.Lambda(); - const invoke = lambda.invoke as jest.Mock; - invoke.mockImplementationOnce((_params, callback) => callback(new Error('Something went wrong'), null)); - const state = fixtures.buildEVMProviderState(); - const workerOpts = fixtures.buildWorkerOptions({ - cloudProvider: { type: 'aws', region: 'us-east-1', disableConcurrencyReservations: false }, - }); - const logOptions = fixtures.buildLogOptions(); - const parameters: WorkerParameters = { - ...workerOpts, - payload: { functionName: 'initializeProvider', state, logOptions }, - }; + mockLambdaClient.on(InvokeCommand, mockInvokeCommandInput).rejects(new Error('Something went wrong')); + await expect(aws.spawn(parameters)).rejects.toThrow(new Error('Something went wrong')); - expect(invoke).toHaveBeenCalledTimes(1); - expect(invoke).toHaveBeenCalledWith( - { - FunctionName: 'airnode-local02cce763-run', - Payload: JSON.stringify({ functionName: 'initializeProvider', state, logOptions }), - }, - expect.any(Function) - ); + expect(mockLambdaClient).toHaveReceivedCommandWith(InvokeCommand, mockInvokeCommandInput); }); }); diff --git a/packages/airnode-node/src/workers/cloud-platforms/aws.ts b/packages/airnode-node/src/workers/cloud-platforms/aws.ts index 00d7150338..8303ef0b4c 100644 --- a/packages/airnode-node/src/workers/cloud-platforms/aws.ts +++ b/packages/airnode-node/src/workers/cloud-platforms/aws.ts @@ -1,49 +1,53 @@ import { logger } from '@api3/airnode-utilities'; -import { goSync } from '@api3/promise-utils'; -import AWS from 'aws-sdk'; +import { go } from '@api3/promise-utils'; +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; import { WorkerParameters, WorkerResponse } from '../../types'; -export function spawn(params: WorkerParameters): Promise { - // lambda.invoke is synchronous so we need to wrap this in a promise - return new Promise((spawnResolve, spawnReject) => { - // Uses the current region by default - const lambda = new AWS.Lambda(); - - // AWS doesn't allow uppercase letters in lambda function names - const resolvedName = `airnode-${params.deploymentId}-run`; - - const options = { - FunctionName: resolvedName, - Payload: JSON.stringify(params.payload), - }; - - const resolve: typeof spawnResolve = (value) => { - logger.debug(`Successful Lambda response: ${value}`); - spawnResolve(value); - }; - - const reject: typeof spawnReject = (error) => { - logger.debug(`Lambda invocation or execution failed. Response: ${error}`); - spawnReject(error); - }; - - // The Lambda invocation callback populates the error (first argument) only when the invocation fails (e.g. status - // code is 400) or the request is not parsed properly by the SDK and can't be invoked. For errors and timeouts that - // happen inside the invoked lambda have "data.FunctionError" and "data.Payload.errorMessage" populated instead. - // See: https://stackoverflow.com/q/42672023 and https://stackoverflow.com/q/48644093 - lambda.invoke(options, (err, data) => { - if (err) return reject(err); - - if (data.FunctionError) return reject(data.Payload); - - if (!data.Payload) return reject(new Error('Missing payload in lambda response')); - const goPayload = goSync(() => JSON.parse(data.Payload!.toString())); - if (!goPayload.success) return reject(goPayload.error); - - const goBody = goSync(() => JSON.parse(goPayload.data.body)); - if (!goBody.success) return reject(goBody.error); - - resolve(goBody.data as WorkerResponse); - }); - }); +export function encodeUtf8(input: string): Uint8Array { + return new TextEncoder().encode(input); +} + +export function decodeUtf8(input: Uint8Array): string { + return new TextDecoder('utf-8').decode(input); +} + +export async function spawn(params: WorkerParameters): Promise { + // Uses the current region by default + const awsLambdaClient = new LambdaClient({}); + const resolvedName = `airnode-${params.deploymentId}-run`; + + const options = { + FunctionName: resolvedName, + Payload: encodeUtf8(JSON.stringify(params.payload)), + }; + + // The Lambda invocation callback populates the error (first argument) only when the invocation fails (e.g. status + // code is 400) or the request is not parsed properly by the SDK and can't be invoked. For errors and timeouts that + // happen inside the invoked lambda have "data.FunctionError" and "data.Payload.errorMessage" populated instead. + // See: https://stackoverflow.com/q/42672023 and https://stackoverflow.com/q/48644093 + const invokeCommand = new InvokeCommand(options); + const goInvoke = await go(() => awsLambdaClient.send(invokeCommand)); + if (!goInvoke.success) { + logger.debug(`Lambda invocation or execution failed. ${goInvoke.error}}`); + throw goInvoke.error; + } + const invokeOutput = goInvoke.data; + + if (invokeOutput.FunctionError) { + logger.debug(`Lambda invocation or execution failed. Response: ${invokeOutput.Payload}`); + throw invokeOutput.Payload; + } + + if (!invokeOutput.Payload) { + const error = new Error('Missing payload in lambda response'); + logger.debug(`Lambda invocation or execution failed. ${error}`); + throw error; + } + + const payloadString = decodeUtf8(invokeOutput.Payload); + const payload = JSON.parse(payloadString); + const body = JSON.parse(payload.body); + + logger.debug(`Successful Lambda response: ${JSON.stringify(body)}`); + return body as WorkerResponse; } diff --git a/yarn.lock b/yarn.lock index 35c2b4daf0..4e24b30dab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,720 @@ resolved "https://registry.yarnpkg.com/@api3/promise-utils/-/promise-utils-0.3.0.tgz#e7ebf92bfd8c1d39983321fc5445070c51fce176" integrity sha512-fH3CzEcsCQjoX6BZ5M+3yRIXZ2zz4/nFdzKUB4wvn3KjvvzvroHFZrzhbKa4mB9E4AS0xnou1AXhlrnN5Fcy+A== +"@aws-crypto/ie11-detection@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/abort-controller@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz#c2d244e9d422583a786dfb75485316cb1d4793ce" + integrity sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/client-lambda@^3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.272.0.tgz#9c39f45a9e1fa690ee1600033275faba97591dd2" + integrity sha512-AQ9tgj/CxLgeknHJTh+nnfER2bwTYGZhJQSc77CFNVsqcO6VC9smKFopxyRNy91Ck769HyJwfU8Q1sxMNUryhw== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.272.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso-oidc@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz#32ec5d4bd4d1f343d642a5846dae6e1864cc890c" + integrity sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/client-sso@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz#6dedf03e5c1d31ef745e72091868082b10c0bca5" + integrity sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/client-sts@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz#a63993d53ca7243f8dadc715b539afdcfa482abf" + integrity sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-sdk-sts" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + fast-xml-parser "4.0.11" + tslib "^2.3.1" + +"@aws-sdk/config-resolver@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz#207af3c70b05c4d93c60fa60201c93dff78802ba" + integrity sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw== + dependencies: + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-env@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz#c647799806d2cf491b9b0d8d32682393caf74e20" + integrity sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-imds@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz#8e740961c2e1f9b93a467e8d5e836e359e18592c" + integrity sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ== + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-ini@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz#86fe4faf38507fada22cbe6f422ebad8777e0172" + integrity sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw== + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.272.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz#953f73468f87510f1dcd0480f6f17139b4b3c0bf" + integrity sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w== + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-ini" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.272.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-process@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz#bd0c859554e705c085f0e2ad5dad7e1e43c967ad" + integrity sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-sso@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz#bd24f9b06088aed91c5d6aaddf3f7e7ab818afd7" + integrity sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ== + dependencies: + "@aws-sdk/client-sso" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/token-providers" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/credential-provider-web-identity@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz#2a1d8f73654c2d50bf27c6355a550bc389d6057e" + integrity sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/fetch-http-handler@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz#52ec2ba4ea25738a91db466a617bd7cc2bd6d2e9" + integrity sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/hash-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz#a39d80fd118ad306f17191f0565ea4db88aa0563" + integrity sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-buffer-from" "3.208.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/invalid-dependency@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz#93b34dc0f78d0c44a4beae6dc75dde4801915f1c" + integrity sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/is-array-buffer@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz#06e557adc284fac2f26071c2944ae01f61b95854" + integrity sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-content-length@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz#400532904c505d3478ddf5c8fe1d703692ea87e8" + integrity sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-endpoint@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz#3d10dff07eeb6239b39b2e2762b11d97f19e4a56" + integrity sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg== + dependencies: + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-host-header@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz#c47b8d35be6d5fbc548378b4694bf705adaae74d" + integrity sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-logger@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz#372e2514b17b826a2b40562667e2543125980705" + integrity sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-recursion-detection@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz#1e6ddc66a11fa2bfd2a59607d2ac5603be6d1072" + integrity sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-retry@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz#a38adcb9eb478246de3f3398bb8fd0a7682462eb" + integrity sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/service-error-classification" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + tslib "^2.3.1" + uuid "^8.3.2" + +"@aws-sdk/middleware-sdk-sts@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz#aa437331f958e3af3b4bec7951256d0f34a8d431" + integrity sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q== + dependencies: + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-serde@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz#9cb23aaa93fbf404fdb8e01b514b36b2d6fb5bc8" + integrity sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-signing@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz#ce632b547d5a091b4bda9d65cb4745445ab5d237" + integrity sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-stack@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz#e62048e47b8ce2ff71d6d32234b6c0be70b0b008" + integrity sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/middleware-user-agent@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz#ea49970c9dbbe4e8fce21763e2ff0d7acab057c2" + integrity sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/node-config-provider@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz#7797a8f500593b1a7b91fc70bcd7a7245afd9a61" + integrity sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/node-http-handler@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz#732c7010310da292d4a6c30f915078e1792d029e" + integrity sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA== + dependencies: + "@aws-sdk/abort-controller" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/property-provider@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz#a626604303acfe83c1a1471f99872dee5641c1a4" + integrity sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/protocol-http@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz#11090fed5d1e20f9f8e97b479e1d6fb2247686f6" + integrity sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-builder@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz#788ca037e21942bb039c920c5dfa4d412b84ea27" + integrity sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/querystring-parser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz#68db5798d10a353c35f62bf34cfcebaa53580e51" + integrity sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/service-error-classification@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz#cf19b82c2ab1e63bb03793c68e6a2b2e7cbd8382" + integrity sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w== + +"@aws-sdk/shared-ini-file-loader@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz#f924ec6e7c183ec749d42e204d8f0d0b7c58fa25" + integrity sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/signature-v4@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz#751895d68c1d1122f1e9a0148146dbdf9db023ae" + integrity sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/smithy-client@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz#cb6fe3d3ec95e10463c8ff6f1c59c55196bd19c1" + integrity sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q== + dependencies: + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/token-providers@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz#9a6a0347a8417be4cd1930eac37ca1fb3e9da5b4" + integrity sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A== + dependencies: + "@aws-sdk/client-sso-oidc" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/types@3.272.0", "@aws-sdk/types@^3.222.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.272.0.tgz#83670e4009c2e72f1fdf55816c55c9f8b5935e0a" + integrity sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/url-parser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz#1a21abb8815ccc2c1344a3dfab0343f4e3eff4d3" + integrity sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ== + dependencies: + "@aws-sdk/querystring-parser" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-base64@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz#36b430e5396251f761590f7c2f0c5c12193f353c" + integrity sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/util-body-length-browser@3.188.0": + version "3.188.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz#e1d949318c10a621b38575a9ef01e39f9857ddb0" + integrity sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-body-length-node@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz#baabd1fa1206ff2bd4ce3785122d86eb3258dd20" + integrity sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-buffer-from@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz#285e86f6dc9030148a4147d65239e75cb254a1b0" + integrity sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/util-config-provider@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz#c485fd83fbac051337e5f6be60ea3f9fa61c0139" + integrity sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz#1e66d738315a2e8c7a947dcb2042d6547885db83" + integrity sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg== + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-defaults-mode-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz#1a35845125a665480b6ff379b98aa4c1fef2cc3a" + integrity sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q== + dependencies: + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-endpoints@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz#4e4c849708634c3dd840a11abaacb02c89db46d3" + integrity sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-hex-encoding@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz#21d7ec319240ee68c33d938e71cb79830bea315d" + integrity sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz#0f598fc238a1256e4bcb64d01459f03a922dd4c3" + integrity sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-middleware@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz#ed7d732a34659b07f949e2de39cde66271a3c632" + integrity sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-retry@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz#049f777d4a8f9fd7b7ed02e116d3a23ceb34f128" + integrity sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg== + dependencies: + "@aws-sdk/service-error-classification" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-uri-escape@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz#5e708d4cde001a4558ee616f889ceacfadd2ab03" + integrity sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz#9ff8834d38b2178d72cc5c63ba3e089cc1b9a9ae" + integrity sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA== + dependencies: + "@aws-sdk/types" "3.272.0" + bowser "^2.11.0" + tslib "^2.3.1" + +"@aws-sdk/util-user-agent-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz#8e8c85d8c3ac4471a309589d91094be14a4260df" + integrity sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA== + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/util-utf8@3.254.0": + version "3.254.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz#909af9c6549833a9a9bf77004b7484bfc96b2c35" + integrity sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw== + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/util-waiter@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.272.0.tgz#958448b6522709d795327f658882ddf0277af273" + integrity sha512-N25/XsJ2wkPh1EgkFyb/GRgfHDityScfD49Hk1AwJWpfetzgkcEtWdeW4IuPymXlSKhrm5L+SBw49USxo9kBag== + dependencies: + "@aws-sdk/abort-controller" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -1405,6 +2119,13 @@ "@types/node" "*" jest-mock "^29.5.0" +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + "@jest/expect-utils@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" @@ -1472,6 +2193,13 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + "@jest/schemas@^29.4.3": version "29.4.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" @@ -1529,6 +2257,18 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jest/types@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" @@ -2299,11 +3039,23 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + "@sinclair/typebox@^0.25.16": version "0.25.24" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -2318,6 +3070,27 @@ dependencies: "@sinonjs/commons" "^2.0.0" +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + "@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1", "@solidity-parser/parser@^0.14.2": version "0.14.5" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" @@ -2578,6 +3351,14 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^28.1.3": + version "28.1.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== + dependencies: + expect "^28.0.0" + pretty-format "^28.0.0" + "@types/jest@^29.4.0": version "29.4.0" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" @@ -2767,6 +3548,18 @@ "@types/mime" "*" "@types/node" "*" +"@types/sinon@^10.0.10": + version "10.0.13" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" + integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -3521,6 +4314,23 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +aws-sdk-client-mock-jest@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.1.0.tgz#93031b4f92d42edd79a063f7b02c4b240e7d779a" + integrity sha512-2HcKQA0kMKi0Lp2ynq/u3trEKDIreXU3wyY9xyeVcbEC5Q2Bw8oWX4ovIZgmvdJHif/IvM7ABcvp/mpBNfyTYQ== + dependencies: + "@types/jest" "^28.1.3" + tslib "^2.1.0" + +aws-sdk-client-mock@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.0.tgz#58247c0fb651cddedbd093c0c06d6bc0caf82e89" + integrity sha512-JkrPrcEvQ4JwylVdQ0njYQMFVwVaZzoVc557rsCorIMjEtmrFvlVYEfIKWoYw8psU4cLjOMyqpxg65NcAn9fvQ== + dependencies: + "@types/sinon" "^10.0.10" + sinon "^14.0.2" + tslib "^2.1.0" + aws-sdk@^2.1333.0: version "2.1333.0" resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1333.0.tgz#02ecd59499e364584efb08196d6147873d6328a9" @@ -3783,6 +4593,11 @@ body-parser@^1.18.3: type-is "~1.6.18" unpipe "1.0.0" +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4979,6 +5794,11 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + diff-sequences@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" @@ -4999,6 +5819,11 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + difflib@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" @@ -5845,6 +6670,17 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expect@^28.0.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + expect@^29.0.0, expect@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" @@ -5974,6 +6810,13 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-xml-parser@4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz#42332a9aca544520631c8919e6ea871c0185a985" + integrity sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -7718,6 +8561,16 @@ jest-config@^29.5.0: slash "^3.0.0" strip-json-comments "^3.1.1" +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + jest-diff@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" @@ -7758,6 +8611,11 @@ jest-environment-node@^29.5.0: jest-mock "^29.5.0" jest-util "^29.5.0" +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" @@ -7790,6 +8648,16 @@ jest-leak-detector@^29.5.0: jest-get-type "^29.4.3" pretty-format "^29.5.0" +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + jest-matcher-utils@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" @@ -7800,6 +8668,21 @@ jest-matcher-utils@^29.5.0: jest-get-type "^29.4.3" pretty-format "^29.5.0" +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-message-util@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" @@ -7941,6 +8824,18 @@ jest-snapshot@^29.5.0: pretty-format "^29.5.0" semver "^7.3.5" +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.0.0, jest-util@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" @@ -8193,6 +9088,11 @@ just-diff@^5.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + jwa@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" @@ -8580,6 +9480,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -9263,6 +10168,17 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== +nise@^5.1.2: + version "5.1.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" + integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^10.0.2" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -10066,6 +10982,13 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -10274,6 +11197,16 @@ prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3, prettier@^2.8.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-format@^29.0.0, pretty-format@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" @@ -11207,6 +12140,18 @@ signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +sinon@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" + integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^9.1.2" + "@sinonjs/samsam" "^7.0.1" + diff "^5.0.0" + nise "^5.1.2" + supports-color "^7.2.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -11666,6 +12611,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -11708,7 +12658,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -12037,12 +12987,12 @@ tslib@1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -12120,7 +13070,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== From 76255742bcee7707f45f250f182b0aa1766e31f0 Mon Sep 17 00:00:00 2001 From: Michal Kimle Date: Thu, 23 Feb 2023 11:44:12 +0100 Subject: [PATCH 2/3] Update AWS SDK for airnode-deployer --- packages/airnode-deployer/package.json | 6 +- .../src/infrastructure/aws.test.ts | 357 +++--- .../src/infrastructure/aws.ts | 172 +-- .../src/infrastructure/gcp.test.ts | 24 +- .../src/infrastructure/gcp.ts | 45 +- .../src/infrastructure/index.test.ts | 206 ++-- .../src/infrastructure/index.ts | 31 +- yarn.lock | 1027 +++++++++++++++-- 8 files changed, 1389 insertions(+), 479 deletions(-) diff --git a/packages/airnode-deployer/package.json b/packages/airnode-deployer/package.json index 68ce265ef0..9665569f45 100644 --- a/packages/airnode-deployer/package.json +++ b/packages/airnode-deployer/package.json @@ -29,9 +29,10 @@ "@api3/airnode-utilities": "^0.10.0", "@api3/airnode-validator": "^0.10.0", "@api3/promise-utils": "^0.3.0", + "@aws-sdk/client-s3": "^3.272.0", + "@aws-sdk/signature-v4-crt": "^3.272.0", "@google-cloud/storage": "^6.9.4", "adm-zip": "^0.5.10", - "aws-sdk": "^2.1333.0", "chalk": "^4.1.2", "cli-table3": "^0.6.3", "compare-versions": "^5.0.3", @@ -45,12 +46,15 @@ "zod": "^3.20.6" }, "devDependencies": { + "@aws-sdk/util-stream-node": "^3.272.0", "@google-cloud/functions-framework": "^3.1.3", "@types/adm-zip": "^0.5.0", "@types/aws-lambda": "^8.10.111", "@types/lodash": "^4.14.191", "@types/node": "^18.15.0", "@types/yargs": "^17.0.22", + "aws-sdk-client-mock": "^2.0.1", + "aws-sdk-client-mock-jest": "^2.0.1", "copyfiles": "^2.4.1", "esbuild-loader": "^3.0.1", "jest": "^29.5.0", diff --git a/packages/airnode-deployer/src/infrastructure/aws.test.ts b/packages/airnode-deployer/src/infrastructure/aws.test.ts index decf9d0e11..e4cd6720d5 100644 --- a/packages/airnode-deployer/src/infrastructure/aws.test.ts +++ b/packages/airnode-deployer/src/infrastructure/aws.test.ts @@ -1,4 +1,22 @@ import fs from 'fs'; +import { Readable } from 'stream'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; +import { + S3Client, + ListBucketsCommand, + GetBucketLocationCommand, + CreateBucketCommand, + PutBucketEncryptionCommand, + PutPublicAccessBlockCommand, + ListObjectsV2Command, + PutObjectCommand, + GetObjectCommand, + CopyObjectCommand, + DeleteObjectsCommand, + DeleteBucketCommand, +} from '@aws-sdk/client-s3'; +import { sdkStreamMixin } from '@aws-sdk/util-stream-node'; import { getAirnodeBucket, createAirnodeBucket, @@ -13,47 +31,13 @@ import { mockBucketDirectoryStructure, mockBucketDirectoryStructureList } from ' import { Directory } from '../utils/infrastructure'; import { setLogsDirectory } from '../utils/logger'; -const mockPromise = (fn: Function) => () => ({ promise: fn }); - -const mockS3 = { - listBuckets: jest.fn(), - createBucket: jest.fn(), - putBucketEncryption: jest.fn(), - putPublicAccessBlock: jest.fn(), - listObjectsV2: jest.fn(), - putObject: jest.fn(), - getObject: jest.fn(), - copyObject: jest.fn(), - deleteObjects: jest.fn(), - deleteBucket: jest.fn(), - getBucketLocation: jest.fn(), -}; - -jest.mock('aws-sdk', () => ({ - config: { - update: jest.fn(), - }, - S3: jest.fn(() => mockS3), -})); - jest.mock('../utils/infrastructure', () => ({ ...jest.requireActual('../utils/infrastructure'), generateBucketName: jest.fn(), })); -const awsListBucketsSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().listBuckets; -const awsGetBucketLocationSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().getBucketLocation; -const awsCreateBucketSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().createBucket; -const awsPutBucketEncryptionSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().putBucketEncryption; -const awsPutPublicAccessBlockSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().putPublicAccessBlock; -const awsListObjectsV2Spy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().listObjectsV2; -const awsPutObjectSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().putObject; -const awsGetObjectSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().getObject; -const awsCopyObjectSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().copyObject; -const awsDeleteObjectsSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().deleteObjects; -const awsDeleteBucketSpy: jest.SpyInstance = jest.requireMock('aws-sdk').S3().deleteBucket; +const mockS3Client = mockClient(S3Client); const generateBucketNameSpy: jest.SpyInstance = jest.requireMock('../utils/infrastructure').generateBucketName; - jest.spyOn(fs, 'appendFileSync').mockImplementation(() => jest.fn()); jest.spyOn(fs, 'mkdirSync').mockImplementation(); setLogsDirectory('/config/logs/'); @@ -75,260 +59,337 @@ const s3ErrorMessage = 'Unexpected S3 error'; const s3Error = new Error(s3ErrorMessage); describe('getAirnodeBucket', () => { + const mockListBucketsCommandInput = {}; + const mockGetBucketLocationCommandInput = { Bucket: bucketName }; + + beforeEach(() => { + mockS3Client.reset(); + }); + it('returns Airnode S3 bucket', async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: bucketName }] }))); - awsGetBucketLocationSpy.mockImplementation(mockPromise(() => ({ LocationConstraint: 'us-east-1' }))); + mockS3Client + .on(ListBucketsCommand, mockListBucketsCommandInput) + .resolves({ Buckets: [{ Name: bucketName }] }) + .on(GetBucketLocationCommand, mockGetBucketLocationCommandInput) + .resolves({ LocationConstraint: 'us-east-1' }); const fetchedBucket = await getAirnodeBucket(); expect(fetchedBucket).toEqual(bucket); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(GetBucketLocationCommand, mockGetBucketLocationCommandInput); }); it(`ignores incorrect Airnode S3 bucket names`, async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: 'airnode-123456' }] }))); + mockS3Client + .on(ListBucketsCommand, mockListBucketsCommandInput) + .resolves({ Buckets: [{ Name: 'airnode-123456' }] }); const fetchedBucket = await getAirnodeBucket(); expect(fetchedBucket).toBeNull(); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); }); - it('returns a region `us-east-1` if the location is an empty string', async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: bucketName }] }))); - awsGetBucketLocationSpy.mockImplementation(mockPromise(() => ({ LocationConstraint: '' }))); + it('returns a region `us-east-1` if the location is undefined', async () => { + mockS3Client + .on(ListBucketsCommand, mockListBucketsCommandInput) + .resolves({ Buckets: [{ Name: bucketName }] }) + .on(GetBucketLocationCommand, mockGetBucketLocationCommandInput) + .resolves({ LocationConstraint: undefined }); const fetchedBucket = await getAirnodeBucket(); expect(fetchedBucket).toEqual(bucket); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(GetBucketLocationCommand, mockGetBucketLocationCommandInput); }); it(`throws an error if can't fetch the list of S3 buckets`, async () => { - awsListBucketsSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(ListBucketsCommand, mockListBucketsCommandInput).rejects(s3Error); await expect(getAirnodeBucket()).rejects.toThrow(new Error(`Failed to list S3 buckets: Error: ${s3ErrorMessage}`)); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); }); it(`throws an error if can't fetch the bucket's location`, async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: bucketName }] }))); - awsGetBucketLocationSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client + .on(ListBucketsCommand, mockListBucketsCommandInput) + .resolves({ Buckets: [{ Name: bucketName }] }) + .on(GetBucketLocationCommand, mockGetBucketLocationCommandInput) + .rejects(s3Error); await expect(getAirnodeBucket()).rejects.toThrow( new Error(`Failed to get location for bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); - }); - - it(`throws an error if the location is not available`, async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: bucketName }] }))); - awsGetBucketLocationSpy.mockImplementation(mockPromise(() => ({ LocationConstraint: null }))); - - await expect(getAirnodeBucket()).rejects.toThrow(new Error(`Unknown bucket region 'null'`)); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(GetBucketLocationCommand, mockGetBucketLocationCommandInput); }); it(`throws an error if the location is 'EU'`, async () => { - awsListBucketsSpy.mockImplementation(mockPromise(() => ({ Buckets: [{ Name: bucketName }] }))); - awsGetBucketLocationSpy.mockImplementation(mockPromise(() => ({ LocationConstraint: 'EU' }))); + mockS3Client + .on(ListBucketsCommand, mockListBucketsCommandInput) + .resolves({ Buckets: [{ Name: bucketName }] }) + .on(GetBucketLocationCommand, mockGetBucketLocationCommandInput) + .resolves({ LocationConstraint: 'EU' }); await expect(getAirnodeBucket()).rejects.toThrow(new Error(`Unknown bucket region 'EU'`)); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(GetBucketLocationCommand, mockGetBucketLocationCommandInput); }); it(`throws an error if there are more then one Airnode S3 buckets`, async () => { const listBucketsResponse = { Buckets: [{ Name: bucketName }, { Name: 'airnode-eeff99887766' }] }; - awsListBucketsSpy.mockImplementation(mockPromise(() => listBucketsResponse)); + mockS3Client.on(ListBucketsCommand, mockListBucketsCommandInput).resolves(listBucketsResponse); await expect(getAirnodeBucket()).rejects.toThrow( new Error(`Multiple Airnode buckets found, stopping. Buckets: ${JSON.stringify(listBucketsResponse.Buckets)}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(ListBucketsCommand, mockListBucketsCommandInput); }); }); describe('createAirnodeBucket', () => { + const mockCreateBucketCommandInput = { Bucket: bucketName }; + const mockPutBucketEncryptionCommandInput = { + Bucket: bucketName, + ServerSideEncryptionConfiguration: { + Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' }, BucketKeyEnabled: true }], + }, + }; + const mockPutPublicAccessBlockCommandInput = { + Bucket: bucketName, + PublicAccessBlockConfiguration: { + BlockPublicAcls: true, + BlockPublicPolicy: true, + IgnorePublicAcls: true, + RestrictPublicBuckets: true, + }, + }; + beforeEach(() => { - awsCreateBucketSpy.mockImplementation(mockPromise(() => {})); - awsPutBucketEncryptionSpy.mockImplementation(mockPromise(() => {})); - awsPutPublicAccessBlockSpy.mockImplementation(mockPromise(() => {})); + mockS3Client.reset(); generateBucketNameSpy.mockImplementation(() => bucketName); }); it(`creates S3 Airnode bucket with no options for 'us-east-1' region`, async () => { + mockS3Client + .on(CreateBucketCommand, mockCreateBucketCommandInput) + .resolves({}) + .on(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput) + .resolves({}) + .on(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput) + .resolves({}); await createAirnodeBucket(cloudProvider); - expect(awsCreateBucketSpy).toHaveBeenCalledWith({ Bucket: bucketName }); - expect(awsPutBucketEncryptionSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - ServerSideEncryptionConfiguration: { - Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' }, BucketKeyEnabled: true }], - }, - }); - expect(awsPutPublicAccessBlockSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - PublicAccessBlockConfiguration: { - BlockPublicAcls: true, - BlockPublicPolicy: true, - IgnorePublicAcls: true, - RestrictPublicBuckets: true, - }, - }); + expect(mockS3Client).toHaveReceivedCommandWith(CreateBucketCommand, mockCreateBucketCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput); }); it(`creates S3 Airnode bucket with options for other than 'us-east-1' region`, async () => { - await createAirnodeBucket({ ...cloudProvider, region: 'europe-central-1' }); - - expect(awsCreateBucketSpy).toHaveBeenCalledWith({ + const mockCreateBucketCommandInputDifferentRegion = { Bucket: bucketName, CreateBucketConfiguration: { LocationConstraint: 'europe-central-1' }, - }); - expect(awsPutBucketEncryptionSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - ServerSideEncryptionConfiguration: { - Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' }, BucketKeyEnabled: true }], - }, - }); - expect(awsPutPublicAccessBlockSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - PublicAccessBlockConfiguration: { - BlockPublicAcls: true, - BlockPublicPolicy: true, - IgnorePublicAcls: true, - RestrictPublicBuckets: true, - }, - }); + }; + mockS3Client + .on(CreateBucketCommand, mockCreateBucketCommandInputDifferentRegion) + .resolves({}) + .on(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput) + .resolves({}) + .on(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput) + .resolves({}); + await createAirnodeBucket({ ...cloudProvider, region: 'europe-central-1' }); + + expect(mockS3Client).toHaveReceivedCommandWith(CreateBucketCommand, mockCreateBucketCommandInputDifferentRegion); + expect(mockS3Client).toHaveReceivedCommandWith(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput); }); it(`throws an error if can't create a bucket`, async () => { - awsCreateBucketSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(CreateBucketCommand, mockCreateBucketCommandInput).rejects(s3Error); await expect(createAirnodeBucket(cloudProvider)).rejects.toThrow( new Error(`Failed to create an S3 bucket: Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(CreateBucketCommand, mockCreateBucketCommandInput); }); it(`throws an error if can't set encryption`, async () => { - awsPutBucketEncryptionSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client + .on(CreateBucketCommand, mockCreateBucketCommandInput) + .resolves({}) + .on(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput) + .rejects(s3Error); await expect(createAirnodeBucket(cloudProvider)).rejects.toThrow( new Error(`Failed to enable encryption for bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(CreateBucketCommand, mockCreateBucketCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput); }); it(`throws an error if can't set public access`, async () => { - awsPutPublicAccessBlockSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client + .on(CreateBucketCommand, mockCreateBucketCommandInput) + .resolves({}) + .on(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput) + .resolves({}) + .on(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput) + .rejects(s3Error); await expect(createAirnodeBucket(cloudProvider)).rejects.toThrow( new Error(`Failed to setup a public access block for bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(CreateBucketCommand, mockCreateBucketCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutBucketEncryptionCommand, mockPutBucketEncryptionCommandInput); + expect(mockS3Client).toHaveReceivedCommandWith(PutPublicAccessBlockCommand, mockPutPublicAccessBlockCommandInput); }); }); describe('getBucketDirectoryStructure', () => { + const mockListObjectsV2CommandInput = { Bucket: bucketName }; + + beforeEach(() => { + mockS3Client.reset(); + }); + it('returns bucket directory structure', async () => { - awsListObjectsV2Spy.mockImplementation( - mockPromise(() => ({ - Contents: mockBucketDirectoryStructureList.map((path) => ({ Key: path })), - IsTruncated: false, - })) - ); + mockS3Client.on(ListObjectsV2Command, mockListObjectsV2CommandInput).resolves({ + Contents: mockBucketDirectoryStructureList.map((path) => ({ Key: path })), + IsTruncated: false, + }); - const directoryStructure = await getBucketDirectoryStructure(bucketName); + const directoryStructure = await getBucketDirectoryStructure(bucket); expect(directoryStructure).toEqual(mockBucketDirectoryStructure); - expect(awsListObjectsV2Spy).toHaveBeenCalledWith({ Bucket: bucketName }); + expect(mockS3Client).toHaveReceivedCommandWith(ListObjectsV2Command, mockListObjectsV2CommandInput); }); it(`throws an error if can't list bucket content`, async () => { - awsListObjectsV2Spy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(ListObjectsV2Command, mockListObjectsV2CommandInput).rejects(s3Error); - await expect(getBucketDirectoryStructure(bucketName)).rejects.toThrow( + await expect(getBucketDirectoryStructure(bucket)).rejects.toThrow( new Error(`Failed to list content of bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(ListObjectsV2Command, mockListObjectsV2CommandInput); }); }); describe('storeFileToBucket', () => { + const mockPutObjectCommandInput = { + Bucket: bucketName, + Key: bucketFilePath, + Body: fileContent, + }; + beforeEach(() => { + mockS3Client.reset(); jest.spyOn(fs, 'readFileSync').mockImplementation(() => fileContent); }); it('stores file in S3 bucket', async () => { - awsPutObjectSpy.mockImplementation(mockPromise(() => {})); + mockS3Client.on(PutObjectCommand, mockPutObjectCommandInput).resolves({}); - await storeFileToBucket(bucketName, bucketFilePath, filePath); - expect(awsPutObjectSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - Key: bucketFilePath, - Body: fileContent, - }); + await storeFileToBucket(bucket, bucketFilePath, filePath); + expect(mockS3Client).toHaveReceivedCommandWith(PutObjectCommand, mockPutObjectCommandInput); }); it(`throws an error if can't store file in bucket`, async () => { - awsPutObjectSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(PutObjectCommand, mockPutObjectCommandInput).rejects(s3Error); - await expect(storeFileToBucket(bucketName, bucketFilePath, filePath)).rejects.toThrow( + await expect(storeFileToBucket(bucket, bucketFilePath, filePath)).rejects.toThrow( new Error(`Failed to store file '${filePath}' to S3 bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(PutObjectCommand, mockPutObjectCommandInput); }); }); describe('getFileFromBucket', () => { + const mockGetObjectCommandInput = { Bucket: bucketName, Key: bucketFilePath }; + const mockStream = new Readable(); + mockStream.push(fileContent); + mockStream.push(null); + const mockGetObjectCommandOutput = { Body: sdkStreamMixin(mockStream) }; + + beforeEach(() => { + mockS3Client.reset(); + }); + it('fetches file from S3 bucket', async () => { - awsGetObjectSpy.mockImplementation(mockPromise(() => ({ Body: fileContent }))); + mockS3Client.on(GetObjectCommand, mockGetObjectCommandInput).resolves(mockGetObjectCommandOutput); - const fetchedFileContent = await getFileFromBucket(bucketName, bucketFilePath); + const fetchedFileContent = await getFileFromBucket(bucket, bucketFilePath); expect(fetchedFileContent).toEqual(fileContent); - expect(awsGetObjectSpy).toHaveBeenCalledWith({ Bucket: bucketName, Key: bucketFilePath }); + expect(mockS3Client).toHaveReceivedCommandWith(GetObjectCommand, mockGetObjectCommandInput); }); it(`throw an error if can't fetch file from bucket`, async () => { - awsGetObjectSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(GetObjectCommand, mockGetObjectCommandInput).rejects(s3Error); - await expect(getFileFromBucket(bucketName, bucketFilePath)).rejects.toThrow( + await expect(getFileFromBucket(bucket, bucketFilePath)).rejects.toThrow( new Error(`Failed to fetch file '${bucketFilePath}' from S3 bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(GetObjectCommand, mockGetObjectCommandInput); }); }); describe('copyFileInBucket', () => { const toBucketFilePath = '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662557994854/config.json'; + const mockCopyObjectCommandInput = { + Bucket: bucketName, + CopySource: `/${bucketName}/${bucketFilePath}`, + Key: toBucketFilePath, + }; + + beforeEach(() => { + mockS3Client.reset(); + }); it('copies file within a bucket', async () => { - awsCopyObjectSpy.mockImplementation(mockPromise(() => {})); + mockS3Client.on(CopyObjectCommand, mockCopyObjectCommandInput).resolves({}); - await copyFileInBucket(bucketName, bucketFilePath, toBucketFilePath); - expect(awsCopyObjectSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - CopySource: `/${bucketName}/${bucketFilePath}`, - Key: toBucketFilePath, - }); + await copyFileInBucket(bucket, bucketFilePath, toBucketFilePath); + expect(mockS3Client).toHaveReceivedCommandWith(CopyObjectCommand, mockCopyObjectCommandInput); }); it(`throw an error if can't copy file within bucket`, async () => { - awsCopyObjectSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(CopyObjectCommand, mockCopyObjectCommandInput).rejects(s3Error); - await expect(copyFileInBucket(bucketName, bucketFilePath, toBucketFilePath)).rejects.toThrow( + await expect(copyFileInBucket(bucket, bucketFilePath, toBucketFilePath)).rejects.toThrow( new Error( `Failed to copy file '${bucketFilePath}' to file '${toBucketFilePath}' within S3 bucket '${bucketName}': Error: ${s3ErrorMessage}` ) ); + expect(mockS3Client).toHaveReceivedCommandWith(CopyObjectCommand, mockCopyObjectCommandInput); }); }); describe('deleteObjects', () => { + const bucketKeys = mockBucketDirectoryStructureList.filter((key) => + key.startsWith('0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace') + ); + const mockDeleteObjectsCommandInput = { + Bucket: bucketName, + Delete: { Objects: bucketKeys.map((bucketKey) => ({ Key: bucketKey })) }, + }; + + beforeEach(() => { + mockS3Client.reset(); + }); + it('deletes S3 bucket directory and its content', async () => { - const bucketKeys = mockBucketDirectoryStructureList.filter((key) => - key.startsWith('0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace') - ); - awsDeleteObjectsSpy.mockImplementation(mockPromise(() => {})); + mockS3Client.on(DeleteObjectsCommand, mockDeleteObjectsCommandInput).resolves({}); await deleteBucketDirectory( - bucketName, + bucket, mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory ); - expect(awsDeleteObjectsSpy).toHaveBeenCalledWith({ - Bucket: bucketName, - Delete: { Objects: bucketKeys.map((bucketKey) => ({ Key: bucketKey })) }, - }); + expect(mockS3Client).toHaveReceivedCommandWith(DeleteObjectsCommand, mockDeleteObjectsCommandInput); }); it(`throw an error if can't delete files from bucket`, async () => { - awsDeleteObjectsSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(DeleteObjectsCommand, mockDeleteObjectsCommandInput).rejects(s3Error); await expect( deleteBucketDirectory( - bucketName, + bucket, mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory ) ).rejects.toThrow( @@ -336,22 +397,30 @@ describe('deleteObjects', () => { `Failed to delete bucket directory '${mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'].bucketKey}' and its content: Error: ${s3ErrorMessage}` ) ); + expect(mockS3Client).toHaveReceivedCommandWith(DeleteObjectsCommand, mockDeleteObjectsCommandInput); }); }); describe('deleteBucket', () => { + const mockDeleteBucketCommandInput = { Bucket: bucketName }; + + beforeEach(() => { + mockS3Client.reset(); + }); + it('deletes an empty S3 bucket', async () => { - awsDeleteBucketSpy.mockImplementation(mockPromise(() => {})); + mockS3Client.on(DeleteBucketCommand, mockDeleteBucketCommandInput).resolves({}); - await deleteBucket(bucketName); - expect(awsDeleteBucketSpy).toHaveBeenCalledWith({ Bucket: bucketName }); + await deleteBucket(bucket); + expect(mockS3Client).toHaveReceivedCommandWith(DeleteBucketCommand, mockDeleteBucketCommandInput); }); it(`throw an error if can't delete files from bucket`, async () => { - awsDeleteBucketSpy.mockImplementation(mockPromise(jest.fn().mockRejectedValue(s3Error))); + mockS3Client.on(DeleteBucketCommand, mockDeleteBucketCommandInput).rejects(s3Error); - await expect(deleteBucket(bucketName)).rejects.toThrow( + await expect(deleteBucket(bucket)).rejects.toThrow( new Error(`Failed to delete S3 bucket '${bucketName}': Error: ${s3ErrorMessage}`) ); + expect(mockS3Client).toHaveReceivedCommandWith(DeleteBucketCommand, mockDeleteBucketCommandInput); }); }); diff --git a/packages/airnode-deployer/src/infrastructure/aws.ts b/packages/airnode-deployer/src/infrastructure/aws.ts index 3405e759eb..0e86c5f7fd 100644 --- a/packages/airnode-deployer/src/infrastructure/aws.ts +++ b/packages/airnode-deployer/src/infrastructure/aws.ts @@ -1,28 +1,47 @@ import * as fs from 'fs'; -import AWS from 'aws-sdk'; +import { + S3Client, + ListBucketsCommand, + GetBucketLocationCommand, + CreateBucketCommand, + CreateBucketCommandInput, + PutBucketEncryptionCommand, + PutPublicAccessBlockCommand, + ListObjectsV2Command, + ListObjectsV2CommandInput, + PutObjectCommand, + GetObjectCommand, + CopyObjectCommand, + DeleteObjectsCommand, + DeleteBucketCommand, +} from '@aws-sdk/client-s3'; import concat from 'lodash/concat'; import compact from 'lodash/compact'; -import isNil from 'lodash/isNil'; import { AwsCloudProvider } from '@api3/airnode-node'; import { go } from '@api3/promise-utils'; import * as logger from '../utils/logger'; import { BUCKET_NAME_REGEX, + Bucket, Directory, FileSystemType, generateBucketName, translatePathsToDirectoryStructure, } from '../utils/infrastructure'; -const initializeS3Service = () => { - return new AWS.S3(); +const DEFAULT_AWS_REGION = 'us-east-1'; + +const initializeS3Service = (region: string) => { + return new S3Client({ region }); }; export const getAirnodeBucket = async () => { - const s3 = initializeS3Service(); + // We're using a default region here because we don't know where is the bucket stored at this point. + const s3 = initializeS3Service(DEFAULT_AWS_REGION); logger.debug('Listing S3 buckets'); - const goBuckets = await go(() => s3.listBuckets().promise()); + const bucketsCommand = new ListBucketsCommand({}); + const goBuckets = await go(() => s3.send(bucketsCommand)); if (!goBuckets.success) { throw new Error(`Failed to list S3 buckets: ${goBuckets.error}`); } @@ -38,20 +57,21 @@ export const getAirnodeBucket = async () => { return null; } - const goBucketLocation = await go(() => s3.getBucketLocation({ Bucket: bucketName }).promise()); + const bucketLocationCommand = new GetBucketLocationCommand({ Bucket: bucketName }); + const goBucketLocation = await go(() => s3.send(bucketLocationCommand)); if (!goBucketLocation.success) { throw new Error(`Failed to get location for bucket '${bucketName}': ${goBucketLocation.error}`); } let region = goBucketLocation.data.LocationConstraint; // The `EU` option is listed as a possible one in the documentation - // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getBucketLocation-property - if (isNil(region) || region === 'EU') { + // https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html#API_GetBucketLocation_ResponseElements + if (region === 'EU') { throw new Error(`Unknown bucket region '${region}'`); } - // The documentation says that for buckets in the `us-east-1` region the value of `LocationConstraint` is null but it is actually an empty string... - // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getBucketLocation-property - if (region === '') { + // The documentation says that for buckets in the `us-east-1` region the value of `LocationConstraint` is null but it is actually undefined + // https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html#API_GetBucketLocation_ResponseElements + if (region === undefined) { region = 'us-east-1'; } @@ -62,34 +82,33 @@ export const getAirnodeBucket = async () => { }; export const createAirnodeBucket = async (cloudProvider: AwsCloudProvider) => { - const s3 = initializeS3Service(); + // If there's no Airnode bucket already available we create it in the region where the Airnode resources will be deployed + const s3 = initializeS3Service(cloudProvider.region); const bucketName = generateBucketName(); - let createParams: AWS.S3.CreateBucketRequest = { Bucket: bucketName }; + let createParams: CreateBucketCommandInput = { Bucket: bucketName }; // If the region is `us-east-1` the configuration must be empty... - // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#createBucket-property + // https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html#API_CreateBucket_RequestBody if (cloudProvider.region !== 'us-east-1') { createParams = { ...createParams, CreateBucketConfiguration: { LocationConstraint: cloudProvider.region } }; } logger.debug(`Creating S3 bucket '${bucketName}' in '${cloudProvider.region}'`); - const goCreate = await go(() => s3.createBucket(createParams).promise()); + const createCommand = new CreateBucketCommand(createParams); + const goCreate = await go(() => s3.send(createCommand)); if (!goCreate.success) { throw new Error(`Failed to create an S3 bucket: ${goCreate.error}`); } // Enable bucket encryption logger.debug(`Setting encryption for S3 bucket '${bucketName}'`); - const goPutEncryption = await go(() => - s3 - .putBucketEncryption({ - Bucket: bucketName, - ServerSideEncryptionConfiguration: { - Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' }, BucketKeyEnabled: true }], - }, - }) - .promise() - ); + const putEncryptionCommand = new PutBucketEncryptionCommand({ + Bucket: bucketName, + ServerSideEncryptionConfiguration: { + Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' }, BucketKeyEnabled: true }], + }, + }); + const goPutEncryption = await go(() => s3.send(putEncryptionCommand)); if (!goPutEncryption.success) { throw new Error(`Failed to enable encryption for bucket '${bucketName}': ${goPutEncryption.error}`); } @@ -97,19 +116,16 @@ export const createAirnodeBucket = async (cloudProvider: AwsCloudProvider) => { // Blocking public access to the bucket // https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html logger.debug(`Setting public access block for S3 bucket '${bucketName}'`); - const goPutPublicAccessBlock = await go(() => - s3 - .putPublicAccessBlock({ - Bucket: bucketName, - PublicAccessBlockConfiguration: { - BlockPublicAcls: true, - BlockPublicPolicy: true, - IgnorePublicAcls: true, - RestrictPublicBuckets: true, - }, - }) - .promise() - ); + const putPublicAccessBlockCommand = new PutPublicAccessBlockCommand({ + Bucket: bucketName, + PublicAccessBlockConfiguration: { + BlockPublicAcls: true, + BlockPublicPolicy: true, + IgnorePublicAcls: true, + RestrictPublicBuckets: true, + }, + }); + const goPutPublicAccessBlock = await go(() => s3.send(putPublicAccessBlockCommand)); if (!goPutPublicAccessBlock.success) { throw new Error( `Failed to setup a public access block for bucket '${bucketName}': ${goPutPublicAccessBlock.error}` @@ -122,18 +138,20 @@ export const createAirnodeBucket = async (cloudProvider: AwsCloudProvider) => { }; }; -export const getBucketDirectoryStructure = async (bucketName: string) => { - const s3 = initializeS3Service(); +export const getBucketDirectoryStructure = async (bucket: Bucket) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); let paths: string[] = []; let truncated = true; - let listParams: AWS.S3.ListObjectsV2Request = { + let listParams: ListObjectsV2CommandInput = { Bucket: bucketName, }; while (truncated) { logger.debug(`Listing objects for S3 bucket '${bucketName}'`); - const goList = await go(() => s3.listObjectsV2(listParams).promise()); + const listCommand = new ListObjectsV2Command(listParams); + const goList = await go(() => s3.send(listCommand)); if (!goList.success) { throw new Error(`Failed to list content of bucket '${bucketName}': ${goList.error}`); } @@ -148,25 +166,29 @@ export const getBucketDirectoryStructure = async (bucketName: string) => { return translatePathsToDirectoryStructure(paths); }; -export const storeFileToBucket = async (bucketName: string, bucketFilePath: string, filePath: string) => { - const s3 = initializeS3Service(); +export const storeFileToBucket = async (bucket: Bucket, bucketFilePath: string, filePath: string) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); logger.debug(`Storing file '${filePath}' as '${bucketFilePath}' to S3 bucket '${bucketName}'`); - const goPut = await go(() => - s3 - .putObject({ Bucket: bucketName, Key: bucketFilePath, Body: fs.readFileSync(filePath, { encoding: 'utf-8' }) }) - .promise() - ); + const putCommand = new PutObjectCommand({ + Bucket: bucketName, + Key: bucketFilePath, + Body: fs.readFileSync(filePath, { encoding: 'utf-8' }), + }); + const goPut = await go(() => s3.send(putCommand)); if (!goPut.success) { throw new Error(`Failed to store file '${filePath}' to S3 bucket '${bucketName}': ${goPut.error}`); } }; -export const getFileFromBucket = async (bucketName: string, filePath: string) => { - const s3 = initializeS3Service(); +export const getFileFromBucket = async (bucket: Bucket, filePath: string) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); logger.debug(`Fetching file '${filePath}' from S3 bucket '${bucketName}'`); - const goGet = await go(() => s3.getObject({ Bucket: bucketName, Key: filePath }).promise()); + const getCommand = new GetObjectCommand({ Bucket: bucketName, Key: filePath }); + const goGet = await go(() => s3.send(getCommand)); if (!goGet.success) { throw new Error(`Failed to fetch file '${filePath}' from S3 bucket '${bucketName}': ${goGet.error}`); } @@ -174,16 +196,25 @@ export const getFileFromBucket = async (bucketName: string, filePath: string) => throw new Error(`The response for file '${filePath}' from S3 bucket '${bucketName}' contained an empty body`); } - return goGet.data.Body.toString('utf-8'); + const goFileContent = await go(() => goGet.data.Body!.transformToString('utf-8')); + if (!goFileContent.success) { + throw new Error(`The response for file '${filePath}' from S3 bucket '${bucketName}' is not parsable`); + } + + return goFileContent.data; }; -export const copyFileInBucket = async (bucketName: string, fromFilePath: string, toFilePath: string) => { - const s3 = initializeS3Service(); +export const copyFileInBucket = async (bucket: Bucket, fromFilePath: string, toFilePath: string) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); logger.debug(`Copying file '${fromFilePath}' to file '${toFilePath}' within S3 bucket '${bucketName}'`); - const goCopy = await go(() => - s3.copyObject({ Bucket: bucketName, CopySource: `/${bucketName}/${fromFilePath}`, Key: toFilePath }).promise() - ); + const copyCommand = new CopyObjectCommand({ + Bucket: bucketName, + CopySource: `/${bucketName}/${fromFilePath}`, + Key: toFilePath, + }); + const goCopy = await go(() => s3.send(copyCommand)); if (!goCopy.success) { throw new Error( `Failed to copy file '${fromFilePath}' to file '${toFilePath}' within S3 bucket '${bucketName}': ${goCopy.error}` @@ -202,26 +233,29 @@ const gatherBucketKeys = (directory: Directory): string[] => [ ), ]; -export const deleteBucketDirectory = async (bucketName: string, directory: Directory) => { - const s3 = initializeS3Service(); +export const deleteBucketDirectory = async (bucket: Bucket, directory: Directory) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); const bucketKeys = gatherBucketKeys(directory); logger.debug(`Deleting files from S3 bucket '${bucketName}': ${JSON.stringify(bucketKeys)}`); - const goDelete = await go(() => - s3 - .deleteObjects({ Bucket: bucketName, Delete: { Objects: bucketKeys.map((bucketKey) => ({ Key: bucketKey })) } }) - .promise() - ); + const deleteCommand = new DeleteObjectsCommand({ + Bucket: bucketName, + Delete: { Objects: bucketKeys.map((bucketKey) => ({ Key: bucketKey })) }, + }); + const goDelete = await go(() => s3.send(deleteCommand)); if (!goDelete.success) { throw new Error(`Failed to delete bucket directory '${directory.bucketKey}' and its content: ${goDelete.error}`); } }; -export const deleteBucket = async (bucketName: string) => { - const s3 = initializeS3Service(); +export const deleteBucket = async (bucket: Bucket) => { + const { name: bucketName, region: bucketRegion } = bucket; + const s3 = initializeS3Service(bucketRegion); logger.debug(`Deleting S3 bucket '${bucketName}'`); - const goDelete = await go(() => s3.deleteBucket({ Bucket: bucketName }).promise()); + const deleteCommand = new DeleteBucketCommand({ Bucket: bucketName }); + const goDelete = await go(() => s3.send(deleteCommand)); if (!goDelete.success) { throw new Error(`Failed to delete S3 bucket '${bucketName}': ${goDelete.error}`); } diff --git a/packages/airnode-deployer/src/infrastructure/gcp.test.ts b/packages/airnode-deployer/src/infrastructure/gcp.test.ts index 836678fb7a..6031d05d3c 100644 --- a/packages/airnode-deployer/src/infrastructure/gcp.test.ts +++ b/packages/airnode-deployer/src/infrastructure/gcp.test.ts @@ -204,7 +204,7 @@ describe('getBucketDirectoryStructure', () => { it('returns bucket directory structure', async () => { gcsGetFilesSpy.mockImplementation(() => [mockBucketDirectoryStructureList.map((path) => ({ name: path }))]); - const directoryStructure = await getBucketDirectoryStructure(bucketName); + const directoryStructure = await getBucketDirectoryStructure(bucket); expect(directoryStructure).toEqual(mockBucketDirectoryStructure); expect(gcsGetFilesSpy).toHaveBeenCalled(); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -214,7 +214,7 @@ describe('getBucketDirectoryStructure', () => { it(`throws an error if can't list bucket content`, async () => { gcsGetFilesSpy.mockRejectedValue(gcsError); - await expect(getBucketDirectoryStructure(bucketName)).rejects.toThrow( + await expect(getBucketDirectoryStructure(bucket)).rejects.toThrow( new Error(`Failed to list content of bucket '${bucketName}': Error: ${gcsErrorMessage}`) ); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -226,7 +226,7 @@ describe('storeFileToBucket', () => { it('stores file in GCS bucket', async () => { gcsUploadSpy.mockImplementation(() => {}); - await storeFileToBucket(bucketName, bucketFilePath, filePath); + await storeFileToBucket(bucket, bucketFilePath, filePath); expect(gcsUploadSpy).toHaveBeenCalled(); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); expect(gcsBucketSpy).toHaveBeenCalledWith(bucketName); @@ -235,7 +235,7 @@ describe('storeFileToBucket', () => { it(`throws an error if can't store file in bucket`, async () => { gcsUploadSpy.mockRejectedValue(gcsError); - await expect(storeFileToBucket(bucketName, bucketFilePath, filePath)).rejects.toThrow( + await expect(storeFileToBucket(bucket, bucketFilePath, filePath)).rejects.toThrow( new Error(`Failed to store file '${filePath}' to GCS bucket '${bucketName}': Error: ${gcsErrorMessage}`) ); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -247,7 +247,7 @@ describe('getFileFromBucket', () => { it('fetches file from GCS bucket', async () => { gcsDownloadSpy.mockImplementation(() => [fileContent]); - const fetchedFileContent = await getFileFromBucket(bucketName, bucketFilePath); + const fetchedFileContent = await getFileFromBucket(bucket, bucketFilePath); expect(fetchedFileContent).toEqual(fileContent); expect(gcsDownloadSpy).toHaveBeenCalled(); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -258,7 +258,7 @@ describe('getFileFromBucket', () => { it(`throw an error if can't fetch file from bucket`, async () => { gcsDownloadSpy.mockRejectedValue(gcsError); - await expect(getFileFromBucket(bucketName, bucketFilePath)).rejects.toThrow( + await expect(getFileFromBucket(bucket, bucketFilePath)).rejects.toThrow( new Error(`Failed to fetch file '${bucketFilePath}' from GCS bucket '${bucketName}': Error: ${gcsErrorMessage}`) ); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -273,7 +273,7 @@ describe('copyFileInBucket', () => { it('copies file within a bucket', async () => { gcsCopySpy.mockImplementation(() => {}); - await copyFileInBucket(bucketName, bucketFilePath, toBucketFilePath); + await copyFileInBucket(bucket, bucketFilePath, toBucketFilePath); expect(gcsCopySpy).toHaveBeenCalledWith(toBucketFilePath); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); expect(gcsBucketSpy).toHaveBeenCalledWith(bucketName); @@ -283,7 +283,7 @@ describe('copyFileInBucket', () => { it(`throw an error if can't copy file within bucket`, async () => { gcsCopySpy.mockRejectedValue(gcsError); - await expect(copyFileInBucket(bucketName, bucketFilePath, toBucketFilePath)).rejects.toThrow( + await expect(copyFileInBucket(bucket, bucketFilePath, toBucketFilePath)).rejects.toThrow( new Error( `Failed to copy file '${bucketFilePath}' to file '${toBucketFilePath}' within GCS bucket '${bucketName}': Error: ${gcsErrorMessage}` ) @@ -302,7 +302,7 @@ describe('deleteObjects', () => { gcsFileDeleteSpy.mockImplementation(() => {}); await deleteBucketDirectory( - bucketName, + bucket, mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory ); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); @@ -318,7 +318,7 @@ describe('deleteObjects', () => { await expect( deleteBucketDirectory( - bucketName, + bucket, mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory ) ).rejects.toThrow( @@ -334,7 +334,7 @@ describe('deleteBucket', () => { it('deletes an empty GCS bucket', async () => { gcsBucketDeleteSpy.mockImplementation(() => {}); - await deleteBucket(bucketName); + await deleteBucket(bucket); expect(gcsBucketDeleteSpy).toHaveBeenCalledWith(); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); expect(gcsBucketSpy).toHaveBeenCalledWith(bucketName); @@ -343,7 +343,7 @@ describe('deleteBucket', () => { it(`throw an error if can't delete files from bucket`, async () => { gcsBucketDeleteSpy.mockRejectedValue(gcsError); - await expect(deleteBucket(bucketName)).rejects.toThrow( + await expect(deleteBucket(bucket)).rejects.toThrow( new Error(`Failed to delete GCS bucket '${bucketName}': Error: ${gcsErrorMessage}`) ); expect(gcsStorageSpy).toHaveBeenCalledTimes(1); diff --git a/packages/airnode-deployer/src/infrastructure/gcp.ts b/packages/airnode-deployer/src/infrastructure/gcp.ts index 4355bd3663..c3aa863a28 100644 --- a/packages/airnode-deployer/src/infrastructure/gcp.ts +++ b/packages/airnode-deployer/src/infrastructure/gcp.ts @@ -2,6 +2,7 @@ import { GcpCloudProvider } from '@api3/airnode-node'; import { go } from '@api3/promise-utils'; import { Storage } from '@google-cloud/storage'; import { + Bucket, BUCKET_NAME_REGEX, Directory, FileSystemType, @@ -104,10 +105,11 @@ export const createAirnodeBucket = async (cloudProvider: GcpCloudProvider) => { }; }; -export const getBucketDirectoryStructure = async (bucketName: string) => { - const bucket = initializeGcsBucket(bucketName); +export const getBucketDirectoryStructure = async (bucket: Bucket) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); - const goGet = await go(() => bucket.getFiles()); + const goGet = await go(() => gcsBucket.getFiles()); if (!goGet.success) { throw new Error(`Failed to list content of bucket '${bucketName}': ${goGet.error}`); } @@ -115,19 +117,21 @@ export const getBucketDirectoryStructure = async (bucketName: string) => { return translatePathsToDirectoryStructure(goGet.data[0].map((file) => file.name)); }; -export const storeFileToBucket = async (bucketName: string, bucketFilePath: string, filePath: string) => { - const bucket = initializeGcsBucket(bucketName); +export const storeFileToBucket = async (bucket: Bucket, bucketFilePath: string, filePath: string) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); logger.debug(`Storing file '${filePath}' as '${bucketFilePath}' to GCS bucket '${bucketName}'`); - const goSave = await go(() => bucket.upload(filePath, { destination: bucketFilePath })); + const goSave = await go(() => gcsBucket.upload(filePath, { destination: bucketFilePath })); if (!goSave.success) { throw new Error(`Failed to store file '${filePath}' to GCS bucket '${bucketName}': ${goSave.error}`); } }; -export const getFileFromBucket = async (bucketName: string, filePath: string) => { - const bucket = initializeGcsBucket(bucketName); - const file = bucket.file(filePath); +export const getFileFromBucket = async (bucket: Bucket, filePath: string) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); + const file = gcsBucket.file(filePath); logger.debug(`Fetching file '${filePath}' from GCS bucket '${bucketName}'`); const goDownload = await go(() => file.download()); @@ -138,9 +142,10 @@ export const getFileFromBucket = async (bucketName: string, filePath: string) => return goDownload.data[0].toString('utf-8'); }; -export const copyFileInBucket = async (bucketName: string, fromFilePath: string, toFilePath: string) => { - const bucket = initializeGcsBucket(bucketName); - const file = bucket.file(fromFilePath); +export const copyFileInBucket = async (bucket: Bucket, fromFilePath: string, toFilePath: string) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); + const file = gcsBucket.file(fromFilePath); logger.debug(`Copying file '${fromFilePath}' to file '${toFilePath}' within GCS bucket '${bucketName}'`); const goCopy = await go(() => file.copy(toFilePath)); @@ -161,26 +166,28 @@ const gatherBucketKeys = (directory: Directory): string[] => [ ), ]; -export const deleteBucketDirectory = async (bucketName: string, directory: Directory) => { - const bucket = initializeGcsBucket(bucketName); +export const deleteBucketDirectory = async (bucket: Bucket, directory: Directory) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); const bucketKeys = gatherBucketKeys(directory); logger.debug(`Deleting files from GCS bucket '${bucketName}': ${JSON.stringify(bucketKeys)}`); for (const bucketKey of bucketKeys.reverse()) { // I could use Bucket.deleteFiles() instead but you can't list the files to be deleted and it makes multiple API calls anyway - logger.debug(`Deleting file '${bucketKey}' from GCS bucket '${bucketName}'`); - const goDelete = await go(() => bucket.file(bucketKey).delete()); + logger.debug(`Deleting file '${gcsBucket}' from GCS bucket '${bucketName}'`); + const goDelete = await go(() => gcsBucket.file(bucketKey).delete()); if (!goDelete.success) { throw new Error(`Failed to delete bucket file '${bucketKey}': ${goDelete.error}`); } } }; -export const deleteBucket = async (bucketName: string) => { - const bucket = initializeGcsBucket(bucketName); +export const deleteBucket = async (bucket: Bucket) => { + const { name: bucketName } = bucket; + const gcsBucket = initializeGcsBucket(bucketName); logger.debug(`Deleting GCS bucket '${bucketName}'`); - const goDelete = await go(() => bucket.delete()); + const goDelete = await go(() => gcsBucket.delete()); if (!goDelete.success) { throw new Error(`Failed to delete GCS bucket '${bucketName}': ${goDelete.error}`); } diff --git a/packages/airnode-deployer/src/infrastructure/index.test.ts b/packages/airnode-deployer/src/infrastructure/index.test.ts index 7dcd14f6a4..56174abf71 100644 --- a/packages/airnode-deployer/src/infrastructure/index.test.ts +++ b/packages/airnode-deployer/src/infrastructure/index.test.ts @@ -590,18 +590,18 @@ describe('deployAirnode', () => { const terraformOutput = await infrastructure.deployAirnode(config, configPath, secretsPath, Date.now()); expect(terraformOutput).toEqual(expectedOutput); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).not.toHaveBeenCalled(); expect(awsCopyFileInBucketSpy).not.toHaveBeenCalled(); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/config.json', configPath ); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/secrets.env', secretsPath ); @@ -657,18 +657,18 @@ describe('deployAirnode', () => { expect(terraformOutput).toEqual(expectedOutput); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); expect(awsCreateAirnodeBucket).toHaveBeenCalledWith(config.nodeSettings.cloudProvider); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(newBucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(newBucket); expect(awsGetFileFromBucketSpy).not.toHaveBeenCalled(); expect(awsCopyFileInBucketSpy).not.toHaveBeenCalled(); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 1, - newBucket.name, + newBucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/config.json', configPath ); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 2, - newBucket.name, + newBucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/secrets.env', secretsPath ); @@ -720,25 +720,25 @@ describe('deployAirnode', () => { const terraformOutput = await infrastructure.deployAirnode(config, configPath, secretsPath, Date.now()); expect(terraformOutput).toEqual(expectedOutput); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsCopyFileInBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/default.tfstate', '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/default.tfstate' ); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/config.json', configPath ); expect(awsStoreFileToBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662730904/secrets.env', secretsPath ); @@ -938,13 +938,13 @@ describe('removeAirnode', () => { await infrastructure.removeAirnode(happyPathDeploymentId); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(exec).toHaveBeenNthCalledWith( @@ -977,9 +977,9 @@ describe('removeAirnode', () => { ].join(' '), { cwd: 'tmpDir' } ); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket); expect(awsDeleteBucketDirectory).toHaveBeenCalledWith( - bucket.name, + bucket, (mockBucketDirectoryStructure['0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6'] as Directory).children['dev'] ); expect(awsDeleteBucketDirectory).toHaveBeenCalledTimes(1); @@ -989,13 +989,13 @@ describe('removeAirnode', () => { it('deletes the address directory if there are no other deployments with that address', async () => { await infrastructure.removeAirnode(deploymentId); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); expect(exec).toHaveBeenNthCalledWith( @@ -1028,13 +1028,13 @@ describe('removeAirnode', () => { ].join(' '), { cwd: 'tmpDir' } ); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket); expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, (mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory).children['dev'] ); - expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith(2, bucket.name, { + expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith(2, bucket, { ...mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'], children: {}, }); @@ -1049,13 +1049,13 @@ describe('removeAirnode', () => { await infrastructure.removeAirnode(deploymentId); expect(awsGetAirnodeBucketSpy).toHaveBeenCalledWith(); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(1, bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenCalledWith( - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); expect(exec).toHaveBeenNthCalledWith( @@ -1088,18 +1088,18 @@ describe('removeAirnode', () => { ].join(' '), { cwd: 'tmpDir' } ); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenNthCalledWith(2, bucket); expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, (mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'] as Directory).children['dev'] ); - expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith(2, bucket.name, { + expect(awsDeleteBucketDirectory).toHaveBeenNthCalledWith(2, bucket, { ...mockBucketDirectoryStructure['0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace'], children: {}, }); expect(awsDeleteBucketDirectory).toHaveBeenCalledTimes(2); - expect(awsDeleteBucket).toHaveBeenCalledWith(bucket.name); + expect(awsDeleteBucket).toHaveBeenCalledWith(bucket); }); it(`fails if there's no Airnode bucket available`, async () => { @@ -1224,69 +1224,69 @@ describe('listAirnodes', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(gcpGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); expect(gcpGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); }); @@ -1310,36 +1310,36 @@ describe('listAirnodes', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(gcpGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(gcpGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(gcpGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(gcpGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); }); @@ -1438,17 +1438,17 @@ describe('deploymentInfo', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(gcpGetAirnodeBucketSpy).not.toHaveBeenCalled(); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(gcpGetBucketDirectoryStructureSpy).not.toHaveBeenCalled(); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(2); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(gcpGetFileFromBucketSpy).not.toHaveBeenCalled(); @@ -1495,37 +1495,37 @@ describe('deploymentInfo', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(gcpGetAirnodeBucketSpy).not.toHaveBeenCalled(); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(gcpGetBucketDirectoryStructureSpy).not.toHaveBeenCalled(); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); expect(gcpGetFileFromBucketSpy).not.toHaveBeenCalled(); @@ -1602,26 +1602,26 @@ describe('fetchFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(4); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); @@ -1650,26 +1650,26 @@ describe('fetchFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(4); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662557983568/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662557983568/secrets.env' ); @@ -1733,36 +1733,36 @@ describe('fetchFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); }); @@ -1783,16 +1783,16 @@ describe('fetchFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(2); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); }); @@ -1811,26 +1811,26 @@ describe('fetchFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(4); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); }); @@ -1891,26 +1891,26 @@ describe('saveDeploymentFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(4); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662557983568/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662557983568/secrets.env' ); @@ -1953,36 +1953,36 @@ describe('saveDeploymentFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(6); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 3, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 4, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/prod/1662558071950/secrets.env' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 5, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 6, - bucket.name, + bucket, '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace/dev/1662559204554/secrets.env' ); }); @@ -2003,16 +2003,16 @@ describe('saveDeploymentFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(2); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); }); @@ -2057,16 +2057,16 @@ describe('saveDeploymentFiles', () => { expect(awsGetAirnodeBucketSpy).toHaveBeenCalledTimes(1); expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledTimes(1); - expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket.name); + expect(awsGetBucketDirectoryStructureSpy).toHaveBeenCalledWith(bucket); expect(awsGetFileFromBucketSpy).toHaveBeenCalledTimes(2); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 1, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/config.json' ); expect(awsGetFileFromBucketSpy).toHaveBeenNthCalledWith( 2, - bucket.name, + bucket, '0xd0624E6C2C8A1DaEdE9Fa7E9C409167ed5F256c6/dev/1662558010204/secrets.env' ); }); diff --git a/packages/airnode-deployer/src/infrastructure/index.ts b/packages/airnode-deployer/src/infrastructure/index.ts index e80521306e..dd19d67757 100644 --- a/packages/airnode-deployer/src/infrastructure/index.ts +++ b/packages/airnode-deployer/src/infrastructure/index.ts @@ -351,7 +351,7 @@ export const deployAirnode = async (config: Config, configPath: string, secretsP logger.debug(`Using Airnode bucket '${bucket.name}'`); logger.debug('Fetching Airnode bucket content'); - const directoryStructure = await cloudProviderLib[type].getBucketDirectoryStructure(bucket.name); + const directoryStructure = await cloudProviderLib[type].getBucketDirectoryStructure(bucket); const bucketStagePath = `${airnodeAddress}/${stage}`; const bucketDeploymentPath = `${bucketStagePath}/${timestamp}`; @@ -377,7 +377,7 @@ export const deployAirnode = async (config: Config, configPath: string, secretsP const bucketConfigPath = `${bucketStagePath}/${latestDeployment}/config.json`; logger.debug(`Fetching configuration file '${bucketConfigPath}'`); const goGetRemoteConfigFileFromBucket = await go(() => - cloudProviderLib[type].getFileFromBucket(bucket!.name, bucketConfigPath) + cloudProviderLib[type].getFileFromBucket(bucket!, bucketConfigPath) ); if (!goGetRemoteConfigFileFromBucket.success) { throw new Error(`Failed to fetch configuration file. Error: ${goGetRemoteConfigFileFromBucket.error.message}`); @@ -404,7 +404,7 @@ export const deployAirnode = async (config: Config, configPath: string, secretsP const latestBucketTerraformStatePath = `${bucketStagePath}/${latestDeployment}/${TF_STATE_FILENAME}`; const newBucketTerraformStatePath = `${bucketDeploymentPath}/${TF_STATE_FILENAME}`; await cloudProviderLib[type].copyFileInBucket( - bucket.name, + bucket, latestBucketTerraformStatePath, newBucketTerraformStatePath ); @@ -412,11 +412,11 @@ export const deployAirnode = async (config: Config, configPath: string, secretsP logger.debug(`Storing configuration file for new deployment ${bucketDeploymentPath}`); const bucketConfigPath = `${bucketDeploymentPath}/config.json`; - await cloudProviderLib[type].storeFileToBucket(bucket.name, bucketConfigPath, configPath); + await cloudProviderLib[type].storeFileToBucket(bucket, bucketConfigPath, configPath); logger.debug(`Storing secrets file for new deployment ${bucketDeploymentPath}`); const bucketSecretsPath = `${bucketDeploymentPath}/secrets.env`; - await cloudProviderLib[type].storeFileToBucket(bucket.name, bucketSecretsPath, secretsPath); + await cloudProviderLib[type].storeFileToBucket(bucket, bucketSecretsPath, secretsPath); logger.debug('Deploying Airnode via Terraform recipes'); const airnodeTmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'airnode')); @@ -486,7 +486,7 @@ async function fetchDeployments(cloudProviderType: CloudProvider['type'], deploy return deployments; } - const directoryStructure = await cloudProviderLib[cloudProviderType].getBucketDirectoryStructure(bucket.name); + const directoryStructure = await cloudProviderLib[cloudProviderType].getBucketDirectoryStructure(bucket); const bucketMissingFiles = getMissingBucketFiles(directoryStructure); for (const [airnodeAddress, addressDirectory] of Object.entries(directoryStructure)) { @@ -524,7 +524,7 @@ async function fetchDeployments(cloudProviderType: CloudProvider['type'], deploy const bucketConfigPath = `${bucketLatestDeploymentPath}/config.json`; logger.debug(`Fetching configuration file '${bucketConfigPath}'`); const goGetConfigFileFromBucket = await go(() => - cloudProviderLib[cloudProviderType].getFileFromBucket(bucket.name, bucketConfigPath) + cloudProviderLib[cloudProviderType].getFileFromBucket(bucket, bucketConfigPath) ); if (!goGetConfigFileFromBucket.success) { logger.warn(`Failed to fetch configuration file. Error: ${goGetConfigFileFromBucket.error.message} Skipping.`); @@ -539,7 +539,7 @@ async function fetchDeployments(cloudProviderType: CloudProvider['type'], deploy logger.debug(`Fetching secrets file '${bucketConfigPath}'`); const bucketSecretsPath = `${bucketLatestDeploymentPath}/secrets.env`; const goGetSecretsFileFromBucket = await go(() => - cloudProviderLib[cloudProviderType].getFileFromBucket(bucket.name, bucketSecretsPath) + cloudProviderLib[cloudProviderType].getFileFromBucket(bucket, bucketSecretsPath) ); if (!goGetSecretsFileFromBucket.success) { logger.warn(`Failed to fetch secrets file. Error: ${goGetSecretsFileFromBucket.error.message} Skipping.`); @@ -626,11 +626,8 @@ async function downloadDeploymentFiles( const configFileBucketPath = `${deploymentPathPrefix}/config.json`; const secretsFileBucketPath = `${deploymentPathPrefix}/secrets.env`; - const configContent = await cloudProviderLib[cloudProviderType].getFileFromBucket(bucket.name, configFileBucketPath); - const secretsContent = await cloudProviderLib[cloudProviderType].getFileFromBucket( - bucket.name, - secretsFileBucketPath - ); + const configContent = await cloudProviderLib[cloudProviderType].getFileFromBucket(bucket, configFileBucketPath); + const secretsContent = await cloudProviderLib[cloudProviderType].getFileFromBucket(bucket, secretsFileBucketPath); return { configContent, secretsContent }; } @@ -678,20 +675,20 @@ export async function removeAirnode(deploymentId: string) { // Refreshing the bucket content because the source code archives were removed by Terraform logger.debug('Refreshing Airnode bucket content'); - const directoryStructure = await cloudProviderLib[cloudProviderType].getBucketDirectoryStructure(bucket.name); + const directoryStructure = await cloudProviderLib[cloudProviderType].getBucketDirectoryStructure(bucket); const addressDirectory = getAddressDirectory(directoryStructure, airnodeAddress) as Directory; const stageDirectory = getStageDirectory(directoryStructure, airnodeAddress, stage) as Directory; // Delete stage directory and its content logger.debug(`Deleting deployment directory '${stageDirectory.bucketKey}' and its content`); - await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket.name, stageDirectory); + await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket, stageDirectory); // eslint-disable-next-line functional/immutable-data delete addressDirectory.children[stage]; // Delete Airnode address directory if empty if (Object.keys(addressDirectory.children).length === 0) { logger.debug(`Deleting Airnode address directory '${addressDirectory.bucketKey}'`); - await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket.name, addressDirectory); + await cloudProviderLib[cloudProviderType].deleteBucketDirectory(bucket, addressDirectory); // eslint-disable-next-line functional/immutable-data delete directoryStructure[airnodeAddress]; } @@ -699,7 +696,7 @@ export async function removeAirnode(deploymentId: string) { // Delete the whole bucket if empty if (Object.keys(directoryStructure).length === 0) { logger.debug(`Deleting Airnode bucket '${bucket.name}'`); - await cloudProviderLib[cloudProviderType].deleteBucket(bucket.name); + await cloudProviderLib[cloudProviderType].deleteBucket(bucket); } }); diff --git a/yarn.lock b/yarn.lock index 4e24b30dab..0451c05532 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,24 @@ resolved "https://registry.yarnpkg.com/@api3/promise-utils/-/promise-utils-0.3.0.tgz#e7ebf92bfd8c1d39983321fc5445070c51fce176" integrity sha512-fH3CzEcsCQjoX6BZ5M+3yRIXZ2zz4/nFdzKUB4wvn3KjvvzvroHFZrzhbKa4mB9E4AS0xnou1AXhlrnN5Fcy+A== +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/crc32c@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" + integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + "@aws-crypto/ie11-detection@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" @@ -30,6 +48,19 @@ dependencies: tslib "^1.11.1" +"@aws-crypto/sha1-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" + integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + "@aws-crypto/sha256-browser@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" @@ -77,6 +108,21 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/chunked-blob-reader-native@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.208.0.tgz#cdbd12c89a4f3ddd91bf707da8bb4af311487cc5" + integrity sha512-JeOZ95PW+fJ6bbuqPySYqLqHk1n4+4ueEEraJsiUrPBV0S1ZtyvOGHcnGztKUjr2PYNaiexmpWuvUve9K12HRA== + dependencies: + "@aws-sdk/util-base64" "3.208.0" + tslib "^2.3.1" + +"@aws-sdk/chunked-blob-reader@3.188.0": + version "3.188.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.188.0.tgz#18181b27511ab512e56b9f2cef30d2abbef639dc" + integrity sha512-zkPRFZZPL3eH+kH86LDYYXImiClA1/sW60zYOjse9Pgka+eDJlvBN6hcYxwDEKjcwATYiSRR1aVQHcfCinlGXg== + dependencies: + tslib "^2.3.1" + "@aws-sdk/client-lambda@^3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.272.0.tgz#9c39f45a9e1fa690ee1600033275faba97591dd2" @@ -119,6 +165,66 @@ "@aws-sdk/util-waiter" "3.272.0" tslib "^2.3.1" +"@aws-sdk/client-s3@^3.272.0": + version "3.276.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.276.0.tgz#0b2c34acb46833054c57218d116fc11b7cd44c5f" + integrity sha512-9cwrYeMTx9a9MUWSxBr2i87NACEw3Vc8ALnDYZSvhps8UivdgZ1v3zN8c0v/g/3RrJJNco2HCs9je+lOPRvq3w== + dependencies: + "@aws-crypto/sha1-browser" "3.0.0" + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.276.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/eventstream-serde-browser" "3.272.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.272.0" + "@aws-sdk/eventstream-serde-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-blob-browser" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/hash-stream-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/md5-js" "3.272.0" + "@aws-sdk/middleware-bucket-endpoint" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-expect-continue" "3.272.0" + "@aws-sdk/middleware-flexible-checksums" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-location-constraint" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-sdk-s3" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-ssec" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4-multi-region" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-stream-browser" "3.272.0" + "@aws-sdk/util-stream-node" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "@aws-sdk/util-waiter" "3.272.0" + "@aws-sdk/xml-builder" "3.201.0" + fast-xml-parser "4.1.2" + tslib "^2.3.1" + "@aws-sdk/client-sso-oidc@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz#32ec5d4bd4d1f343d642a5846dae6e1864cc890c" @@ -237,6 +343,48 @@ fast-xml-parser "4.0.11" tslib "^2.3.1" +"@aws-sdk/client-sts@3.276.0": + version "3.276.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.276.0.tgz#89bc73cfb92807fffac824a3aafe15cf218f2385" + integrity sha512-J6FR4tYa/WdDdwWAKhw/mXQXKWUaZZQpMiyFEbFPQyURSWu3u17nv97NUdvVOgCth48H6Wb6a4ksssYy4K9tFQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-sdk-sts" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + fast-xml-parser "4.1.2" + tslib "^2.3.1" + "@aws-sdk/config-resolver@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz#207af3c70b05c4d93c60fa60201c93dff78802ba" @@ -330,6 +478,51 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/eventstream-codec@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.272.0.tgz#9d5cbc6c2e438eee18eb8532bc4a3cab16315214" + integrity sha512-HYMzglDnqUhvx3u9MdzZ/OjLuavaaH9zF9XMXRuv7bdsN9AAi3/0he0FEx84ZXNXSAZCebLwXJYf0ZrN6g37QA== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + tslib "^2.3.1" + +"@aws-sdk/eventstream-serde-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.272.0.tgz#c8b4a98beb9473db508a4669bd0dc25de4c0c825" + integrity sha512-mE1+mevS+KVKpnTLi5FytsBwAK1kWZ92ERtAiElp58SKE1OpfSg8lEY8VI6JKGlueN540Qq3LeIgA2/HJOcK/w== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/eventstream-serde-config-resolver@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.272.0.tgz#f72ab037404ecb01e35dc619d7971813c269346c" + integrity sha512-e47BhGBvx+me53cvYx+47ml5KNDj7XoTth80krHlyLrimFELE1ij4tHSKR/XzilKKH1uIWmJQdlAi29129ZX5w== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/eventstream-serde-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.272.0.tgz#5f3e97e14419938271a2e62d2f759347a093530a" + integrity sha512-uto8y4FoZugWnczM1TKwv6oV2Po2Jgrp+W1Ws3baRQ4Lan+QpFx3Tps1N5rNzQ+7Uz0xT1BhbSNPAkKs22/jtg== + dependencies: + "@aws-sdk/eventstream-serde-universal" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/eventstream-serde-universal@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.272.0.tgz#3dbc2a92486f3c1772ab1aba52324376cc112013" + integrity sha512-E9jlt8tzDcEMoNlgv3+01jGPJPHmbmw2NsajZhB4axVMpEy247JV6qvCZe+5R+EGy96t0pfsO2naViEB4Va47g== + dependencies: + "@aws-sdk/eventstream-codec" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + "@aws-sdk/fetch-http-handler@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz#52ec2ba4ea25738a91db466a617bd7cc2bd6d2e9" @@ -341,6 +534,16 @@ "@aws-sdk/util-base64" "3.208.0" tslib "^2.3.1" +"@aws-sdk/hash-blob-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.272.0.tgz#c3f71c082f1c3f86fb4f7632e1a9cb418f8d8a03" + integrity sha512-IRCIMG42fXcdD92C8Sb0CQI8D/msxDwHGAIqP94iGhVEnKX2egyx5J8lmPY4gEky5UzyMMaH7cayBv89ZMEBmQ== + dependencies: + "@aws-sdk/chunked-blob-reader" "3.188.0" + "@aws-sdk/chunked-blob-reader-native" "3.208.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + "@aws-sdk/hash-node@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz#a39d80fd118ad306f17191f0565ea4db88aa0563" @@ -351,6 +554,15 @@ "@aws-sdk/util-utf8" "3.254.0" tslib "^2.3.1" +"@aws-sdk/hash-stream-node@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.272.0.tgz#543fb22d16b9fffae8b071f076fcbd39c8822fff" + integrity sha512-mWwQWdfVYoR6PXRLkHP6pC1cghZMg0ULuOAm70EtTO2YXiyLlMIDb+VD4RRbjh3hNkzh+y/W47wSUJthGBM1kg== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + "@aws-sdk/invalid-dependency@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz#93b34dc0f78d0c44a4beae6dc75dde4801915f1c" @@ -366,6 +578,26 @@ dependencies: tslib "^2.3.1" +"@aws-sdk/md5-js@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.272.0.tgz#2f4dc06541a60979bb807c8adc438f13fc3ad958" + integrity sha512-/GK32mgAarhn/F0xCeBKbYfLRof3tOCNrg8mAGNz9Di8E1/qMOnX/OXUGag0lsvNZ6DTjdjln29t4e8iKmOVqA== + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-bucket-endpoint@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.272.0.tgz#79dab44a109c78548593c9ccc2849d8f232996c2" + integrity sha512-523T6JXfjsY9uSgMusa6myCccRv2TWyUSjzMx/0aUHfHRacJSunfPtSNX1kfYxXWn/ByWhaieHFBPehVI6wg1A== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-arn-parser" "3.208.0" + "@aws-sdk/util-config-provider" "3.208.0" + tslib "^2.3.1" + "@aws-sdk/middleware-content-length@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz#400532904c505d3478ddf5c8fe1d703692ea87e8" @@ -389,6 +621,28 @@ "@aws-sdk/util-middleware" "3.272.0" tslib "^2.3.1" +"@aws-sdk/middleware-expect-continue@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.272.0.tgz#08e21704657347fcf8517c7aeddcc7cf62765ea0" + integrity sha512-TNx61LCZUKp/yZqcb38qb4tU3lbhKaI9zn2FQ+fpKzUSTI3H6E5aw42wHaq2LEacYlyK3b5Wg1R0sKR+vsUutw== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + +"@aws-sdk/middleware-flexible-checksums@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.272.0.tgz#61487b490a15ef5ed95d64bcde04297c30f7d411" + integrity sha512-dc/tMiYM4wTZpjXf2PSQCFD4SQI5wyVwY5SoBgcB3W2XLq1SzXahiDnnUSn2EzDTKPIrmQmYyDFRpFEPo0sP/g== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-crypto/crc32c" "3.0.0" + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + "@aws-sdk/middleware-host-header@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz#c47b8d35be6d5fbc548378b4694bf705adaae74d" @@ -398,6 +652,14 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/middleware-location-constraint@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.272.0.tgz#5f6b54479b2f0526288ea767e503349d382fa971" + integrity sha512-tROQ1DM9djxfXmXPTT0XietrUt6y6QEHShPI9rQMstjXYiaHBVXRveuRLcLAKwl4nXIrgmnIU7ygyj2ZyD8gcA== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + "@aws-sdk/middleware-logger@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz#372e2514b17b826a2b40562667e2543125980705" @@ -428,6 +690,16 @@ tslib "^2.3.1" uuid "^8.3.2" +"@aws-sdk/middleware-sdk-s3@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.272.0.tgz#174c41fec71611b0b41c185c66c63a32e8f9e021" + integrity sha512-uMvoLePkyP54b9BckMELlDnFh0SGPAfTkBwiH/FC79K7noGLA5A4KgqKObtB9LPYHkPfm1WLqIgdaE6gS1BlFQ== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-arn-parser" "3.208.0" + tslib "^2.3.1" + "@aws-sdk/middleware-sdk-sts@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz#aa437331f958e3af3b4bec7951256d0f34a8d431" @@ -460,6 +732,14 @@ "@aws-sdk/util-middleware" "3.272.0" tslib "^2.3.1" +"@aws-sdk/middleware-ssec@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.272.0.tgz#fa4a0e19df3bbec515794e6398b9656ab91ec8c9" + integrity sha512-WDPcNPkscTmJUzdAvfx8p+YuUn2YR9ocmZA7yYUJ5kA94MyGH6Rbjp8tleWwQvah/HweeCQrYUzJk9wsH64LPA== + dependencies: + "@aws-sdk/types" "3.272.0" + tslib "^2.3.1" + "@aws-sdk/middleware-stack@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz#e62048e47b8ce2ff71d6d32234b6c0be70b0b008" @@ -543,6 +823,31 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/signature-v4-crt@^3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.272.0.tgz#ff3bb4468c466c5effe3b3706b9c4e72c7291546" + integrity sha512-egTOzuMoQvKXR8B1kT0Ym6He0BrADj5S2nJxhmIqmuANLXulUVfi9yxdlPfI9eWGimzOCzVsyd8Pl7HYU67FSA== + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/querystring-parser" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + aws-crt "^1.15.9" + tslib "^2.3.1" + +"@aws-sdk/signature-v4-multi-region@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.272.0.tgz#4018ed214b7c45f19b38391c0d70bf6362e2270e" + integrity sha512-nir/ICA3saE303tS+DuJ803Uocn/d3hOpOl5DqI9RDjaZxbTXwv9uHP+by8sdyyfwCE8TFaYWoiSW5rLI+Qt0g== + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-arn-parser" "3.208.0" + tslib "^2.3.1" + "@aws-sdk/signature-v4@3.272.0": version "3.272.0" resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz#751895d68c1d1122f1e9a0148146dbdf9db023ae" @@ -592,6 +897,13 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/util-arn-parser@3.208.0": + version "3.208.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.208.0.tgz#56b6ae4699c3140bb27dcede5146876fef04e823" + integrity sha512-QV4af+kscova9dv4VuHOgH8wEr/IIYHDGcnyVtkUEqahCejWr1Kuk+SBK0xMwnZY5LSycOtQ8aeqHOn9qOjZtA== + dependencies: + tslib "^2.3.1" + "@aws-sdk/util-base64@3.208.0": version "3.208.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz#36b430e5396251f761590f7c2f0c5c12193f353c" @@ -688,6 +1000,28 @@ "@aws-sdk/service-error-classification" "3.272.0" tslib "^2.3.1" +"@aws-sdk/util-stream-browser@3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.272.0.tgz#614fec601c6e4193c98739e6daae3aa1a53f6990" + integrity sha512-vD514YffKxBjV/erjUNgkXcb/mzXAz3uk/KUFMXsodo3cA4Z8WxL4P0p1O09FVuJlNa0gZ8mhFPNzNOekh31GA== + dependencies: + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-utf8" "3.254.0" + tslib "^2.3.1" + +"@aws-sdk/util-stream-node@3.272.0", "@aws-sdk/util-stream-node@^3.272.0": + version "3.272.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.272.0.tgz#19e2bd5f71c3493dd06c3d37408fa9bda37995f6" + integrity sha512-s7dGeM1ImzihqBKgrpaeZokLnPUk3H4Et5oiM+t+TpRxotXTecJPyuD0p76HRgO8KSXfVT5Nxw/FoHXqj1fiMg== + dependencies: + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-buffer-from" "3.208.0" + tslib "^2.3.1" + "@aws-sdk/util-uri-escape@3.201.0": version "3.201.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz#5e708d4cde001a4558ee616f889ceacfadd2ab03" @@ -713,7 +1047,7 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@^3.0.0": +"@aws-sdk/util-utf8-browser@^3.0.0", "@aws-sdk/util-utf8-browser@^3.109.0": version "3.259.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== @@ -737,6 +1071,13 @@ "@aws-sdk/types" "3.272.0" tslib "^2.3.1" +"@aws-sdk/xml-builder@3.201.0": + version "3.201.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.201.0.tgz#acf0869855460528114bec17f290b224fe19a3e2" + integrity sha512-brRdB1wwMgjWEnOQsv7zSUhIQuh7DEicrfslAqHop4S4FtSI3GQAShpQqgOpMTNFYcpaWKmE/Y1MJmNY7xLCnw== + dependencies: + tslib "^2.3.1" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -2018,6 +2359,20 @@ teeny-request "^8.0.0" uuid "^8.0.0" +"@httptoolkit/websocket-stream@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz#8d732f1509860236276f6b0759db4cc9859bbb62" + integrity sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ== + dependencies: + "@types/ws" "*" + duplexify "^3.5.1" + inherits "^2.0.1" + isomorphic-ws "^4.0.1" + readable-stream "^2.3.3" + safe-buffer "^5.1.2" + ws "*" + xtend "^4.0.0" + "@humanwhocodes/config-array@^0.11.8": version "0.11.8" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" @@ -3565,6 +3920,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/ws@*": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -4039,6 +4401,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" @@ -4073,6 +4440,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi@^0.3.0, ansi@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + integrity sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A== + antlr4@^4.11.0: version "4.12.0" resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.12.0.tgz#e2323fbb057c77068a174914b0533398aeaba56a" @@ -4104,6 +4476,14 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +are-we-there-yet@~1.0.0: + version "1.0.6" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz#a2d28c93102aa6cc96245a26cb954de06ec53f0c" + integrity sha512-Zfw6bteqM9gQXZ1BIWOgM8xEwMrUGoyL8nW13+O+OOgNX3YhuDN1GDgg1NzdTlmm3j+9sHy7uBZ12r+z9lXnZQ== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -4314,39 +4694,36 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +aws-crt@^1.15.9: + version "1.15.9" + resolved "https://registry.yarnpkg.com/aws-crt/-/aws-crt-1.15.9.tgz#f603109bcf1bef3e27346c04367075f5be021078" + integrity sha512-tInTJwASvrj+iIQZd+p/S3fUf2nWp3mNQv+TJHndZIllCQg3tcy8vF6pkXR++3fF/eAIOYnr7adf7z2/JneJ8g== + dependencies: + "@aws-sdk/util-utf8-browser" "^3.109.0" + "@httptoolkit/websocket-stream" "^6.0.0" + axios "^0.24.0" + cmake-js "^6.3.2" + crypto-js "^4.0.0" + mqtt "^4.3.7" + tar "^6.1.11" + aws-sdk-client-mock-jest@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.1.0.tgz#93031b4f92d42edd79a063f7b02c4b240e7d779a" - integrity sha512-2HcKQA0kMKi0Lp2ynq/u3trEKDIreXU3wyY9xyeVcbEC5Q2Bw8oWX4ovIZgmvdJHif/IvM7ABcvp/mpBNfyTYQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.0.1.tgz#734cf348d35e262599a2f360c76c7b6618e46a60" + integrity sha512-mQN3rWzk+b9+kxMAeV9fxu8+lDOFpmvBc+dgU9Sd+HkF+0Sl9O9upFRS7NudyVDcq7KF/30jsC2Dju2Q28nlIw== dependencies: "@types/jest" "^28.1.3" tslib "^2.1.0" aws-sdk-client-mock@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.0.tgz#58247c0fb651cddedbd093c0c06d6bc0caf82e89" - integrity sha512-JkrPrcEvQ4JwylVdQ0njYQMFVwVaZzoVc557rsCorIMjEtmrFvlVYEfIKWoYw8psU4cLjOMyqpxg65NcAn9fvQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/aws-sdk-client-mock/-/aws-sdk-client-mock-2.0.1.tgz#c37ec569fa88688d8d88d7a7f028af26d6d2086e" + integrity sha512-Ib/AnI8ZdoIxOBbKSs28TUwJb7FI/AYVYn48PcXx6guk5fBs4GZJJEc+Ci9aImRtVmgO6jHN/6Etz17fr6j3qw== dependencies: "@types/sinon" "^10.0.10" sinon "^14.0.2" tslib "^2.1.0" -aws-sdk@^2.1333.0: - version "2.1333.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1333.0.tgz#02ecd59499e364584efb08196d6147873d6328a9" - integrity sha512-MvOuleNeRryJtkCGXGEWDHPqqgxuqdi4/hGzJEpn9tnjsW9LNK8UgFPpYzUZ24ZO/3S+jiUh8DMMrL5nVGnagg== - dependencies: - buffer "4.9.2" - events "1.1.1" - ieee754 "1.1.13" - jmespath "0.16.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - util "^0.12.4" - uuid "8.0.0" - xml2js "0.4.19" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -4364,7 +4741,23 @@ axios@^0.21.0, axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -axios@^1.0.0, axios@^1.3.4: +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +axios@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" + integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axios@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== @@ -4445,7 +4838,7 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4481,6 +4874,11 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" +big-integer@^1.6.17: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4508,6 +4906,14 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + bip39@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" @@ -4518,7 +4924,7 @@ bip39@3.0.4: pbkdf2 "^3.0.9" randombytes "^2.0.1" -bl@^4.0.3, bl@^4.1.0: +bl@^4.0.2, bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4537,6 +4943,16 @@ blessed@0.1.81: resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ== +bluebird@^3: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== + bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -4699,6 +5115,16 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -4711,15 +5137,6 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -4736,6 +5153,11 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== + bufferutil@4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" @@ -4818,6 +5240,11 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw== + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -4863,6 +5290,13 @@ chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.5" +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== + dependencies: + traverse ">=0.3.0 <0.4" + chalk@3.0.0, chalk@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4951,6 +5385,11 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -5037,6 +5476,15 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -5098,6 +5546,28 @@ cloudevents@^6.0.0: util "^0.12.4" uuid "^8.3.2" +cmake-js@^6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-6.3.2.tgz#4ee827bea99205e1bfda86f5883994873af357b6" + integrity sha512-7MfiQ/ijzeE2kO+WFB9bv4QP5Dn2yVaAP2acFJr4NIFy2hT4w6O4EpOTLNcohR5IPX7M4wNf/5taIqMj7UA9ug== + dependencies: + axios "^0.21.1" + bluebird "^3" + debug "^4" + fs-extra "^5.0.0" + is-iojs "^1.0.1" + lodash "^4" + memory-stream "0" + npmlog "^1.2.0" + rc "^1.2.7" + semver "^5.0.3" + splitargs "0" + tar "^4" + unzipper "^0.8.13" + url-join "0" + which "^1.0.9" + yargs "^3.6.0" + cmd-shim@5.0.0, cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" @@ -5110,6 +5580,11 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" @@ -5235,6 +5710,14 @@ comment-json@^4.2.3: has-own-prop "^2.0.0" repeat-string "^1.6.1" +commist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" + integrity sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg== + dependencies: + leven "^2.1.0" + minimist "^1.1.0" + common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -5535,6 +6018,11 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +crypto-js@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + csv-generate@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" @@ -5631,7 +6119,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1: +debug@4, debug@4.3.4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5658,7 +6146,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0, decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5680,7 +6168,7 @@ deep-eql@^4.1.2: dependencies: type-detect "^4.0.0" -deep-extend@~0.6.0: +deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== @@ -5881,12 +6369,29 @@ dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== + dependencies: + readable-stream "^2.0.2" + duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^4.0.0: +duplexify@^3.5.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +duplexify@^4.0.0, duplexify@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw== @@ -6000,7 +6505,7 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -6617,11 +7122,6 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== - events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -6817,6 +7317,13 @@ fast-xml-parser@4.0.11: dependencies: strnum "^1.0.5" +fast-xml-parser@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" + integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== + dependencies: + strnum "^1.0.5" + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -6964,7 +7471,7 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.0: +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.4, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -7081,6 +7588,15 @@ fs-extra@^11.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -7099,6 +7615,13 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -7126,6 +7649,16 @@ fsevents@~2.1.1: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fstream@~1.0.10: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + ftp@^0.3.10: version "0.3.10" resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -7190,6 +7723,17 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +gauge@~1.2.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + integrity sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA== + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + gaxios@^5.0.0, gaxios@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.0.tgz#133b77b45532be71eec72012b7e97c2320b6140a" @@ -7444,7 +7988,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7752,7 +8296,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@2.0.1, has-unicode@^2.0.1: +has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== @@ -7799,6 +8343,14 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== +help-me@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-3.0.0.tgz#9803c81b5f346ad2bce2c6a0ba01b82257d319e8" + integrity sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ== + dependencies: + glob "^7.1.6" + readable-stream "^3.6.0" + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -7943,12 +8495,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -8024,12 +8571,12 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -8087,6 +8634,11 @@ interpret@^3.1.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -8201,6 +8753,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -8245,6 +8804,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-iojs@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-iojs/-/is-iojs-1.1.0.tgz#4c11033b5d5d94d6eab3775dedc9be7d008325f1" + integrity sha512-tLn1j3wYSL6DkvEI+V/j0pKohpa5jk+ER74v6S4SgCXnjS0WA+DoZbwZBrrhgwksMvtuwndyGeG5F8YMsoBzSA== + is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -8409,7 +8973,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -8424,6 +8988,11 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -8903,11 +9472,6 @@ jest@^29.5.0: import-local "^3.0.2" jest-cli "^29.5.0" -jmespath@0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" - integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== - js-git@^0.7.8: version "0.7.8" resolved "https://registry.yarnpkg.com/js-git/-/js-git-0.7.8.tgz#52fa655ab61877d6f1079efc6534b554f31e5444" @@ -8918,7 +9482,7 @@ js-git@^0.7.8: git-sha1 "^0.1.2" pako "^0.2.5" -js-sdsl@^4.1.4: +js-sdsl@4.3.0, js-sdsl@^4.1.4: version "4.3.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== @@ -9163,6 +9727,13 @@ lazy@~1.0.11: resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== + dependencies: + invert-kv "^1.0.0" + lerna@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.5.1.tgz#eb89698e5b2891f5681f39d980f63d0519fc464f" @@ -9337,6 +9908,11 @@ levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -9401,6 +9977,11 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== + load-json-file@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" @@ -9500,6 +10081,21 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + integrity sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg== + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + integrity sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw== + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + integrity sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw== + lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" @@ -9510,7 +10106,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9679,6 +10275,13 @@ memdown@^5.0.0: ltgt "~2.2.0" safe-buffer "~5.2.0" +memory-stream@0: + version "0.0.3" + resolved "https://registry.yarnpkg.com/memory-stream/-/memory-stream-0.0.3.tgz#ebe8dd1c3b8bc38c0e7941e9ddd5aebe6b4de83f" + integrity sha512-q0D3m846qY6ZkIt+19ZemU5vH56lpOZZwoJc3AICARKh/menBuayQUjAGPrqtHQQMUYERSdOrej92J9kz7LgYA== + dependencies: + readable-stream "~1.0.26-2" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -9859,11 +10462,16 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: +minimist@^1.1.0, minimist@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -9911,6 +10519,14 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" @@ -9923,6 +10539,13 @@ minipass@^4.0.0, minipass@^4.0.2, minipass@^4.2.4: resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -9952,7 +10575,7 @@ mkdirp@0.5.5: dependencies: minimist "^1.2.5" -mkdirp@0.5.x, mkdirp@^0.5.1: +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -10079,6 +10702,38 @@ morgan@^1.10.0: on-finished "~2.3.0" on-headers "~1.0.2" +mqtt-packet@^6.8.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz#c8b507832c4152e3e511c0efa104ae4a64cd418f" + integrity sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA== + dependencies: + bl "^4.0.2" + debug "^4.1.1" + process-nextick-args "^2.0.1" + +mqtt@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-4.3.7.tgz#42985ca490ea25d2c12c119d83c632db6dc9d589" + integrity sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw== + dependencies: + commist "^1.0.0" + concat-stream "^2.0.0" + debug "^4.1.1" + duplexify "^4.1.1" + help-me "^3.0.0" + inherits "^2.0.3" + lru-cache "^6.0.0" + minimist "^1.2.5" + mqtt-packet "^6.8.0" + number-allocator "^1.0.9" + pump "^3.0.0" + readable-stream "^3.6.0" + reinterval "^1.1.0" + rfdc "^1.3.0" + split2 "^3.1.0" + ws "^7.5.5" + xtend "^4.0.2" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -10446,6 +11101,15 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-1.2.1.tgz#28e7be619609b53f7ad1dd300a10d64d716268b6" + integrity sha512-1J5KqSRvESP6XbjPaXt2H6qDzgizLTM7x0y1cXIjP2PpvdCqyNC7TO3cPRKsuYlElbi/DwkzRRdG2zpmE0IktQ== + dependencies: + ansi "~0.3.0" + are-we-there-yet "~1.0.0" + gauge "~1.2.0" + npmlog@^6.0.0, npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -10464,6 +11128,19 @@ nssocket@0.6.0: eventemitter2 "~0.4.14" lazy "~1.0.11" +number-allocator@^1.0.9: + version "1.0.14" + resolved "https://registry.yarnpkg.com/number-allocator/-/number-allocator-1.0.14.tgz#1f2e32855498a7740dcc8c78bed54592d930ee4d" + integrity sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA== + dependencies: + debug "^4.3.1" + js-sdsl "4.3.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -10606,7 +11283,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -10668,6 +11345,13 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + dependencies: + lcid "^1.0.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -11192,7 +11876,12 @@ prettier-plugin-solidity@^1.1.3: semver "^7.3.8" solidity-comments-extractor "^0.0.7" -prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3, prettier@^2.8.4: +prettier@^2.3.1, prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +prettier@^2.8.3, prettier@^2.8.4: version "2.8.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== @@ -11221,11 +11910,16 @@ proc-log@^2.0.0, proc-log@^2.0.1: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== -process-nextick-args@~2.0.0: +process-nextick-args@^2.0.1, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -11335,6 +12029,14 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -11421,6 +12123,16 @@ raw-body@2.5.2, raw-body@^2.2.0, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -11536,10 +12248,10 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== +readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -11549,7 +12261,7 @@ readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~1.0.31: +readable-stream@~1.0.26-2, readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== @@ -11559,6 +12271,19 @@ readable-stream@~1.0.31: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + integrity sha512-NkXT2AER7VKXeXtJNSaWLpWIhmtSE3K2PguaLEeWr4JILghcIKqoLt1A3wHrnpDC5+ekf8gfk1GKWkFXe4odMw== + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -11636,6 +12361,11 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +reinterval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" + integrity sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ== + repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -11809,7 +12539,12 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.2.8: +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@2, rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -11905,12 +12640,7 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== - -sax@>=0.6.0, sax@^1.2.4: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11973,7 +12703,7 @@ semaphore-async-await@^1.5.1: resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12055,7 +12785,7 @@ setimmediate@1.0.4: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== -setimmediate@^1.0.5: +setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== @@ -12372,7 +13102,7 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== -split2@^3.0.0: +split2@^3.0.0, split2@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== @@ -12386,6 +13116,11 @@ split@^1.0.0: dependencies: through "2" +splitargs@0: + version "0.0.7" + resolved "https://registry.yarnpkg.com/splitargs/-/splitargs-0.0.7.tgz#fe9f7ae657371b33b10cb80da143cf8249cf6b3b" + integrity sha512-UUFYD2oWbNwULH6WoVtLUOw8ch586B+HUqcsAjjjeoBQAM1bD4wZRXu01koaxyd8UeYpybWqW4h+lO1Okv40Tg== + sprintf-js@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -12479,6 +13214,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + "string-width@^1.0.2 || 2", string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -12551,6 +13295,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -12601,7 +13352,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1: +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== @@ -12740,6 +13491,19 @@ tar@6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" +tar@^4: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + tar@^6.1.11, tar@^6.1.2: version "6.1.13" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" @@ -12899,6 +13663,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== + treeverse@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" @@ -13229,6 +13998,21 @@ untildify@^4.0.0: resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== +unzipper@^0.8.13: + version "0.8.14" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.8.14.tgz#ade0524cd2fc14d11b8de258be22f9d247d3f79b" + integrity sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "~1.0.10" + listenercount "~1.0.1" + readable-stream "~2.1.5" + setimmediate "~1.0.4" + upath@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" @@ -13249,13 +14033,10 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" +url-join@0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" + integrity sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw== url@^0.11.0: version "0.11.0" @@ -13303,11 +14084,6 @@ uuid@2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== -uuid@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.0.0.tgz#bc6ccf91b5ff0ac07bbcdbf1c7c4e150db4dbb6c" - integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== - uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -13565,7 +14341,7 @@ which-typed-array@^1.1.2, which-typed-array@^1.1.9: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: +which@1.3.1, which@^1.0.9, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -13598,6 +14374,11 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw== + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -13621,6 +14402,14 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -13699,29 +14488,21 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +ws@*: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + ws@7.4.6, ws@~7.4.0: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.0.0, ws@^7.4.6: +ws@^7.0.0, ws@^7.4.6, ws@^7.5.5: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xml2js@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ== - xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" @@ -13732,11 +14513,16 @@ xregexp@2.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -13752,7 +14538,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -13884,6 +14670,19 @@ yargs@^17.1.1, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^3.6.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg== + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 1ae85d7d38b4a1341f07c353b087ebc0c0ae050c Mon Sep 17 00:00:00 2001 From: Michal Kimle Date: Fri, 24 Feb 2023 10:03:13 +0100 Subject: [PATCH 3/3] Add changeset --- .changeset/hot-timers-act.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/hot-timers-act.md diff --git a/.changeset/hot-timers-act.md b/.changeset/hot-timers-act.md new file mode 100644 index 0000000000..cb60c7a76f --- /dev/null +++ b/.changeset/hot-timers-act.md @@ -0,0 +1,6 @@ +--- +'@api3/airnode-deployer': minor +'@api3/airnode-node': minor +--- + +AWS SDK update