From 28ba7d15af9168bfb97ece65a20834d11152bf7b Mon Sep 17 00:00:00 2001 From: Hugo Lewenhaupt Date: Sun, 5 Nov 2023 21:37:38 +0100 Subject: [PATCH] feat: Support Python lambdas --- .github/workflows/build.yml | 8 +- .projen/tasks.json | 41 +- .projenrc.js.bak | 7 + API.md | 11 - common/SpyEventSender.ts | 138 +- common/spyEvents/FunctionConsole.ts | 1 + extension/interceptor.ts | 6 + extensions/python/__init__.py | 0 extensions/python/interceptor.py | 358 + extensions/python/requirements.txt | 4 + extensions/spy-wrapper/spy-wrapper | 4 + functions/sendMessage.ts | 8 +- listener/ServerlessSpyListenerParams.ts | 2 +- listener/SpyHandlers.ts.ts | 2 +- listener/WsListener.ts | 117 +- listener/iot-connection.ts | 69 + package-lock.json | 9936 ++++++++++++----- package.json | 58 +- src/ServerlessSpy.ts | 277 +- src/common/envVariableNames.ts | 5 + src/tsconfig.esm.json | 33 + test/cdk/.projen/tasks.json | 6 +- test/cdk/.projenrc.js.bak | 8 +- test/cdk/functions/python/dummy.py | 2 + test/cdk/functions/python/lambda.py | 3 + test/cdk/functions/python/lambdaFail.py | 2 + test/cdk/package.json | 16 +- .../ServerlessSpyEventsEventBridgeToLambda.ts | 4 + .../ServerlessSpyEventsPythonLambda.ts | 11 + .../ServerlessSpyEventsSnsToLambda.ts | 5 + .../ServerlessSpyEventsSqsToLambda.ts | 5 + test/cdk/src/eventBridgeToLambdaStack.ts | 14 +- test/cdk/src/main.ts | 5 + test/cdk/src/pythonLambdaStack.ts | 50 + test/cdk/src/snsToLambdaStack.ts | 10 + test/cdk/src/sqsToLambdaStack.ts | 15 + test/cdk/test/__snapshots__/e2e.test.ts.snap | 2486 ++--- .../test/__snapshots__/esmLambda.test.ts.snap | 2486 ++--- .../eventBridgeToLambda.test.ts.snap | 1235 +- .../test/__snapshots__/lambda.test.ts.snap | 2486 ++--- .../lambdaToDynamoDb.test.ts.snap | 950 +- .../lambdaToEventBridge.test.ts.snap | 942 +- .../__snapshots__/lambdaToS3.test.ts.snap | 1068 +- .../__snapshots__/lambdaToSnS.test.ts.snap | 928 +- .../__snapshots__/lambdaToSqs.test.ts.snap | 900 +- .../__snapshots__/pythonLambda.test.ts.snap | 355 + .../__snapshots__/snsToLambda.test.ts.snap | 1279 +-- .../test/__snapshots__/snsToSqs.test.ts.snap | 1178 +- test/cdk/test/__snapshots__/sqs.test.ts.snap | 920 +- .../__snapshots__/sqsToLambda.test.ts.snap | 998 +- test/cdk/test/e2e.test.ts | 2 +- test/cdk/test/esmLambda.test.ts | 2 +- test/cdk/test/eventBridgeToLambda.test.ts | 23 +- test/cdk/test/lambda.test.ts | 2 +- test/cdk/test/lambdaToDynamoDb.test.ts | 2 +- test/cdk/test/lambdaToEventBridge.test.ts | 2 +- test/cdk/test/lambdaToS3.test.ts | 2 +- test/cdk/test/lambdaToSnS.test.ts | 2 +- test/cdk/test/lambdaToSqs.test.ts | 2 +- test/cdk/test/pythonLambda.test.ts | 388 + test/cdk/test/snsToLambda.test.ts | 37 +- test/cdk/test/snsToSqs.test.ts | 6 +- test/cdk/test/sqs.test.ts | 2 +- test/cdk/test/sqsToLambda.test.ts | 38 +- test/cdk/tsconfig.esm.json | 3 +- tsconfig.json | 3 +- tsconfig.npm.json | 13 +- 67 files changed, 13062 insertions(+), 16919 deletions(-) create mode 100644 extensions/python/__init__.py create mode 100644 extensions/python/interceptor.py create mode 100644 extensions/python/requirements.txt create mode 100755 extensions/spy-wrapper/spy-wrapper create mode 100644 listener/iot-connection.ts create mode 100644 src/tsconfig.esm.json create mode 100644 test/cdk/functions/python/dummy.py create mode 100644 test/cdk/functions/python/lambda.py create mode 100644 test/cdk/functions/python/lambdaFail.py create mode 100644 test/cdk/serverlessSpyEvents/ServerlessSpyEventsPythonLambda.ts create mode 100644 test/cdk/src/pythonLambdaStack.ts create mode 100644 test/cdk/test/__snapshots__/pythonLambda.test.ts.snap create mode 100644 test/cdk/test/pythonLambda.test.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b81c91d..d54524b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,12 @@ jobs: with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} + - name: Configure AWS credentials from Test account + uses: aws-actions/configure-aws-credentials@v4 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_REGION }} - uses: actions/setup-node@v3 with: node-version: 16 @@ -50,8 +56,6 @@ jobs: with: name: build-artifact path: dist - container: - image: jsii/superchain:1-buster-slim-node14 self-mutation: needs: build runs-on: ubuntu-latest diff --git a/.projen/tasks.json b/.projen/tasks.json index a28ae41..cdfa232 100644 --- a/.projen/tasks.json +++ b/.projen/tasks.json @@ -6,7 +6,7 @@ "steps": [ { "exec": "rm -rf lib" - }, + }, { "spawn": "pre-compile" }, @@ -109,7 +109,7 @@ "compile-cli-web": { "name": "compile-cli-web", "description": "Compile TS for CLI web console", - "steps": [ + "steps": [ { "exec": "esbuild --bundle --platform=browser --sourcemap cli/webServerlessSpy.ts --outdir=lib/cli" } @@ -118,7 +118,7 @@ "compile": { "name": "compile", "description": "Only compile", - "steps": [ + "steps": [ { "exec": "rm -rf lib && rm -rf temp" }, @@ -130,7 +130,7 @@ }, { "exec": "mv lib temp" - }, + }, { "exec": "tsc --project tsconfig.npm.json --module esnext --outDir lib" }, @@ -142,31 +142,37 @@ }, { "exec": "cp -rlf temp/* lib/src" - }, + }, { "spawn": "bundle-extension" - }, + }, + { + "exec": "mkdir lib/extensions" + }, + { + "spawn": "bundle-python-extension" + }, { "spawn": "compile-cli-web" - }, + }, { "exec": "cp -rlf cli/* lib/cli" }, { "exec": "rm -rf temp" - } + } ] }, "cli": { "name": "cli", "description": "Run cli", - "steps": [ + "steps": [ { "spawn": "compile-cli-web" - }, + }, { "exec": "esr cli/cli.ts --cdkoutput ../test/cdk/cdkOutput.json" - } + } ] }, "bundle-extension": { @@ -178,6 +184,15 @@ } ] }, + "bundle-python-extension": { + "name": "bundle-python-extension", + "description": "Bundle ptyhon extension", + "steps": [ + { + "exec": "cp -rlf extensions/python lib/extensions/python" + } + ] + }, "docgen": { "name": "docgen", "description": "Generate API.md from .jsii manifest", @@ -328,7 +343,7 @@ }, { "exec": "npm-check-updates --dep prod --upgrade --target=minor" - }, + }, { "exec": "npm run upgrade -w test/cdk" }, @@ -337,7 +352,7 @@ }, { "exec": "npm update" - }, + }, { "spawn": "post-upgrade" } diff --git a/.projenrc.js.bak b/.projenrc.js.bak index 776ddd3..fc2f1f6 100644 --- a/.projenrc.js.bak +++ b/.projenrc.js.bak @@ -25,6 +25,13 @@ const project = new awscdk.AwsCdkConstructLibrary({ singleQuote: true, }, }, + jestOptions: { + jestConfig: { + moduleNameMapper: { + ['^aws-cdk-lib/.warnings.jsii.js$']: '/node_modules/aws-cdk-lib/.warnings.jsii.js', + }, + }, + }, // deps: [], /* Runtime dependencies of this module. */ // description: undefined, /* The description is just a string that helps people understand the purpose of the package. */ diff --git a/API.md b/API.md index a3e973b..c27b311 100644 --- a/API.md +++ b/API.md @@ -147,7 +147,6 @@ Any object. | --- | --- | --- | | node | constructs.Node | The tree node. | | serviceKeys | string[] | *No description.* | -| wsUrl | string | *No description.* | --- @@ -173,16 +172,6 @@ public readonly serviceKeys: string[]; --- -##### `wsUrl`Required - -```typescript -public readonly wsUrl: string; -``` - -- *Type:* string - ---- - ## Structs diff --git a/common/SpyEventSender.ts b/common/SpyEventSender.ts index a4db602..21bf080 100644 --- a/common/SpyEventSender.ts +++ b/common/SpyEventSender.ts @@ -1,15 +1,5 @@ -import { - ApiGatewayManagementApi, - PostToConnectionCommand, -} from '@aws-sdk/client-apigatewaymanagementapi'; -import { - AttributeValue, - DeleteItemCommand, - DynamoDBClient, - ScanCommand, -} from '@aws-sdk/client-dynamodb'; - import { unmarshall } from '@aws-sdk/util-dynamodb'; +import iot from 'aws-iot-device-sdk'; import { DynamoDBStreamEvent, S3Event, @@ -17,6 +7,12 @@ import { EventBridgeEvent, SQSEvent, } from 'aws-lambda'; +import { v4 } from 'uuid'; +import { + fragment, + getConnection, + SSPY_TOPIC, +} from '../listener/iot-connection'; import { envVariableNames } from '../src/common/envVariableNames'; import { DynamoDBSpyEvent } from './spyEvents/DynamoDBSpyEvent'; import { EventBridgeRuleSpyEvent } from './spyEvents/EventBridgeRuleSpyEvent'; @@ -28,27 +24,32 @@ import { SpyMessage } from './spyEvents/SpyMessage'; import { SqsSpyEvent } from './spyEvents/SqsSpyEvent'; export class SpyEventSender { - ddb = new DynamoDBClient({ - region: process.env.AWS_REGION, - }); debugMode = process.env[envVariableNames.SSPY_DEBUG] === 'true'; - apigwManagementApi = new ApiGatewayManagementApi({ - apiVersion: '2018-11-29', - endpoint: process.env[envVariableNames.SSPY_WS_ENDPOINT]!, - }); - connections: Record[] | undefined; - - constructor(params?: { - log: (message: string, ...optionalParams: any[]) => void; - logError: (message: string, ...optionalParams: any[]) => void; + connection: iot.device | undefined; + scope: string; + + constructor(params: { + log?: (message: string, ...optionalParams: any[]) => void; + logError?: (message: string, ...optionalParams: any[]) => void; + scope: string; }) { - if (params?.log) { + if (params.log) { this.log = params.log; } - if (params?.logError) { + if (params.logError) { this.logError = params.logError; } + + this.scope = params.scope; + } + + public async close() { + this.connection?.end(); + } + + public async connect() { + this.connection = await getConnection(this.debugMode); } public async publishSpyEvent(event: any) { @@ -59,17 +60,6 @@ export class SpyEventSender { ); this.log('ARN to names mapping', JSON.stringify(mapping)); - let connectionData; - - const scanParams = new ScanCommand({ - TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME] as string, - ProjectionExpression: 'connectionId', - }); - - connectionData = await this.ddb.send(scanParams); - - this.connections = connectionData.Items; - const postDataPromises: Promise[] = []; if (event?.Records && event.Records[0]?.Sns) { @@ -227,45 +217,55 @@ export class SpyEventSender { await Promise.all(postDataPromises); } - private async postData(spyMessage: Omit) { - this.log('Post spy message', JSON.stringify(spyMessage)); + private encode(input: any): fragment[] { + const payload = JSON.stringify(input); + const parts = payload.match(/.{1,50000}/g); + if (!parts) return []; + this.log(`Encoded iot message, ${parts.length}`); + const id = v4(); + return parts.map((part, index) => ({ + id, + index, + count: parts.length, + data: part, + })); + } - if (!this.connections) { - return; + private async postData(spyMessage: Omit) { + if (this.connection === undefined) { + throw new Error( + 'No IoT connection created yet, did you forget to call connect()?' + ); } - const postCalls = this.connections.map(async ({ connectionId }) => { - this.log(`Sending message to client: ${connectionId.S}`); - - try { - const postToConnectionCommand = new PostToConnectionCommand({ - ConnectionId: connectionId.S, - Data: JSON.stringify({ - timestamp: new Date().toISOString(), - serviceKey: spyMessage.serviceKey, - data: spyMessage.data, - }) as any, - }); - - await this.apigwManagementApi.send(postToConnectionCommand); - } catch (e) { - this.logError(`Faild sending spy message to: ${connectionId.S}`, e); - if ((e as any).$metadata.httpStatusCode === 410) { - this.log(`Found stale connection, deleting ${connectionId}`); - - const deleteParams = new DeleteItemCommand({ - TableName: process.env[envVariableNames.SSPY_WS_TABLE_NAME], - Key: { connectionId }, - }); + this.log('Post spy message', JSON.stringify(spyMessage)); - await this.ddb.send(deleteParams); - } else { - throw e; - } + const connection = this.connection; + const topic = `${SSPY_TOPIC}/${this.scope}`; + + try { + for (const fragment of this.encode(spyMessage)) { + await new Promise((resolve) => { + connection.publish( + topic, + JSON.stringify(fragment), + { + qos: 1, + }, + () => { + console.error('Publishing finished'); + resolve(); + } + ); + }); + this.log( + `Published fragment ${fragment.index} out of ${fragment.count} to topic ${topic}` + ); } - }); + } catch (e) { + this.logError(`Failed to send payload to iot: ${e}`); + } - await Promise.all(postCalls); this.log('Send spy message finish'); } diff --git a/common/spyEvents/FunctionConsole.ts b/common/spyEvents/FunctionConsole.ts index b51b68a..13d2474 100644 --- a/common/spyEvents/FunctionConsole.ts +++ b/common/spyEvents/FunctionConsole.ts @@ -1,5 +1,6 @@ export type FunctionConsole = { type: 'log' | 'debug' | 'info' | 'error' | 'warn'; + formattedMessage?: string; message?: any; optionalParams: any[]; }; diff --git a/extension/interceptor.ts b/extension/interceptor.ts index 363b030..944e3b5 100644 --- a/extension/interceptor.ts +++ b/extension/interceptor.ts @@ -31,6 +31,7 @@ interceptConsole(); const spyEventSender = new SpyEventSender({ log, logError, + scope: process.env['SSPY_ROOT_STACK']!, }); // Wrap original handler. @@ -41,6 +42,8 @@ export const handler = async ( context: Context, callback: Callback ): Promise => { + await spyEventSender.connect(); + const contextSpy: FunctionContext = { functionName: context.functionName, awsRequestId: context.awsRequestId, @@ -138,11 +141,14 @@ export const handler = async ( } } catch (error) { // Even if the original handler is not async, we return the promise as an async handler so we can send an error message + // eslint-disable-next-line @typescript-eslint/return-await return new Promise((_, reject) => fail(error).then(() => { reject(error); }) ); + } finally { + await spyEventSender.close(); } }; diff --git a/extensions/python/__init__.py b/extensions/python/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/extensions/python/interceptor.py b/extensions/python/interceptor.py new file mode 100644 index 0000000..7f49b94 --- /dev/null +++ b/extensions/python/interceptor.py @@ -0,0 +1,358 @@ +from __future__ import print_function + +import json +import os +import uuid +from io import StringIO + +import boto3 +from awscrt import auth, mqtt5 +from awsiot import mqtt_connection_builder +from awslambdaric import bootstrap + +try: + import __builtin__ as builtins # Python 2 +except ImportError: + import builtins # Python 3 + +boto_iot = boto3.client('iot') + +subscribed_to_sqs = os.environ.get('SSPY_SUBSCRIBED_TO_SQS', False) == 'true' +debug_mode = os.environ['SSPY_DEBUG'] == 'true' +scope = os.environ['SSPY_ROOT_STACK'] +original_handler_name = os.environ['ORIGINAL_HANDLER'] +spied_function_name = os.environ['SSPY_FUNCTION_NAME'] + +_print = print # keep a local copy of the original print + +iot_endpoint_response = boto_iot.describe_endpoint(endpointType='iot:Data-ATS') +endpoint_address = iot_endpoint_response['endpointAddress'] +credentials_provider = auth.AwsCredentialsProvider.new_default_chain() + + +def new_print(*args, **kwargs): + if current_context is None: + return + buf = StringIO() + mod_kwargs = { + **kwargs, + 'file': buf, + } + _print(*args, **mod_kwargs) + buf.seek(0) + message = buf.read() + + key = f'Function#{spied_function_name}#Console' + publish( + mqtt_connection, + [ + { + 'serviceKey': key, + 'data': { + 'request': current_event, + 'context': prepare_lambda_context(current_context), + 'console': { + 'type': 'log', + 'formattedMessage': message, + 'message': args[0], + 'optionalParams': list(args)[1:], + }, + }, + } + ], + ) + _print(list(args)[1:]) + _print(*args, **kwargs) + + +builtins.print = new_print + + +def log(*args, **kwargs): + if debug_mode: + _print('SSPY EXTENSION', *args, **kwargs) + + +def get_spy_event_type(service_key: str) -> str: + if service_key is None: + raise Exception('Missing service_key') + return service_key[0 : service_key.index('#')] + + +def unmarshall(data): + deserializer = boto3.dynamodb.types.TypeDeserializer() + python_data = {k: deserializer.deserialize(v) for k, v in data.items()} + return python_data + + +class CustomEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, (list, dict, str, int, float, bool, type(None))): + return json.JSONEncoder.default(self, obj) + elif hasattr(obj, '__repr__'): + return obj.__repr__() + else: + return json.JSONEncoder.default(self, obj.__repr__()) + + +def encode(payload) -> list[dict]: + payload_as_string = json.dumps(payload, cls=CustomEncoder) + n = 50000 + parts = [ + payload_as_string[i : i + n] + for i in range(0, len(payload_as_string), n) + ] + log(f'parts: {json.dumps(parts)}') + count = len(parts) + if count == 0: + return [] + payload_id = str(uuid.uuid4()) + return [ + {'id': payload_id, 'index': i, 'count': count, 'data': part} + for i, part in enumerate(parts) + ] + + +def publish(mqtt_connection, payloads: list[dict]): + try: + futures = [] + for payload in payloads: + log(f'handling payload {json.dumps(payload, cls=CustomEncoder)}') + for fragment in encode(payload): + future, _ = mqtt_connection.publish( + topic=f'sspy/{scope}', + payload=json.dumps(fragment, cls=CustomEncoder), + qos=mqtt5.QoS.AT_LEAST_ONCE, + ) + futures.append(future) + log(f'Publishing {len(futures)} messages') + for future in futures: + future.result() + log('Publishing complete') + except Exception as e: + log(f'Failed to publish payload: {e}') + + +def publish_spy_event(mqtt_connection, event): + log('Event', json.dumps(event)) + mapping = json.loads(os.environ['SSPY_INFRA_MAPPING']) + log('ARN to names mapping', json.dumps(mapping)) + + has_records = event.get('Records') is not None + + payloads = [] + + if has_records and event['Records'].get('Sns'): + for record in event.get('Records'): + subscription_arn = record.get('EventSubscriptionArn') + sns_record = record['Sns'] + if mapping.get(subscription_arn): + service_key = mapping[subscription_arn] + else: + service_key = mapping[sns_record['TopicArn']] + + try: + message = json.loads(sns_record['Message']) + except json.JSONDecodeError: + message = sns_record['Message'] + + spy_event_type = get_spy_event_type(service_key) + + payloads.append( + { + 'data': { + 'spyEventType': spy_event_type, + 'message': message, + 'subject': sns_record['Subject'], + 'timestamp': sns_record['Timestamp'], + 'topicArn': sns_record['TopicArn'], + 'messageId': sns_record['MessageId'], + 'messageAttributes': sns_record['MessageAttributes'], + }, + 'serviceKey': service_key, + } + ) + elif has_records and event['Records'].get('eventSource') == 'aws:sqs': + for record in event['Records']: + subscription_arn = record.get('eventSourceARN') + service_key = mapping[subscription_arn] + + try: + body = json.loads(record['body']) + except json.JSONDecodeError: + body = record['body'] + + payloads.append( + { + 'serviceKey': service_key, + 'data': { + 'spyEventType': 'Sqs', + 'body': body, + 'messageAttributes': record['messageAttributes'], + }, + } + ) + elif has_records and event['Records'][0].get('s3') is not None: + for record in event['Records']: + bucket_arn = record['s3']['bucket']['arn'] + payloads.append( + { + 'service_key': mapping[bucket_arn], + 'data': { + 'spyEventType': 'S3', + 'eventName': record['eventName'], + 'eventTime': record['eventTime'], + 'bucket': record['s3']['bucket']['name'], + 'key': record['s3']['object']['key'], + }, + } + ) + elif has_records and event['Records'][0].get('dynamodb'): + for record in event['Records']: + arn = record['eventSourceARN'] + arn = arn[0 : arn.index('/stream/')] + payloads.append( + { + 'service_key': mapping[arn], + 'data': { + 'spyEventType': 'DynamoDB', + 'eventName': record['eventName'], + 'newImage': unmarshall( + record.get('dynamodb', {}).get('NewImage') + ), + 'oldImage': unmarshall( + record.get('dynamodb', {}).get('OldImage') + ) + if record.get('dynamodb', {}).get('OldImage') + is not None + else None, + }, + } + ) + elif ( + event.get('detail') + and event.get('detail-type') + and event.get('version') + and event.get('source') + ): + service_key = mapping['eventBridge'] + spy_event_type = get_spy_event_type(service_key) + payloads.append( + { + 'service_key': service_key, + 'data': { + 'spyEventType': spy_event_type, + 'detail': event['detail'], + 'detailType': event['detail-type'], + 'eventBridgeId': event['id'], + 'source': event['source'], + 'time': event['time'], + 'account': event['account'], + }, + } + ) + else: + payloads.append(event) + publish(mqtt_connection, payloads) + + +def prepare_lambda_context(context): + return { + 'awsRequestId': context.aws_request_id, + 'functionName': context.function_name, + 'functionVersion': context.function_version, + 'invokedFunctionArn': context.invoked_function_arn, + } + + +def on_connection_interrupted(connection, error, **kwargs): + log('Connection interrupted. error: {}'.format(error)) + + +# Callback when an interrupted connection is re-established. +def on_connection_resumed(connection, return_code, session_present, **kwargs): + log( + 'Connection resumed. return_code: {} session_present: {}'.format( + return_code, session_present + ) + ) + + +def handler(event, context): + global current_context + global current_event + global mqtt_connection + + mqtt_connection = ( + mqtt_connection_builder.websockets_with_default_aws_signing( + endpoint=endpoint_address, + region=endpoint_address.split('.')[2], + credentials_provider=credentials_provider, + on_connection_interrupted=on_connection_interrupted, + on_connection_resumed=on_connection_resumed, + client_id=str(uuid.uuid4()), + clean_session=False, + keep_alive_secs=30, + ) + ) + connect_future = mqtt_connection.connect() + + # Future.result() waits until a result is available + connect_future.result() + _print('IoT Connected') + + current_context = context + current_event = event + original_handler = bootstrap._get_handler(original_handler_name) + + publish( + mqtt_connection, + [ + { + 'serviceKey': f'Function#{spied_function_name}#Request', + 'data': { + 'request': event, + 'context': prepare_lambda_context(context), + }, + } + ], + ) + try: + response = original_handler(event, context) + publish( + mqtt_connection, + [ + { + 'serviceKey': f'Function#{spied_function_name}#Response', + 'data': { + 'request': event, + 'response': response, + 'context': prepare_lambda_context(context), + }, + } + ], + ) + except Exception as e: + import traceback + + log(f'Error: {e}') + publish( + mqtt_connection, + [ + { + 'serviceKey': f'Function#{spied_function_name}#Error', + 'data': { + 'request': event, + 'error': { + 'message': str(e), + 'name': 'Error', + 'stack': str(traceback.format_exc()), + }, + 'context': prepare_lambda_context(context), + }, + } + ], + ) + raise e + mqtt_connection.disconnect().result() + return response diff --git a/extensions/python/requirements.txt b/extensions/python/requirements.txt new file mode 100644 index 0000000..8175c3c --- /dev/null +++ b/extensions/python/requirements.txt @@ -0,0 +1,4 @@ +awslambdaric==2.0.8 +boto3 +awsiotsdk==1.19.0 +awscrt==0.19.* diff --git a/extensions/spy-wrapper/spy-wrapper b/extensions/spy-wrapper/spy-wrapper new file mode 100755 index 0000000..98526e3 --- /dev/null +++ b/extensions/spy-wrapper/spy-wrapper @@ -0,0 +1,4 @@ +#!/bin/bash +export ORIGINAL_HANDLER=$_HANDLER +export _HANDLER="interceptor.handler" +exec "$@" diff --git a/functions/sendMessage.ts b/functions/sendMessage.ts index 5f25575..7e128e1 100644 --- a/functions/sendMessage.ts +++ b/functions/sendMessage.ts @@ -1,13 +1,17 @@ import { SpyEventSender } from '../common/SpyEventSender'; -const spyEventSender = new SpyEventSender(); - export const handler = async (event: any) => { + const spyEventSender = new SpyEventSender({ + scope: process.env['SSPY_ROOT_STACK']!, + }); try { + await spyEventSender.connect(); await spyEventSender.publishSpyEvent(event); } catch (e) { console.error(e); return { statusCode: 500, body: (e as Error)?.stack }; + } finally { + await spyEventSender.close(); } return { statusCode: 200, body: 'Data sent.' }; diff --git a/listener/ServerlessSpyListenerParams.ts b/listener/ServerlessSpyListenerParams.ts index 84be985..b2dcb81 100644 --- a/listener/ServerlessSpyListenerParams.ts +++ b/listener/ServerlessSpyListenerParams.ts @@ -1,7 +1,7 @@ import { Credentials } from '@aws-sdk/types'; export type ServerlessSpyListenerParams = { - serverlessSpyWsUrl: string; credentials?: Credentials; debugMode?: boolean; + scope: string; }; diff --git a/listener/SpyHandlers.ts.ts b/listener/SpyHandlers.ts.ts index 999c496..983765d 100644 --- a/listener/SpyHandlers.ts.ts +++ b/listener/SpyHandlers.ts.ts @@ -3,8 +3,8 @@ import { EventBridgeRuleSpyEvent } from '../common/spyEvents/EventBridgeRuleSpyE import { EventBridgeSpyEvent } from '../common/spyEvents/EventBridgeSpyEvent'; import { FunctionConsole } from '../common/spyEvents/FunctionConsole'; import { FunctionConsoleSpyEvent } from '../common/spyEvents/FunctionConsoleSpyEvent'; -import { FunctionErrorSpyEvent } from '../common/spyEvents/FunctionErrorSpyEvent'; import { FunctionContext } from '../common/spyEvents/FunctionContext'; +import { FunctionErrorSpyEvent } from '../common/spyEvents/FunctionErrorSpyEvent'; import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent'; import { FunctionResponseSpyEvent } from '../common/spyEvents/FunctionResponseSpyEvent'; import { S3SpyEvent } from '../common/spyEvents/S3SpyEvent'; diff --git a/listener/WsListener.ts b/listener/WsListener.ts index bd15db5..f54f22e 100644 --- a/listener/WsListener.ts +++ b/listener/WsListener.ts @@ -1,8 +1,8 @@ -import { WebSocket } from 'ws'; -import { getSignedWebSocketUrl } from '../common/getWebSocketUrl'; +import { device } from 'aws-iot-device-sdk'; import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent'; import { SpyEvent } from '../common/spyEvents/SpyEvent'; import { SpyMessage } from '../common/spyEvents/SpyMessage'; +import { fragment, getConnection, SSPY_TOPIC } from './iot-connection'; import { ServerlessSpyListener } from './ServerlessSpyListener'; import { ServerlessSpyListenerParams } from './ServerlessSpyListenerParams'; import { WaitForParams } from './WaitForParams'; @@ -13,66 +13,89 @@ export class WsListener { private connectionOpenResolve?: () => void; private connectionOpenReject?: (reason?: any) => void; - private waitForConnection?: Promise; - private ws?: WebSocket; private closed = true; private functionPrefix = 'waitFor'; private debugMode = false; + private connection: device | undefined; + + private fragments = new Map>(); public async start(params: ServerlessSpyListenerParams) { this.debugMode = !!params.debugMode; + try { + this.connection = await getConnection(this.debugMode); + const topic = `${SSPY_TOPIC}/${params.scope}`; + this.log(`Subscribing to topic ${topic}`); + this.closed = false; + const connectionOpenResolve = this.connectionOpenResolve; + const localConnection = this.connection; + this.connection.on('connect', () => { + this.closed = false; + this.log('Connection opened'); + localConnection.subscribe(topic); + if (connectionOpenResolve) { + connectionOpenResolve(); + } + }); + this.connection.on('message', (_topic, data: Buffer) => { + if (this.closed) return; + + this.log('Message received', data.toString()); + const fragment = JSON.parse(data.toString()); + let message: SpyMessageStorage | undefined = undefined; + if (!fragment.id) { + message = JSON.parse(fragment.data) as SpyMessageStorage; + } - this.waitForConnection = new Promise((resolve, reject) => { - this.connectionOpenResolve = resolve; - this.connectionOpenReject = reject; - }); - - const urlSigned = await getSignedWebSocketUrl( - params.serverlessSpyWsUrl, - params.credentials - ); - - this.ws = new WebSocket(urlSigned); - this.closed = false; - this.ws.on('open', () => { - this.log('Connection oppened'); - this.connectionOpenResolve!(); - }); - this.ws.on('message', (data) => { - if (this.closed) return; - - this.log('Message received', data); - - const message = JSON.parse(data.toString()) as SpyMessageStorage; - - message.serviceKeyForFunction = message.serviceKey.replace(/#/g, ''); + let pending = this.fragments.get(fragment.id); + if (!pending) { + pending = new Map(); + this.fragments.set(fragment.id, pending); + } + pending.set(fragment.index, fragment); + + if (pending.size === fragment.count) { + const data = [...pending.values()] + .sort((a, b) => a.index - b.index) + .map((item) => item.data) + .join(''); + this.fragments.delete(fragment.id); + message = JSON.parse(data) as SpyMessageStorage; + } - if (message.serviceKey.startsWith('Function')) { - message.functionContextAwsRequestId = ( - message.data as FunctionRequestSpyEvent - ).context.awsRequestId; - } + if (message) { + message.serviceKeyForFunction = message.serviceKey.replace(/#/g, ''); - this.messages.push(message); - this.resolveOldTrackerWithNewMessage(message); - }); - this.ws.on('close', () => { - this.log('Connection closed'); + if (message.serviceKey.startsWith('Function')) { + message.functionContextAwsRequestId = ( + message.data as FunctionRequestSpyEvent + ).context.awsRequestId; + } - this.closed = true; - }); + this.messages.push(message); + this.resolveOldTrackerWithNewMessage(message); + } + }); + this.connection.on('close', () => { + this.log('Connection closed'); - this.ws.on('error', (error) => { - this.log('Connection error:', error); - this.connectionOpenReject?.(error); - }); + this.closed = true; + }); - await this.waitForConnection; + const connectionOpenReject = this.connectionOpenReject; + this.connection.on('error', (error) => { + this.log('Connection error:', error); + connectionOpenReject?.(error); + }); + } catch (e) { + console.error('Failed to get connection', e); + throw e; + } } public async stop() { this.closed = true; - this.ws!.close(); + this.connection!.end(); } private trackerMatchMessage(tracker: Tracker, message: SpyMessageStorage) { @@ -231,7 +254,7 @@ export class WsListener { tracker.promiseReject(new Error(message)); }, paramsW?.timoutMs || 10000); - promise.finally(() => { + void promise.finally(() => { clearTimeout(timer); }); diff --git a/listener/iot-connection.ts b/listener/iot-connection.ts new file mode 100644 index 0000000..67ea559 --- /dev/null +++ b/listener/iot-connection.ts @@ -0,0 +1,69 @@ +import { IoTClient, DescribeEndpointCommand } from '@aws-sdk/client-iot'; +import { device } from 'aws-iot-device-sdk'; + +export const SSPY_TOPIC = 'sspy'; + +export type fragment = { id: string; index: number; count: number; data: any }; + +function createLog(debugMode: boolean) { + return (message: string, ...optionalParams: any[]) => { + if (debugMode) { + console.debug('SSPY', message, ...optionalParams); + } + }; +} + +function createErrorLog() { + return (message: string, ...optionalParams: any[]) => { + console.error('SSPY', message, ...optionalParams); + }; +} + +export async function getConnection(debugMode: boolean): Promise { + const log = createLog(debugMode); + const logError = createErrorLog(); + log('Getting IoT endpoint'); + let response: any; + try { + const iotClient = new IoTClient({}); + response = await iotClient.send( + new DescribeEndpointCommand({ + endpointType: 'iot:Data-ATS', + }) + ); + } catch (e) { + logError('failed to get endpoint', e); + throw e; + } + log('Using IoT endpoint:', response.endpointAddress); + + if (!response.endpointAddress) { + logError('No IoT endpoint could be found'); + throw new Error('IoT Endpoint address not found'); + } + + const connection = new device({ + protocol: 'wss', + host: response.endpointAddress, + region: process.env['AWS_REGION'], + reconnectPeriod: 1, + }); + + connection.on('connect', () => { + log('IoT connected'); + }); + + connection.on('error', (err) => { + logError('IoT error', err); + }); + + connection.on('close', () => { + log('IoT closed'); + }); + + connection.on('reconnect', () => { + log('IoT reconnected'); + }); + + return connection; +} diff --git a/package-lock.json b/package-lock.json index 6752ca3..d947fdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,14 @@ "version": "0.0.0", "bundleDependencies": [ "@aws-sdk/credential-providers", - "@aws-sdk/client-apigatewaymanagementapi", "@aws-sdk/client-dynamodb", "@aws-sdk/client-eventbridge", "@aws-sdk/client-lambda", "@aws-sdk/client-s3", "@aws-sdk/client-sns", "@aws-sdk/client-sqs", + "@aws-sdk/client-iot", + "aws-iot-device-sdk", "@aws-sdk/lib-dynamodb", "@aws-sdk/util-dynamodb", "aws4", @@ -37,11 +38,9 @@ "cli" ], "dependencies": { - "@aws-cdk/aws-apigatewayv2-alpha": "2.43.1-alpha.0", - "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.43.1-alpha.0", - "@aws-sdk/client-apigatewaymanagementapi": "^3.180.0", "@aws-sdk/client-dynamodb": "^3.180.0", "@aws-sdk/client-eventbridge": "^3.180.0", + "@aws-sdk/client-iot": "^3.449.0", "@aws-sdk/client-lambda": "^3.180.0", "@aws-sdk/client-s3": "^3.180.0", "@aws-sdk/client-sns": "^3.180.0", @@ -51,6 +50,7 @@ "@aws-sdk/lib-dynamodb": "^3.180.0", "@aws-sdk/types": "^3.178.0", "@aws-sdk/util-dynamodb": "^3.180.0", + "aws-iot-device-sdk": "^2.2.13", "aws-lambda": "^1.0.7", "aws4": "^1.11.0", "bootstrap": "^5.2.1", @@ -65,15 +65,18 @@ "sspy": "lib/cli/cli.js" }, "devDependencies": { + "@aws-cdk/aws-lambda-python-alpha": "^2.75.0-alpha.0", + "@types/aws-iot-device-sdk": "2.2.8", "@types/aws-lambda": "^8.10.106", "@types/aws4": "^1.11.2", - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.10", "@types/node": "^18.7.23", "@types/uuid": "^8.3.4", "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.38.1", - "aws-cdk-lib": "2.51.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "aws-cdk": "2.75.0", + "aws-cdk-lib": "2.75.0", "constructs": "10.1.115", "esbuild": "^0.15.9", "esbuild-runner": "^2.2.1", @@ -84,23 +87,24 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", - "jest": "^28.1.3", - "jsii": "^1.69.0", - "jsii-diff": "^1.69.0", - "jsii-docgen": "^7.0.97", - "jsii-pacmak": "^1.69.0", + "jest": "^29.7.0", + "jsii": "^5.2.32", + "jsii-diff": "^1.92.0", + "jsii-docgen": "^10.2.2", + "jsii-pacmak": "^1.92.0", "json-schema": "^0.4.0", "npm-check-updates": "^16", "prettier": "^2.7.1", "projen": "^0.62.24", "standard-version": "^9", - "ts-jest": "^28.0.8", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4", - "uuid": "^9.0.0" + "typescript": "^5.2.2", + "uuid": "^9.0.1" }, "peerDependencies": { - "aws-cdk-lib": "^2", + "@aws-cdk/aws-lambda-python-alpha": ">2.75.0-alpha.0", + "aws-cdk-lib": ">2.75.0", "constructs": "^10" } }, @@ -117,11 +121,12 @@ "devDependencies": {} }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -129,9 +134,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.200", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", - "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" }, "node_modules/@aws-cdk/asset-kubectl-v20": { "version": "2.1.2", @@ -143,26 +148,15 @@ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" }, - "node_modules/@aws-cdk/aws-apigatewayv2-alpha": { - "version": "2.43.1-alpha.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "aws-cdk-lib": "^2.43.1", - "constructs": "^10.0.0" - } - }, - "node_modules/@aws-cdk/aws-apigatewayv2-integrations-alpha": { - "version": "2.43.1-alpha.0", - "license": "Apache-2.0", + "node_modules/@aws-cdk/aws-lambda-python-alpha": { + "version": "2.75.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.75.0-alpha.0.tgz", + "integrity": "sha512-AlP6doxzfut1k+Z97lHsk9MvFzghHv9qizTVyn2+8VQp40DEEvZ1H8P9e/zZSpjqu5wCbL7vybcQyp7ymKykUg==", "engines": { "node": ">= 14.15.0" }, "peerDependencies": { - "@aws-cdk/aws-apigatewayv2-alpha": "2.43.1-alpha.0", - "aws-cdk-lib": "^2.43.1", + "aws-cdk-lib": "2.75.0", "constructs": "^10.0.0" } }, @@ -319,50 +313,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi": { - "version": "3.180.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.180.0", - "@aws-sdk/config-resolver": "3.178.0", - "@aws-sdk/credential-provider-node": "3.180.0", - "@aws-sdk/fetch-http-handler": "3.178.0", - "@aws-sdk/hash-node": "3.178.0", - "@aws-sdk/invalid-dependency": "3.178.0", - "@aws-sdk/middleware-content-length": "3.178.0", - "@aws-sdk/middleware-host-header": "3.178.0", - "@aws-sdk/middleware-logger": "3.178.0", - "@aws-sdk/middleware-recursion-detection": "3.178.0", - "@aws-sdk/middleware-retry": "3.178.0", - "@aws-sdk/middleware-serde": "3.178.0", - "@aws-sdk/middleware-signing": "3.179.0", - "@aws-sdk/middleware-stack": "3.178.0", - "@aws-sdk/middleware-user-agent": "3.178.0", - "@aws-sdk/node-config-provider": "3.178.0", - "@aws-sdk/node-http-handler": "3.178.0", - "@aws-sdk/protocol-http": "3.178.0", - "@aws-sdk/smithy-client": "3.180.0", - "@aws-sdk/types": "3.178.0", - "@aws-sdk/url-parser": "3.178.0", - "@aws-sdk/util-base64-browser": "3.170.0", - "@aws-sdk/util-base64-node": "3.170.0", - "@aws-sdk/util-body-length-browser": "3.170.0", - "@aws-sdk/util-body-length-node": "3.170.0", - "@aws-sdk/util-defaults-mode-browser": "3.180.0", - "@aws-sdk/util-defaults-mode-node": "3.180.0", - "@aws-sdk/util-user-agent-browser": "3.178.0", - "@aws-sdk/util-user-agent-node": "3.178.0", - "@aws-sdk/util-utf8-browser": "3.170.0", - "@aws-sdk/util-utf8-node": "3.170.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.180.0", "inBundle": true, @@ -508,6 +458,520 @@ "node": ">=12.0.0" } }, + "node_modules/@aws-sdk/client-iot": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.449.0.tgz", + "integrity": "sha512-lE86rjRuY3x215FAoX2WkahbhvTgrfp8QqyGaOwhvQRIDfvp/H7KFavR8V/UnHbLWt4nykkg5iBgIRyPsmxd7A==", + "inBundle": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.449.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "inBundle": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "inBundle": true, + "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" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "inBundle": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "inBundle": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.449.0.tgz", + "integrity": "sha512-HFTlFbf9jwp5BJkXbMKlEwk6oGC7AVYaPEkaNk77kzZ8RGoqVSAqe0HL74DACcJUpMD/VWYX7pfWq/Wm+2B79g==", + "inBundle": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.449.0.tgz", + "integrity": "sha512-iKh5Es9tyY+Ch17bvMubW67ydW4X3Buy9vwTIqpmXlnXEfbvjZRwycjWK2MO/P1Su3wjA14zNBq2ifNWFxkwFA==", + "inBundle": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-sdk-sts": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz", + "integrity": "sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.449.0.tgz", + "integrity": "sha512-C2pMYysIfbRBR4Q+Aj7J0cRsKY/X2cOnrggrWzsEUJK3EJ1aHwrzm3HI0VM5DttJyya5hE4tZ/H1VX3zNGUtKA==", + "inBundle": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.449.0.tgz", + "integrity": "sha512-cCsqMqL8vmHADwIHCmTWDB4vr5fCXb4PZn3njbA/PIA92xL4S7hRmYi/1ll0CMd+fks+t/h+s+PIhFGo54C7cA==", + "inBundle": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-ini": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz", + "integrity": "sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.449.0.tgz", + "integrity": "sha512-Lfhh38rOjFAZBjZZJ2ehve+X048xxr+hTr+ntGOKady1GAH6W1U5UGNYuD9fr5vFaQQtAcNLKkUui+TnmJ4z/w==", + "inBundle": true, + "dependencies": { + "@aws-sdk/client-sso": "3.449.0", + "@aws-sdk/token-providers": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz", + "integrity": "sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-logger": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz", + "integrity": "sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==", + "inBundle": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-signing": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz", + "integrity": "sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "inBundle": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "inBundle": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-lambda": { "version": "3.180.0", "inBundle": true, @@ -1480,6 +1944,19 @@ "node": ">= 12.0.0" } }, + "node_modules/@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", + "inBundle": true, + "dependencies": { + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { "version": "3.180.0", "inBundle": true, @@ -2142,12 +2619,28 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/service-error-classification": { - "version": "3.178.0", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", "inBundle": true, - "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.178.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { @@ -2213,6 +2706,248 @@ "node": ">= 12.0.0" } }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz", + "integrity": "sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==", + "inBundle": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "inBundle": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "inBundle": true, + "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" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "inBundle": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "inBundle": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-logger": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, "node_modules/@aws-sdk/types": { "version": "3.178.0", "inBundle": true, @@ -2366,6 +3101,33 @@ "node": ">= 12.0.0" } }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz", + "integrity": "sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==", + "inBundle": true, + "dependencies": { + "@aws-sdk/types": "3.449.0", + "@smithy/util-endpoints": "^1.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/util-hex-encoding": { "version": "3.170.0", "inBundle": true, @@ -2513,44 +3275,119 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.19.3", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2561,198 +3398,216 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.19.0", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -2761,8 +3616,9 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -2772,8 +3628,9 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2785,37 +3642,42 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -2824,9 +3686,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "dev": true, - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -2836,8 +3699,9 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2847,8 +3711,9 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2858,8 +3723,9 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2869,8 +3735,9 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2880,8 +3747,9 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2889,10 +3757,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2902,8 +3786,9 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2913,8 +3798,9 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2924,8 +3810,9 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2935,8 +3822,9 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2946,8 +3834,9 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2957,8 +3846,9 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2970,11 +3860,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2984,31 +3875,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -3018,19 +3911,21 @@ }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3039,8 +3934,9 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -3062,6 +3958,30 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.2", "dev": true, @@ -3139,6 +4059,74 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@httptoolkit/websocket-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", + "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", + "inBundle": true, + "optional": true, + "peer": true, + "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" + } + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "inBundle": true, + "optional": true, + "peer": true + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.5", "dev": true, @@ -3188,8 +4176,9 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3203,8 +4192,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3215,8 +4205,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3226,8 +4217,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3240,8 +4232,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3251,73 +4244,76 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -3328,113 +4324,90 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/@jest/environment": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -3442,21 +4415,20 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -3468,88 +4440,94 @@ } }, "node_modules/@jest/schemas": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "28.1.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -3557,16 +4535,18 @@ "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -3582,8 +4562,9 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -3594,41 +4575,45 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsii/check-node": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@jsii/check-node/-/check-node-1.92.0.tgz", + "integrity": "sha512-MQnFvDIn/VOz4FzchobZ4dfrl6qfuZIlYviNbGXhPMSeJ92BVB2F+NEyem9Sg/Csy2ehhtO1FGaUj4mO9/7Ntg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.2", - "semver": "^7.3.7" + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/@jsii/spec": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@jsii/spec/-/spec-1.92.0.tgz", + "integrity": "sha512-6jbwQ2uCVOUq6eddKQG/cPzuUsdJwaszQstTZtruhhjWNuoC4CjT5eHlzjeBqtxQZpGiKkRRwPHb1bCEGgffxA==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "ajv": "^8.11.0" + "ajv": "^8.12.0" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/@jsii/spec/node_modules/ajv": { - "version": "8.11.0", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3642,8 +4627,9 @@ }, "node_modules/@jsii/spec/node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -4506,9 +5492,10 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.43", - "dev": true, - "license": "MIT" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@sindresorhus/is": { "version": "5.3.0", @@ -4522,165 +5509,785 @@ } }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "dev": true, - "license": "MIT", + "node_modules/@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "inBundle": true, "dependencies": { - "defer-to-connect": "^2.0.1" + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=14.16" + "node": ">=14.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", + "node_modules/@smithy/config-resolver": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", + "inBundle": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, "engines": { - "node": ">= 10" + "node": ">=14.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT" + "node_modules/@smithy/credential-provider-imds": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", + "inBundle": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "inBundle": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "dev": true, - "license": "MIT" + "node_modules/@smithy/eventstream-codec/node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "inBundle": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } }, - "node_modules/@types/aws-lambda": { - "version": "8.10.106", - "dev": true, - "license": "MIT" + "node_modules/@smithy/eventstream-codec/node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true }, - "node_modules/@types/aws4": { - "version": "1.11.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/eventstream-codec/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "inBundle": true, "dependencies": { - "@types/node": "*" + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "dev": true, - "license": "MIT", + "node_modules/@smithy/eventstream-codec/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "inBundle": true + }, + "node_modules/@smithy/eventstream-codec/node_modules/@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "inBundle": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "dev": true, - "license": "MIT", + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.5.tgz", + "integrity": "sha512-m9yoTx+64XRSpCzWArOpvHeAuVfI2LFz2hDzgzjzCLlN8IIwzkFaCav5ShsYxx4iu9sXp09+on0a5VROY9+MFQ==", + "inBundle": true, "dependencies": { - "@babel/types": "^7.0.0" + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "dev": true, - "license": "MIT", + "node_modules/@smithy/hash-node": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.13.tgz", + "integrity": "sha512-0L2BJ/uVLB+XMeuUfz2qhkcsgVL6IdO3ekROYTW7Wg+sWWqXm8fPN7RtqCrHjpAkPu4X23fsl2NpOjXsH/vNgA==", + "inBundle": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "inBundle": true, "dependencies": { - "@babel/types": "^7.3.0" + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" } }, - "node_modules/@types/glob": { - "version": "8.0.0", - "dev": true, - "license": "MIT", + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "inBundle": true, "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "inBundle": true, "dependencies": { - "@types/node": "*" + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.5.tgz", + "integrity": "sha512-eRhI0mI9tnkpmLwJbprV+MdlPyOMe8tFtVrNFMUlgOQrJeYv5AD5UFRn/KhgNX1vO1pVgpPtD9R+cRuFhj/lIQ==", + "inBundle": true, + "dependencies": { + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", + "inBundle": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "inBundle": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", + "inBundle": true, + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "inBundle": true, + "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.13.tgz", + "integrity": "sha512-odJl+t0YdI2wT61Nr6qvlN+I8APNFWTtPr90CqVyHidb4Kyzq3lFSiY5T6I+IdvCV6BbNZ2btUYm2R6ae7zWYw==", + "inBundle": true, + "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.13.tgz", + "integrity": "sha512-iFqrjps6K/eLNbDKppyp5gCCZyEtv/BYMlDSBXwwHIrwV7sZ8l8r6OGAcg1a69j4Id1uJccYppaTpW5G1BLhsA==", + "inBundle": true, + "dependencies": { + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.18", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "inBundle": true, + "dependencies": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "inBundle": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "inBundle": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.17.tgz", + "integrity": "sha512-kAJNbe3n4PYOpudOUjcyZ3MZ8G3xWt/oV+lZp/y87Rmd5/evLEc5VVuEW6u030aY8L3Uw2PX6cVA5UuJBIN14Q==", + "inBundle": true, + "dependencies": { + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.13", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.23.tgz", + "integrity": "sha512-S319Pjqmo4Quq6D9Ytt/XLMpS0PgbZZ7WAjjs3+6h0b/fRkUe5qppE115plpZZvN1EixDbh9R/k30tDOJayYdA==", + "inBundle": true, + "dependencies": { + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.13", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", + "inBundle": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "inBundle": true, + "dependencies": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", + "inBundle": true, + "dependencies": { + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.18.tgz", + "integrity": "sha512-e/a7JrmHTy+gxHjdJKHQFyK8X2SCoJEaBXTrs5Q/HS69a3P4P0Mbu1znKFKFM/fDtppCxPCO0IcIbNvbVSEJ8w==", + "inBundle": true, + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.5", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "inBundle": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.1.tgz", + "integrity": "sha512-JvpZMUTMIil6rstH3tyBjCE7tuTmCprcmCXHW4o8a5mSthhQ8fEj5lDWOonTigtB2CqiBQ/SWlpoctuzVO7J0Q==", + "inBundle": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", "dev": true, "license": "MIT" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", "dev": true, "license": "MIT" }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aws-iot-device-sdk": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.8.tgz", + "integrity": "sha512-l7JWoN1vHDpvm13kppPSmfnIQbQrJK7kvG95LIKf3qYF+WJjaUDOTdMn8BA8djHWb7ASRu2D4jtuVzSTj2We6Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/ws": "*", + "mqtt": "^4.2.8" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.106", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aws4": { + "version": "1.11.2", "dev": true, "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "27.5.2", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, - "license": "MIT", "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "dev": true, - "license": "MIT" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4689,8 +6296,9 @@ }, "node_modules/@types/minimatch": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.2", @@ -4699,7 +6307,8 @@ }, "node_modules/@types/node": { "version": "18.7.23", - "dev": true, + "devOptional": true, + "inBundle": true, "license": "MIT" }, "node_modules/@types/normalize-package-data": { @@ -4707,15 +6316,17 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/prettier": { - "version": "2.6.0", - "dev": true, - "license": "MIT" + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "dev": true, - "license": "MIT" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, "node_modules/@types/uuid": { "version": "8.3.4", @@ -4724,49 +6335,56 @@ }, "node_modules/@types/ws": { "version": "8.5.3", - "dev": true, + "devOptional": true, + "inBundle": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.13", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "dev": true, - "license": "MIT" + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", + "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/type-utils": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4775,24 +6393,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4801,15 +6421,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4817,24 +6438,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", + "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/utils": "6.12.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4843,11 +6465,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4855,20 +6478,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4881,38 +6505,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", + "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", "dev": true, - "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.12.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4920,9 +6547,10 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.2", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -5051,8 +6679,9 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5065,8 +6694,9 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5097,9 +6727,10 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5209,6 +6840,20 @@ "inBundle": true, "license": "MIT" }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "inBundle": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "inBundle": true, + "optional": true, + "peer": true + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "inBundle": true, @@ -5221,9 +6866,10 @@ } }, "node_modules/aws-cdk": { - "version": "2.43.1", + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.75.0.tgz", + "integrity": "sha512-BkyWNpYZz66Ewoi7rBPYZnW+0BAKbWYawhQ1v7KQWmGB0cFlQmvIfoOFklF5EOyAKOltUVRQF6KJf1/AIedkmg==", "dev": true, - "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" }, @@ -5234,46 +6880,93 @@ "fsevents": "2.3.2" } }, - "node_modules/aws-cdk-lib": { - "version": "2.51.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.51.0.tgz", - "integrity": "sha512-x/XXquLJ30QeyrC7HrXeueD+F5ayXEHxYlOlNEAcMIdpzhvojSHtfsyY3x0FeodHT9ycJH8RAUV+QZtmZV9mrw==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "yaml" - ], + "node_modules/aws-cdk-lib": { + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.75.0.tgz", + "integrity": "sha512-lFMrRJPt5TDRm4PGllo0aFcSi8nHzs0mZbYUF/lnMc15ORroV8Iv38U1I0CHiZwWO/QtLuxIzEXWA5hSbgpKzw==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.97", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.3.8", + "table": "^6.8.1", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.9", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.15", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^9.1.0", - "ignore": "^5.2.0", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.1.1", - "semver": "^7.3.8", - "yaml": "1.10.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 14.15.0" + "node": ">=8" }, - "peerDependencies": { - "constructs": "^10.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", "inBundle": true, - "license": "Apache-2.0" + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/aws-cdk-lib/node_modules/at-least-node": { "version": "1.0.0", @@ -5305,11 +6998,37 @@ "node": ">= 0.8.0" } }, + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/concat-map": { "version": "0.0.1", "inBundle": true, "license": "MIT" }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/fs-extra": { "version": "9.1.0", "inBundle": true, @@ -5330,13 +7049,26 @@ "license": "ISC" }, "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.2.0", + "version": "5.2.4", "inBundle": true, "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/jsonfile": { "version": "6.1.0", "inBundle": true, @@ -5356,6 +7088,11 @@ "node": "*" } }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/lru-cache": { "version": "6.0.0", "inBundle": true, @@ -5379,13 +7116,21 @@ } }, "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.1.1", + "version": "2.3.0", "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/aws-cdk-lib/node_modules/semver": { "version": "7.3.8", "inBundle": true, @@ -5400,6 +7145,61 @@ "node": ">=10" } }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/aws-cdk-lib/node_modules/universalify": { "version": "2.0.0", "inBundle": true, @@ -5408,6 +7208,14 @@ "node": ">= 10.0.0" } }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/aws-cdk-lib/node_modules/yallist": { "version": "4.0.0", "inBundle": true, @@ -5421,6 +7229,159 @@ "node": ">= 6" } }, + "node_modules/aws-crt": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.19.0.tgz", + "integrity": "sha512-pBRSpy4TsL/fxW7Lp1xpN1FhnxvtBXFYx3Njo/j/m8GSV3Ytq/mBetYq7vhDb7CJQmFJCWod9I0yShqjiSUuyQ==", + "hasInstallScript": true, + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "@aws-sdk/util-utf8-browser": "^3.109.0", + "@httptoolkit/websocket-stream": "^6.0.1", + "axios": "^1.6.0", + "buffer": "^6.0.3", + "crypto-js": "^4.2.0", + "mqtt": "^4.3.7", + "process": "^0.11.10" + } + }, + "node_modules/aws-crt/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/aws-crt/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "optional": true, + "peer": true + }, + "node_modules/aws-crt/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aws-crt/node_modules/mqtt": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", + "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", + "inBundle": true, + "optional": true, + "peer": true, + "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" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/aws-crt/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "inBundle": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/aws-iot-device-sdk": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.13.tgz", + "integrity": "sha512-rUR68vJxna5q0HSvBFy70QD0kFa91H8mQU2Jdor0JpNxmfNaOhQoiGCcgrZAxR69xY1kGHs+JzWOqqVtAfL0+A==", + "inBundle": true, + "dependencies": { + "crypto-js": "4.2.0", + "minimist": "1.2.6", + "mqtt": "4.2.8", + "websocket-stream": "^5.5.2" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/aws-jwt-verify": { "version": "2.1.3", "license": "Apache-2.0", @@ -5475,21 +7436,35 @@ "inBundle": true, "license": "MIT" }, + "node_modules/axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" @@ -5497,23 +7472,50 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -5521,13 +7523,14 @@ "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -5547,15 +7550,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -5563,7 +7567,7 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, + "inBundle": true, "license": "MIT" }, "node_modules/base64-js": { @@ -5585,6 +7589,41 @@ "inBundle": true, "license": "MIT" }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "inBundle": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bluebird": { "version": "3.7.2", "inBundle": true, @@ -5724,7 +7763,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5743,7 +7782,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5753,14 +7794,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -5782,8 +7826,9 @@ }, "node_modules/bser": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -5946,7 +7991,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001412", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "dev": true, "funding": [ { @@ -5956,9 +8003,12 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/caporal": { "version": "1.4.0", @@ -6004,8 +8054,9 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -6024,9 +8075,10 @@ "license": "MIT" }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "dev": true, - "license": "MIT" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", @@ -6157,8 +8209,9 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -6173,22 +8226,24 @@ } }, "node_modules/codemaker": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/codemaker/-/codemaker-1.92.0.tgz", + "integrity": "sha512-h9LW/YFYMAXHvv4aHNxVfawza/8GHL0Nw0zFpqdURXsjRlsCtG+SzqRvYLOJoFqxzZ9+rkXJf8fODImC6WHa8g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "camelcase": "^6.3.0", "decamelize": "^5.0.1", "fs-extra": "^10.1.0" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/codemaker/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6197,9 +8252,10 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "dev": true, - "license": "MIT" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true }, "node_modules/color-convert": { "version": "2.0.1", @@ -6238,11 +8294,44 @@ "node": ">=0.1.90" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "3.0.2", "inBundle": true, "license": "MIT" }, + "node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "inBundle": true, + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, + "node_modules/commist/node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "inBundle": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/commonmark": { "version": "0.30.0", "dev": true, @@ -6276,15 +8365,15 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, + "inBundle": true, "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", - "dev": true, "engines": [ "node >= 6.0" ], + "inBundle": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -6637,23 +8726,37 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/core-util-is": { "version": "1.0.3", "inBundle": true, "license": "MIT" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -6672,6 +8775,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "inBundle": true + }, "node_modules/crypto-random-string": { "version": "4.0.0", "dev": true, @@ -6714,8 +8823,9 @@ }, "node_modules/date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0" } @@ -6730,7 +8840,7 @@ }, "node_modules/debug": { "version": "4.3.4", - "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -6746,8 +8856,9 @@ }, "node_modules/decamelize": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6809,9 +8920,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", "dev": true, - "license": "MIT" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-extend": { "version": "0.6.0", @@ -6827,9 +8947,10 @@ "license": "MIT" }, "node_modules/deepmerge": { - "version": "4.2.2", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6865,6 +8986,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "inBundle": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "inBundle": true, @@ -6880,8 +9012,9 @@ }, "node_modules/detect-indent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -6902,14 +9035,6 @@ "node": ">=0.3.1" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "dev": true, @@ -7011,6 +9136,32 @@ "node": ">=4" } }, + "node_modules/downlevel-dts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/downlevel-dts/-/downlevel-dts-0.11.0.tgz", + "integrity": "sha512-vo835pntK7kzYStk7xUHDifiYJvXxVhUapt85uk2AI94gUUAQX9HNRtrcMHNSc3YHJUEHGbYIGsM99uIbgAtxw==", + "dev": true, + "dependencies": { + "semver": "^7.3.2", + "shelljs": "^0.8.3", + "typescript": "next" + }, + "bin": { + "downlevel-dts": "index.js" + } + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "inBundle": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "dev": true, @@ -7024,14 +9175,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.266", - "dev": true, - "license": "ISC" + "version": "1.4.593", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz", + "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==", + "dev": true }, "node_modules/emittery": { - "version": "0.10.2", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7053,6 +9206,15 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "inBundle": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.10.0", "dev": true, @@ -7486,18 +9648,6 @@ } } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-utils": { "version": "3.0.0", "dev": true, @@ -7524,11 +9674,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/argparse": { @@ -7633,14 +9787,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "dev": true, @@ -7659,8 +9805,9 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7681,6 +9828,8 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -7695,86 +9844,60 @@ } }, "node_modules/expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "license": "MIT", "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" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/expect/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/expect/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/extend": { "version": "3.0.2", "inBundle": true, @@ -7808,9 +9931,10 @@ "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.2.12", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7893,8 +10017,9 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -7975,6 +10100,28 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "inBundle": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "inBundle": true, @@ -7983,6 +10130,22 @@ "is-callable": "^1.1.3" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/form-data-encoder": { "version": "2.1.2", "dev": true, @@ -8025,9 +10188,23 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, + "inBundle": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "inBundle": true, @@ -8099,8 +10276,9 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -8128,8 +10306,9 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -8355,7 +10534,7 @@ }, "node_modules/glob": { "version": "7.2.3", - "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -8383,20 +10562,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-promise": { - "version": "3.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@types/glob": "*" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "glob": "*" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "inBundle": true, @@ -8501,6 +10666,12 @@ "dev": true, "license": "MIT" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "16.6.0", "license": "MIT", @@ -8641,6 +10812,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "inBundle": true, + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, "node_modules/hosted-git-info": { "version": "5.1.0", "dev": true, @@ -8654,8 +10835,9 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.0", @@ -8712,8 +10894,9 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -8758,9 +10941,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.0", - "dev": true, - "license": "MIT", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "engines": { "node": ">= 4" } @@ -8820,8 +11003,9 @@ }, "node_modules/import-local": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -8859,7 +11043,7 @@ }, "node_modules/inflight": { "version": "1.0.6", - "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -9012,6 +11196,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ip": { "version": "2.0.0", "dev": true, @@ -9142,8 +11335,9 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -9289,8 +11483,9 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -9400,59 +11595,66 @@ "dev": true, "license": "ISC" }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "inBundle": true, + "optional": true, + "peer": true, + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "inBundle": true, "license": "MIT" }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -9463,9 +11665,10 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -9475,20 +11678,21 @@ } }, "node_modules/jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -9500,135 +11704,112 @@ } }, "node_modules/jest-changed-files": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/jest-cli": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -9640,35 +11821,36 @@ } }, "node_modules/jest-config": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", @@ -9683,157 +11865,80 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/jest-get-type": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/jest-docblock": { - "version": "28.1.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/jest-environment-node": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" @@ -9862,134 +11967,57 @@ } }, "node_modules/jest-leak-detector": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.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", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/jest-mock": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -10003,221 +12031,199 @@ } }, "node_modules/jest-regex-util": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "license": "MIT", "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/jest-runtime": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/jest-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -10225,40 +12231,31 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -10266,60 +12263,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/jest-watcher": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "MIT", "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10351,14 +12333,21 @@ } }, "node_modules/js-sdsl": { - "version": "4.1.4", - "dev": true, - "license": "MIT" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "devOptional": true, + "inBundle": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -10374,8 +12363,9 @@ }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -10384,48 +12374,50 @@ } }, "node_modules/jsii": { - "version": "1.69.0", + "version": "5.2.32", + "resolved": "https://registry.npmjs.org/jsii/-/jsii-5.2.32.tgz", + "integrity": "sha512-91g2+havdNomPRVmkkhv7SDxb66t8UybdkWkDH7ESK1SenZZ5VrAievYDSNQG16tBO0YBn1mTCy4G1pbFhPvfQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "case": "^1.6.3", "chalk": "^4", + "downlevel-dts": "^0.11.0", "fast-deep-equal": "^3.1.3", - "fs-extra": "^10.1.0", - "log4js": "^6.6.1", - "semver": "^7.3.7", + "log4js": "^6.9.1", + "semver": "^7.5.4", "semver-intersect": "^1.4.0", "sort-json": "^2.0.1", - "spdx-license-list": "^6.6.0", - "typescript": "~3.9.10", - "yargs": "^16.2.0" + "spdx-license-list": "^6.8.0", + "typescript": "~5.2", + "yargs": "^17.7.2" }, "bin": { "jsii": "bin/jsii" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 16.14.0" } }, "node_modules/jsii-diff": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-diff/-/jsii-diff-1.92.0.tgz", + "integrity": "sha512-gEfYFtYIiz+SytHFTE/JG3mdTRLFwxTy4sRx9RUmCFF2jSorpEGpfrzwv+bwKEA7G4IqhbHhza05ePfpBQrbdw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "fs-extra": "^10.1.0", - "jsii-reflect": "^1.69.0", - "log4js": "^6.6.1", + "jsii-reflect": "^1.92.0", + "log4js": "^6.9.1", "yargs": "^16.2.0" }, "bin": { "jsii-diff": "bin/jsii-diff" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/jsii-diff/node_modules/is-fullwidth-code-point": { @@ -10467,25 +12459,75 @@ } }, "node_modules/jsii-docgen": { - "version": "7.0.97", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/jsii-docgen/-/jsii-docgen-10.2.2.tgz", + "integrity": "sha512-MyaHFU84SYJc7jOcqyT8Ve5pVVAgbgpn9uvTAhX+s7l3wYKY7vrXCBUHmM2XX1nrKuhs0J8nknQDXLiwQXXfDQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jsii/spec": "^1.69.0", + "@jsii/spec": "^1.92.0", "case": "^1.6.3", "fs-extra": "^10.1.0", - "glob": "^7.2.3", - "glob-promise": "^3.4.0", - "jsii-reflect": "^1.69.0", - "jsii-rosetta": "^1.69.0", - "semver": "^7.3.7", + "glob": "^8.1.0", + "glob-promise": "^6.0.5", + "jsii-reflect": "^1.92.0", + "semver": "^7.5.4", "yargs": "^16.2.0" }, "bin": { "jsii-docgen": "bin/jsii-docgen" }, "engines": { - "node": ">= 14.17.0" + "node": ">= 16.0.0" + }, + "peerDependencies": { + "jsii-rosetta": "~v1.85.0 || ~5.0.14 || ~5.1.2 || ~5.2.0" + } + }, + "node_modules/jsii-docgen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jsii-docgen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jsii-docgen/node_modules/glob-promise": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.5.tgz", + "integrity": "sha512-uUzvxo60yo/vMLXZHCNAlfdM5U5A07jCnUO8xTK44Z0Vc58poGDXhDx8ju1DmPdprOORh+4Lpog64hl+AJ5piA==", + "dev": true, + "dependencies": { + "@types/glob": "^8.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^8.0.3" } }, "node_modules/jsii-docgen/node_modules/is-fullwidth-code-point": { @@ -10496,6 +12538,18 @@ "node": ">=8" } }, + "node_modules/jsii-docgen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsii-docgen/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -10527,21 +12581,22 @@ } }, "node_modules/jsii-pacmak": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-pacmak/-/jsii-pacmak-1.92.0.tgz", + "integrity": "sha512-LIwXYTYjX5APnb6qzu5TDMEkSJXq5ntE71fT5Lpj3KMpOGGOrYlCAuP1lxpf1oWfIZeuyC4orRafuE7AECEa/A==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "clone": "^2.1.2", - "codemaker": "^1.69.0", + "codemaker": "^1.92.0", "commonmark": "^0.30.0", "escape-string-regexp": "^4.0.0", "fs-extra": "^10.1.0", - "jsii-reflect": "^1.69.0", - "jsii-rosetta": "^1.69.0", - "semver": "^7.3.7", - "spdx-license-list": "^6.6.0", + "jsii-reflect": "^1.92.0", + "jsii-rosetta": "^1.92.0", + "semver": "^7.5.4", + "spdx-license-list": "^6.8.0", "xmlbuilder": "^15.1.1", "yargs": "^16.2.0" }, @@ -10549,7 +12604,7 @@ "jsii-pacmak": "bin/jsii-pacmak" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/jsii-pacmak/node_modules/is-fullwidth-code-point": { @@ -10560,6 +12615,59 @@ "node": ">=8" } }, + "node_modules/jsii-pacmak/node_modules/jsii": { + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii/-/jsii-1.92.0.tgz", + "integrity": "sha512-UHuPVMkUXBcbnSAsylQSea7BFNkr6hkx6NhGGoZ5Xnb3fZV7wwr9DHnE14yQJUIsrCL8WcqhCU79QTbWmnKpag==", + "dev": true, + "dependencies": { + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", + "case": "^1.6.3", + "chalk": "^4", + "fast-deep-equal": "^3.1.3", + "fs-extra": "^10.1.0", + "log4js": "^6.9.1", + "semver": "^7.5.4", + "semver-intersect": "^1.4.0", + "sort-json": "^2.0.1", + "spdx-license-list": "^6.8.0", + "typescript": "~3.9.10", + "yargs": "^16.2.0" + }, + "bin": { + "jsii": "bin/jsii" + }, + "engines": { + "node": ">= 14.17.0" + } + }, + "node_modules/jsii-pacmak/node_modules/jsii-rosetta": { + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-1.92.0.tgz", + "integrity": "sha512-TKrCq3FToJ3rgCUzDEOWHIoYEs4CvtyXNNE2dPkX5YYv3+18vP8qiftGpyHGcgyslx2E7gm1g/8uPkAxeAEP+A==", + "dev": true, + "dependencies": { + "@jsii/check-node": "1.92.0", + "@jsii/spec": "1.92.0", + "@xmldom/xmldom": "^0.8.10", + "commonmark": "^0.30.0", + "fast-glob": "^3.3.2", + "jsii": "1.92.0", + "semver": "^7.5.4", + "semver-intersect": "^1.4.0", + "stream-json": "^1.8.0", + "typescript": "~3.9.10", + "workerpool": "^6.5.1", + "yargs": "^16.2.0" + }, + "bin": { + "jsii-rosetta": "bin/jsii-rosetta" + }, + "engines": { + "node": ">= 14.17.0" + } + }, "node_modules/jsii-pacmak/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -10573,6 +12681,19 @@ "node": ">=8" } }, + "node_modules/jsii-pacmak/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/jsii-pacmak/node_modules/yargs": { "version": "16.2.0", "dev": true, @@ -10591,36 +12712,39 @@ } }, "node_modules/jsii-reflect": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-reflect/-/jsii-reflect-1.92.0.tgz", + "integrity": "sha512-9ZLaygpYXG7UBqcUtgINd4pDL43l2gdUwOqWUrMz5beVOgp1ccvbihVPW6LtWGcTDfC+A2oNzjEP6roUvWvDDw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "chalk": "^4", "fs-extra": "^10.1.0", - "oo-ascii-tree": "^1.69.0", + "oo-ascii-tree": "^1.92.0", "yargs": "^16.2.0" }, "bin": { "jsii-tree": "bin/jsii-tree" }, "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/jsii-reflect/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jsii-reflect/node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10632,8 +12756,9 @@ }, "node_modules/jsii-reflect/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -10648,127 +12773,58 @@ } }, "node_modules/jsii-rosetta": { - "version": "1.69.0", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-5.2.3.tgz", + "integrity": "sha512-W4uUf1IMW9ZVDXWc/DsfJqn07SuhC19+g7IvmPd7W/Qs1kIRu7nvqGS8DrHO0SVa4A5uCb3w+fSGUGb/7KjcfQ==", "dev": true, - "license": "Apache-2.0", + "peer": true, "dependencies": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "1.69.0", - "@xmldom/xmldom": "^0.8.2", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", + "@xmldom/xmldom": "^0.8.10", + "chalk": "^4", "commonmark": "^0.30.0", - "fast-glob": "^3.2.12", - "jsii": "1.69.0", - "semver": "^7.3.7", + "fast-glob": "^3.3.2", + "jsii": "~5.2.5", + "semver": "^7.5.4", "semver-intersect": "^1.4.0", - "typescript": "~3.9.10", - "workerpool": "^6.2.1", - "yargs": "^16.2.0" + "stream-json": "^1.8.0", + "typescript": "~5.2.2", + "workerpool": "^6.5.1", + "yargs": "^17.7.2" }, "bin": { "jsii-rosetta": "bin/jsii-rosetta" }, "engines": { - "node": ">= 14.6.0" - } - }, - "node_modules/jsii-rosetta/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jsii-rosetta/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "node": ">= 16.14.0" } }, "node_modules/jsii-rosetta/node_modules/typescript": { - "version": "3.9.10", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/jsii-rosetta/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsii/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jsii/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=14.17" } }, "node_modules/jsii/node_modules/typescript": { - "version": "3.9.10", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/jsii/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "node": ">=14.17" } }, "node_modules/json-buffer": { @@ -10820,8 +12876,9 @@ "license": "ISC" }, "node_modules/json5": { - "version": "2.2.1", - "license": "MIT", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -10886,8 +12943,9 @@ }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10908,8 +12966,9 @@ }, "node_modules/leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11038,15 +13097,16 @@ "license": "MIT" }, "node_modules/log4js": { - "version": "6.6.1", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "date-format": "^4.0.13", + "date-format": "^4.0.14", "debug": "^4.3.4", - "flatted": "^3.2.6", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.1.2" + "streamroller": "^3.1.5" }, "engines": { "node": ">=8.0" @@ -11072,27 +13132,20 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "dev": true, @@ -11126,8 +13179,9 @@ }, "node_modules/makeerror": { "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -11339,8 +13393,9 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -11370,10 +13425,36 @@ "lodash.camelcase": "^4.3.0" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "inBundle": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11403,7 +13484,7 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -11549,9 +13630,71 @@ "node": ">=0.10.0" } }, + "node_modules/mqtt": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.8.tgz", + "integrity": "sha512-DJYjlXODVXtSDecN8jnNzi6ItX3+ufGsEs9OB3YV24HtkRrh7kpx8L5M1LuyF0KzaiGtWr2PzDcMGAY60KGOSA==", + "inBundle": true, + "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", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "split2": "^3.1.0", + "ws": "^7.5.0", + "xtend": "^4.0.2" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "inBundle": true, + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "inBundle": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/ms": { "version": "2.1.2", - "dev": true, + "inBundle": true, "license": "MIT" }, "node_modules/mute-stream": { @@ -11602,13 +13745,15 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true }, "node_modules/node-releases": { - "version": "2.0.6", - "dev": true, - "license": "MIT" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true }, "node_modules/nopt": { "version": "5.0.0", @@ -11640,8 +13785,9 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11898,8 +14044,9 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -11921,6 +14068,18 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "inBundle": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "inBundle": true, @@ -12007,7 +14166,7 @@ }, "node_modules/once": { "version": "1.4.0", - "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -12015,8 +14174,9 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -12028,11 +14188,12 @@ } }, "node_modules/oo-ascii-tree": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/oo-ascii-tree/-/oo-ascii-tree-1.92.0.tgz", + "integrity": "sha512-rLSPbnakn5Wb3dOIVtrmn8jfHKqWv7bROpyBiw6DExq+dOG7qC49EIs89hBhyHkvLolX0oC+0a/RMPAyHEZ+1w==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">= 14.6.0" + "node": ">= 14.17.0" } }, "node_modules/open": { @@ -12263,7 +14424,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "dev": true, + "inBundle": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12334,17 +14495,19 @@ } }, "node_modules/pirates": { - "version": "4.0.5", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -12354,8 +14517,9 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -12366,8 +14530,9 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -12377,8 +14542,9 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -12391,8 +14557,9 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -12434,22 +14601,24 @@ } }, "node_modules/pretty-format": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -12477,6 +14646,17 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "inBundle": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "inBundle": true, @@ -13235,8 +15415,9 @@ }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -13270,9 +15451,26 @@ "dev": true, "license": "ISC" }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "inBundle": true, + "optional": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "inBundle": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -13292,6 +15490,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/q": { "version": "1.5.1", "dev": true, @@ -13385,9 +15599,10 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "dev": true, - "license": "MIT" + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true }, "node_modules/read-package-json": { "version": "5.0.2", @@ -13591,7 +15806,7 @@ }, "node_modules/readable-stream": { "version": "3.6.0", - "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -13602,6 +15817,18 @@ "node": ">= 6" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "dev": true, @@ -13666,6 +15893,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", + "inBundle": true + }, "node_modules/remote-git-tags": { "version": "3.0.0", "dev": true, @@ -13713,8 +15946,9 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -13724,8 +15958,9 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -13739,9 +15974,10 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -13799,7 +16035,8 @@ }, "node_modules/rfdc": { "version": "1.3.0", - "dev": true, + "devOptional": true, + "inBundle": true, "license": "MIT" }, "node_modules/rimraf": { @@ -13893,9 +16130,10 @@ "license": "ISC" }, "node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14007,6 +16245,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { "version": "1.0.4", "inBundle": true, @@ -14075,8 +16330,9 @@ }, "node_modules/sort-json": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz", + "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==", "dev": true, - "license": "MIT", "dependencies": { "detect-indent": "^5.0.0", "detect-newline": "^2.1.0", @@ -14088,8 +16344,9 @@ }, "node_modules/sort-json/node_modules/detect-newline": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14199,9 +16456,10 @@ "license": "CC0-1.0" }, "node_modules/spdx-license-list": { - "version": "6.6.0", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.8.0.tgz", + "integrity": "sha512-5UdM7r9yJ1EvsPQZWfa41AZjLQngl9iMMysm9XBW7Lqhq7aF8cllfqjS+rFCHB8FFMGSM0yFWue2LUV9mR0QzQ==", "dev": true, - "license": "CC0-1.0", "engines": { "node": ">=8" }, @@ -14222,7 +16480,7 @@ }, "node_modules/split2": { "version": "3.2.2", - "dev": true, + "inBundle": true, "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" @@ -14253,9 +16511,10 @@ } }, "node_modules/stack-utils": { - "version": "2.0.5", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -14265,8 +16524,9 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -14408,10 +16668,32 @@ "node": ">=10" } }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true + }, + "node_modules/stream-json": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", + "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", + "dev": true, + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "inBundle": true + }, "node_modules/streamroller": { - "version": "3.1.3", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, - "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -14423,8 +16705,9 @@ }, "node_modules/streamroller/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -14436,23 +16719,25 @@ }, "node_modules/streamroller/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/streamroller/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -14460,8 +16745,9 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -14549,16 +16835,18 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -14585,6 +16873,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "inBundle": true + }, "node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -14596,18 +16890,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "dev": true, @@ -14758,25 +17040,11 @@ "node": ">= 10" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -14834,13 +17102,15 @@ }, "node_modules/tmpl": { "version": "1.0.5", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -14864,32 +17134,45 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { - "version": "28.0.8", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^28.0.0", - "babel-jest": "^28.0.0", - "jest": "^28.0.0", - "typescript": ">=4.3" + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -14987,28 +17270,10 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "inBundle": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "inBundle": true }, "node_modules/type-check": { "version": "0.4.0", @@ -15023,8 +17288,9 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -15054,15 +17320,16 @@ } }, "node_modules/typescript": { - "version": "4.8.4", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { @@ -15077,6 +17344,12 @@ "node": ">=0.8.0" } }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "inBundle": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "inBundle": true, @@ -15144,7 +17417,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -15154,15 +17429,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -15247,9 +17525,14 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "9.0.0", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "license": "MIT", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -15260,13 +17543,14 @@ "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.0.1", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" @@ -15301,8 +17585,9 @@ }, "node_modules/walker": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -15319,6 +17604,73 @@ "node": ">=10.13.0" } }, + "node_modules/websocket-stream": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", + "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", + "inBundle": true, + "dependencies": { + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "^3.2.0", + "xtend": "^4.0.0" + } + }, + "node_modules/websocket-stream/node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "inBundle": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/websocket-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "inBundle": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "inBundle": true + }, + "node_modules/websocket-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "inBundle": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/websocket-stream/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "inBundle": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -15473,9 +17825,10 @@ "license": "MIT" }, "node_modules/workerpool": { - "version": "6.2.1", - "dev": true, - "license": "Apache-2.0" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true }, "node_modules/wrap-ansi": { "version": "8.0.1", @@ -15552,13 +17905,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, + "inBundle": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -15630,7 +17984,7 @@ }, "node_modules/xtend": { "version": "4.0.2", - "dev": true, + "inBundle": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -15646,6 +18000,7 @@ }, "node_modules/yallist": { "version": "4.0.0", + "inBundle": true, "license": "ISC" }, "node_modules/yaml": { @@ -15657,17 +18012,18 @@ } }, "node_modules/yargs": { - "version": "17.5.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -15681,6 +18037,20 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -15702,6 +18072,23 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "dev": true, @@ -15735,7 +18122,7 @@ "version": "0.0.0", "license": "MPL-2.0", "dependencies": { - "@aws-sdk/client-apigatewaymanagementapi": "^3.180.0", + "@aws-cdk/aws-lambda-python-alpha": "^2.75.0-alpha.0", "@aws-sdk/client-dynamodb": "^3.180.0", "@aws-sdk/client-eventbridge": "^3.180.0", "@aws-sdk/client-lambda": "^3.180.0", @@ -15745,24 +18132,164 @@ "@aws-sdk/lib-dynamodb": "^3.180.0", "@aws-sdk/util-dynamodb": "^3.180.0", "@serverless-stack/node": "^1.15.4", - "aws-cdk-lib": "^2.51.0", + "aws-cdk-lib": "^2.75.0", "aws-lambda": "^1.0.7", "aws4": "^1.11.0", "constructs": "^10.1.115", "tsconfig-paths": "^4.1.0" }, "devDependencies": { - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.10", "@types/node": "^18.7.23", - "aws-cdk": "^2.43.1", + "aws-cdk": "^2.75.1", "esbuild": "^0.15.9", - "jest": "^28.1.3", + "jest": "^29.7.0", "jest-junit": "^14.0.1", "npm-check-updates": "^15", "projen": "^0.62.24", - "ts-jest": "^28.0.8", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^5.2.2" + } + }, + "test/cdk/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "test/cdk/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "test/cdk/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "test/cdk/node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "test/cdk/node_modules/ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "test/node_modules/aws-cdk": { + "version": "2.110.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.110.1.tgz", + "integrity": "sha512-/V0FOgsvD/FkFANrYnSmyb+XK56tm2oE86pUCoEggQ2tka6Zm0z9blKZQV4euMErNSkWz4ReSAKenaqk86Fr5Q==", + "dev": true, + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "test/node_modules/brace-expansion": { @@ -15871,21 +18398,45 @@ "engines": { "node": ">=4" } + }, + "test/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "test/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } } }, "dependencies": { "@ampproject/remapping": { - "version": "2.2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@aws-cdk/asset-awscli-v1": { - "version": "2.2.200", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", - "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" + "version": "2.2.201", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.201.tgz", + "integrity": "sha512-INZqcwDinNaIdb5CtW3ez5s943nX5stGBQS6VOP2JDlOFP81hM3fds/9NDknipqfUkZM43dx+HgVvkXYXXARCQ==" }, "@aws-cdk/asset-kubectl-v20": { "version": "2.1.2", @@ -15897,12 +18448,10 @@ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" }, - "@aws-cdk/aws-apigatewayv2-alpha": { - "version": "2.43.1-alpha.0", - "requires": {} - }, - "@aws-cdk/aws-apigatewayv2-integrations-alpha": { - "version": "2.43.1-alpha.0", + "@aws-cdk/aws-lambda-python-alpha": { + "version": "2.75.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/aws-lambda-python-alpha/-/aws-lambda-python-alpha-2.75.0-alpha.0.tgz", + "integrity": "sha512-AlP6doxzfut1k+Z97lHsk9MvFzghHv9qizTVyn2+8VQp40DEEvZ1H8P9e/zZSpjqu5wCbL7vybcQyp7ymKykUg==", "requires": {} }, "@aws-crypto/crc32": { @@ -16004,71 +18553,32 @@ "version": "2.0.2", "requires": { "@aws-sdk/types": "^3.110.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1" - } - } - }, - "@aws-sdk/abort-controller": { - "version": "3.178.0", - "requires": { - "@aws-sdk/types": "3.178.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/chunked-blob-reader": { - "version": "3.170.0", - "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/chunked-blob-reader-native": { - "version": "3.170.0", - "requires": { - "@aws-sdk/util-base64-browser": "3.170.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/client-apigatewaymanagementapi": { - "version": "3.180.0", - "requires": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.180.0", - "@aws-sdk/config-resolver": "3.178.0", - "@aws-sdk/credential-provider-node": "3.180.0", - "@aws-sdk/fetch-http-handler": "3.178.0", - "@aws-sdk/hash-node": "3.178.0", - "@aws-sdk/invalid-dependency": "3.178.0", - "@aws-sdk/middleware-content-length": "3.178.0", - "@aws-sdk/middleware-host-header": "3.178.0", - "@aws-sdk/middleware-logger": "3.178.0", - "@aws-sdk/middleware-recursion-detection": "3.178.0", - "@aws-sdk/middleware-retry": "3.178.0", - "@aws-sdk/middleware-serde": "3.178.0", - "@aws-sdk/middleware-signing": "3.179.0", - "@aws-sdk/middleware-stack": "3.178.0", - "@aws-sdk/middleware-user-agent": "3.178.0", - "@aws-sdk/node-config-provider": "3.178.0", - "@aws-sdk/node-http-handler": "3.178.0", - "@aws-sdk/protocol-http": "3.178.0", - "@aws-sdk/smithy-client": "3.180.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1" + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.178.0", + "requires": { "@aws-sdk/types": "3.178.0", - "@aws-sdk/url-parser": "3.178.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/chunked-blob-reader": { + "version": "3.170.0", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/chunked-blob-reader-native": { + "version": "3.170.0", + "requires": { "@aws-sdk/util-base64-browser": "3.170.0", - "@aws-sdk/util-base64-node": "3.170.0", - "@aws-sdk/util-body-length-browser": "3.170.0", - "@aws-sdk/util-body-length-node": "3.170.0", - "@aws-sdk/util-defaults-mode-browser": "3.180.0", - "@aws-sdk/util-defaults-mode-node": "3.180.0", - "@aws-sdk/util-user-agent-browser": "3.178.0", - "@aws-sdk/util-user-agent-node": "3.178.0", - "@aws-sdk/util-utf8-browser": "3.170.0", - "@aws-sdk/util-utf8-node": "3.170.0", "tslib": "^2.3.1" } }, @@ -16199,6 +18709,427 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/client-iot": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.449.0.tgz", + "integrity": "sha512-lE86rjRuY3x215FAoX2WkahbhvTgrfp8QqyGaOwhvQRIDfvp/H7KFavR8V/UnHbLWt4nykkg5iBgIRyPsmxd7A==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.449.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "requires": { + "@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" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/client-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.449.0.tgz", + "integrity": "sha512-HFTlFbf9jwp5BJkXbMKlEwk6oGC7AVYaPEkaNk77kzZ8RGoqVSAqe0HL74DACcJUpMD/VWYX7pfWq/Wm+2B79g==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/client-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.449.0.tgz", + "integrity": "sha512-iKh5Es9tyY+Ch17bvMubW67ydW4X3Buy9vwTIqpmXlnXEfbvjZRwycjWK2MO/P1Su3wjA14zNBq2ifNWFxkwFA==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-sdk-sts": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz", + "integrity": "sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.449.0.tgz", + "integrity": "sha512-C2pMYysIfbRBR4Q+Aj7J0cRsKY/X2cOnrggrWzsEUJK3EJ1aHwrzm3HI0VM5DttJyya5hE4tZ/H1VX3zNGUtKA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.449.0.tgz", + "integrity": "sha512-cCsqMqL8vmHADwIHCmTWDB4vr5fCXb4PZn3njbA/PIA92xL4S7hRmYi/1ll0CMd+fks+t/h+s+PIhFGo54C7cA==", + "requires": { + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-ini": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz", + "integrity": "sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.449.0.tgz", + "integrity": "sha512-Lfhh38rOjFAZBjZZJ2ehve+X048xxr+hTr+ntGOKady1GAH6W1U5UGNYuD9fr5vFaQQtAcNLKkUui+TnmJ4z/w==", + "requires": { + "@aws-sdk/client-sso": "3.449.0", + "@aws-sdk/token-providers": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz", + "integrity": "sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz", + "integrity": "sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==", + "requires": { + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz", + "integrity": "sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "requires": { + "strnum": "^1.0.5" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, "@aws-sdk/client-lambda": { "version": "3.180.0", "requires": { @@ -16955,6 +19886,15 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", + "requires": { + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" + } + }, "@aws-sdk/credential-provider-cognito-identity": { "version": "3.180.0", "requires": { @@ -17384,6 +20324,18 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", + "requires": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, "@aws-sdk/service-error-classification": { "version": "3.178.0" }, @@ -17422,6 +20374,213 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/token-providers": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz", + "integrity": "sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==", + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "requires": { + "@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" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + } + } + }, "@aws-sdk/types": { "version": "3.178.0" }, @@ -17518,6 +20677,27 @@ "tslib": "^2.3.1" } }, + "@aws-sdk/util-endpoints": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz", + "integrity": "sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==", + "requires": { + "@aws-sdk/types": "3.449.0", + "@smithy/util-endpoints": "^1.0.2", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + } + } + }, "@aws-sdk/util-hex-encoding": { "version": "3.170.0", "requires": { @@ -17606,169 +20786,273 @@ } }, "@babel/code-frame": { - "version": "7.18.6", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { - "version": "7.19.3", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true }, "@babel/core": { - "version": "7.19.3", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { "semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dev": true, "requires": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.19.3", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.19.0", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.18.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.18.10", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true }, "@babel/helpers": { - "version": "7.19.0", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" } }, "@babel/highlight": { - "version": "7.18.6", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -17776,6 +21060,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -17785,6 +21071,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -17792,18 +21080,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -17812,11 +21108,15 @@ } }, "@babel/parser": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17824,6 +21124,8 @@ }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17831,6 +21133,8 @@ }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" @@ -17838,6 +21142,8 @@ }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -17845,13 +21151,26 @@ }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -17859,6 +21178,8 @@ }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17866,6 +21187,8 @@ }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -17873,6 +21196,8 @@ }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17880,6 +21205,8 @@ }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17887,6 +21214,8 @@ }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" @@ -17894,60 +21223,74 @@ }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/template": { - "version": "7.18.10", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.19.3", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { - "version": "7.19.3", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "@cspotcode/source-map-support": { @@ -17967,6 +21310,21 @@ } } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, "@eslint/eslintrc": { "version": "1.3.2", "dev": true, @@ -18021,6 +21379,71 @@ "tslib": "^2.4.0" } }, + "@httptoolkit/websocket-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", + "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", + "optional": true, + "peer": true, + "requires": { + "@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" + }, + "dependencies": { + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "optional": true, + "peer": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "peer": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true, + "peer": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "peer": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "@humanwhocodes/config-array": { "version": "0.10.5", "dev": true, @@ -18048,6 +21471,8 @@ }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -18059,6 +21484,8 @@ "dependencies": { "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -18067,6 +21494,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -18074,6 +21503,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -18081,6 +21512,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -18088,137 +21521,137 @@ }, "resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - } } }, "@jest/environment": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3" + "jest-mock": "^29.7.0" } }, "@jest/expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { - "jest-get-type": "^28.0.2" + "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "@jest/globals": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" } }, "@jest/reporters": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -18226,82 +21659,93 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" } }, "@jest/schemas": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "28.1.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.13", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { - "@jest/test-result": "^28.1.3", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" } }, "@jest/types": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -18310,11 +21754,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { @@ -18323,6 +21770,8 @@ }, "@jridgewell/set-array": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -18330,30 +21779,38 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@jsii/check-node": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@jsii/check-node/-/check-node-1.92.0.tgz", + "integrity": "sha512-MQnFvDIn/VOz4FzchobZ4dfrl6qfuZIlYviNbGXhPMSeJ92BVB2F+NEyem9Sg/Csy2ehhtO1FGaUj4mO9/7Ntg==", "dev": true, "requires": { "chalk": "^4.1.2", - "semver": "^7.3.7" + "semver": "^7.5.4" } }, "@jsii/spec": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@jsii/spec/-/spec-1.92.0.tgz", + "integrity": "sha512-6jbwQ2uCVOUq6eddKQG/cPzuUsdJwaszQstTZtruhhjWNuoC4CjT5eHlzjeBqtxQZpGiKkRRwPHb1bCEGgffxA==", "dev": true, "requires": { - "ajv": "^8.11.0" + "ajv": "^8.12.0" }, "dependencies": { "ajv": { - "version": "8.11.0", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -18364,6 +21821,8 @@ }, "json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } @@ -18980,26 +22439,483 @@ } } }, - "@sinclair/typebox": { - "version": "0.24.43", - "dev": true + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@sindresorhus/is": { + "version": "5.3.0", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, + "@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/config-resolver": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, + "@smithy/credential-provider-imds": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "tslib": "^2.5.0" + } + }, + "@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", + "requires": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@aws-sdk/types": { + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + } + } + }, + "@smithy/fetch-http-handler": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.5.tgz", + "integrity": "sha512-m9yoTx+64XRSpCzWArOpvHeAuVfI2LFz2hDzgzjzCLlN8IIwzkFaCav5ShsYxx4iu9sXp09+on0a5VROY9+MFQ==", + "requires": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "@smithy/hash-node": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.13.tgz", + "integrity": "sha512-0L2BJ/uVLB+XMeuUfz2qhkcsgVL6IdO3ekROYTW7Wg+sWWqXm8fPN7RtqCrHjpAkPu4X23fsl2NpOjXsH/vNgA==", + "requires": { + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", + "requires": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-endpoint": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.5.tgz", + "integrity": "sha512-eRhI0mI9tnkpmLwJbprV+MdlPyOMe8tFtVrNFMUlgOQrJeYv5AD5UFRn/KhgNX1vO1pVgpPtD9R+cRuFhj/lIQ==", + "requires": { + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-retry": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/node-config-provider": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", + "requires": { + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", + "requires": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", + "requires": { + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", + "requires": { + "@smithy/types": "^2.4.0" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/signature-v4": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.13.tgz", + "integrity": "sha512-odJl+t0YdI2wT61Nr6qvlN+I8APNFWTtPr90CqVyHidb4Kyzq3lFSiY5T6I+IdvCV6BbNZ2btUYm2R6ae7zWYw==", + "requires": { + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "@smithy/smithy-client": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.13.tgz", + "integrity": "sha512-iFqrjps6K/eLNbDKppyp5gCCZyEtv/BYMlDSBXwwHIrwV7sZ8l8r6OGAcg1a69j4Id1uJccYppaTpW5G1BLhsA==", + "requires": { + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.18", + "tslib": "^2.5.0" + } + }, + "@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "requires": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-base64": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "requires": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "requires": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.17.tgz", + "integrity": "sha512-kAJNbe3n4PYOpudOUjcyZ3MZ8G3xWt/oV+lZp/y87Rmd5/evLEc5VVuEW6u030aY8L3Uw2PX6cVA5UuJBIN14Q==", + "requires": { + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.13", + "@smithy/types": "^2.4.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.23.tgz", + "integrity": "sha512-S319Pjqmo4Quq6D9Ytt/XLMpS0PgbZZ7WAjjs3+6h0b/fRkUe5qppE115plpZZvN1EixDbh9R/k30tDOJayYdA==", + "requires": { + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.13", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-endpoints": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", + "requires": { + "@smithy/node-config-provider": "^2.1.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } + }, + "@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "requires": { + "tslib": "^2.5.0" + } }, - "@sindresorhus/is": { - "version": "5.3.0", - "dev": true + "@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", + "requires": { + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + } }, - "@sinonjs/commons": { - "version": "1.8.3", - "dev": true, + "@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "requires": { - "type-detect": "4.0.8" + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" } }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "dev": true, + "@smithy/util-stream": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.18.tgz", + "integrity": "sha512-e/a7JrmHTy+gxHjdJKHQFyK8X2SCoJEaBXTrs5Q/HS69a3P4P0Mbu1znKFKFM/fDtppCxPCO0IcIbNvbVSEJ8w==", + "requires": { + "@smithy/fetch-http-handler": "^2.2.5", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", + "tslib": "^2.5.0" + } + }, + "@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "requires": { + "tslib": "^2.5.0" + } + }, + "@smithy/util-utf8": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.1.tgz", + "integrity": "sha512-JvpZMUTMIil6rstH3tyBjCE7tuTmCprcmCXHW4o8a5mSthhQ8fEj5lDWOonTigtB2CqiBQ/SWlpoctuzVO7J0Q==", "requires": { - "@sinonjs/commons": "^1.7.0" + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" } }, "@szmarczak/http-timer": { @@ -19028,6 +22944,17 @@ "version": "1.0.3", "dev": true }, + "@types/aws-iot-device-sdk": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.8.tgz", + "integrity": "sha512-l7JWoN1vHDpvm13kppPSmfnIQbQrJK7kvG95LIKf3qYF+WJjaUDOTdMn8BA8djHWb7ASRu2D4jtuVzSTj2We6Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/ws": "*", + "mqtt": "^4.2.8" + } + }, "@types/aws-lambda": { "version": "8.10.106", "dev": true @@ -19040,25 +22967,31 @@ } }, "@types/babel__core": { - "version": "7.1.19", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { - "version": "7.6.4", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.1", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -19066,22 +22999,28 @@ } }, "@types/babel__traverse": { - "version": "7.18.2", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/glob": { - "version": "8.0.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", "dev": true, "requires": { - "@types/minimatch": "*", + "@types/minimatch": "^5.1.2", "@types/node": "*" } }, "@types/graceful-fs": { - "version": "4.1.5", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "requires": { "@types/node": "*" @@ -19092,33 +23031,43 @@ "dev": true }, "@types/istanbul-lib-coverage": { - "version": "2.0.4", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "@types/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { - "version": "3.0.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "27.5.2", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "@types/json-schema": { - "version": "7.0.11", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { @@ -19127,6 +23076,8 @@ }, "@types/minimatch": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/minimist": { @@ -19135,18 +23086,22 @@ }, "@types/node": { "version": "18.7.23", - "dev": true + "devOptional": true }, "@types/normalize-package-data": { "version": "2.4.1", "dev": true }, - "@types/prettier": { - "version": "2.6.0", + "@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@types/stack-utils": { - "version": "2.0.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "@types/uuid": { @@ -19155,103 +23110,130 @@ }, "@types/ws": { "version": "8.5.3", - "dev": true, + "devOptional": true, "requires": { "@types/node": "*" } }, "@types/yargs": { - "version": "17.0.13", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "21.0.0", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", + "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/type-utils": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/type-utils": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" } }, "@typescript-eslint/type-utils": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", + "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.38.1", - "@typescript-eslint/utils": "5.38.1", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/utils": "6.12.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/visitor-keys": "5.38.1", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/utils": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", + "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.1", - "@typescript-eslint/types": "5.38.1", - "@typescript-eslint/typescript-estree": "5.38.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.38.1", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.38.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.12.0", + "eslint-visitor-keys": "^3.4.1" } }, "@xmldom/xmldom": { - "version": "0.8.2", + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true }, "abbrev": { @@ -19336,6 +23318,8 @@ }, "ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" @@ -19343,6 +23327,8 @@ "dependencies": { "type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } @@ -19359,7 +23345,9 @@ } }, "anymatch": { - "version": "3.1.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -19433,32 +23421,47 @@ "async": { "version": "3.2.4" }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "optional": true, + "peer": true + }, "available-typed-arrays": { "version": "1.0.5" }, "aws-cdk": { - "version": "2.43.1", + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.75.0.tgz", + "integrity": "sha512-BkyWNpYZz66Ewoi7rBPYZnW+0BAKbWYawhQ1v7KQWmGB0cFlQmvIfoOFklF5EOyAKOltUVRQF6KJf1/AIedkmg==", "dev": true, "requires": { "fsevents": "2.3.2" } }, "aws-cdk-lib": { - "version": "2.51.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.51.0.tgz", - "integrity": "sha512-x/XXquLJ30QeyrC7HrXeueD+F5ayXEHxYlOlNEAcMIdpzhvojSHtfsyY3x0FeodHT9ycJH8RAUV+QZtmZV9mrw==", + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.75.0.tgz", + "integrity": "sha512-lFMrRJPt5TDRm4PGllo0aFcSi8nHzs0mZbYUF/lnMc15ORroV8Iv38U1I0CHiZwWO/QtLuxIzEXWA5hSbgpKzw==", "requires": { - "@aws-cdk/asset-awscli-v1": "^2.2.9", + "@aws-cdk/asset-awscli-v1": "^2.2.97", "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.15", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^9.1.0", - "ignore": "^5.2.0", + "ignore": "^5.2.4", "jsonschema": "^1.4.1", "minimatch": "^3.1.2", - "punycode": "^2.1.1", + "punycode": "^2.3.0", "semver": "^7.3.8", + "table": "^6.8.1", "yaml": "1.10.2" }, "dependencies": { @@ -19466,6 +23469,31 @@ "version": "1.0.2", "bundled": true }, + "ajv": { + "version": "8.12.0", + "bundled": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "bundled": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "bundled": true + }, "at-least-node": { "version": "1.0.0", "bundled": true @@ -19486,10 +23514,29 @@ "version": "1.6.3", "bundled": true }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true + }, "concat-map": { "version": "0.0.1", "bundled": true }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true + }, "fs-extra": { "version": "9.1.0", "bundled": true, @@ -19505,7 +23552,15 @@ "bundled": true }, "ignore": { - "version": "5.2.0", + "version": "5.2.4", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true + }, + "json-schema-traverse": { + "version": "1.0.0", "bundled": true }, "jsonfile": { @@ -19520,6 +23575,10 @@ "version": "1.4.1", "bundled": true }, + "lodash.truncate": { + "version": "4.4.2", + "bundled": true + }, "lru-cache": { "version": "6.0.0", "bundled": true, @@ -19535,7 +23594,11 @@ } }, "punycode": { - "version": "2.1.1", + "version": "2.3.0", + "bundled": true + }, + "require-from-string": { + "version": "2.0.2", "bundled": true }, "semver": { @@ -19545,10 +23608,53 @@ "lru-cache": "^6.0.0" } }, + "slice-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "bundled": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "table": { + "version": "6.8.1", + "bundled": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, "universalify": { "version": "2.0.0", "bundled": true }, + "uri-js": { + "version": "4.4.1", + "bundled": true, + "requires": { + "punycode": "^2.1.0" + } + }, "yallist": { "version": "4.0.0", "bundled": true @@ -19559,6 +23665,97 @@ } } }, + "aws-crt": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.19.0.tgz", + "integrity": "sha512-pBRSpy4TsL/fxW7Lp1xpN1FhnxvtBXFYx3Njo/j/m8GSV3Ytq/mBetYq7vhDb7CJQmFJCWod9I0yShqjiSUuyQ==", + "optional": true, + "peer": true, + "requires": { + "@aws-sdk/util-utf8-browser": "^3.109.0", + "@httptoolkit/websocket-stream": "^6.0.1", + "axios": "^1.6.0", + "buffer": "^6.0.3", + "crypto-js": "^4.2.0", + "mqtt": "^4.3.7", + "process": "^0.11.10" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "optional": true, + "peer": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "optional": true, + "peer": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mqtt": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz", + "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", + "optional": true, + "peer": true, + "requires": { + "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" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "optional": true, + "peer": true, + "requires": {} + } + } + }, + "aws-iot-device-sdk": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/aws-iot-device-sdk/-/aws-iot-device-sdk-2.2.13.tgz", + "integrity": "sha512-rUR68vJxna5q0HSvBFy70QD0kFa91H8mQU2Jdor0JpNxmfNaOhQoiGCcgrZAxR69xY1kGHs+JzWOqqVtAfL0+A==", + "requires": { + "crypto-js": "4.2.0", + "minimist": "1.2.6", + "mqtt": "4.2.8", + "websocket-stream": "^5.5.2" + } + }, "aws-jwt-verify": { "version": "2.1.3" }, @@ -19594,14 +23791,28 @@ "aws4": { "version": "1.11.0" }, + "axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "optional": true, + "peer": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "babel-jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { - "@jest/transform": "^28.1.3", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -19609,6 +23820,8 @@ }, "babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -19616,10 +23829,33 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "babel-plugin-jest-hoist": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -19630,6 +23866,8 @@ }, "babel-preset-current-node-syntax": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -19647,20 +23885,42 @@ } }, "babel-preset-jest": { - "version": "28.1.3", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^28.1.3", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "base64-js": { "version": "1.5.1" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, "bluebird": { "version": "3.7.2" }, @@ -19731,7 +23991,6 @@ }, "brace-expansion": { "version": "1.1.11", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19745,13 +24004,15 @@ } }, "browserslist": { - "version": "4.21.4", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" } }, "bs-logger": { @@ -19763,6 +24024,8 @@ }, "bser": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -19879,7 +24142,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001412", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "dev": true }, "caporal": { @@ -19910,6 +24175,8 @@ }, "char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "chownr": { @@ -19921,7 +24188,9 @@ "dev": true }, "cjs-module-lexer": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "clean-stack": { @@ -20011,13 +24280,17 @@ }, "co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "code-point-at": { "version": "1.1.0" }, "codemaker": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/codemaker/-/codemaker-1.92.0.tgz", + "integrity": "sha512-h9LW/YFYMAXHvv4aHNxVfawza/8GHL0Nw0zFpqdURXsjRlsCtG+SzqRvYLOJoFqxzZ9+rkXJf8fODImC6WHa8g==", "dev": true, "requires": { "camelcase": "^6.3.0", @@ -20027,12 +24300,16 @@ "dependencies": { "camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "collect-v8-coverage": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color-convert": { @@ -20056,9 +24333,35 @@ "colors": { "version": "1.4.0" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, + "peer": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "3.0.2" }, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "requires": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + }, + "dependencies": { + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==" + } + } + }, "commonmark": { "version": "0.30.0", "dev": true, @@ -20084,12 +24387,10 @@ } }, "concat-map": { - "version": "0.0.1", - "dev": true + "version": "0.0.1" }, "concat-stream": { "version": "2.0.0", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -20336,21 +24637,29 @@ } }, "convert-source-map": { - "version": "1.8.0", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "dev": true - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "core-util-is": { "version": "1.0.3" }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } + }, "create-require": { "version": "1.1.1", "dev": true @@ -20364,6 +24673,11 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "crypto-random-string": { "version": "4.0.0", "dev": true, @@ -20386,6 +24700,8 @@ }, "date-format": { "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true }, "dateformat": { @@ -20394,13 +24710,14 @@ }, "debug": { "version": "4.3.4", - "dev": true, "requires": { "ms": "2.1.2" } }, "decamelize": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true }, "decamelize-keys": { @@ -20435,8 +24752,11 @@ } }, "dedent": { - "version": "0.7.0", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "requires": {} }, "deep-extend": { "version": "0.6.0", @@ -20447,7 +24767,9 @@ "dev": true }, "deepmerge": { - "version": "4.2.2", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "defer-to-connect": { @@ -20464,6 +24786,13 @@ "object-keys": "^1.1.1" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "optional": true, + "peer": true + }, "delegates": { "version": "1.0.0" }, @@ -20473,6 +24802,8 @@ }, "detect-indent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true }, "detect-newline": { @@ -20483,10 +24814,6 @@ "version": "4.0.2", "dev": true }, - "diff-sequences": { - "version": "27.5.1", - "dev": true - }, "dir-glob": { "version": "3.0.1", "dev": true, @@ -20551,6 +24878,28 @@ } } }, + "downlevel-dts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/downlevel-dts/-/downlevel-dts-0.11.0.tgz", + "integrity": "sha512-vo835pntK7kzYStk7xUHDifiYJvXxVhUapt85uk2AI94gUUAQX9HNRtrcMHNSc3YHJUEHGbYIGsM99uIbgAtxw==", + "dev": true, + "requires": { + "semver": "^7.3.2", + "shelljs": "^0.8.3", + "typescript": "next" + } + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "eastasianwidth": { "version": "0.2.0", "dev": true @@ -20562,11 +24911,15 @@ } }, "electron-to-chromium": { - "version": "1.4.266", + "version": "1.4.593", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz", + "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==", "dev": true }, "emittery": { - "version": "0.10.2", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { @@ -20581,6 +24934,14 @@ "iconv-lite": "^0.6.2" } }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.10.0", "dev": true, @@ -20894,14 +25255,6 @@ "prettier-linter-helpers": "^1.0.0" } }, - "eslint-scope": { - "version": "5.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-utils": { "version": "3.0.0", "dev": true, @@ -20916,7 +25269,9 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { @@ -20957,10 +25312,6 @@ } } }, - "estraverse": { - "version": "4.3.0", - "dev": true - }, "esutils": { "version": "2.0.3", "dev": true @@ -20970,6 +25321,8 @@ }, "execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -20985,63 +25338,55 @@ }, "exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "exit-hook": { "version": "1.1.1" }, "expect": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { - "@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" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, "diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } - }, - "react-is": { - "version": "18.2.0", - "dev": true } } }, @@ -21068,7 +25413,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -21129,6 +25476,8 @@ }, "fb-watchman": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -21181,12 +25530,31 @@ "version": "3.2.7", "dev": true }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "optional": true, + "peer": true + }, "for-each": { "version": "0.3.3", "requires": { "is-callable": "^1.1.3" } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "optional": true, + "peer": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "form-data-encoder": { "version": "2.1.2", "dev": true @@ -21212,8 +25580,14 @@ } }, "fs.realpath": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true }, "function-bind": { "version": "1.1.1" @@ -21261,6 +25635,8 @@ }, "gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -21277,6 +25653,8 @@ }, "get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-pkg-repo": { @@ -21424,7 +25802,6 @@ }, "glob": { "version": "7.2.3", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -21441,13 +25818,6 @@ "is-glob": "^4.0.3" } }, - "glob-promise": { - "version": "3.4.0", - "dev": true, - "requires": { - "@types/glob": "*" - } - }, "glob-to-regexp": { "version": "0.4.1" }, @@ -21515,6 +25885,12 @@ "version": "1.0.4", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "graphql": { "version": "16.6.0" }, @@ -21583,6 +25959,15 @@ "version": "3.0.0", "dev": true }, + "help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "requires": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, "hosted-git-info": { "version": "5.1.0", "dev": true, @@ -21592,6 +25977,8 @@ }, "html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-cache-semantics": { @@ -21631,6 +26018,8 @@ }, "human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "humanize-ms": { @@ -21656,8 +26045,9 @@ "version": "1.1.13" }, "ignore": { - "version": "5.2.0", - "dev": true + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==" }, "ignore-walk": { "version": "5.0.1", @@ -21696,6 +26086,8 @@ }, "import-local": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -21716,7 +26108,6 @@ }, "inflight": { "version": "1.0.6", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -21810,6 +26201,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ip": { "version": "2.0.0", "dev": true @@ -21873,6 +26270,8 @@ }, "is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-generator-function": { @@ -21944,6 +26343,8 @@ }, "is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { @@ -22002,41 +26403,51 @@ "version": "2.0.0", "dev": true }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "optional": true, + "peer": true, + "requires": {} + }, "isstream": { "version": "0.1.2" }, "istanbul-lib-coverage": { - "version": "3.2.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true }, "istanbul-lib-instrument": { - "version": "5.2.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", + "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", "dev": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "dev": true - } + "semver": "^7.5.4" } }, "istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -22045,7 +26456,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -22053,242 +26466,195 @@ } }, "jest": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^28.1.3" + "jest-cli": "^29.7.0" } }, "jest-changed-files": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, "diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } - }, - "react-is": { - "version": "18.2.0", - "dev": true } } }, "jest-cli": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" } }, "jest-config": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - } - } - }, - "jest-diff": { - "version": "27.5.1", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "jest-get-type": { - "version": "27.5.1", - "dev": true - } } }, "jest-docblock": { - "version": "28.1.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - } + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" } }, "jest-environment-node": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "jest-get-type": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -22310,153 +26676,116 @@ } }, "jest-leak-detector": { - "version": "28.1.3", - "dev": true, - "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - } - } - }, - "jest-matcher-utils": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "jest-get-type": { - "version": "27.5.1", - "dev": true - } + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-message-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.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", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - } } }, "jest-mock": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { - "version": "28.0.2", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "jest-resolve": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" } }, "jest-runner": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "dependencies": { "source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -22466,111 +26795,102 @@ } }, "jest-runtime": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "2.6.0", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.3", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, "diff-sequences": { - "version": "28.1.1", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "jest-diff": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } - }, - "react-is": { - "version": "18.2.0", - "dev": true } } }, "jest-util": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -22579,66 +26899,59 @@ } }, "jest-validate": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^28.1.3" + "pretty-format": "^29.7.0" }, "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - }, "camelcase": { "version": "6.3.0", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - }, - "react-is": { - "version": "18.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "jest-watcher": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "28.1.3", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -22657,11 +26970,15 @@ "version": "4.10.0" }, "js-sdsl": { - "version": "4.1.4", - "dev": true + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "devOptional": true }, "js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -22673,68 +26990,50 @@ }, "jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "jsii": { - "version": "1.69.0", + "version": "5.2.32", + "resolved": "https://registry.npmjs.org/jsii/-/jsii-5.2.32.tgz", + "integrity": "sha512-91g2+havdNomPRVmkkhv7SDxb66t8UybdkWkDH7ESK1SenZZ5VrAievYDSNQG16tBO0YBn1mTCy4G1pbFhPvfQ==", "dev": true, "requires": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "case": "^1.6.3", "chalk": "^4", + "downlevel-dts": "^0.11.0", "fast-deep-equal": "^3.1.3", - "fs-extra": "^10.1.0", - "log4js": "^6.6.1", - "semver": "^7.3.7", + "log4js": "^6.9.1", + "semver": "^7.5.4", "semver-intersect": "^1.4.0", "sort-json": "^2.0.1", - "spdx-license-list": "^6.6.0", - "typescript": "~3.9.10", - "yargs": "^16.2.0" + "spdx-license-list": "^6.8.0", + "typescript": "~5.2", + "yargs": "^17.7.2" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "typescript": { - "version": "3.9.10", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true - }, - "yargs": { - "version": "16.2.0", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } } } }, "jsii-diff": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-diff/-/jsii-diff-1.92.0.tgz", + "integrity": "sha512-gEfYFtYIiz+SytHFTE/JG3mdTRLFwxTy4sRx9RUmCFF2jSorpEGpfrzwv+bwKEA7G4IqhbHhza05ePfpBQrbdw==", "dev": true, "requires": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "fs-extra": "^10.1.0", - "jsii-reflect": "^1.69.0", - "log4js": "^6.6.1", + "jsii-reflect": "^1.92.0", + "log4js": "^6.9.1", "yargs": "^16.2.0" }, "dependencies": { @@ -22767,24 +27066,65 @@ } }, "jsii-docgen": { - "version": "7.0.97", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/jsii-docgen/-/jsii-docgen-10.2.2.tgz", + "integrity": "sha512-MyaHFU84SYJc7jOcqyT8Ve5pVVAgbgpn9uvTAhX+s7l3wYKY7vrXCBUHmM2XX1nrKuhs0J8nknQDXLiwQXXfDQ==", "dev": true, "requires": { - "@jsii/spec": "^1.69.0", + "@jsii/spec": "^1.92.0", "case": "^1.6.3", "fs-extra": "^10.1.0", - "glob": "^7.2.3", - "glob-promise": "^3.4.0", - "jsii-reflect": "^1.69.0", - "jsii-rosetta": "^1.69.0", - "semver": "^7.3.7", + "glob": "^8.1.0", + "glob-promise": "^6.0.5", + "jsii-reflect": "^1.92.0", + "semver": "^7.5.4", "yargs": "^16.2.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "glob-promise": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.5.tgz", + "integrity": "sha512-uUzvxo60yo/vMLXZHCNAlfdM5U5A07jCnUO8xTK44Z0Vc58poGDXhDx8ju1DmPdprOORh+4Lpog64hl+AJ5piA==", + "dev": true, + "requires": { + "@types/glob": "^8.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "dev": true }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "string-width": { "version": "4.2.3", "dev": true, @@ -22810,20 +27150,22 @@ } }, "jsii-pacmak": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-pacmak/-/jsii-pacmak-1.92.0.tgz", + "integrity": "sha512-LIwXYTYjX5APnb6qzu5TDMEkSJXq5ntE71fT5Lpj3KMpOGGOrYlCAuP1lxpf1oWfIZeuyC4orRafuE7AECEa/A==", "dev": true, "requires": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "clone": "^2.1.2", - "codemaker": "^1.69.0", + "codemaker": "^1.92.0", "commonmark": "^0.30.0", "escape-string-regexp": "^4.0.0", "fs-extra": "^10.1.0", - "jsii-reflect": "^1.69.0", - "jsii-rosetta": "^1.69.0", - "semver": "^7.3.7", - "spdx-license-list": "^6.6.0", + "jsii-reflect": "^1.92.0", + "jsii-rosetta": "^1.92.0", + "semver": "^7.5.4", + "spdx-license-list": "^6.8.0", "xmlbuilder": "^15.1.1", "yargs": "^16.2.0" }, @@ -22832,6 +27174,47 @@ "version": "3.0.0", "dev": true }, + "jsii": { + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii/-/jsii-1.92.0.tgz", + "integrity": "sha512-UHuPVMkUXBcbnSAsylQSea7BFNkr6hkx6NhGGoZ5Xnb3fZV7wwr9DHnE14yQJUIsrCL8WcqhCU79QTbWmnKpag==", + "dev": true, + "requires": { + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", + "case": "^1.6.3", + "chalk": "^4", + "fast-deep-equal": "^3.1.3", + "fs-extra": "^10.1.0", + "log4js": "^6.9.1", + "semver": "^7.5.4", + "semver-intersect": "^1.4.0", + "sort-json": "^2.0.1", + "spdx-license-list": "^6.8.0", + "typescript": "~3.9.10", + "yargs": "^16.2.0" + } + }, + "jsii-rosetta": { + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-1.92.0.tgz", + "integrity": "sha512-TKrCq3FToJ3rgCUzDEOWHIoYEs4CvtyXNNE2dPkX5YYv3+18vP8qiftGpyHGcgyslx2E7gm1g/8uPkAxeAEP+A==", + "dev": true, + "requires": { + "@jsii/check-node": "1.92.0", + "@jsii/spec": "1.92.0", + "@xmldom/xmldom": "^0.8.10", + "commonmark": "^0.30.0", + "fast-glob": "^3.3.2", + "jsii": "1.92.0", + "semver": "^7.5.4", + "semver-intersect": "^1.4.0", + "stream-json": "^1.8.0", + "typescript": "~3.9.10", + "workerpool": "^6.5.1", + "yargs": "^16.2.0" + } + }, "string-width": { "version": "4.2.3", "dev": true, @@ -22841,6 +27224,12 @@ "strip-ansi": "^6.0.1" } }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "dev": true + }, "yargs": { "version": "16.2.0", "dev": true, @@ -22857,23 +27246,29 @@ } }, "jsii-reflect": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/jsii-reflect/-/jsii-reflect-1.92.0.tgz", + "integrity": "sha512-9ZLaygpYXG7UBqcUtgINd4pDL43l2gdUwOqWUrMz5beVOgp1ccvbihVPW6LtWGcTDfC+A2oNzjEP6roUvWvDDw==", "dev": true, "requires": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "^1.69.0", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", "chalk": "^4", "fs-extra": "^10.1.0", - "oo-ascii-tree": "^1.69.0", + "oo-ascii-tree": "^1.92.0", "yargs": "^16.2.0" }, "dependencies": { "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -22883,6 +27278,8 @@ }, "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -22897,51 +27294,33 @@ } }, "jsii-rosetta": { - "version": "1.69.0", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/jsii-rosetta/-/jsii-rosetta-5.2.3.tgz", + "integrity": "sha512-W4uUf1IMW9ZVDXWc/DsfJqn07SuhC19+g7IvmPd7W/Qs1kIRu7nvqGS8DrHO0SVa4A5uCb3w+fSGUGb/7KjcfQ==", "dev": true, + "peer": true, "requires": { - "@jsii/check-node": "1.69.0", - "@jsii/spec": "1.69.0", - "@xmldom/xmldom": "^0.8.2", + "@jsii/check-node": "1.92.0", + "@jsii/spec": "^1.92.0", + "@xmldom/xmldom": "^0.8.10", + "chalk": "^4", "commonmark": "^0.30.0", - "fast-glob": "^3.2.12", - "jsii": "1.69.0", - "semver": "^7.3.7", + "fast-glob": "^3.3.2", + "jsii": "~5.2.5", + "semver": "^7.5.4", "semver-intersect": "^1.4.0", - "typescript": "~3.9.10", - "workerpool": "^6.2.1", - "yargs": "^16.2.0" + "stream-json": "^1.8.0", + "typescript": "~5.2.2", + "workerpool": "^6.5.1", + "yargs": "^17.7.2" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "typescript": { - "version": "3.9.10", - "dev": true - }, - "yargs": { - "version": "16.2.0", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } + "peer": true } } }, @@ -22984,7 +27363,9 @@ "dev": true }, "json5": { - "version": "2.2.1" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -23023,6 +27404,8 @@ }, "kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "latest-version": { @@ -23034,6 +27417,8 @@ }, "leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { @@ -23117,14 +27502,16 @@ "version": "4.5.0" }, "log4js": { - "version": "6.6.1", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "requires": { - "date-format": "^4.0.13", + "date-format": "^4.0.14", "debug": "^4.3.4", - "flatted": "^3.2.6", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.1.2" + "streamroller": "^3.1.5" } }, "lowercase-keys": { @@ -23136,16 +27523,12 @@ "dev": true }, "make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "dev": true - } + "semver": "^7.5.3" } }, "make-error": { @@ -23176,6 +27559,8 @@ }, "makeerror": { "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { "tmpl": "1.0.5" @@ -23316,6 +27701,8 @@ }, "merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "merge2": { @@ -23336,8 +27723,27 @@ "lodash.camelcase": "^4.3.0" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "optional": true, + "peer": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "optional": true, + "peer": true, + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "mimic-response": { @@ -23353,7 +27759,6 @@ }, "minimatch": { "version": "3.1.2", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -23445,9 +27850,47 @@ "version": "1.0.1", "dev": true }, + "mqtt": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.8.tgz", + "integrity": "sha512-DJYjlXODVXtSDecN8jnNzi6ItX3+ufGsEs9OB3YV24HtkRrh7kpx8L5M1LuyF0KzaiGtWr2PzDcMGAY60KGOSA==", + "requires": { + "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", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "split2": "^3.1.0", + "ws": "^7.5.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + } + } + }, + "mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, "ms": { - "version": "2.1.2", - "dev": true + "version": "2.1.2" }, "mute-stream": { "version": "0.0.6" @@ -23482,10 +27925,14 @@ }, "node-int64": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-releases": { - "version": "2.0.6", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "nopt": { @@ -23507,6 +27954,8 @@ }, "normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "normalize-url": { @@ -23686,6 +28135,8 @@ }, "npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -23701,6 +28152,17 @@ "set-blocking": "^2.0.0" } }, + "number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "optional": true, + "peer": true, + "requires": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, "number-is-nan": { "version": "1.0.1" }, @@ -23742,20 +28204,23 @@ }, "once": { "version": "1.4.0", - "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "oo-ascii-tree": { - "version": "1.69.0", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/oo-ascii-tree/-/oo-ascii-tree-1.92.0.tgz", + "integrity": "sha512-rLSPbnakn5Wb3dOIVtrmn8jfHKqWv7bROpyBiw6DExq+dOG7qC49EIs89hBhyHkvLolX0oC+0a/RMPAyHEZ+1w==", "dev": true }, "open": { @@ -23893,8 +28358,7 @@ "dev": true }, "path-is-absolute": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "path-key": { "version": "3.1.1", @@ -23930,11 +28394,15 @@ } }, "pirates": { - "version": "4.0.5", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -23942,6 +28410,8 @@ "dependencies": { "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -23950,6 +28420,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -23957,6 +28429,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -23964,6 +28438,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -23987,16 +28463,20 @@ } }, "pretty-format": { - "version": "27.5.1", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "ansi-regex": "^5.0.1", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "react-is": "^18.0.0" }, "dependencies": { "ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -24012,6 +28492,13 @@ "version": "2.0.1", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "optional": true, + "peer": true + }, "process-nextick-args": { "version": "2.0.1" }, @@ -24516,6 +29003,8 @@ }, "prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -24540,9 +29029,24 @@ "version": "1.2.4", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "optional": true, + "peer": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" }, "pupa": { "version": "3.1.0", @@ -24551,6 +29055,12 @@ "escape-goat": "^4.0.0" } }, + "pure-rand": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "dev": true + }, "q": { "version": "1.5.1", "dev": true @@ -24606,7 +29116,9 @@ } }, "react-is": { - "version": "17.0.2", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "read-package-json": { @@ -24747,13 +29259,21 @@ }, "readable-stream": { "version": "3.6.0", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "3.0.0", "dev": true, @@ -24788,6 +29308,11 @@ "rc": "1.2.8" } }, + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, "remote-git-tags": { "version": "3.0.0", "dev": true @@ -24815,6 +29340,8 @@ }, "resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" @@ -24822,6 +29349,8 @@ "dependencies": { "resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } @@ -24831,7 +29360,9 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "responselike": { @@ -24863,7 +29394,7 @@ }, "rfdc": { "version": "1.3.0", - "dev": true + "devOptional": true }, "rimraf": { "version": "3.0.2", @@ -24903,7 +29434,9 @@ "version": "1.2.1" }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -24960,7 +29493,7 @@ "serverless-spy-test": { "version": "file:test/cdk", "requires": { - "@aws-sdk/client-apigatewaymanagementapi": "^3.180.0", + "@aws-cdk/aws-lambda-python-alpha": "^2.75.0-alpha.0", "@aws-sdk/client-dynamodb": "^3.180.0", "@aws-sdk/client-eventbridge": "^3.180.0", "@aws-sdk/client-lambda": "^3.180.0", @@ -24970,22 +29503,93 @@ "@aws-sdk/lib-dynamodb": "^3.180.0", "@aws-sdk/util-dynamodb": "^3.180.0", "@serverless-stack/node": "^1.15.4", - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.10", "@types/node": "^18.7.23", - "aws-cdk": "^2.43.1", - "aws-cdk-lib": "^2.51.0", + "aws-cdk": "^2.75.1", + "aws-cdk-lib": "^2.75.0", "aws-lambda": "^1.0.7", "aws4": "^1.11.0", "constructs": "^10.1.115", "esbuild": "^0.15.9", - "jest": "^28.1.3", + "jest": "^29.7.0", "jest-junit": "^14.0.1", "npm-check-updates": "^15", "projen": "^0.62.24", - "ts-jest": "^28.0.8", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "tsconfig-paths": "^4.1.0", - "typescript": "^4.8.4" + "typescript": "^5.2.2" + }, + "dependencies": { + "@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.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" + } + }, + "babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "requires": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + } + }, + "ts-jest": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + } + } } }, "set-blocking": { @@ -25003,6 +29607,17 @@ "version": "3.0.0", "dev": true }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "side-channel": { "version": "1.0.4", "requires": { @@ -25046,6 +29661,8 @@ }, "sort-json": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz", + "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==", "dev": true, "requires": { "detect-indent": "^5.0.0", @@ -25055,6 +29672,8 @@ "dependencies": { "detect-newline": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", "dev": true } } @@ -25139,7 +29758,9 @@ "dev": true }, "spdx-license-list": { - "version": "6.6.0", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.8.0.tgz", + "integrity": "sha512-5UdM7r9yJ1EvsPQZWfa41AZjLQngl9iMMysm9XBW7Lqhq7aF8cllfqjS+rFCHB8FFMGSM0yFWue2LUV9mR0QzQ==", "dev": true }, "split": { @@ -25151,7 +29772,6 @@ }, "split2": { "version": "3.2.2", - "dev": true, "requires": { "readable-stream": "^3.0.0" } @@ -25170,7 +29790,9 @@ "version": "0.0.10" }, "stack-utils": { - "version": "2.0.5", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -25178,6 +29800,8 @@ "dependencies": { "escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } @@ -25276,8 +29900,30 @@ } } }, + "stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true + }, + "stream-json": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", + "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", + "dev": true, + "requires": { + "stream-chain": "^2.2.5" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "streamroller": { - "version": "3.1.3", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "requires": { "date-format": "^4.0.14", @@ -25287,6 +29933,8 @@ "dependencies": { "fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -25296,6 +29944,8 @@ }, "jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -25303,19 +29953,22 @@ }, "universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } }, "string_decoder": { "version": "1.3.0", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } }, "string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -25373,10 +30026,14 @@ }, "strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-indent": { @@ -25390,6 +30047,11 @@ "version": "3.1.1", "dev": true }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "supports-color": { "version": "7.2.0", "dev": true, @@ -25397,14 +30059,6 @@ "has-flag": "^4.0.0" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "dev": true @@ -25509,16 +30163,10 @@ "yallist": "^4.0.0" } }, - "terminal-link": { - "version": "2.1.1", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, "test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", @@ -25560,10 +30208,14 @@ }, "tmpl": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -25577,17 +30229,26 @@ "version": "3.0.1", "dev": true }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "ts-jest": { - "version": "28.0.8", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^28.0.0", - "json5": "^2.2.1", + "jest-util": "^29.0.0", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "dependencies": { @@ -25640,20 +30301,9 @@ } }, "tslib": { - "version": "2.4.0" - }, - "tsutils": { - "version": "3.21.0", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "dev": true - } - } + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "type-check": { "version": "0.4.0", @@ -25664,6 +30314,8 @@ }, "type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { @@ -25681,7 +30333,9 @@ } }, "typescript": { - "version": "4.8.4", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true }, "uglify-js": { @@ -25689,6 +30343,11 @@ "dev": true, "optional": true }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "unbox-primitive": { "version": "1.0.2", "requires": { @@ -25728,7 +30387,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.9", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -25795,7 +30456,9 @@ "version": "1.0.2" }, "uuid": { - "version": "9.0.0", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true }, "v8-compile-cache-lib": { @@ -25803,12 +30466,14 @@ "dev": true }, "v8-to-istanbul": { - "version": "9.0.1", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" } }, "validate-npm-package-license": { @@ -25831,6 +30496,8 @@ }, "walker": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { "makeerror": "1.0.12" @@ -25843,6 +30510,69 @@ "graceful-fs": "^4.1.2" } }, + "websocket-stream": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", + "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", + "requires": { + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "^3.2.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, "which": { "version": "2.0.2", "dev": true, @@ -25936,7 +30666,9 @@ "dev": true }, "workerpool": { - "version": "6.2.1", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "wrap-ansi": { @@ -25979,11 +30711,12 @@ } }, "wrappy": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -26019,8 +30752,7 @@ "dev": true }, "xtend": { - "version": "4.0.2", - "dev": true + "version": "4.0.2" }, "y18n": { "version": "5.0.8", @@ -26034,18 +30766,31 @@ "dev": true }, "yargs": { - "version": "17.5.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "dev": true @@ -26059,6 +30804,17 @@ "strip-ansi": "^6.0.1" } }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "yargs-parser": { "version": "21.1.1", "dev": true diff --git a/package.json b/package.json index 7b1bdbc..062b7dd 100644 --- a/package.json +++ b/package.json @@ -44,15 +44,18 @@ "organization": false }, "devDependencies": { + "@aws-cdk/aws-lambda-python-alpha": "^2.75.0-alpha.0", + "@types/aws-iot-device-sdk": "2.2.8", "@types/aws-lambda": "^8.10.106", "@types/aws4": "^1.11.2", - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.10", "@types/node": "^18.7.23", "@types/uuid": "^8.3.4", "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.38.1", - "aws-cdk-lib": "2.51.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "aws-cdk": "2.75.0", + "aws-cdk-lib": "2.75.0", "constructs": "10.1.115", "esbuild": "^0.15.9", "esbuild-runner": "^2.2.1", @@ -63,20 +66,20 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.1", - "jest": "^28.1.3", - "jsii": "^1.69.0", - "jsii-diff": "^1.69.0", - "jsii-docgen": "^7.0.97", - "jsii-pacmak": "^1.69.0", + "jest": "^29.7.0", + "jsii": "^5.2.32", + "jsii-diff": "^1.92.0", + "jsii-docgen": "^10.2.2", + "jsii-pacmak": "^1.92.0", "json-schema": "^0.4.0", "npm-check-updates": "^16", "prettier": "^2.7.1", "projen": "^0.62.24", "standard-version": "^9", - "ts-jest": "^28.0.8", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4", - "uuid": "^9.0.0" + "typescript": "^5.2.2", + "uuid": "^9.0.1" }, "workspaces": [ "test", @@ -84,15 +87,14 @@ "cli" ], "peerDependencies": { - "aws-cdk-lib": "^2", + "@aws-cdk/aws-lambda-python-alpha": ">=2.75.0-alpha.0", + "aws-cdk-lib": ">=2.75.0", "constructs": "^10" }, "dependencies": { - "@aws-cdk/aws-apigatewayv2-alpha": "2.43.1-alpha.0", - "@aws-cdk/aws-apigatewayv2-integrations-alpha": "2.43.1-alpha.0", - "@aws-sdk/client-apigatewaymanagementapi": "^3.180.0", "@aws-sdk/client-dynamodb": "^3.180.0", "@aws-sdk/client-eventbridge": "^3.180.0", + "@aws-sdk/client-iot": "^3.449.0", "@aws-sdk/client-lambda": "^3.180.0", "@aws-sdk/client-s3": "^3.180.0", "@aws-sdk/client-sns": "^3.180.0", @@ -102,6 +104,7 @@ "@aws-sdk/lib-dynamodb": "^3.180.0", "@aws-sdk/types": "^3.178.0", "@aws-sdk/util-dynamodb": "^3.180.0", + "aws-iot-device-sdk": "^2.2.13", "aws-lambda": "^1.0.7", "aws4": "^1.11.0", "bootstrap": "^5.2.1", @@ -151,13 +154,14 @@ }, "bundleDependencies": [ "@aws-sdk/credential-providers", - "@aws-sdk/client-apigatewaymanagementapi", "@aws-sdk/client-dynamodb", "@aws-sdk/client-eventbridge", "@aws-sdk/client-lambda", "@aws-sdk/client-s3", "@aws-sdk/client-sns", "@aws-sdk/client-sqs", + "@aws-sdk/client-iot", + "aws-iot-device-sdk", "@aws-sdk/lib-dynamodb", "@aws-sdk/util-dynamodb", "aws4", @@ -186,6 +190,9 @@ "cobertura", "text" ], + "moduleNameMapper": { + "^aws-cdk-lib/.warnings.jsii.js$": "/node_modules/aws-cdk-lib/.warnings.jsii.js" + }, "coverageDirectory": "coverage", "coveragePathIgnorePatterns": [ "/node_modules/" @@ -205,11 +212,14 @@ } ] ], - "preset": "ts-jest", - "globals": { - "ts-jest": { - "tsconfig": "tsconfig.dev.json" - } - } + "transform": { + "^.+\\.tsx?$": [ + "ts-jest", + { + "tsconfig": "tsconfig.dev.json" + } + ] + }, + "preset": "ts-jest" } -} \ No newline at end of file +} diff --git a/src/ServerlessSpy.ts b/src/ServerlessSpy.ts index 58e4588..f76abb9 100644 --- a/src/ServerlessSpy.ts +++ b/src/ServerlessSpy.ts @@ -1,13 +1,13 @@ import * as fs from 'fs'; import * as path from 'path'; -import * as apiGwV2 from '@aws-cdk/aws-apigatewayv2-alpha'; -import * as apiGwV2Int from '@aws-cdk/aws-apigatewayv2-integrations-alpha'; -import { CfnOutput, Duration, NestedStack, Stack } from 'aws-cdk-lib'; -import * as agw from 'aws-cdk-lib/aws-apigatewayv2'; +import { PythonLayerVersion } from '@aws-cdk/aws-lambda-python-alpha'; +import { aws_iam, Duration, NestedStack, Stack } from 'aws-cdk-lib'; import * as dynamoDb from 'aws-cdk-lib/aws-dynamodb'; import * as events from 'aws-cdk-lib/aws-events'; import * as targets from 'aws-cdk-lib/aws-events-targets'; +import { Effect } from 'aws-cdk-lib/aws-iam'; import * as lambda from 'aws-cdk-lib/aws-lambda'; +import { ILayerVersion } from 'aws-cdk-lib/aws-lambda'; import * as dynamoDbStream from 'aws-cdk-lib/aws-lambda-event-sources'; import { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources'; import * as lambdaNode from 'aws-cdk-lib/aws-lambda-nodejs'; @@ -38,17 +38,14 @@ export interface SpyFilter { } export class ServerlessSpy extends Construct { - private extensionLayer: lambda.LayerVersion; - private table: dynamoDb.Table; - private webSocketApi: apiGwV2.WebSocketApi; private createdResourcesBySSpy: IConstruct[] = []; private lambdaSubscriptionPool: LambdaSubscription[] = []; private lambdaSubscriptionMain: LambdaSubscription; private lambdasSpied: LambdaSpied[] = []; - private webSocketStage: apiGwV2.WebSocketStage; public serviceKeys: string[] = []; private spiedNodes: IConstruct[] = []; - wsUrl: string; + private layerMap: Partial> = {}; + private spyWrapperLayer: lambda.ILayerVersion; constructor( scope: Construct, @@ -57,107 +54,17 @@ export class ServerlessSpy extends Construct { ) { super(scope, id); - this.extensionLayer = new lambda.LayerVersion(this, 'Extension', { - compatibleRuntimes: [ - lambda.Runtime.NODEJS_12_X, - lambda.Runtime.NODEJS_14_X, - lambda.Runtime.NODEJS_16_X, - lambda.Runtime.NODEJS_18_X, - ], - code: lambda.Code.fromAsset(this.getExtensionAssetLocation()), - }); - this.createdResourcesBySSpy.push(this.extensionLayer); - - this.table = new dynamoDb.Table(this, 'WebSocket', { - partitionKey: { - name: 'connectionId', - type: dynamoDb.AttributeType.STRING, - }, - billingMode: dynamoDb.BillingMode.PAY_PER_REQUEST, - }); - this.createdResourcesBySSpy.push(this.table); - - const envVars = this.getDafaultLambdaEnvironmentVariables(); - - if (this.props?.debugMode) { - envVars[envVariableNames.SSPY_DEBUG] = 'true'; - } - - const functionOnConnect = new lambdaNode.NodejsFunction(this, 'OnConnect', { - memorySize: 512, - timeout: Duration.seconds(5), - runtime: lambda.Runtime.NODEJS_18_X, - handler: 'handler', - entry: this.getAssetLocation('functions/onConnect.js'), - environment: envVars, - }); - this.table.grantWriteData(functionOnConnect); - this.createdResourcesBySSpy.push(functionOnConnect); - - const functionOnDisconnect = new lambdaNode.NodejsFunction( - this, - 'OnDisconnect', - { - memorySize: 512, - timeout: Duration.seconds(5), - runtime: lambda.Runtime.NODEJS_18_X, - handler: 'handler', - entry: this.getAssetLocation('functions/onDisconnect.js'), - environment: envVars, - } - ); - this.table.grantWriteData(functionOnDisconnect); - this.createdResourcesBySSpy.push(functionOnDisconnect); - - this.webSocketApi = new apiGwV2.WebSocketApi(this, 'ApiGwWebSocket'); - this.createdResourcesBySSpy.push(this.webSocketApi); - this.webSocketStage = new apiGwV2.WebSocketStage( - this, - 'ApiGwWebSocketStage', - { - webSocketApi: this.webSocketApi, - stageName: 'prod', - autoDeploy: true, - } - ); - this.createdResourcesBySSpy.push(this.webSocketStage); - const webSocketApiRoute = this.webSocketApi.addRoute('$connect', { - integration: new apiGwV2Int.WebSocketLambdaIntegration( - '$connect', - functionOnConnect - ), - }); - (webSocketApiRoute.node.defaultChild as agw.CfnRoute).authorizationType = - 'AWS_IAM'; - - this.webSocketApi.addRoute('$disconnect', { - integration: new apiGwV2Int.WebSocketLambdaIntegration( - '$disconnect', - functionOnDisconnect + this.spyWrapperLayer = new lambda.LayerVersion(this, 'SpyWrapperLayer', { + code: lambda.Code.fromAsset( + this.getLanguageExtensionAssetLocation('spy-wrapper') ), }); this.lambdaSubscriptionMain = this.provideFunctionForSubscription(); - - this.webSocketApi.addRoute('sendmessage', { - integration: new apiGwV2Int.WebSocketLambdaIntegration( - 'SendMessage', - this.lambdaSubscriptionMain.function - ), - }); - - this.wsUrl = `wss://${this.webSocketApi.apiId}.execute-api.${ - Stack.of(this).region - }.amazonaws.com/${this.webSocketStage.stageName}`; - - new CfnOutput(Stack.of(this), 'ServerlessSpyWsUrl', { - value: this.wsUrl, - }); } private getDafaultLambdaEnvironmentVariables(): { [key: string]: string } { return { - [envVariableNames.SSPY_WS_TABLE_NAME]: this.table.tableName, NODE_OPTIONS: '--enable-source-maps', }; } @@ -195,7 +102,10 @@ export class ServerlessSpy extends Construct { }; nodes = nodes.filter((node) => { - if (filterWithDefaults.spyLambda && node instanceof lambda.Function) { + if ( + filterWithDefaults.spyLambda && + (node instanceof lambda.Function || node instanceof NodejsFunction) + ) { return true; } else if (filterWithDefaults.spySnsTopic && node instanceof sns.Topic) { return true; @@ -290,13 +200,13 @@ export class ServerlessSpy extends Construct { } } - const extensionAssetLocationWraper = path.join( + const extensionAssetLocationWrapper = path.join( extensionAssetLocation, 'spy-wrapper' ); - if (!fs.existsSync(extensionAssetLocationWraper)) { + if (!fs.existsSync(extensionAssetLocationWrapper)) { throw new Error( - `Wraper script for extension does not exists ${extensionAssetLocation}` + `Wrapper script for extension does not exists ${extensionAssetLocation}` ); } @@ -312,6 +222,29 @@ export class ServerlessSpy extends Construct { return extensionAssetLocation; } + private getLanguageExtensionAssetLocation(language: string) { + const rootDir = path.join(__dirname, '..'); + + let extensionAssetLocation = path.join(rootDir, `extensions/${language}`); + + const extensionAssetLocationAlt = path.join( + rootDir, + `lib/extension${language}` + ); + + if (!fs.existsSync(extensionAssetLocation)) { + if (!fs.existsSync(extensionAssetLocationAlt)) { + throw new Error( + `Folder with assets for extension for ${language} does not exists at ${extensionAssetLocation} or at ${extensionAssetLocationAlt} ` + ); + } else { + extensionAssetLocation = extensionAssetLocationAlt; + } + } + + return extensionAssetLocation; + } + /** * Write SpyEvents class, which helps with writing the code for tests. * @param fileLocation @@ -384,6 +317,49 @@ export class ServerlessSpy extends Construct { } } + private getExtensionForRuntime( + runtime: lambda.Runtime, + architecture: lambda.Architecture + ) { + const layerKey = (r: lambda.Runtime, a: lambda.Architecture) => + `${r.toString()}_${a.name.toString()}`; + let layer = this.layerMap[layerKey(runtime, architecture)]; + if (layer) { + return layer; + } + + switch (runtime) { + case lambda.Runtime.PYTHON_3_8: + case lambda.Runtime.PYTHON_3_9: + case lambda.Runtime.PYTHON_3_10: + layer = new PythonLayerVersion(this, 'PythonExtension', { + compatibleRuntimes: [runtime], + compatibleArchitectures: [architecture], + entry: this.getLanguageExtensionAssetLocation('python'), + }); + break; + case lambda.Runtime.NODEJS_12_X: + case lambda.Runtime.NODEJS_14_X: + case lambda.Runtime.NODEJS_16_X: + case lambda.Runtime.NODEJS_18_X: + layer = new lambda.LayerVersion(this, 'Extension', { + compatibleRuntimes: [runtime], + compatibleArchitectures: [architecture], + code: lambda.Code.fromAsset(this.getExtensionAssetLocation()), + }); + break; + default: + console.log(`No extensions available for ${runtime.toString()}`); + return undefined; + } + + for (const compatibleRuntime of layer.compatibleRuntimes!) { + this.layerMap[layerKey(compatibleRuntime, architecture)] = layer; + } + this.createdResourcesBySSpy.push(layer); + return layer; + } + private internalSpySpySqsWithNoSubscription(queue: sqs.Queue) { const subscription = this.findElement( (n: IConstruct) => @@ -411,28 +387,25 @@ export class ServerlessSpy extends Construct { } ); func.addEventSource(new SqsEventSource(queue)); - + this.setupForIoT(func); // - func.addLayers(this.extensionLayer); + func.addLayers( + this.getExtensionForRuntime( + lambda.Runtime.NODEJS_18_X, + func.architecture + )! + ); + func.addLayers(this.spyWrapperLayer); //const functionName = this.getConstructName(func); //func.addEnvironment(envVariableNames.SSPY_FUNCTION_NAME, functionName); func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper'); - func.addEnvironment( - envVariableNames.SSPY_WS_ENDPOINT, - this.getWsEndpoint() - ); if (this.props?.debugMode) { func.addEnvironment(envVariableNames.SSPY_DEBUG, 'true'); } - this.table.grantWriteData(func); - this.table.grantReadData(func); - this.webSocketApi.grantManageConnections(func); - // - this.createdResourcesBySSpy.push(func); const serviceKey = `Sqs#${queueName}`; @@ -481,29 +454,26 @@ export class ServerlessSpy extends Construct { runtime: lambda.Runtime.NODEJS_18_X, handler: 'handler', entry: this.getAssetLocation('functions/sendMessage.js'), + // p--out-extension:.js=.mjs --target='node18.13.0' --banner:js=\"import { createRequire } from 'module';const require = createRequire(import.meta.url);\" + // bundling: { + // format: OutputFormat.ESM, + // target: 'node18.13.0', + // // See https://github.com/evanw/esbuild/issues/1921#issuecomment-1152991694 + // banner: + // "import { createRequire } from 'module';const require = createRequire(import.meta.url);", + // esbuildArgs: { + // '--out-extension:.js': '.mjs', + // }, + // tsconfig: path.join(__dirname, 'tsconfig.esm.json'), + // }, environment: { - [envVariableNames.SSPY_WS_TABLE_NAME]: this.table.tableName, NODE_OPTIONS: '--enable-source-maps', }, }); - - this.table.grantWriteData(func); - this.table.grantReadData(func); - func.addEnvironment( - envVariableNames.SSPY_WS_ENDPOINT, - this.getWsEndpoint() - ); - - this.webSocketApi.grantManageConnections(func); + this.setupForIoT(func); return func; } - private getWsEndpoint(): string { - return `https://${this.webSocketApi.apiId}.execute-api.${ - Stack.of(this).region - }.amazonaws.com/${this.webSocketStage.stageName}`; - } - private internalSpyS3(s3Bucket: s3.Bucket) { s3Bucket.addEventNotification( s3.EventType.OBJECT_CREATED_PUT, @@ -661,30 +631,39 @@ export class ServerlessSpy extends Construct { } return functionSubscription; } + private setupForIoT(func: lambda.Function) { + func.addEnvironment( + envVariableNames.SSPY_ROOT_STACK, + this.cleanName(this.findRootStack(Stack.of(this)).node.id) + ); + + func.addToRolePolicy( + new aws_iam.PolicyStatement({ + actions: ['iot:*'], + effect: Effect.ALLOW, + resources: ['*'], + }) + ); + } private internalSpyLambda(func: lambda.Function) { - func.addLayers(this.extensionLayer); + const layer = this.getExtensionForRuntime(func.runtime, func.architecture); + if (!layer) { + return; + } + func.addLayers(layer); + func.addLayers(this.spyWrapperLayer); const functionName = this.getConstructName(func); func.addEnvironment(envVariableNames.SSPY_FUNCTION_NAME, functionName); func.addEnvironment('AWS_LAMBDA_EXEC_WRAPPER', '/opt/spy-wrapper'); - func.addEnvironment( - envVariableNames.SSPY_WS_TABLE_NAME, - this.table.tableName - ); - func.addEnvironment( - envVariableNames.SSPY_WS_ENDPOINT, - this.getWsEndpoint() - ); if (this.props?.debugMode) { func.addEnvironment(envVariableNames.SSPY_DEBUG, 'true'); } - this.table.grantWriteData(func); - this.table.grantReadData(func); - this.webSocketApi.grantManageConnections(func); + this.setupForIoT(func); this.serviceKeys.push(`Function#${functionName}#Request`); this.serviceKeys.push(`Function#${functionName}#Error`); @@ -702,15 +681,17 @@ export class ServerlessSpy extends Construct { constructName = constructName.substring(node.id.length + 1); } + return this.cleanName(constructName); + } + + private cleanName(name: string) { //snake case to camel case including dash and first letter to upper case - constructName = constructName + return name .replace(/[-_]+/g, ' ') .replace(/[^\w\s]/g, '') .replace(/\s(.)/g, ($1) => $1.toUpperCase()) .replace(/\s/g, '') .replace(/^(.)/, ($1) => $1.toUpperCase()); - - return constructName; } private getTopic(topicArn: string): sns.Topic | undefined { diff --git a/src/common/envVariableNames.ts b/src/common/envVariableNames.ts index 5dd4cf5..80b15c7 100644 --- a/src/common/envVariableNames.ts +++ b/src/common/envVariableNames.ts @@ -28,4 +28,9 @@ export enum envVariableNames { * Log debugging details. */ SSPY_DEBUG = 'SSPY_DEBUG', + + /** + * The root stack + */ + SSPY_ROOT_STACK = 'SSPY_ROOT_STACK', } diff --git a/src/tsconfig.esm.json b/src/tsconfig.esm.json new file mode 100644 index 0000000..59d4adc --- /dev/null +++ b/src/tsconfig.esm.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "module": "ES2022", + "target": "ES2022", + "lib": ["es2023"], + "sourceMap": true, + "moduleResolution": "node", + "allowJs": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strict": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "declaration": false, + "emitDeclarationOnly": false, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "skipLibCheck": true, + "noEmit": true, + "baseUrl": ".", + "paths": { + "serverless-spy/*": ["../*"], + "serverless-spy": ["../"] + } + }, + "include": ["src/**/*.ts", "test/**/*.ts"], + "exclude": ["cdk.out"], + "ts-node": { + "require": [ + "tsconfig-paths/register" + ] + } +} diff --git a/test/cdk/.projen/tasks.json b/test/cdk/.projen/tasks.json index cce589c..0aee2ce 100644 --- a/test/cdk/.projen/tasks.json +++ b/test/cdk/.projen/tasks.json @@ -66,7 +66,7 @@ "description": "Deploys your CDK app to the AWS cloud", "steps": [ { - "exec": "cdk deploy --all --require-approval never --outputs-file cdkOutput.json" + "exec": "cdk deploy --all --method direct --require-approval never --outputs-file cdkOutput.json" } ] }, @@ -132,7 +132,7 @@ "description": "Run tests", "steps": [ { - "exec": "jest --passWithNoTests --all --updateSnapshot" + "exec": "jest --passWithNoTests --all --updateSnapshot --silent=false" } ] }, @@ -150,7 +150,7 @@ "description": "Run jest in watch mode", "steps": [ { - "exec": "jest --watch" + "exec": "jest --watch --silent=false" } ] }, diff --git a/test/cdk/.projenrc.js.bak b/test/cdk/.projenrc.js.bak index 14eff6f..e2c54e5 100644 --- a/test/cdk/.projenrc.js.bak +++ b/test/cdk/.projenrc.js.bak @@ -8,7 +8,13 @@ const project = new awscdk.AwsCdkTypeScriptApp({ name: 'serverless-spy-test-e2e', eslint: false, packageManager: 'npm', - + jestOptions: { + jestConfig: { + moduleNameMapper: { + ['^aws-cdk-lib/.warnings.jsii.js$']: '/node_modules/aws-cdk-lib/.warnings.jsii.js', + }, + }, + }, // deps: [], /* Runtime dependencies of this module. */ // description: undefined, /* The description is just a string that helps people understand the purpose of the package. */ // devDeps: [], /* Build dependencies for this module. */ diff --git a/test/cdk/functions/python/dummy.py b/test/cdk/functions/python/dummy.py new file mode 100644 index 0000000..5d6062d --- /dev/null +++ b/test/cdk/functions/python/dummy.py @@ -0,0 +1,2 @@ +def handler(event, _): + return event diff --git a/test/cdk/functions/python/lambda.py b/test/cdk/functions/python/lambda.py new file mode 100644 index 0000000..a0d565c --- /dev/null +++ b/test/cdk/functions/python/lambda.py @@ -0,0 +1,3 @@ +def handler(event, _): + print('My console log message', event) + return {**event, 'message': f'{event["message"]} ServerlessSpy'} diff --git a/test/cdk/functions/python/lambdaFail.py b/test/cdk/functions/python/lambdaFail.py new file mode 100644 index 0000000..7857fdb --- /dev/null +++ b/test/cdk/functions/python/lambdaFail.py @@ -0,0 +1,2 @@ +def handler(event, _): + raise Exception('My test error') diff --git a/test/cdk/package.json b/test/cdk/package.json index af6f01e..ea4b377 100644 --- a/test/cdk/package.json +++ b/test/cdk/package.json @@ -21,20 +21,19 @@ "watch": "scripts/run-task watch" }, "devDependencies": { - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.10", "@types/node": "^18.7.23", - "aws-cdk": "^2.43.1", + "aws-cdk": "^2.75.1", "esbuild": "^0.15.9", - "jest": "^28.1.3", + "jest": "^29.7.0", "jest-junit": "^14.0.1", "npm-check-updates": "^15", "projen": "^0.62.24", - "ts-jest": "^28.0.8", + "ts-jest": "^29.1.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^5.2.2" }, "dependencies": { - "@aws-sdk/client-apigatewaymanagementapi": "^3.180.0", "@aws-sdk/client-dynamodb": "^3.180.0", "@aws-sdk/client-eventbridge": "^3.180.0", "@aws-sdk/client-lambda": "^3.180.0", @@ -44,7 +43,8 @@ "@aws-sdk/lib-dynamodb": "^3.180.0", "@aws-sdk/util-dynamodb": "^3.180.0", "@serverless-stack/node": "^1.15.4", - "aws-cdk-lib": "^2.51.0", + "@aws-cdk/aws-lambda-python-alpha": "^2.75.0-alpha.0", + "aws-cdk-lib": "^2.75.0", "aws-lambda": "^1.0.7", "aws4": "^1.11.0", "constructs": "^10.1.115", @@ -52,4 +52,4 @@ }, "license": "MPL-2.0", "version": "0.0.0" -} \ No newline at end of file +} diff --git a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsEventBridgeToLambda.ts b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsEventBridgeToLambda.ts index 1b952ca..a4724df 100644 --- a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsEventBridgeToLambda.ts +++ b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsEventBridgeToLambda.ts @@ -5,5 +5,9 @@ export class ServerlessSpyEvents { FunctionMyLambdaError: 'Function#MyLambda#Error' = 'Function#MyLambda#Error'; FunctionMyLambdaConsole: 'Function#MyLambda#Console' = 'Function#MyLambda#Console'; FunctionMyLambdaResponse: 'Function#MyLambda#Response' = 'Function#MyLambda#Response'; + FunctionMyPythonLambdaRequest: 'Function#MyPythonLambda#Request' = 'Function#MyPythonLambda#Request'; + FunctionMyPythonLambdaError: 'Function#MyPythonLambda#Error' = 'Function#MyPythonLambda#Error'; + FunctionMyPythonLambdaConsole: 'Function#MyPythonLambda#Console' = 'Function#MyPythonLambda#Console'; + FunctionMyPythonLambdaResponse: 'Function#MyPythonLambda#Response' = 'Function#MyPythonLambda#Response'; EventBridgeRuleMyEventBusMyRule: 'EventBridgeRule#MyEventBus#MyRule' = 'EventBridgeRule#MyEventBus#MyRule'; } diff --git a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsPythonLambda.ts b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsPythonLambda.ts new file mode 100644 index 0000000..58ee30e --- /dev/null +++ b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsPythonLambda.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +export class ServerlessSpyEvents { + FunctionMyLambdaRequest: 'Function#MyLambda#Request' = 'Function#MyLambda#Request'; + FunctionMyLambdaError: 'Function#MyLambda#Error' = 'Function#MyLambda#Error'; + FunctionMyLambdaConsole: 'Function#MyLambda#Console' = 'Function#MyLambda#Console'; + FunctionMyLambdaResponse: 'Function#MyLambda#Response' = 'Function#MyLambda#Response'; + FunctionMyLambdaThatFailsRequest: 'Function#MyLambdaThatFails#Request' = 'Function#MyLambdaThatFails#Request'; + FunctionMyLambdaThatFailsError: 'Function#MyLambdaThatFails#Error' = 'Function#MyLambdaThatFails#Error'; + FunctionMyLambdaThatFailsConsole: 'Function#MyLambdaThatFails#Console' = 'Function#MyLambdaThatFails#Console'; + FunctionMyLambdaThatFailsResponse: 'Function#MyLambdaThatFails#Response' = 'Function#MyLambdaThatFails#Response'; +} diff --git a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSnsToLambda.ts b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSnsToLambda.ts index 020de6a..cb7b92b 100644 --- a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSnsToLambda.ts +++ b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSnsToLambda.ts @@ -6,4 +6,9 @@ export class ServerlessSpyEvents { FunctionMyLambdaConsole: 'Function#MyLambda#Console' = 'Function#MyLambda#Console'; FunctionMyLambdaResponse: 'Function#MyLambda#Response' = 'Function#MyLambda#Response'; SnsSubscriptionMyTopicMyLambda: 'SnsSubscription#MyTopic#MyLambda' = 'SnsSubscription#MyTopic#MyLambda'; + FunctionMyPythonLambdaRequest: 'Function#MyPythonLambda#Request' = 'Function#MyPythonLambda#Request'; + FunctionMyPythonLambdaError: 'Function#MyPythonLambda#Error' = 'Function#MyPythonLambda#Error'; + FunctionMyPythonLambdaConsole: 'Function#MyPythonLambda#Console' = 'Function#MyPythonLambda#Console'; + FunctionMyPythonLambdaResponse: 'Function#MyPythonLambda#Response' = 'Function#MyPythonLambda#Response'; + SnsSubscriptionMyTopicMyPythonLambda: 'SnsSubscription#MyTopic#MyPythonLambda' = 'SnsSubscription#MyTopic#MyPythonLambda'; } diff --git a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSqsToLambda.ts b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSqsToLambda.ts index a1a9dce..8e26faa 100644 --- a/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSqsToLambda.ts +++ b/test/cdk/serverlessSpyEvents/ServerlessSpyEventsSqsToLambda.ts @@ -5,4 +5,9 @@ export class ServerlessSpyEvents { FunctionMyLambdaConsole: 'Function#MyLambda#Console' = 'Function#MyLambda#Console'; FunctionMyLambdaResponse: 'Function#MyLambda#Response' = 'Function#MyLambda#Response'; SqsMyQueue: 'Sqs#MyQueue' = 'Sqs#MyQueue'; + FunctionMyPythonLambdaRequest: 'Function#MyPythonLambda#Request' = 'Function#MyPythonLambda#Request'; + FunctionMyPythonLambdaError: 'Function#MyPythonLambda#Error' = 'Function#MyPythonLambda#Error'; + FunctionMyPythonLambdaConsole: 'Function#MyPythonLambda#Console' = 'Function#MyPythonLambda#Console'; + FunctionMyPythonLambdaResponse: 'Function#MyPythonLambda#Response' = 'Function#MyPythonLambda#Response'; + SqsMyQueue2: 'Sqs#MyQueue2' = 'Sqs#MyQueue2'; } diff --git a/test/cdk/src/eventBridgeToLambdaStack.ts b/test/cdk/src/eventBridgeToLambdaStack.ts index d6255d7..2fa2011 100644 --- a/test/cdk/src/eventBridgeToLambdaStack.ts +++ b/test/cdk/src/eventBridgeToLambdaStack.ts @@ -25,10 +25,22 @@ export class EventBridgeToLambdaStack extends Stack { }, }); + const pythonFunc = new lambda.Function(this, 'MyPythonLambda', { + memorySize: 512, + timeout: Duration.seconds(5), + runtime: lambda.Runtime.PYTHON_3_9, + handler: 'dummy.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '../functions/python/')), + environment: {}, + }); + new events.Rule(this, 'MyRule', { eventBus: bus, eventPattern: { version: ['0'] }, - targets: [new targets.LambdaFunction(func)], + targets: [ + new targets.LambdaFunction(func), + new targets.LambdaFunction(pythonFunc), + ], }); const serverlessSpy = new ServerlessSpy(this, 'ServerlessSpy', { diff --git a/test/cdk/src/main.ts b/test/cdk/src/main.ts index 339026a..801bc4f 100644 --- a/test/cdk/src/main.ts +++ b/test/cdk/src/main.ts @@ -7,6 +7,7 @@ import { LambdaToEventBridgeStack } from './lambdaToEventBridgeStack'; import { LambdaToS3Stack } from './lambdaToS3Stack'; import { LambdaToSnsStack } from './lambdaToSnsStack'; import { LambdaToSqsStack } from './lambdaToSqsStack'; +import { PythonLambdaStack } from './pythonLambdaStack'; import { SnsToLambdaStack } from './snsToLambdaStack'; import { SnsToSqsStack } from './snsToSqsStack'; import { SqsStack } from './sqsStack'; @@ -36,6 +37,10 @@ new EsmLambdaStack(app, 'ServerlessSpyEsmLambda', { env: testEnv, generateSpyEventsFile: true, }); +new PythonLambdaStack(app, 'ServerlessSpyPythonLambda', { + env: testEnv, + generateSpyEventsFile: true, +}); new LambdaToDynamoDbStack(app, 'ServerlessSpyLambdaToDynamoDb', { env: testEnv, generateSpyEventsFile: true, diff --git a/test/cdk/src/pythonLambdaStack.ts b/test/cdk/src/pythonLambdaStack.ts new file mode 100644 index 0000000..c7e8b34 --- /dev/null +++ b/test/cdk/src/pythonLambdaStack.ts @@ -0,0 +1,50 @@ +import * as path from 'path'; +import { Duration, Stack, CfnOutput } from 'aws-cdk-lib'; +import * as lambda from 'aws-cdk-lib/aws-lambda'; +import { Construct } from 'constructs'; +import { ServerlessSpy } from '../../../src/ServerlessSpy'; +import { GenerateSpyEventsFileProps } from './GenerateSpyEventsFileProps'; + +export class PythonLambdaStack extends Stack { + constructor(scope: Construct, id: string, props: GenerateSpyEventsFileProps) { + super(scope, id, props); + + const func = new lambda.Function(this, 'MyLambda', { + memorySize: 512, + timeout: Duration.seconds(5), + runtime: lambda.Runtime.PYTHON_3_9, + handler: 'lambda.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '../functions/python/')), + environment: {}, + }); + + const func3 = new lambda.Function(this, 'MyLambdaThatFails', { + memorySize: 512, + timeout: Duration.seconds(5), + runtime: lambda.Runtime.PYTHON_3_9, + handler: 'lambdaFail.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '../functions/python/')), + environment: {}, + }); + + const serverlessSpy = new ServerlessSpy(this, 'ServerlessSpy', { + generateSpyEventsFileLocation: props.generateSpyEventsFile + ? 'serverlessSpyEvents/ServerlessSpyEventsPythonLambda.ts' + : undefined, + debugMode: true, + }); + + serverlessSpy.spy(); + + new CfnOutput(this, `FunctionName${serverlessSpy.getConstructName(func)}`, { + value: func.functionName, + }); + new CfnOutput( + this, + `FunctionName${serverlessSpy.getConstructName(func3)}`, + { + value: func3.functionName, + } + ); + } +} diff --git a/test/cdk/src/snsToLambdaStack.ts b/test/cdk/src/snsToLambdaStack.ts index b7980a1..6629128 100644 --- a/test/cdk/src/snsToLambdaStack.ts +++ b/test/cdk/src/snsToLambdaStack.ts @@ -26,6 +26,16 @@ export class SnsToLambdaStack extends Stack { }); topic.addSubscription(new LambdaSubscription(func)); + const pythonFunc = new lambda.Function(this, 'MyPythonLambda', { + memorySize: 512, + timeout: Duration.seconds(5), + runtime: lambda.Runtime.PYTHON_3_9, + handler: 'dummy.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '../functions/python/')), + environment: {}, + }); + topic.addSubscription(new LambdaSubscription(pythonFunc)); + const serverlessSpy = new ServerlessSpy(this, 'ServerlessSpy', { generateSpyEventsFileLocation: props.generateSpyEventsFile ? 'serverlessSpyEvents/ServerlessSpyEventsSnsToLambda.ts' diff --git a/test/cdk/src/sqsToLambdaStack.ts b/test/cdk/src/sqsToLambdaStack.ts index 5109227..23c8361 100644 --- a/test/cdk/src/sqsToLambdaStack.ts +++ b/test/cdk/src/sqsToLambdaStack.ts @@ -26,6 +26,18 @@ export class SqsToLambdaStack extends Stack { }); func.addEventSource(new SqsEventSource(queue)); + const queue2 = new sqs.Queue(this, 'MyQueue2'); + + const pythonFunc = new lambda.Function(this, 'MyPythonLambda', { + memorySize: 512, + timeout: Duration.seconds(5), + runtime: lambda.Runtime.PYTHON_3_9, + handler: 'dummy.handler', + code: lambda.Code.fromAsset(path.join(__dirname, '../functions/python/')), + environment: {}, + }); + pythonFunc.addEventSource(new SqsEventSource(queue2)); + const serverlessSpy = new ServerlessSpy(this, 'ServerlessSpy', { generateSpyEventsFileLocation: props.generateSpyEventsFile ? 'serverlessSpyEvents/ServerlessSpyEventsSqsToLambda.ts' @@ -38,5 +50,8 @@ export class SqsToLambdaStack extends Stack { new CfnOutput(this, `QueueUrl${serverlessSpy.getConstructName(queue)}`, { value: queue.queueUrl, }); + new CfnOutput(this, `QueueUrl${serverlessSpy.getConstructName(queue2)}`, { + value: queue2.queueUrl, + }); } } diff --git a/test/cdk/test/__snapshots__/e2e.test.ts.snap b/test/cdk/test/__snapshots__/e2e.test.ts.snap index ee8f42f..de6971d 100644 --- a/test/cdk/test/__snapshots__/e2e.test.ts.snap +++ b/test/cdk/test/__snapshots__/e2e.test.ts.snap @@ -1,66 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`E2e Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameToSnsAndDynamoDb": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameToSnsAndDynamoDb": { + "Value": { "Ref": "ToSnsAndDynamoDb13696817", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": Object { - "DependsOn": Array [ + "Resources": { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": { + "DependsOn": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", ], - "Properties": Object { - "Code": Object { + "Properties": { + "Code": { "ZipFile": "import boto3 # type: ignore import json import logging import urllib.request -s3 = boto3.client(\\"s3\\") +s3 = boto3.client("s3") EVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration' -CONFIGURATION_TYPES = [\\"TopicConfigurations\\", \\"QueueConfigurations\\", \\"LambdaFunctionConfigurations\\"] +CONFIGURATION_TYPES = ["TopicConfigurations", "QueueConfigurations", "LambdaFunctionConfigurations"] def handler(event: dict, context): - response_status = \\"SUCCESS\\" - error_message = \\"\\" + response_status = "SUCCESS" + error_message = "" try: - props = event[\\"ResourceProperties\\"] - bucket = props[\\"BucketName\\"] - notification_configuration = props[\\"NotificationConfiguration\\"] - request_type = event[\\"RequestType\\"] + props = event["ResourceProperties"] + bucket = props["BucketName"] + notification_configuration = props["NotificationConfiguration"] + request_type = event["RequestType"] managed = props.get('Managed', 'true').lower() == 'true' stack_id = event['StackId'] @@ -71,9 +53,9 @@ def handler(event: dict, context): put_bucket_notification_configuration(bucket, config) except Exception as e: - logging.exception(\\"Failed to put bucket notification configuration\\") - response_status = \\"FAILED\\" - error_message = f\\"Error: {str(e)}. \\" + logging.exception("Failed to put bucket notification configuration") + response_status = "FAILED" + error_message = f"Error: {str(e)}. " finally: submit_response(event, context, response_status, error_message) @@ -89,7 +71,7 @@ def handle_unmanaged(bucket, stack_id, request_type, notification_configuration) return external_notifications def with_id(notification): - notification['Id'] = f\\"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}\\" + notification['Id'] = f"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}" return notification notifications = {} @@ -109,7 +91,7 @@ def find_external_notifications(bucket, stack_id): existing_notifications = get_bucket_notification_configuration(bucket) external_notifications = {} for t in CONFIGURATION_TYPES: - external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\\"{stack_id}-\\")] + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f"{stack_id}-")] if EVENTBRIDGE_CONFIGURATION in existing_notifications: external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION] @@ -125,59 +107,59 @@ def put_bucket_notification_configuration(bucket, notification_configuration): def submit_response(event: dict, context, response_status: str, error_message: str): response_body = json.dumps( { - \\"Status\\": response_status, - \\"Reason\\": f\\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\\", - \\"PhysicalResourceId\\": event.get(\\"PhysicalResourceId\\") or event[\\"LogicalResourceId\\"], - \\"StackId\\": event[\\"StackId\\"], - \\"RequestId\\": event[\\"RequestId\\"], - \\"LogicalResourceId\\": event[\\"LogicalResourceId\\"], - \\"NoEcho\\": False, + "Status": response_status, + "Reason": f"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}", + "PhysicalResourceId": event.get("PhysicalResourceId") or event["LogicalResourceId"], + "StackId": event["StackId"], + "RequestId": event["RequestId"], + "LogicalResourceId": event["LogicalResourceId"], + "NoEcho": False, } - ).encode(\\"utf-8\\") - headers = {\\"content-type\\": \\"\\", \\"content-length\\": str(len(response_body))} + ).encode("utf-8") + headers = {"content-type": "", "content-length": str(len(response_body))} try: - req = urllib.request.Request(url=event[\\"ResponseURL\\"], headers=headers, data=response_body, method=\\"PUT\\") + req = urllib.request.Request(url=event["ResponseURL"], headers=headers, data=response_body, method="PUT") with urllib.request.urlopen(req) as response: - print(response.read().decode(\\"utf-8\\")) - print(\\"Status code: \\" + response.reason) + print(response.read().decode("utf-8")) + print("Status code: " + response.reason) except Exception as e: - print(\\"send(..) failed executing request.urlopen(..): \\" + str(e)) + print("send(..) failed executing request.urlopen(..): " + str(e)) ", }, - "Description": "AWS CloudFormation handler for \\"Custom::S3BucketNotifications\\" resources (@aws-cdk/aws-s3)", + "Description": "AWS CloudFormation handler for "Custom::S3BucketNotifications" resources (@aws-cdk/aws-s3)", "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", "Arn", ], }, - "Runtime": "python3.7", + "Runtime": "python3.9", "Timeout": 300, }, "Type": "AWS::Lambda::Function", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -188,11 +170,11 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "s3:PutBucketNotification", "Effect": "Allow", "Resource": "*", @@ -201,85 +183,70 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": Object { - "Properties": Object { + "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "FromSnsToSqsAndS3DD1CDB48": Object { - "DependsOn": Array [ + "FromSnsToSqsAndS3DD1CDB48": { + "DependsOn": [ "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", "FromSnsToSqsAndS3ServiceRoleCD383645", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "3957015dd67c832692644e95d92196ff2ada39286e6e0ffe1240b6d3c4e7e127.zip", + "S3Key": "a9bb5fe5ed2e4a1c2d744a8ced1fad5ed4c780be7f88e98174fb167c86a8d59b.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "S3_BUCKET_NAME": Object { + "S3_BUCKET_NAME": { "Ref": "MyBucketF68F3FF0", }, - "SQS_URL": Object { + "SQS_URL": { "Ref": "MyQueueNo27A959A93", }, "SSPY_FUNCTION_NAME": "FromSnsToSqsAndS3", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3ServiceRoleCD383645", "Arn", ], @@ -289,47 +256,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSnsToSqsAndS3MyTopicNo138932820": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "FromSnsToSqsAndS3MyTopicNo138932820": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "FromSnsToSqsAndS3ServiceRoleCD383645": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSnsToSqsAndS3ServiceRoleCD383645": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -340,12 +307,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "s3:DeleteObject*", "s3:PutObject", "s3:PutObjectLegalHold", @@ -355,19 +322,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s "s3:Abort*", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], }, - Object { - "Fn::Join": Array [ + { + "Fn::Join": [ "", - Array [ - Object { - "Fn::GetAtt": Array [ + [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -378,172 +345,89 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - Object { - "Action": Array [ + { + "Action": [ "sqs:SendMessage", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSnsToSqsAndS3ServiceRoleCD383645", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeE78842BE": Object { - "DependsOn": Array [ + "FromSqsToEventBridgeE78842BE": { + "DependsOn": [ "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", "FromSqsToEventBridgeServiceRole95F97034", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "9ead32172ab355ca59de0a6e6aa6b042d9be0a18ebeb9797410aaabee61c98d3.zip", + "S3Key": "691edd22e8e1590859df13fae18f42fa0bf16bad7f4b95f6199f6b80efeb1bbc.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "EB_NAME": Object { + "EB_NAME": { "Ref": "MyEventBus251E60F8", }, "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "FromSqsToEventBridge", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo2\\"}", + "":"Sqs#MyQueueNo2"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSqsToEventBridgeServiceRole95F97034", "Arn", ], @@ -553,27 +437,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSqsToEventBridgeServiceRole95F97034": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSqsToEventBridgeServiceRole95F97034": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -584,12 +468,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -597,137 +481,69 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { + { "Action": "events:PutEvents", "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyEventBus251E60F8", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSqsToEventBridgeServiceRole95F97034", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "FromSqsToEventBridgeE78842BE", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": Object { - "Properties": Object { + "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "s3.amazonaws.com", - "SourceAccount": Object { + "SourceAccount": { "Ref": "AWS::AccountId", }, - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -735,28 +551,28 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyBucketF68F3FF0": Object { + "MyBucketF68F3FF0": { "DeletionPolicy": "Retain", "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, - "MyBucketNotifications46AC0CD2": Object { - "DependsOn": Array [ + "MyBucketNotifications46AC0CD2": { + "DependsOn": [ "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7", ], - "Properties": Object { - "BucketName": Object { + "Properties": { + "BucketName": { "Ref": "MyBucketF68F3FF0", }, "Managed": true, - "NotificationConfiguration": Object { - "LambdaFunctionConfigurations": Array [ - Object { - "Events": Array [ + "NotificationConfiguration": { + "LambdaFunctionConfigurations": [ + { + "Events": [ "s3:ObjectCreated:Put", ], - "LambdaFunctionArn": Object { - "Fn::GetAtt": Array [ + "LambdaFunctionArn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -764,8 +580,8 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - "ServiceToken": Object { - "Fn::GetAtt": Array [ + "ServiceToken": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "Arn", ], @@ -773,30 +589,30 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "Custom::S3BucketNotifications", }, - "MyEventBridge1F4311C4": Object { - "Properties": Object { - "EventBusName": Object { + "MyEventBridge1F4311C4": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Id": "Target0", }, - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + { + "Arn": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], @@ -807,18 +623,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Events::Rule", }, - "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -826,18 +642,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -845,36 +661,36 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBus251E60F8": Object { - "Properties": Object { + "MyEventBus251E60F8": { + "Properties": { "Name": "TestMyEventBus25AE8456", }, "Type": "AWS::Events::EventBus", }, - "MyQueueNo154EF6659": Object { + "MyQueueNo154EF6659": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyQueueNo1PolicyD523EAC1": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "MyQueueNo1PolicyD523EAC1": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sqs:SendMessage", - "Condition": Object { - "ArnEquals": Object { - "aws:SourceArn": Object { + "Condition": { + "ArnEquals": { + "aws:SourceArn": { "Ref": "MyTopicNo10D152776", }, }, }, "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "sns.amazonaws.com", }, - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], @@ -883,112 +699,97 @@ def submit_response(event: dict, context, response_status: str, error_message: s ], "Version": "2012-10-17", }, - "Queues": Array [ - Object { + "Queues": [ + { "Ref": "MyQueueNo154EF6659", }, ], }, "Type": "AWS::SQS::QueuePolicy", }, - "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": Object { - "DependsOn": Array [ + "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": { + "DependsOn": [ "MyQueueNo1PolicyD523EAC1", ], - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, "Protocol": "sqs", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "MyQueueNo27A959A93": Object { + "MyQueueNo27A959A93": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyTable794EDED1": Object { + "MyTable794EDED1": { "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { + "Properties": { + "AttributeDefinitions": [ + { "AttributeName": "pk", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { + "KeySchema": [ + { "AttributeName": "pk", "KeyType": "HASH", }, ], - "StreamSpecification": Object { + "StreamSpecification": { "StreamViewType": "NEW_AND_OLD_IMAGES", }, }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, - "MyTopicNo10D152776": Object { + "MyTopicNo10D152776": { "Type": "AWS::SNS::Topic", }, - "ReceiveEventBridge1A8F9A7B": Object { - "DependsOn": Array [ + "ReceiveEventBridge1A8F9A7B": { + "DependsOn": [ "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", "ReceiveEventBridgeServiceRoleBF34AC2A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveEventBridge", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveEventBridgeServiceRoleBF34AC2A", "Arn", ], @@ -998,27 +799,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveEventBridgeServiceRoleBF34AC2A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveEventBridgeServiceRoleBF34AC2A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1029,159 +830,76 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveEventBridgeServiceRoleBF34AC2A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqs09F03F56": Object { - "DependsOn": Array [ + "ReceiveSqs09F03F56": { + "DependsOn": [ "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", "ReceiveSqsServiceRoleB707237A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveSqs", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo1\\"}", + "":"Sqs#MyQueueNo1"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveSqsServiceRoleB707237A", "Arn", ], @@ -1191,27 +909,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveSqsServiceRoleB707237A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveSqsServiceRoleB707237A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1222,12 +940,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -1235,880 +953,245 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveSqsServiceRoleB707237A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "ReceiveSqs09F03F56", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "nodejs16.x", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, - "AutoDeploy": true, - "StageName": "prod", }, - "Type": "AWS::ApiGatewayV2::Stage", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], + "ServerlessSpyRuleAllMyEventBus059FF67A": { + "Properties": { + "EventBusName": { + "Ref": "MyEventBus251E60F8", }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], + "EventPattern": { + "version": [ + "0", ], }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", + "Arn", + ], + }, + "Id": "Target0", + }, + ], }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Events::Rule", }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { + "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "ServerlessSpyRuleAllMyEventBus059FF67A", + "Arn", ], }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, }, - "Type": "AWS::ApiGatewayV2::Route", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", + "ServerlessSpySubscription0ServiceRoleF955D76C", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "NODE_OPTIONS": "--enable-source-maps", + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ + "", + [ + "{"", + { + "Fn::GetAtt": [ + "MyBucketF68F3FF0", + "Arn", + ], + }, + "":"S3#MyBucket","", + { + "Ref": "MyTopicNo10D152776", + }, + "":"SnsSubscription#MyTopicNo1#MyQueueNo1","eventBridge":"EventBridge#MyEventBus","", + { + "Fn::GetAtt": [ + "MyTable794EDED1", + "Arn", + ], + }, + "":"DynamoDB#MyTable"}", ], - }, - "/invocations", - ], + ], + }, + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "index.handler", + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0ServiceRoleF955D76C", + "Arn", ], }, + "Runtime": "nodejs18.x", + "Timeout": 5, }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Lambda::Function", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], + "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": { + "Properties": { + "BatchSize": 1, + "EventSourceArn": { + "Fn::GetAtt": [ + "MyTable794EDED1", + "StreamArn", ], }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - ], - "Content": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", - }, - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyRuleAllMyEventBus059FF67A": Object { - "Properties": Object { - "EventBusName": Object { - "Ref": "MyEventBus251E60F8", - }, - "EventPattern": Object { - "version": Array [ - "0", - ], - }, - "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyRuleAllMyEventBus059FF67A", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "ServerlessSpySubscription0ServiceRoleF955D76C", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ - "MyBucketF68F3FF0", - "Arn", - ], - }, - "\\":\\"S3#MyBucket\\",\\"", - Object { - "Ref": "MyTopicNo10D152776", - }, - "\\":\\"SnsSubscription#MyTopicNo1#MyQueueNo1\\",\\"eventBridge\\":\\"EventBridge#MyEventBus\\",\\"", - Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "Arn", - ], - }, - "\\":\\"DynamoDB#MyTable\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0ServiceRoleF955D76C", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "sns.amazonaws.com", - "SourceArn": Object { - "Ref": "MyTopicNo10D152776", - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": Object { - "Properties": Object { - "BatchSize": 1, - "EventSourceArn": Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "StreamArn", - ], - }, - "FunctionName": Object { - "Ref": "ServerlessSpySubscription0036DF4AB", - }, - "MaximumRetryAttempts": 0, - "StartingPosition": "LATEST", + "FunctionName": { + "Ref": "ServerlessSpySubscription0036DF4AB", + }, + "MaximumRetryAttempts": 0, + "StartingPosition": "LATEST", }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpySubscription0MyTopicNo183F8FCED": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopicNo183F8FCED": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, - Object { + { "Action": "dynamodb:ListStreams", "Effect": "Allow", "Resource": "*", }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyTable794EDED1", "StreamArn", ], @@ -2118,35 +1201,35 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2157,59 +1240,41 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsTopic#MyTopicNo1\\",\\"eventBridge\\":\\"EventBridgeRule#MyEventBus#MyEventBridge\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", + "":"SnsTopic#MyTopicNo1","eventBridge":"EventBridgeRule#MyEventBus#MyEventBridge"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -2219,58 +1284,58 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": Object { - "Properties": Object { + "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription1MyTopicNo1F1471199": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription1MyTopicNo1F1471199": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2281,164 +1346,78 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": Object { - "Properties": Object { + "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription2F82BAF5F": Object { - "DependsOn": Array [ + "ServerlessSpySubscription2F82BAF5F": { + "DependsOn": [ "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", "ServerlessSpySubscription2ServiceRole7162AC7F", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3\\"}", + "":"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription2ServiceRole7162AC7F", "Arn", ], @@ -2448,47 +1427,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription2MyTopicNo1ABC3C742": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription2MyTopicNo1ABC3C742": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription2ServiceRole7162AC7F": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription2ServiceRole7162AC7F": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2499,170 +1478,67 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription2ServiceRole7162AC7F", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, - "ToSnsAndDynamoDb13696817": Object { - "DependsOn": Array [ + "ToSnsAndDynamoDb13696817": { + "DependsOn": [ "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", "ToSnsAndDynamoDbServiceRoleB0BC8E77", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e7ff2a7516b279b0c0e4e115aaf1e813a8e6ba33e12b277bc85f15876a3f165b.zip", + "S3Key": "aa9fbb8d63f63ee5dc45650386259597171d3679551fb30d084bd2b3d17ea32c.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DYNAMODB_TABLE_NAME": Object { + "DYNAMODB_TABLE_NAME": { "Ref": "MyTable794EDED1", }, "NODE_OPTIONS": "--enable-source-maps", - "SNS_TOPIC_ARN": Object { + "SNS_TOPIC_ARN": { "Ref": "MyTopicNo10D152776", }, "SSPY_FUNCTION_NAME": "ToSnsAndDynamoDb", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ToSnsAndDynamoDbServiceRoleB0BC8E77", "Arn", ], @@ -2672,27 +1548,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ToSnsAndDynamoDbServiceRoleB0BC8E77": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleB0BC8E77": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2703,19 +1579,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sns:Publish", "Effect": "Allow", - "Resource": Object { + "Resource": { "Ref": "MyTopicNo10D152776", }, }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:UpdateItem", @@ -2723,97 +1599,29 @@ def submit_response(event: dict, context, response_status: str, error_message: s "dynamodb:DescribeTable", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyTable794EDED1", "Arn", ], }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { + { "Ref": "AWS::NoValue", }, ], }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ToSnsAndDynamoDbServiceRoleB0BC8E77", }, ], @@ -2821,22 +1629,22 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Type": "AWS::IAM::Policy", }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/esmLambda.test.ts.snap b/test/cdk/test/__snapshots__/esmLambda.test.ts.snap index a3ae57f..e518d3c 100644 --- a/test/cdk/test/__snapshots__/esmLambda.test.ts.snap +++ b/test/cdk/test/__snapshots__/esmLambda.test.ts.snap @@ -1,66 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`EsmLambda Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameToSnsAndDynamoDb": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameToSnsAndDynamoDb": { + "Value": { "Ref": "ToSnsAndDynamoDb13696817", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": Object { - "DependsOn": Array [ + "Resources": { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": { + "DependsOn": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", ], - "Properties": Object { - "Code": Object { + "Properties": { + "Code": { "ZipFile": "import boto3 # type: ignore import json import logging import urllib.request -s3 = boto3.client(\\"s3\\") +s3 = boto3.client("s3") EVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration' -CONFIGURATION_TYPES = [\\"TopicConfigurations\\", \\"QueueConfigurations\\", \\"LambdaFunctionConfigurations\\"] +CONFIGURATION_TYPES = ["TopicConfigurations", "QueueConfigurations", "LambdaFunctionConfigurations"] def handler(event: dict, context): - response_status = \\"SUCCESS\\" - error_message = \\"\\" + response_status = "SUCCESS" + error_message = "" try: - props = event[\\"ResourceProperties\\"] - bucket = props[\\"BucketName\\"] - notification_configuration = props[\\"NotificationConfiguration\\"] - request_type = event[\\"RequestType\\"] + props = event["ResourceProperties"] + bucket = props["BucketName"] + notification_configuration = props["NotificationConfiguration"] + request_type = event["RequestType"] managed = props.get('Managed', 'true').lower() == 'true' stack_id = event['StackId'] @@ -71,9 +53,9 @@ def handler(event: dict, context): put_bucket_notification_configuration(bucket, config) except Exception as e: - logging.exception(\\"Failed to put bucket notification configuration\\") - response_status = \\"FAILED\\" - error_message = f\\"Error: {str(e)}. \\" + logging.exception("Failed to put bucket notification configuration") + response_status = "FAILED" + error_message = f"Error: {str(e)}. " finally: submit_response(event, context, response_status, error_message) @@ -89,7 +71,7 @@ def handle_unmanaged(bucket, stack_id, request_type, notification_configuration) return external_notifications def with_id(notification): - notification['Id'] = f\\"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}\\" + notification['Id'] = f"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}" return notification notifications = {} @@ -109,7 +91,7 @@ def find_external_notifications(bucket, stack_id): existing_notifications = get_bucket_notification_configuration(bucket) external_notifications = {} for t in CONFIGURATION_TYPES: - external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\\"{stack_id}-\\")] + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f"{stack_id}-")] if EVENTBRIDGE_CONFIGURATION in existing_notifications: external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION] @@ -125,59 +107,59 @@ def put_bucket_notification_configuration(bucket, notification_configuration): def submit_response(event: dict, context, response_status: str, error_message: str): response_body = json.dumps( { - \\"Status\\": response_status, - \\"Reason\\": f\\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\\", - \\"PhysicalResourceId\\": event.get(\\"PhysicalResourceId\\") or event[\\"LogicalResourceId\\"], - \\"StackId\\": event[\\"StackId\\"], - \\"RequestId\\": event[\\"RequestId\\"], - \\"LogicalResourceId\\": event[\\"LogicalResourceId\\"], - \\"NoEcho\\": False, + "Status": response_status, + "Reason": f"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}", + "PhysicalResourceId": event.get("PhysicalResourceId") or event["LogicalResourceId"], + "StackId": event["StackId"], + "RequestId": event["RequestId"], + "LogicalResourceId": event["LogicalResourceId"], + "NoEcho": False, } - ).encode(\\"utf-8\\") - headers = {\\"content-type\\": \\"\\", \\"content-length\\": str(len(response_body))} + ).encode("utf-8") + headers = {"content-type": "", "content-length": str(len(response_body))} try: - req = urllib.request.Request(url=event[\\"ResponseURL\\"], headers=headers, data=response_body, method=\\"PUT\\") + req = urllib.request.Request(url=event["ResponseURL"], headers=headers, data=response_body, method="PUT") with urllib.request.urlopen(req) as response: - print(response.read().decode(\\"utf-8\\")) - print(\\"Status code: \\" + response.reason) + print(response.read().decode("utf-8")) + print("Status code: " + response.reason) except Exception as e: - print(\\"send(..) failed executing request.urlopen(..): \\" + str(e)) + print("send(..) failed executing request.urlopen(..): " + str(e)) ", }, - "Description": "AWS CloudFormation handler for \\"Custom::S3BucketNotifications\\" resources (@aws-cdk/aws-s3)", + "Description": "AWS CloudFormation handler for "Custom::S3BucketNotifications" resources (@aws-cdk/aws-s3)", "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", "Arn", ], }, - "Runtime": "python3.7", + "Runtime": "python3.9", "Timeout": 300, }, "Type": "AWS::Lambda::Function", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -188,11 +170,11 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "s3:PutBucketNotification", "Effect": "Allow", "Resource": "*", @@ -201,85 +183,70 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": Object { - "Properties": Object { + "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "FromSnsToSqsAndS3DD1CDB48": Object { - "DependsOn": Array [ + "FromSnsToSqsAndS3DD1CDB48": { + "DependsOn": [ "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", "FromSnsToSqsAndS3ServiceRoleCD383645", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "3957015dd67c832692644e95d92196ff2ada39286e6e0ffe1240b6d3c4e7e127.zip", + "S3Key": "a9bb5fe5ed2e4a1c2d744a8ced1fad5ed4c780be7f88e98174fb167c86a8d59b.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "S3_BUCKET_NAME": Object { + "S3_BUCKET_NAME": { "Ref": "MyBucketF68F3FF0", }, - "SQS_URL": Object { + "SQS_URL": { "Ref": "MyQueueNo27A959A93", }, "SSPY_FUNCTION_NAME": "FromSnsToSqsAndS3", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3ServiceRoleCD383645", "Arn", ], @@ -289,47 +256,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSnsToSqsAndS3MyTopicNo138932820": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "FromSnsToSqsAndS3MyTopicNo138932820": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "FromSnsToSqsAndS3ServiceRoleCD383645": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSnsToSqsAndS3ServiceRoleCD383645": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -340,12 +307,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "s3:DeleteObject*", "s3:PutObject", "s3:PutObjectLegalHold", @@ -355,19 +322,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s "s3:Abort*", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], }, - Object { - "Fn::Join": Array [ + { + "Fn::Join": [ "", - Array [ - Object { - "Fn::GetAtt": Array [ + [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -378,172 +345,89 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - Object { - "Action": Array [ + { + "Action": [ "sqs:SendMessage", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSnsToSqsAndS3ServiceRoleCD383645", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeE78842BE": Object { - "DependsOn": Array [ + "FromSqsToEventBridgeE78842BE": { + "DependsOn": [ "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", "FromSqsToEventBridgeServiceRole95F97034", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "9ead32172ab355ca59de0a6e6aa6b042d9be0a18ebeb9797410aaabee61c98d3.zip", + "S3Key": "691edd22e8e1590859df13fae18f42fa0bf16bad7f4b95f6199f6b80efeb1bbc.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "EB_NAME": Object { + "EB_NAME": { "Ref": "MyEventBus251E60F8", }, "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "FromSqsToEventBridge", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo2\\"}", + "":"Sqs#MyQueueNo2"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSqsToEventBridgeServiceRole95F97034", "Arn", ], @@ -553,27 +437,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSqsToEventBridgeServiceRole95F97034": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSqsToEventBridgeServiceRole95F97034": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -584,12 +468,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -597,137 +481,69 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { + { "Action": "events:PutEvents", "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyEventBus251E60F8", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSqsToEventBridgeServiceRole95F97034", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "FromSqsToEventBridgeE78842BE", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": Object { - "Properties": Object { + "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "s3.amazonaws.com", - "SourceAccount": Object { + "SourceAccount": { "Ref": "AWS::AccountId", }, - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -735,28 +551,28 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyBucketF68F3FF0": Object { + "MyBucketF68F3FF0": { "DeletionPolicy": "Retain", "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, - "MyBucketNotifications46AC0CD2": Object { - "DependsOn": Array [ + "MyBucketNotifications46AC0CD2": { + "DependsOn": [ "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7", ], - "Properties": Object { - "BucketName": Object { + "Properties": { + "BucketName": { "Ref": "MyBucketF68F3FF0", }, "Managed": true, - "NotificationConfiguration": Object { - "LambdaFunctionConfigurations": Array [ - Object { - "Events": Array [ + "NotificationConfiguration": { + "LambdaFunctionConfigurations": [ + { + "Events": [ "s3:ObjectCreated:Put", ], - "LambdaFunctionArn": Object { - "Fn::GetAtt": Array [ + "LambdaFunctionArn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -764,8 +580,8 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - "ServiceToken": Object { - "Fn::GetAtt": Array [ + "ServiceToken": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "Arn", ], @@ -773,30 +589,30 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "Custom::S3BucketNotifications", }, - "MyEventBridge1F4311C4": Object { - "Properties": Object { - "EventBusName": Object { + "MyEventBridge1F4311C4": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Id": "Target0", }, - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + { + "Arn": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], @@ -807,18 +623,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Events::Rule", }, - "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -826,18 +642,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -845,36 +661,36 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBus251E60F8": Object { - "Properties": Object { + "MyEventBus251E60F8": { + "Properties": { "Name": "TestMyEventBus25AE8456", }, "Type": "AWS::Events::EventBus", }, - "MyQueueNo154EF6659": Object { + "MyQueueNo154EF6659": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyQueueNo1PolicyD523EAC1": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "MyQueueNo1PolicyD523EAC1": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sqs:SendMessage", - "Condition": Object { - "ArnEquals": Object { - "aws:SourceArn": Object { + "Condition": { + "ArnEquals": { + "aws:SourceArn": { "Ref": "MyTopicNo10D152776", }, }, }, "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "sns.amazonaws.com", }, - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], @@ -883,112 +699,97 @@ def submit_response(event: dict, context, response_status: str, error_message: s ], "Version": "2012-10-17", }, - "Queues": Array [ - Object { + "Queues": [ + { "Ref": "MyQueueNo154EF6659", }, ], }, "Type": "AWS::SQS::QueuePolicy", }, - "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": Object { - "DependsOn": Array [ + "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": { + "DependsOn": [ "MyQueueNo1PolicyD523EAC1", ], - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, "Protocol": "sqs", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "MyQueueNo27A959A93": Object { + "MyQueueNo27A959A93": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyTable794EDED1": Object { + "MyTable794EDED1": { "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { + "Properties": { + "AttributeDefinitions": [ + { "AttributeName": "pk", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { + "KeySchema": [ + { "AttributeName": "pk", "KeyType": "HASH", }, ], - "StreamSpecification": Object { + "StreamSpecification": { "StreamViewType": "NEW_AND_OLD_IMAGES", }, }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, - "MyTopicNo10D152776": Object { + "MyTopicNo10D152776": { "Type": "AWS::SNS::Topic", }, - "ReceiveEventBridge1A8F9A7B": Object { - "DependsOn": Array [ + "ReceiveEventBridge1A8F9A7B": { + "DependsOn": [ "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", "ReceiveEventBridgeServiceRoleBF34AC2A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveEventBridge", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveEventBridgeServiceRoleBF34AC2A", "Arn", ], @@ -998,27 +799,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveEventBridgeServiceRoleBF34AC2A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveEventBridgeServiceRoleBF34AC2A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1029,159 +830,76 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveEventBridgeServiceRoleBF34AC2A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqs09F03F56": Object { - "DependsOn": Array [ + "ReceiveSqs09F03F56": { + "DependsOn": [ "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", "ReceiveSqsServiceRoleB707237A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveSqs", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo1\\"}", + "":"Sqs#MyQueueNo1"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveSqsServiceRoleB707237A", "Arn", ], @@ -1191,27 +909,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveSqsServiceRoleB707237A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveSqsServiceRoleB707237A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1222,12 +940,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -1235,880 +953,245 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveSqsServiceRoleB707237A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "ReceiveSqs09F03F56", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "nodejs16.x", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, - "AutoDeploy": true, - "StageName": "prod", }, - "Type": "AWS::ApiGatewayV2::Stage", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], + "ServerlessSpyRuleAllMyEventBus059FF67A": { + "Properties": { + "EventBusName": { + "Ref": "MyEventBus251E60F8", }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], + "EventPattern": { + "version": [ + "0", ], }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", + "Arn", + ], + }, + "Id": "Target0", + }, + ], }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Events::Rule", }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { + "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "ServerlessSpyRuleAllMyEventBus059FF67A", + "Arn", ], }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, }, - "Type": "AWS::ApiGatewayV2::Route", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", + "ServerlessSpySubscription0ServiceRoleF955D76C", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "NODE_OPTIONS": "--enable-source-maps", + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ + "", + [ + "{"", + { + "Fn::GetAtt": [ + "MyBucketF68F3FF0", + "Arn", + ], + }, + "":"S3#MyBucket","", + { + "Ref": "MyTopicNo10D152776", + }, + "":"SnsSubscription#MyTopicNo1#MyQueueNo1","eventBridge":"EventBridge#MyEventBus","", + { + "Fn::GetAtt": [ + "MyTable794EDED1", + "Arn", + ], + }, + "":"DynamoDB#MyTable"}", ], - }, - "/invocations", - ], + ], + }, + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "index.handler", + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0ServiceRoleF955D76C", + "Arn", ], }, + "Runtime": "nodejs18.x", + "Timeout": 5, }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Lambda::Function", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], + "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": { + "Properties": { + "BatchSize": 1, + "EventSourceArn": { + "Fn::GetAtt": [ + "MyTable794EDED1", + "StreamArn", ], }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - ], - "Content": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", - }, - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyRuleAllMyEventBus059FF67A": Object { - "Properties": Object { - "EventBusName": Object { - "Ref": "MyEventBus251E60F8", - }, - "EventPattern": Object { - "version": Array [ - "0", - ], - }, - "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyRuleAllMyEventBus059FF67A", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "ServerlessSpySubscription0ServiceRoleF955D76C", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ - "MyBucketF68F3FF0", - "Arn", - ], - }, - "\\":\\"S3#MyBucket\\",\\"", - Object { - "Ref": "MyTopicNo10D152776", - }, - "\\":\\"SnsSubscription#MyTopicNo1#MyQueueNo1\\",\\"eventBridge\\":\\"EventBridge#MyEventBus\\",\\"", - Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "Arn", - ], - }, - "\\":\\"DynamoDB#MyTable\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0ServiceRoleF955D76C", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "sns.amazonaws.com", - "SourceArn": Object { - "Ref": "MyTopicNo10D152776", - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": Object { - "Properties": Object { - "BatchSize": 1, - "EventSourceArn": Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "StreamArn", - ], - }, - "FunctionName": Object { - "Ref": "ServerlessSpySubscription0036DF4AB", - }, - "MaximumRetryAttempts": 0, - "StartingPosition": "LATEST", + "FunctionName": { + "Ref": "ServerlessSpySubscription0036DF4AB", + }, + "MaximumRetryAttempts": 0, + "StartingPosition": "LATEST", }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpySubscription0MyTopicNo183F8FCED": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopicNo183F8FCED": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, - Object { + { "Action": "dynamodb:ListStreams", "Effect": "Allow", "Resource": "*", }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyTable794EDED1", "StreamArn", ], @@ -2118,35 +1201,35 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2157,59 +1240,41 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsTopic#MyTopicNo1\\",\\"eventBridge\\":\\"EventBridgeRule#MyEventBus#MyEventBridge\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", + "":"SnsTopic#MyTopicNo1","eventBridge":"EventBridgeRule#MyEventBus#MyEventBridge"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -2219,58 +1284,58 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": Object { - "Properties": Object { + "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription1MyTopicNo1F1471199": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription1MyTopicNo1F1471199": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2281,164 +1346,78 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": Object { - "Properties": Object { + "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription2F82BAF5F": Object { - "DependsOn": Array [ + "ServerlessSpySubscription2F82BAF5F": { + "DependsOn": [ "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", "ServerlessSpySubscription2ServiceRole7162AC7F", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3\\"}", + "":"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription2ServiceRole7162AC7F", "Arn", ], @@ -2448,47 +1427,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription2MyTopicNo1ABC3C742": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription2MyTopicNo1ABC3C742": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription2ServiceRole7162AC7F": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription2ServiceRole7162AC7F": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2499,170 +1478,67 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription2ServiceRole7162AC7F", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, - "ToSnsAndDynamoDb13696817": Object { - "DependsOn": Array [ + "ToSnsAndDynamoDb13696817": { + "DependsOn": [ "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", "ToSnsAndDynamoDbServiceRoleB0BC8E77", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e7ff2a7516b279b0c0e4e115aaf1e813a8e6ba33e12b277bc85f15876a3f165b.zip", + "S3Key": "aa9fbb8d63f63ee5dc45650386259597171d3679551fb30d084bd2b3d17ea32c.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DYNAMODB_TABLE_NAME": Object { + "DYNAMODB_TABLE_NAME": { "Ref": "MyTable794EDED1", }, "NODE_OPTIONS": "--enable-source-maps", - "SNS_TOPIC_ARN": Object { + "SNS_TOPIC_ARN": { "Ref": "MyTopicNo10D152776", }, "SSPY_FUNCTION_NAME": "ToSnsAndDynamoDb", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ToSnsAndDynamoDbServiceRoleB0BC8E77", "Arn", ], @@ -2672,27 +1548,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ToSnsAndDynamoDbServiceRoleB0BC8E77": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleB0BC8E77": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2703,19 +1579,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sns:Publish", "Effect": "Allow", - "Resource": Object { + "Resource": { "Ref": "MyTopicNo10D152776", }, }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:UpdateItem", @@ -2723,97 +1599,29 @@ def submit_response(event: dict, context, response_status: str, error_message: s "dynamodb:DescribeTable", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyTable794EDED1", "Arn", ], }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { + { "Ref": "AWS::NoValue", }, ], }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ToSnsAndDynamoDbServiceRoleB0BC8E77", }, ], @@ -2821,22 +1629,22 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Type": "AWS::IAM::Policy", }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/eventBridgeToLambda.test.ts.snap b/test/cdk/test/__snapshots__/eventBridgeToLambda.test.ts.snap index 879c665..0c17a75 100644 --- a/test/cdk/test/__snapshots__/eventBridgeToLambda.test.ts.snap +++ b/test/cdk/test/__snapshots__/eventBridgeToLambda.test.ts.snap @@ -1,96 +1,63 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`EventBridge to Lambda Snapshot 1`] = ` -Object { - "Outputs": Object { - "EventBusNameMyEventBus": Object { - "Value": Object { +{ + "Outputs": { + "EventBusNameMyEventBus": { + "Value": { "Ref": "MyEventBus251E60F8", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyEventBus251E60F8": Object { - "Properties": Object { + "Resources": { + "MyEventBus251E60F8": { + "Properties": { "Name": "TestMyEventBus25AE8456", }, "Type": "AWS::Events::EventBus", }, - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -100,27 +67,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -131,141 +98,176 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": "*", }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + ], + "Version": "2012-10-17", + }, + "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "Roles": [ + { + "Ref": "MyLambdaServiceRole4539ECB6", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "MyPythonLambdaBD2BE2C6": { + "DependsOn": [ + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "MyPythonLambdaServiceRoleE254838E", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "a34102ca9b461fd6335e146271be5476c61e07b3b0ca21959ff0705dd70432d8.zip", + }, + "Environment": { + "Variables": { + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", + "SSPY_DEBUG": "true", + "SSPY_FUNCTION_NAME": "MyPythonLambda", + "SSPY_INFRA_MAPPING": "{}", + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "dummy.handler", + "Layers": [ + { + "Ref": "ServerlessSpyPythonExtension718A6034", + }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, + ], + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "MyPythonLambdaServiceRoleE254838E", + "Arn", + ], + }, + "Runtime": "python3.9", + "Timeout": 5, + }, + "Type": "AWS::Lambda::Function", + }, + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": "*", }, - Object { - "Action": "execute-api:ManageConnections", + ], + "Version": "2012-10-17", + }, + "PolicyName": "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "Roles": [ + { + "Ref": "MyPythonLambdaServiceRoleE254838E", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "MyPythonLambdaServiceRoleE254838E": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], + "Principal": { + "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { - "Ref": "MyLambdaServiceRole4539ECB6", + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], }, ], }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::IAM::Role", }, - "MyRuleA44AB831": Object { - "Properties": Object { - "EventBusName": Object { + "MyRuleA44AB831": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn", ], }, "Id": "Target0", }, - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription13C6B2B7D", + { + "Arn": { + "Fn::GetAtt": [ + "MyPythonLambdaBD2BE2C6", "Arn", ], }, "Id": "Target1", }, + { + "Arn": { + "Fn::GetAtt": [ + "ServerlessSpySubscription13C6B2B7D", + "Arn", + ], + }, + "Id": "Target2", + }, ], }, "Type": "AWS::Events::Rule", }, - "MyRuleAllowEventRuleTestMyLambda6DF223AB114A1738": Object { - "Properties": Object { + "MyRuleAllowEventRuleTestMyLambda6DF223AB114A1738": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyRuleA44AB831", "Arn", ], @@ -273,18 +275,18 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "MyRuleAllowEventRuleTestServerlessSpySubscription13F5C56BA3FA7E3FD": Object { - "Properties": Object { + "MyRuleAllowEventRuleTestMyPythonLambda73A81E6CDD62CCB4": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription13C6B2B7D", + "FunctionName": { + "Fn::GetAtt": [ + "MyPythonLambdaBD2BE2C6", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyRuleA44AB831", "Arn", ], @@ -292,532 +294,74 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { + "MyRuleAllowEventRuleTestServerlessSpySubscription13F5C56BA3FA7E3FD": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "MyRuleA44AB831", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, + "ServerlessSpyPythonExtension718A6034": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, + "CompatibleRuntimes": [ + "python3.9", ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, + "S3Key": "f0805f3798a1ec284ae50530bcfe1f7dc297a30367d2ef35819e3b21b57db6cd.zip", }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyRuleAllMyEventBus059FF67A": Object { - "Properties": Object { - "EventBusName": Object { + "ServerlessSpyRuleAllMyEventBus059FF67A": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -828,18 +372,18 @@ Object { }, "Type": "AWS::Events::Rule", }, - "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": Object { - "Properties": Object { + "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "ServerlessSpyRuleAllMyEventBus059FF67A", "Arn", ], @@ -847,48 +391,41 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", + }, + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": "{\\"eventBridge\\":\\"EventBridge#MyEventBus\\"}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_INFRA_MAPPING": "{"eventBridge":"EventBridge#MyEventBus"}", + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -898,116 +435,48 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1018,48 +487,30 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": "{\\"eventBridge\\":\\"EventBridgeRule#MyEventBus#MyRule\\"}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_INFRA_MAPPING": "{"eventBridge":"EventBridgeRule#MyEventBus#MyRule"}", + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -1069,27 +520,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1100,132 +551,44 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambda.test.ts.snap b/test/cdk/test/__snapshots__/lambda.test.ts.snap index 6388bd1..74deb72 100644 --- a/test/cdk/test/__snapshots__/lambda.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambda.test.ts.snap @@ -1,66 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameToSnsAndDynamoDb": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameToSnsAndDynamoDb": { + "Value": { "Ref": "ToSnsAndDynamoDb13696817", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": Object { - "DependsOn": Array [ + "Resources": { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": { + "DependsOn": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", ], - "Properties": Object { - "Code": Object { + "Properties": { + "Code": { "ZipFile": "import boto3 # type: ignore import json import logging import urllib.request -s3 = boto3.client(\\"s3\\") +s3 = boto3.client("s3") EVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration' -CONFIGURATION_TYPES = [\\"TopicConfigurations\\", \\"QueueConfigurations\\", \\"LambdaFunctionConfigurations\\"] +CONFIGURATION_TYPES = ["TopicConfigurations", "QueueConfigurations", "LambdaFunctionConfigurations"] def handler(event: dict, context): - response_status = \\"SUCCESS\\" - error_message = \\"\\" + response_status = "SUCCESS" + error_message = "" try: - props = event[\\"ResourceProperties\\"] - bucket = props[\\"BucketName\\"] - notification_configuration = props[\\"NotificationConfiguration\\"] - request_type = event[\\"RequestType\\"] + props = event["ResourceProperties"] + bucket = props["BucketName"] + notification_configuration = props["NotificationConfiguration"] + request_type = event["RequestType"] managed = props.get('Managed', 'true').lower() == 'true' stack_id = event['StackId'] @@ -71,9 +53,9 @@ def handler(event: dict, context): put_bucket_notification_configuration(bucket, config) except Exception as e: - logging.exception(\\"Failed to put bucket notification configuration\\") - response_status = \\"FAILED\\" - error_message = f\\"Error: {str(e)}. \\" + logging.exception("Failed to put bucket notification configuration") + response_status = "FAILED" + error_message = f"Error: {str(e)}. " finally: submit_response(event, context, response_status, error_message) @@ -89,7 +71,7 @@ def handle_unmanaged(bucket, stack_id, request_type, notification_configuration) return external_notifications def with_id(notification): - notification['Id'] = f\\"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}\\" + notification['Id'] = f"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}" return notification notifications = {} @@ -109,7 +91,7 @@ def find_external_notifications(bucket, stack_id): existing_notifications = get_bucket_notification_configuration(bucket) external_notifications = {} for t in CONFIGURATION_TYPES: - external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\\"{stack_id}-\\")] + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f"{stack_id}-")] if EVENTBRIDGE_CONFIGURATION in existing_notifications: external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION] @@ -125,59 +107,59 @@ def put_bucket_notification_configuration(bucket, notification_configuration): def submit_response(event: dict, context, response_status: str, error_message: str): response_body = json.dumps( { - \\"Status\\": response_status, - \\"Reason\\": f\\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\\", - \\"PhysicalResourceId\\": event.get(\\"PhysicalResourceId\\") or event[\\"LogicalResourceId\\"], - \\"StackId\\": event[\\"StackId\\"], - \\"RequestId\\": event[\\"RequestId\\"], - \\"LogicalResourceId\\": event[\\"LogicalResourceId\\"], - \\"NoEcho\\": False, + "Status": response_status, + "Reason": f"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}", + "PhysicalResourceId": event.get("PhysicalResourceId") or event["LogicalResourceId"], + "StackId": event["StackId"], + "RequestId": event["RequestId"], + "LogicalResourceId": event["LogicalResourceId"], + "NoEcho": False, } - ).encode(\\"utf-8\\") - headers = {\\"content-type\\": \\"\\", \\"content-length\\": str(len(response_body))} + ).encode("utf-8") + headers = {"content-type": "", "content-length": str(len(response_body))} try: - req = urllib.request.Request(url=event[\\"ResponseURL\\"], headers=headers, data=response_body, method=\\"PUT\\") + req = urllib.request.Request(url=event["ResponseURL"], headers=headers, data=response_body, method="PUT") with urllib.request.urlopen(req) as response: - print(response.read().decode(\\"utf-8\\")) - print(\\"Status code: \\" + response.reason) + print(response.read().decode("utf-8")) + print("Status code: " + response.reason) except Exception as e: - print(\\"send(..) failed executing request.urlopen(..): \\" + str(e)) + print("send(..) failed executing request.urlopen(..): " + str(e)) ", }, - "Description": "AWS CloudFormation handler for \\"Custom::S3BucketNotifications\\" resources (@aws-cdk/aws-s3)", + "Description": "AWS CloudFormation handler for "Custom::S3BucketNotifications" resources (@aws-cdk/aws-s3)", "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", "Arn", ], }, - "Runtime": "python3.7", + "Runtime": "python3.9", "Timeout": 300, }, "Type": "AWS::Lambda::Function", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -188,11 +170,11 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "s3:PutBucketNotification", "Effect": "Allow", "Resource": "*", @@ -201,85 +183,70 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": Object { - "Properties": Object { + "FromSnsToSqsAndS3AllowInvokeTestMyTopicNo1964ECD796255293D": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "FromSnsToSqsAndS3DD1CDB48": Object { - "DependsOn": Array [ + "FromSnsToSqsAndS3DD1CDB48": { + "DependsOn": [ "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", "FromSnsToSqsAndS3ServiceRoleCD383645", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "3957015dd67c832692644e95d92196ff2ada39286e6e0ffe1240b6d3c4e7e127.zip", + "S3Key": "a9bb5fe5ed2e4a1c2d744a8ced1fad5ed4c780be7f88e98174fb167c86a8d59b.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "S3_BUCKET_NAME": Object { + "S3_BUCKET_NAME": { "Ref": "MyBucketF68F3FF0", }, - "SQS_URL": Object { + "SQS_URL": { "Ref": "MyQueueNo27A959A93", }, "SSPY_FUNCTION_NAME": "FromSnsToSqsAndS3", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3ServiceRoleCD383645", "Arn", ], @@ -289,47 +256,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSnsToSqsAndS3MyTopicNo138932820": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "FromSnsToSqsAndS3MyTopicNo138932820": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "FromSnsToSqsAndS3DD1CDB48", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "FromSnsToSqsAndS3ServiceRoleCD383645": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSnsToSqsAndS3ServiceRoleCD383645": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -340,12 +307,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "s3:DeleteObject*", "s3:PutObject", "s3:PutObjectLegalHold", @@ -355,19 +322,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s "s3:Abort*", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], }, - Object { - "Fn::Join": Array [ + { + "Fn::Join": [ "", - Array [ - Object { - "Fn::GetAtt": Array [ + [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -378,172 +345,89 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - Object { - "Action": Array [ + { + "Action": [ "sqs:SendMessage", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSnsToSqsAndS3ServiceRoleDefaultPolicy7B1CCE08", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSnsToSqsAndS3ServiceRoleCD383645", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeE78842BE": Object { - "DependsOn": Array [ + "FromSqsToEventBridgeE78842BE": { + "DependsOn": [ "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", "FromSqsToEventBridgeServiceRole95F97034", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "9ead32172ab355ca59de0a6e6aa6b042d9be0a18ebeb9797410aaabee61c98d3.zip", + "S3Key": "691edd22e8e1590859df13fae18f42fa0bf16bad7f4b95f6199f6b80efeb1bbc.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "EB_NAME": Object { + "EB_NAME": { "Ref": "MyEventBus251E60F8", }, "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "FromSqsToEventBridge", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo2\\"}", + "":"Sqs#MyQueueNo2"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "FromSqsToEventBridgeServiceRole95F97034", "Arn", ], @@ -553,27 +437,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "FromSqsToEventBridgeServiceRole95F97034": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "FromSqsToEventBridgeServiceRole95F97034": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -584,12 +468,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -597,137 +481,69 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, }, - Object { + { "Action": "events:PutEvents", "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyEventBus251E60F8", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "FromSqsToEventBridgeServiceRoleDefaultPolicyCAE36D6B", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "FromSqsToEventBridgeServiceRole95F97034", }, ], }, "Type": "AWS::IAM::Policy", }, - "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "FromSqsToEventBridgeSqsEventSourceTestMyQueueNo24D3D979A0048B77D": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo27A959A93", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "FromSqsToEventBridgeE78842BE", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": Object { - "Properties": Object { + "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "s3.amazonaws.com", - "SourceAccount": Object { + "SourceAccount": { "Ref": "AWS::AccountId", }, - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -735,28 +551,28 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyBucketF68F3FF0": Object { + "MyBucketF68F3FF0": { "DeletionPolicy": "Retain", "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, - "MyBucketNotifications46AC0CD2": Object { - "DependsOn": Array [ + "MyBucketNotifications46AC0CD2": { + "DependsOn": [ "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7", ], - "Properties": Object { - "BucketName": Object { + "Properties": { + "BucketName": { "Ref": "MyBucketF68F3FF0", }, "Managed": true, - "NotificationConfiguration": Object { - "LambdaFunctionConfigurations": Array [ - Object { - "Events": Array [ + "NotificationConfiguration": { + "LambdaFunctionConfigurations": [ + { + "Events": [ "s3:ObjectCreated:Put", ], - "LambdaFunctionArn": Object { - "Fn::GetAtt": Array [ + "LambdaFunctionArn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -764,8 +580,8 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - "ServiceToken": Object { - "Fn::GetAtt": Array [ + "ServiceToken": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "Arn", ], @@ -773,30 +589,30 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "Custom::S3BucketNotifications", }, - "MyEventBridge1F4311C4": Object { - "Properties": Object { - "EventBusName": Object { + "MyEventBridge1F4311C4": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Id": "Target0", }, - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + { + "Arn": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], @@ -807,18 +623,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Events::Rule", }, - "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestReceiveEventBridgeE66203697BDF9DA9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ReceiveEventBridge1A8F9A7B", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -826,18 +642,18 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": Object { - "Properties": Object { + "MyEventBridgeAllowEventRuleTestServerlessSpySubscription13F5C56BA05D346A0": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyEventBridge1F4311C4", "Arn", ], @@ -845,36 +661,36 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyEventBus251E60F8": Object { - "Properties": Object { + "MyEventBus251E60F8": { + "Properties": { "Name": "TestMyEventBus25AE8456", }, "Type": "AWS::Events::EventBus", }, - "MyQueueNo154EF6659": Object { + "MyQueueNo154EF6659": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyQueueNo1PolicyD523EAC1": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "MyQueueNo1PolicyD523EAC1": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sqs:SendMessage", - "Condition": Object { - "ArnEquals": Object { - "aws:SourceArn": Object { + "Condition": { + "ArnEquals": { + "aws:SourceArn": { "Ref": "MyTopicNo10D152776", }, }, }, "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "sns.amazonaws.com", }, - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], @@ -883,112 +699,97 @@ def submit_response(event: dict, context, response_status: str, error_message: s ], "Version": "2012-10-17", }, - "Queues": Array [ - Object { + "Queues": [ + { "Ref": "MyQueueNo154EF6659", }, ], }, "Type": "AWS::SQS::QueuePolicy", }, - "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": Object { - "DependsOn": Array [ + "MyQueueNo1TestMyTopicNo1964ECD79AF2A440D": { + "DependsOn": [ "MyQueueNo1PolicyD523EAC1", ], - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, "Protocol": "sqs", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "MyQueueNo27A959A93": Object { + "MyQueueNo27A959A93": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "MyTable794EDED1": Object { + "MyTable794EDED1": { "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { + "Properties": { + "AttributeDefinitions": [ + { "AttributeName": "pk", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { + "KeySchema": [ + { "AttributeName": "pk", "KeyType": "HASH", }, ], - "StreamSpecification": Object { + "StreamSpecification": { "StreamViewType": "NEW_AND_OLD_IMAGES", }, }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, - "MyTopicNo10D152776": Object { + "MyTopicNo10D152776": { "Type": "AWS::SNS::Topic", }, - "ReceiveEventBridge1A8F9A7B": Object { - "DependsOn": Array [ + "ReceiveEventBridge1A8F9A7B": { + "DependsOn": [ "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", "ReceiveEventBridgeServiceRoleBF34AC2A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveEventBridge", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveEventBridgeServiceRoleBF34AC2A", "Arn", ], @@ -998,27 +799,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveEventBridgeServiceRoleBF34AC2A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveEventBridgeServiceRoleBF34AC2A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1029,159 +830,76 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveEventBridgeServiceRoleDefaultPolicy1EADA25A", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveEventBridgeServiceRoleBF34AC2A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqs09F03F56": Object { - "DependsOn": Array [ + "ReceiveSqs09F03F56": { + "DependsOn": [ "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", "ReceiveSqsServiceRoleB707237A", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_FUNCTION_NAME": "ReceiveSqs", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "\\":\\"Sqs#MyQueueNo1\\"}", + "":"Sqs#MyQueueNo1"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ReceiveSqsServiceRoleB707237A", "Arn", ], @@ -1191,27 +909,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ReceiveSqsServiceRoleB707237A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ReceiveSqsServiceRoleB707237A": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1222,12 +940,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "ReceiveSqsServiceRoleDefaultPolicyB7E3156E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -1235,880 +953,245 @@ def submit_response(event: dict, context, response_status: str, error_message: s "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ReceiveSqsServiceRoleDefaultPolicyB7E3156E", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ReceiveSqsServiceRoleB707237A", }, ], }, "Type": "AWS::IAM::Policy", }, - "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "ReceiveSqsSqsEventSourceTestMyQueueNo1F2086853E6B28A23": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueNo154EF6659", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "ReceiveSqs09F03F56", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "nodejs16.x", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, - "AutoDeploy": true, - "StageName": "prod", }, - "Type": "AWS::ApiGatewayV2::Stage", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], + "ServerlessSpyRuleAllMyEventBus059FF67A": { + "Properties": { + "EventBusName": { + "Ref": "MyEventBus251E60F8", }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], + "EventPattern": { + "version": [ + "0", ], }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", + "Arn", + ], + }, + "Id": "Target0", + }, + ], }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Events::Rule", }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { + "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "ServerlessSpyRuleAllMyEventBus059FF67A", + "Arn", ], }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, }, - "Type": "AWS::ApiGatewayV2::Route", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", + "ServerlessSpySubscription0ServiceRoleF955D76C", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "NODE_OPTIONS": "--enable-source-maps", + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ + "", + [ + "{"", + { + "Fn::GetAtt": [ + "MyBucketF68F3FF0", + "Arn", + ], + }, + "":"S3#MyBucket","", + { + "Ref": "MyTopicNo10D152776", + }, + "":"SnsSubscription#MyTopicNo1#MyQueueNo1","eventBridge":"EventBridge#MyEventBus","", + { + "Fn::GetAtt": [ + "MyTable794EDED1", + "Arn", + ], + }, + "":"DynamoDB#MyTable"}", ], - }, - "/invocations", - ], + ], + }, + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "index.handler", + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0ServiceRoleF955D76C", + "Arn", ], }, + "Runtime": "nodejs18.x", + "Timeout": 5, }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::Lambda::Function", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0036DF4AB", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], + "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": { + "Properties": { + "BatchSize": 1, + "EventSourceArn": { + "Fn::GetAtt": [ + "MyTable794EDED1", + "StreamArn", ], }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - ], - "Content": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", - }, - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyRuleAllMyEventBus059FF67A": Object { - "Properties": Object { - "EventBusName": Object { - "Ref": "MyEventBus251E60F8", - }, - "EventPattern": Object { - "version": Array [ - "0", - ], - }, - "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyRuleAllMyEventBus059FF67A", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "ServerlessSpySubscription0ServiceRoleF955D76C", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ - "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ - "MyBucketF68F3FF0", - "Arn", - ], - }, - "\\":\\"S3#MyBucket\\",\\"", - Object { - "Ref": "MyTopicNo10D152776", - }, - "\\":\\"SnsSubscription#MyTopicNo1#MyQueueNo1\\",\\"eventBridge\\":\\"EventBridge#MyEventBus\\",\\"", - Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "Arn", - ], - }, - "\\":\\"DynamoDB#MyTable\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0ServiceRoleF955D76C", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpySubscription0AllowInvokeTestMyTopicNo1964ECD79C6B117A9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "sns.amazonaws.com", - "SourceArn": Object { - "Ref": "MyTopicNo10D152776", - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": Object { - "Properties": Object { - "BatchSize": 1, - "EventSourceArn": Object { - "Fn::GetAtt": Array [ - "MyTable794EDED1", - "StreamArn", - ], - }, - "FunctionName": Object { - "Ref": "ServerlessSpySubscription0036DF4AB", - }, - "MaximumRetryAttempts": 0, - "StartingPosition": "LATEST", + "FunctionName": { + "Ref": "ServerlessSpySubscription0036DF4AB", + }, + "MaximumRetryAttempts": 0, + "StartingPosition": "LATEST", }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpySubscription0MyTopicNo183F8FCED": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopicNo183F8FCED": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, - Object { + { "Action": "dynamodb:ListStreams", "Effect": "Allow", "Resource": "*", }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyTable794EDED1", "StreamArn", ], @@ -2118,35 +1201,35 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2157,59 +1240,41 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsTopic#MyTopicNo1\\",\\"eventBridge\\":\\"EventBridgeRule#MyEventBus#MyEventBridge\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", + "":"SnsTopic#MyTopicNo1","eventBridge":"EventBridgeRule#MyEventBus#MyEventBridge"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -2219,58 +1284,58 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": Object { - "Properties": Object { + "ServerlessSpySubscription1AllowInvokeTestMyTopicNo1964ECD795255AF94": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription1MyTopicNo1F1471199": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription1MyTopicNo1F1471199": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2281,164 +1346,78 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": Object { - "Properties": Object { + "ServerlessSpySubscription2AllowInvokeTestMyTopicNo1964ECD798CE12661": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription2F82BAF5F": Object { - "DependsOn": Array [ + "ServerlessSpySubscription2F82BAF5F": { + "DependsOn": [ "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", "ServerlessSpySubscription2ServiceRole7162AC7F", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopicNo10D152776", }, - "\\":\\"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3\\"}", + "":"SnsSubscription#MyTopicNo1#FromSnsToSqsAndS3"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription2ServiceRole7162AC7F", "Arn", ], @@ -2448,47 +1427,47 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription2MyTopicNo1ABC3C742": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription2MyTopicNo1ABC3C742": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription2F82BAF5F", "Arn", ], }, - "FilterPolicy": Object { - "test": Array [ + "FilterPolicy": { + "test": [ "test", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopicNo10D152776", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription2ServiceRole7162AC7F": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription2ServiceRole7162AC7F": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2499,170 +1478,67 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription2ServiceRole7162AC7F", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, - "ToSnsAndDynamoDb13696817": Object { - "DependsOn": Array [ + "ToSnsAndDynamoDb13696817": { + "DependsOn": [ "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", "ToSnsAndDynamoDbServiceRoleB0BC8E77", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e7ff2a7516b279b0c0e4e115aaf1e813a8e6ba33e12b277bc85f15876a3f165b.zip", + "S3Key": "aa9fbb8d63f63ee5dc45650386259597171d3679551fb30d084bd2b3d17ea32c.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DYNAMODB_TABLE_NAME": Object { + "DYNAMODB_TABLE_NAME": { "Ref": "MyTable794EDED1", }, "NODE_OPTIONS": "--enable-source-maps", - "SNS_TOPIC_ARN": Object { + "SNS_TOPIC_ARN": { "Ref": "MyTopicNo10D152776", }, "SSPY_FUNCTION_NAME": "ToSnsAndDynamoDb", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ToSnsAndDynamoDbServiceRoleB0BC8E77", "Arn", ], @@ -2672,27 +1548,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ToSnsAndDynamoDbServiceRoleB0BC8E77": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleB0BC8E77": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -2703,19 +1579,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sns:Publish", "Effect": "Allow", - "Resource": Object { + "Resource": { "Ref": "MyTopicNo10D152776", }, }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:UpdateItem", @@ -2723,97 +1599,29 @@ def submit_response(event: dict, context, response_status: str, error_message: s "dynamodb:DescribeTable", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyTable794EDED1", "Arn", ], }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { + { "Ref": "AWS::NoValue", }, ], }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ToSnsAndDynamoDbServiceRoleDefaultPolicy256D4481", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ToSnsAndDynamoDbServiceRoleB0BC8E77", }, ], @@ -2821,22 +1629,22 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Type": "AWS::IAM::Policy", }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambdaToDynamoDb.test.ts.snap b/test/cdk/test/__snapshots__/lambdaToDynamoDb.test.ts.snap index ba559ab..8c53f83 100644 --- a/test/cdk/test/__snapshots__/lambdaToDynamoDb.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambdaToDynamoDb.test.ts.snap @@ -1,93 +1,60 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda to DynamoDB Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameMyLambda": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { "Ref": "MyLambdaCCE802FB", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "7172f838bb31a77647d853d5b0a3aaf0bfcc1a9c375b99bd48ffcb19394b4167.zip", + "S3Key": "becc36ee310d32474bc76bce4497d3e813f6c678f68509385c0b284e7088ecde.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "DYNAMODB_TABLE_NAME": Object { + "DYNAMODB_TABLE_NAME": { "Ref": "MyTable794EDED1", }, "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -97,27 +64,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -128,12 +95,12 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "dynamodb:BatchWriteItem", "dynamodb:PutItem", "dynamodb:UpdateItem", @@ -141,693 +108,124 @@ Object { "dynamodb:DescribeTable", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyTable794EDED1", "Arn", ], }, - Object { + { "Ref": "AWS::NoValue", }, ], }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyTable794EDED1": Object { + "MyTable794EDED1": { "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { + "Properties": { + "AttributeDefinitions": [ + { "AttributeName": "pk", "AttributeType": "S", }, ], "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { + "KeySchema": [ + { "AttributeName": "pk", "KeyType": "HASH", }, ], - "StreamSpecification": Object { + "StreamSpecification": { "StreamViewType": "NEW_AND_OLD_IMAGES", }, }, "Type": "AWS::DynamoDB::Table", "UpdateReplacePolicy": "Retain", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Runtime": "nodejs18.x", - "Timeout": 5, }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyTable794EDED1", "Arn", ], }, - "\\":\\"DynamoDB#MyTable\\"}", + "":"DynamoDB#MyTable"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -837,16 +235,16 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": Object { - "Properties": Object { + "ServerlessSpySubscription0DynamoDBEventSourceTestMyTableFA18AF5FBAD5ECE5": { + "Properties": { "BatchSize": 1, - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "EventSourceArn": { + "Fn::GetAtt": [ "MyTable794EDED1", "StreamArn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "ServerlessSpySubscription0036DF4AB", }, "MaximumRetryAttempts": 0, @@ -854,97 +252,29 @@ Object { }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, - Object { + { "Action": "dynamodb:ListStreams", "Effect": "Allow", "Resource": "*", }, - Object { - "Action": Array [ + { + "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyTable794EDED1", "StreamArn", ], @@ -954,35 +284,35 @@ Object { "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -993,43 +323,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambdaToEventBridge.test.ts.snap b/test/cdk/test/__snapshots__/lambdaToEventBridge.test.ts.snap index 9514f64..cddef15 100644 --- a/test/cdk/test/__snapshots__/lambdaToEventBridge.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambdaToEventBridge.test.ts.snap @@ -1,99 +1,66 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda to EventBridge Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameMyLambda": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { "Ref": "MyLambdaCCE802FB", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyEventBus251E60F8": Object { - "Properties": Object { + "Resources": { + "MyEventBus251E60F8": { + "Properties": { "Name": "TestMyEventBus25AE8456", }, "Type": "AWS::Events::EventBus", }, - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "93d67a8abeec62af34436a1666dee6c9a5aa79abd75445cdb9efbc9454cbbb66.zip", + "S3Key": "cd00a4426b94bd8db7578694881dfea9b0b6c155f1d547f6dc8686ef3b0bcc8e.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "EB_NAME": Object { + "EB_NAME": { "Ref": "MyEventBus251E60F8", }, "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -103,27 +70,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -134,631 +101,69 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "events:PutEvents", "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyEventBus251E60F8", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyRuleAllMyEventBus059FF67A": Object { - "Properties": Object { - "EventBusName": Object { + "ServerlessSpyRuleAllMyEventBus059FF67A": { + "Properties": { + "EventBusName": { "Ref": "MyEventBus251E60F8", }, - "EventPattern": Object { - "version": Array [ + "EventPattern": { + "version": [ "0", ], }, "State": "ENABLED", - "Targets": Array [ - Object { - "Arn": Object { - "Fn::GetAtt": Array [ + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -769,18 +174,18 @@ Object { }, "Type": "AWS::Events::Rule", }, - "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": Object { - "Properties": Object { + "ServerlessSpyRuleAllMyEventBusAllowEventRuleTestServerlessSpySubscription037770329EE5AF7D1": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "events.amazonaws.com", - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "ServerlessSpyRuleAllMyEventBus059FF67A", "Arn", ], @@ -788,48 +193,41 @@ Object { }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", + }, + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": "{\\"eventBridge\\":\\"EventBridge#MyEventBus\\"}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_INFRA_MAPPING": "{"eventBridge":"EventBridge#MyEventBus"}", + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -839,116 +237,48 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -959,43 +289,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambdaToS3.test.ts.snap b/test/cdk/test/__snapshots__/lambdaToS3.test.ts.snap index 2acba2b..a530709 100644 --- a/test/cdk/test/__snapshots__/lambdaToS3.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambdaToS3.test.ts.snap @@ -1,66 +1,48 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda to S3 Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameMyLambda": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { "Ref": "MyLambdaCCE802FB", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": Object { - "DependsOn": Array [ + "Resources": { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691": { + "DependsOn": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", ], - "Properties": Object { - "Code": Object { + "Properties": { + "Code": { "ZipFile": "import boto3 # type: ignore import json import logging import urllib.request -s3 = boto3.client(\\"s3\\") +s3 = boto3.client("s3") EVENTBRIDGE_CONFIGURATION = 'EventBridgeConfiguration' -CONFIGURATION_TYPES = [\\"TopicConfigurations\\", \\"QueueConfigurations\\", \\"LambdaFunctionConfigurations\\"] +CONFIGURATION_TYPES = ["TopicConfigurations", "QueueConfigurations", "LambdaFunctionConfigurations"] def handler(event: dict, context): - response_status = \\"SUCCESS\\" - error_message = \\"\\" + response_status = "SUCCESS" + error_message = "" try: - props = event[\\"ResourceProperties\\"] - bucket = props[\\"BucketName\\"] - notification_configuration = props[\\"NotificationConfiguration\\"] - request_type = event[\\"RequestType\\"] + props = event["ResourceProperties"] + bucket = props["BucketName"] + notification_configuration = props["NotificationConfiguration"] + request_type = event["RequestType"] managed = props.get('Managed', 'true').lower() == 'true' stack_id = event['StackId'] @@ -71,9 +53,9 @@ def handler(event: dict, context): put_bucket_notification_configuration(bucket, config) except Exception as e: - logging.exception(\\"Failed to put bucket notification configuration\\") - response_status = \\"FAILED\\" - error_message = f\\"Error: {str(e)}. \\" + logging.exception("Failed to put bucket notification configuration") + response_status = "FAILED" + error_message = f"Error: {str(e)}. " finally: submit_response(event, context, response_status, error_message) @@ -89,7 +71,7 @@ def handle_unmanaged(bucket, stack_id, request_type, notification_configuration) return external_notifications def with_id(notification): - notification['Id'] = f\\"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}\\" + notification['Id'] = f"{stack_id}-{hash(json.dumps(notification, sort_keys=True))}" return notification notifications = {} @@ -109,7 +91,7 @@ def find_external_notifications(bucket, stack_id): existing_notifications = get_bucket_notification_configuration(bucket) external_notifications = {} for t in CONFIGURATION_TYPES: - external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f\\"{stack_id}-\\")] + external_notifications[t] = [n for n in existing_notifications.get(t, []) if not n['Id'].startswith(f"{stack_id}-")] if EVENTBRIDGE_CONFIGURATION in existing_notifications: external_notifications[EVENTBRIDGE_CONFIGURATION] = existing_notifications[EVENTBRIDGE_CONFIGURATION] @@ -125,59 +107,59 @@ def put_bucket_notification_configuration(bucket, notification_configuration): def submit_response(event: dict, context, response_status: str, error_message: str): response_body = json.dumps( { - \\"Status\\": response_status, - \\"Reason\\": f\\"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}\\", - \\"PhysicalResourceId\\": event.get(\\"PhysicalResourceId\\") or event[\\"LogicalResourceId\\"], - \\"StackId\\": event[\\"StackId\\"], - \\"RequestId\\": event[\\"RequestId\\"], - \\"LogicalResourceId\\": event[\\"LogicalResourceId\\"], - \\"NoEcho\\": False, + "Status": response_status, + "Reason": f"{error_message}See the details in CloudWatch Log Stream: {context.log_stream_name}", + "PhysicalResourceId": event.get("PhysicalResourceId") or event["LogicalResourceId"], + "StackId": event["StackId"], + "RequestId": event["RequestId"], + "LogicalResourceId": event["LogicalResourceId"], + "NoEcho": False, } - ).encode(\\"utf-8\\") - headers = {\\"content-type\\": \\"\\", \\"content-length\\": str(len(response_body))} + ).encode("utf-8") + headers = {"content-type": "", "content-length": str(len(response_body))} try: - req = urllib.request.Request(url=event[\\"ResponseURL\\"], headers=headers, data=response_body, method=\\"PUT\\") + req = urllib.request.Request(url=event["ResponseURL"], headers=headers, data=response_body, method="PUT") with urllib.request.urlopen(req) as response: - print(response.read().decode(\\"utf-8\\")) - print(\\"Status code: \\" + response.reason) + print(response.read().decode("utf-8")) + print("Status code: " + response.reason) except Exception as e: - print(\\"send(..) failed executing request.urlopen(..): \\" + str(e)) + print("send(..) failed executing request.urlopen(..): " + str(e)) ", }, - "Description": "AWS CloudFormation handler for \\"Custom::S3BucketNotifications\\" resources (@aws-cdk/aws-s3)", + "Description": "AWS CloudFormation handler for "Custom::S3BucketNotifications" resources (@aws-cdk/aws-s3)", "Handler": "index.handler", - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", "Arn", ], }, - "Runtime": "python3.7", + "Runtime": "python3.9", "Timeout": 300, }, "Type": "AWS::Lambda::Function", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -188,11 +170,11 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "s3:PutBucketNotification", "Effect": "Allow", "Resource": "*", @@ -201,29 +183,29 @@ def submit_response(event: dict, context, response_status: str, error_message: s "Version": "2012-10-17", }, "PolicyName": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleDefaultPolicy2CF63D36", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "BucketNotificationsHandler050a0587b7544547bf325f094a3db834RoleB6FB88EC", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": Object { - "Properties": Object { + "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "s3.amazonaws.com", - "SourceAccount": Object { + "SourceAccount": { "Ref": "AWS::AccountId", }, - "SourceArn": Object { - "Fn::GetAtt": Array [ + "SourceArn": { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -231,28 +213,28 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Permission", }, - "MyBucketF68F3FF0": Object { + "MyBucketF68F3FF0": { "DeletionPolicy": "Retain", "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", }, - "MyBucketNotifications46AC0CD2": Object { - "DependsOn": Array [ + "MyBucketNotifications46AC0CD2": { + "DependsOn": [ "MyBucketAllowBucketNotificationsToTestServerlessSpySubscription037770329D87F83A7", ], - "Properties": Object { - "BucketName": Object { + "Properties": { + "BucketName": { "Ref": "MyBucketF68F3FF0", }, "Managed": true, - "NotificationConfiguration": Object { - "LambdaFunctionConfigurations": Array [ - Object { - "Events": Array [ + "NotificationConfiguration": { + "LambdaFunctionConfigurations": [ + { + "Events": [ "s3:ObjectCreated:Put", ], - "LambdaFunctionArn": Object { - "Fn::GetAtt": Array [ + "LambdaFunctionArn": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], @@ -260,8 +242,8 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - "ServiceToken": Object { - "Fn::GetAtt": Array [ + "ServiceToken": { + "Fn::GetAtt": [ "BucketNotificationsHandler050a0587b7544547bf325f094a3db8347ECC3691", "Arn", ], @@ -269,59 +251,44 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "Custom::S3BucketNotifications", }, - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "09e2cf84370768a3080d8c1face28edf5ee252d68b8f7fd0b54e6c5871ea5a65.zip", + "S3Key": "d77b4e6f7b74308720e5e2428fbc3efb615ab76ebd3ad452f2846321140ae104.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "S3_BUCKET_NAME": Object { + "S3_BUCKET_NAME": { "Ref": "MyBucketF68F3FF0", }, "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -331,27 +298,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -362,12 +329,12 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "s3:DeleteObject*", "s3:PutObject", "s3:PutObjectLegalHold", @@ -377,19 +344,19 @@ def submit_response(event: dict, context, response_status: str, error_message: s "s3:Abort*", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ + "Resource": [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], }, - Object { - "Fn::Join": Array [ + { + "Fn::Join": [ "", - Array [ - Object { - "Fn::GetAtt": Array [ + [ + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], @@ -400,658 +367,89 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyBucketF68F3FF0", "Arn", ], }, - "\\":\\"S3#MyBucket\\"}", + "":"S3#MyBucket"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -1061,116 +459,48 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1181,43 +511,23 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambdaToSnS.test.ts.snap b/test/cdk/test/__snapshots__/lambdaToSnS.test.ts.snap index 6202e06..f73805c 100644 --- a/test/cdk/test/__snapshots__/lambdaToSnS.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambdaToSnS.test.ts.snap @@ -1,93 +1,60 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda to SNS Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameMyLambda": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { "Ref": "MyLambdaCCE802FB", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "2ccc2c3d7fa5133214c161796fff8886a847b72d047c6ee8a9a14dd4ef3f7770.zip", + "S3Key": "4678d12034c31aa3affdd08f3d5d4160683cf76ad4210e7530993add568e0c25.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SNS_TOPIC_ARN": Object { + "SNS_TOPIC_ARN": { "Ref": "MyTopic86869434", }, "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -97,27 +64,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -128,669 +95,100 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { "Action": "sns:Publish", "Effect": "Allow", - "Resource": Object { + "Resource": { "Ref": "MyTopic86869434", }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyTopic86869434": Object { + "MyTopic86869434": { "Type": "AWS::SNS::Topic", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopic86869434", }, - "\\":\\"SnsTopic#MyTopic\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", + "":"SnsTopic#MyTopic"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -800,147 +198,79 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription0MyTopic191FC9F5": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopic191FC9F5": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -951,43 +281,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/lambdaToSqs.test.ts.snap b/test/cdk/test/__snapshots__/lambdaToSqs.test.ts.snap index b4c04b2..5cf04eb 100644 --- a/test/cdk/test/__snapshots__/lambdaToSqs.test.ts.snap +++ b/test/cdk/test/__snapshots__/lambdaToSqs.test.ts.snap @@ -1,93 +1,60 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Lambda to SQS Snapshot 1`] = ` -Object { - "Outputs": Object { - "FunctionNameMyLambda": Object { - "Value": Object { +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { "Ref": "MyLambdaCCE802FB", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "2ab828b559dbfd9c7daef0ab4973901ae70e529f9e029072d94bf6eec64f8501.zip", + "S3Key": "7e269d02c6be0a2e0bec899124d5ce9a6c7c73748a065745a3510af418144601.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SQS_URL": Object { + "SQS_URL": { "Ref": "MyQueueE6CA6235", }, "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -97,27 +64,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -128,667 +95,98 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:SendMessage", "sqs:GetQueueAttributes", "sqs:GetQueueUrl", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyQueueE6CA6235": Object { + "MyQueueE6CA6235": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -798,116 +196,48 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -918,43 +248,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/pythonLambda.test.ts.snap b/test/cdk/test/__snapshots__/pythonLambda.test.ts.snap new file mode 100644 index 0000000..d8bc8e1 --- /dev/null +++ b/test/cdk/test/__snapshots__/pythonLambda.test.ts.snap @@ -0,0 +1,355 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PythonLambda Snapshot 1`] = ` +{ + "Outputs": { + "FunctionNameMyLambda": { + "Value": { + "Ref": "MyLambdaCCE802FB", + }, + }, + "FunctionNameMyLambdaThatFails": { + "Value": { + "Ref": "MyLambdaThatFails5E489081", + }, + }, + }, + "Parameters": { + "BootstrapVersion": { + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", + "Type": "AWS::SSM::Parameter::Value", + }, + }, + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ + "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "MyLambdaServiceRole4539ECB6", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "a34102ca9b461fd6335e146271be5476c61e07b3b0ca21959ff0705dd70432d8.zip", + }, + "Environment": { + "Variables": { + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", + "SSPY_DEBUG": "true", + "SSPY_FUNCTION_NAME": "MyLambda", + "SSPY_INFRA_MAPPING": "{}", + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "lambda.handler", + "Layers": [ + { + "Ref": "ServerlessSpyPythonExtension718A6034", + }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, + ], + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "MyLambdaServiceRole4539ECB6", + "Arn", + ], + }, + "Runtime": "python3.9", + "Timeout": 5, + }, + "Type": "AWS::Lambda::Function", + }, + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", + "Roles": [ + { + "Ref": "MyLambdaServiceRole4539ECB6", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "MyLambdaThatFails5E489081": { + "DependsOn": [ + "MyLambdaThatFailsServiceRoleDefaultPolicyE947DE2E", + "MyLambdaThatFailsServiceRole961B78F0", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "a34102ca9b461fd6335e146271be5476c61e07b3b0ca21959ff0705dd70432d8.zip", + }, + "Environment": { + "Variables": { + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", + "SSPY_DEBUG": "true", + "SSPY_FUNCTION_NAME": "MyLambdaThatFails", + "SSPY_INFRA_MAPPING": "{}", + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "lambdaFail.handler", + "Layers": [ + { + "Ref": "ServerlessSpyPythonExtension718A6034", + }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, + ], + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "MyLambdaThatFailsServiceRole961B78F0", + "Arn", + ], + }, + "Runtime": "python3.9", + "Timeout": 5, + }, + "Type": "AWS::Lambda::Function", + }, + "MyLambdaThatFailsServiceRole961B78F0": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "MyLambdaThatFailsServiceRoleDefaultPolicyE947DE2E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "MyLambdaThatFailsServiceRoleDefaultPolicyE947DE2E", + "Roles": [ + { + "Ref": "MyLambdaThatFailsServiceRole961B78F0", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ServerlessSpyPythonExtension718A6034": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "python3.9", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "f0805f3798a1ec284ae50530bcfe1f7dc297a30367d2ef35819e3b21b57db6cd.zip", + }, + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", + }, + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", + "ServerlessSpySubscription0ServiceRoleF955D76C", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "NODE_OPTIONS": "--enable-source-maps", + "SSPY_INFRA_MAPPING": "{}", + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "index.handler", + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "ServerlessSpySubscription0ServiceRoleF955D76C", + "Arn", + ], + }, + "Runtime": "nodejs18.x", + "Timeout": 5, + }, + "Type": "AWS::Lambda::Function", + }, + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", + "Roles": [ + { + "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5", + ], + { + "Ref": "BootstrapVersion", + }, + ], + }, + ], + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", + }, + ], + }, + }, +} +`; diff --git a/test/cdk/test/__snapshots__/snsToLambda.test.ts.snap b/test/cdk/test/__snapshots__/snsToLambda.test.ts.snap index f64cc9a..998db77 100644 --- a/test/cdk/test/__snapshots__/snsToLambda.test.ts.snap +++ b/test/cdk/test/__snapshots__/snsToLambda.test.ts.snap @@ -1,106 +1,73 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SNS to Lambda Snapshot 1`] = ` -Object { - "Outputs": Object { - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, - "SnsTopicArnMyTopic": Object { - "Value": Object { +{ + "Outputs": { + "SnsTopicArnMyTopic": { + "Value": { "Ref": "MyTopic86869434", }, }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaAllowInvokeTestMyTopic06942AEA77ADE5E7": Object { - "Properties": Object { + "Resources": { + "MyLambdaAllowInvokeTestMyTopic06942AEA77ADE5E7": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -110,42 +77,42 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaMyTopicA81E02FD": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "MyLambdaMyTopicA81E02FD": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "MyLambdaCCE802FB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -156,496 +123,142 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyTopic86869434": Object { - "Type": "AWS::SNS::Topic", - }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { + "MyPythonLambdaAllowInvokeTestMyTopic06942AEA71E065BF": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", + "FunctionName": { + "Fn::GetAtt": [ + "MyPythonLambdaBD2BE2C6", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - ], - "Content": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", - }, - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", + "MyPythonLambdaBD2BE2C6": { + "DependsOn": [ + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "MyPythonLambdaServiceRoleE254838E", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "a34102ca9b461fd6335e146271be5476c61e07b3b0ca21959ff0705dd70432d8.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", + "Environment": { + "Variables": { + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_FUNCTION_NAME": "MyPythonLambda", + "SSPY_INFRA_MAPPING": "{}", + "SSPY_ROOT_STACK": "Test", }, }, - "Handler": "index.handler", + "Handler": "dummy.handler", + "Layers": [ + { + "Ref": "ServerlessSpyPythonExtension718A6034", + }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, + ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", + "Role": { + "Fn::GetAtt": [ + "MyPythonLambdaServiceRoleE254838E", "Arn", ], }, - "Runtime": "nodejs18.x", + "Runtime": "python3.9", "Timeout": 5, }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "MyPythonLambdaMyTopicC8D1E8B1": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ + "MyPythonLambdaBD2BE2C6", + "Arn", + ], + }, + "Protocol": "lambda", + "TopicArn": { + "Ref": "MyTopic86869434", + }, + }, + "Type": "AWS::SNS::Subscription", + }, + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": "*", }, ], "Version": "2012-10-17", }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", + "PolicyName": "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "Roles": [ + { + "Ref": "MyPythonLambdaServiceRoleE254838E", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyPythonLambdaServiceRoleE254838E": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -656,162 +269,89 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "MyTopic86869434": { + "Type": "AWS::SNS::Topic", + }, + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "nodejs16.x", + ], + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, }, - "Type": "AWS::Lambda::Function", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, + "ServerlessSpyPythonExtension718A6034": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "python3.9", ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "f0805f3798a1ec284ae50530bcfe1f7dc297a30367d2ef35819e3b21b57db6cd.zip", + }, }, - "Type": "AWS::IAM::Role", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - ], + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", + }, }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopic86869434", }, - "\\":\\"SnsTopic#MyTopic\\"}", + "":"SnsTopic#MyTopic"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -821,147 +361,79 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription0MyTopic191FC9F5": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopic191FC9F5": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -972,59 +444,41 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopic86869434", }, - "\\":\\"SnsSubscription#MyTopic#MyLambda\\"}", - ], - ], - }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", + "":"SnsSubscription#MyTopic#MyLambda"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -1034,58 +488,58 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1AllowInvokeTestMyTopic06942AEAED481931": Object { - "Properties": Object { + "ServerlessSpySubscription1AllowInvokeTestMyTopic06942AEAED481931": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription1MyTopic98E4131B": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription1MyTopic98E4131B": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1096,132 +550,171 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", + "ServerlessSpySubscription2AllowInvokeTestMyTopic06942AEA9C58EED7": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "ServerlessSpySubscription2F82BAF5F", + "Arn", + ], + }, + "Principal": "sns.amazonaws.com", + "SourceArn": { + "Ref": "MyTopic86869434", + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ServerlessSpySubscription2F82BAF5F": { + "DependsOn": [ + "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", + "ServerlessSpySubscription2ServiceRole7162AC7F", + ], + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", + }, + "Environment": { + "Variables": { + "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", + "NODE_OPTIONS": "--enable-source-maps", + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ + "", + [ + "{"", + { + "Ref": "MyTopic86869434", + }, + "":"SnsSubscription#MyTopic#MyPythonLambda"}", + ], + ], + }, + "SSPY_ROOT_STACK": "Test", + }, + }, + "Handler": "index.handler", + "MemorySize": 512, + "Role": { + "Fn::GetAtt": [ + "ServerlessSpySubscription2ServiceRole7162AC7F", + "Arn", + ], + }, + "Runtime": "nodejs18.x", + "Timeout": 5, + }, + "Type": "AWS::Lambda::Function", + }, + "ServerlessSpySubscription2MyTopic089E6498": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ + "ServerlessSpySubscription2F82BAF5F", + "Arn", + ], + }, + "Protocol": "lambda", + "TopicArn": { + "Ref": "MyTopic86869434", + }, + }, + "Type": "AWS::SNS::Subscription", + }, + "ServerlessSpySubscription2ServiceRole7162AC7F": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], }, ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", + }, + "Type": "AWS::IAM::Role", + }, + "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ServerlessSpySubscription2ServiceRoleDefaultPolicyA3D9E5E8", + "Roles": [ + { + "Ref": "ServerlessSpySubscription2ServiceRole7162AC7F", }, ], }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", + "Type": "AWS::IAM::Policy", }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/snsToSqs.test.ts.snap b/test/cdk/test/__snapshots__/snsToSqs.test.ts.snap index 2f2732b..741ba5f 100644 --- a/test/cdk/test/__snapshots__/snsToSqs.test.ts.snap +++ b/test/cdk/test/__snapshots__/snsToSqs.test.ts.snap @@ -1,106 +1,72 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SNS to SQS Snapshot 1`] = ` -Object { - "Outputs": Object { - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, - "SnsTopicArnMyTopic": Object { - "Value": Object { +{ + "Outputs": { + "SnsTopicArnMyTopic": { + "Value": { "Ref": "MyTopic86869434", }, }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaAllowInvokeTestMyTopic06942AEA77ADE5E7": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "MyLambdaCCE802FB", - "Arn", - ], - }, - "Principal": "sns.amazonaws.com", - "SourceArn": Object { - "Ref": "MyTopic86869434", - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", - "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", + [ + "{"", + { + "Fn::GetAtt": [ + "MyQueueE6CA6235", + "Arn", + ], }, - ".amazonaws.com/prod", + "":"Sqs#MyQueue"}", ], ], }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", + "SSPY_SUBSCRIBED_TO_SQS": "true", }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -110,42 +76,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaMyTopicA81E02FD": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ - "MyLambdaCCE802FB", - "Arn", - ], - }, - "Protocol": "lambda", - "TopicArn": Object { - "Ref": "MyTopic86869434", - }, - }, - "Type": "AWS::SNS::Subscription", - }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -156,662 +107,181 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:ReceiveMessage", + "sqs:ChangeMessageVisibility", + "sqs:GetQueueUrl", + "sqs:DeleteMessage", + "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], + "Resource": { + "Fn::GetAtt": [ + "MyQueueE6CA6235", + "Arn", ], }, }, + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", + }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyTopic86869434": Object { - "Type": "AWS::SNS::Topic", - }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", + "MyLambdaSqsEventSourceTestMyQueueE040091DE4AC535F": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ + "MyQueueE6CA6235", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], + "FunctionName": { + "Ref": "MyLambdaCCE802FB", }, }, - "Type": "AWS::Lambda::Permission", + "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", + "MyQueueE6CA6235": { + "DeletionPolicy": "Delete", + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", + "MyQueuePolicy6BBEDDAC": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "sqs:SendMessage", + "Condition": { + "ArnEquals": { + "aws:SourceArn": { + "Ref": "MyTopic86869434", + }, + }, }, - ":apigateway:", - Object { - "Ref": "AWS::Region", + "Effect": "Allow", + "Principal": { + "Service": "sns.amazonaws.com", }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "Resource": { + "Fn::GetAtt": [ + "MyQueueE6CA6235", "Arn", ], }, - "/invocations", - ], + }, ], + "Version": "2012-10-17", }, + "Queues": [ + { + "Ref": "MyQueueE6CA6235", + }, + ], }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::SQS::QueuePolicy", }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", + "MyQueueTestMyTopic06942AEA1790F2C1": { + "DependsOn": [ + "MyQueuePolicy6BBEDDAC", + ], + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ + "MyQueueE6CA6235", "Arn", ], }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], + "Protocol": "sqs", + "TopicArn": { + "Ref": "MyTopic86869434", }, }, - "Type": "AWS::ApiGatewayV2::Integration", + "Type": "AWS::SNS::Subscription", }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", + "MyTopic86869434": { + "Type": "AWS::SNS::Topic", }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs16.x", - "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopic86869434", }, - "\\":\\"SnsTopic#MyTopic\\"}", + "":"SnsTopic#MyTopic"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -821,147 +291,79 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": Object { - "Properties": Object { + "ServerlessSpySubscription0AllowInvokeTestMyTopic06942AEAB4AEE620": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription0MyTopic191FC9F5": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription0MyTopic191FC9F5": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription0036DF4AB", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -972,59 +374,41 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription13C6B2B7D": Object { - "DependsOn": Array [ + "ServerlessSpySubscription13C6B2B7D": { + "DependsOn": [ "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", "ServerlessSpySubscription1ServiceRoleCB639294", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { + [ + "{"", + { "Ref": "MyTopic86869434", }, - "\\":\\"SnsSubscription#MyTopic#MyLambda\\"}", + "":"SnsSubscription#MyTopic#MyQueue"}", ], ], }, - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription1ServiceRoleCB639294", "Arn", ], @@ -1034,58 +418,58 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription1AllowInvokeTestMyTopic06942AEAED481931": Object { - "Properties": Object { + "ServerlessSpySubscription1AllowInvokeTestMyTopic06942AEAED481931": { + "Properties": { "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ + "FunctionName": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Principal": "sns.amazonaws.com", - "SourceArn": Object { + "SourceArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::Lambda::Permission", }, - "ServerlessSpySubscription1MyTopic98E4131B": Object { - "Properties": Object { - "Endpoint": Object { - "Fn::GetAtt": Array [ + "ServerlessSpySubscription1MyTopic98E4131B": { + "Properties": { + "Endpoint": { + "Fn::GetAtt": [ "ServerlessSpySubscription13C6B2B7D", "Arn", ], }, "Protocol": "lambda", - "TopicArn": Object { + "TopicArn": { "Ref": "MyTopic86869434", }, }, "Type": "AWS::SNS::Subscription", }, - "ServerlessSpySubscription1ServiceRoleCB639294": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription1ServiceRoleCB639294": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -1096,132 +480,44 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription1ServiceRoleDefaultPolicyB2E063F5", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription1ServiceRoleCB639294", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/sqs.test.ts.snap b/test/cdk/test/__snapshots__/sqs.test.ts.snap index 6a1f1ff..fb898c0 100644 --- a/test/cdk/test/__snapshots__/sqs.test.ts.snap +++ b/test/cdk/test/__snapshots__/sqs.test.ts.snap @@ -1,414 +1,93 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SQS with option spySqsWithNoSubscriptionAndDropAllMessages Snapshot 1`] = ` -Object { - "Outputs": Object { - "QueueUrlMyQueue": Object { - "Value": Object { +{ + "Outputs": { + "QueueUrlMyQueue": { + "Value": { "Ref": "MyQueueE6CA6235", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyQueueE6CA6235": Object { + "Resources": { + "MyQueueE6CA6235": { "DeletionPolicy": "Delete", "Type": "AWS::SQS::Queue", "UpdateReplacePolicy": "Delete", }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ "nodejs18.x", ], - "Content": Object { - "S3Bucket": Object { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", }, }, "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessages3748840C": Object { - "DependsOn": Array [ + "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessages3748840C": { + "DependsOn": [ "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleDefaultPolicy986A7CEA", "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleE8496CCC", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "017c4a8f4be7b88fdbd3f2870a840157cf42e67cb2c44d8b9e81f3995d6ea901.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, - "\\":\\"Sqs#MyQueue\\"}", + "":"Sqs#MyQueue"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleE8496CCC", "Arn", ], @@ -418,12 +97,12 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleDefaultPolicy986A7CEA": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleDefaultPolicy986A7CEA": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -431,119 +110,51 @@ Object { "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleDefaultPolicy986A7CEA", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleE8496CCC", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleE8496CCC": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesServiceRoleE8496CCC": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -554,268 +165,55 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesSqsEventSourceTestMyQueueE040091D6114B6E3": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessagesSqsEventSourceTestMyQueueE040091D6114B6E3": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "ServerlessSpyMyQueueSqsSubscriptionAndDropAllMessages3748840C", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", - "Arn", - ], - }, - "Runtime": "nodejs18.x", - "Timeout": 5, - }, - "Type": "AWS::Lambda::Function", - }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", - }, - ], - }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -825,116 +223,48 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -945,43 +275,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/__snapshots__/sqsToLambda.test.ts.snap b/test/cdk/test/__snapshots__/sqsToLambda.test.ts.snap index c5fd261..5195214 100644 --- a/test/cdk/test/__snapshots__/sqsToLambda.test.ts.snap +++ b/test/cdk/test/__snapshots__/sqsToLambda.test.ts.snap @@ -1,105 +1,77 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SQS to Lambda Snapshot 1`] = ` -Object { - "Outputs": Object { - "QueueUrlMyQueue": Object { - "Value": Object { +{ + "Outputs": { + "QueueUrlMyQueue": { + "Value": { "Ref": "MyQueueE6CA6235", }, }, - "ServerlessSpyWsUrl": Object { - "Value": Object { - "Fn::Join": Array [ - "", - Array [ - "wss://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], + "QueueUrlMyQueue2": { + "Value": { + "Ref": "MyQueue22D001D59", }, }, }, - "Parameters": Object { - "BootstrapVersion": Object { + "Parameters": { + "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", "Type": "AWS::SSM::Parameter::Value", }, }, - "Resources": Object { - "MyLambdaCCE802FB": Object { - "DependsOn": Array [ + "Resources": { + "MyLambdaCCE802FB": { + "DependsOn": [ "MyLambdaServiceRoleDefaultPolicy5BBC6F68", "MyLambdaServiceRole4539ECB6", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, "S3Key": "798d95ca5ea9167fe4c020efbb7df9d7998800b0911757a1ea86cfe4b8fc2c2f.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_DEBUG": "true", "SSPY_FUNCTION_NAME": "MyLambda", - "SSPY_INFRA_MAPPING": Object { - "Fn::Join": Array [ + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ "", - Array [ - "{\\"", - Object { - "Fn::GetAtt": Array [ + [ + "{"", + { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, - "\\":\\"Sqs#MyQueue\\"}", + "":"Sqs#MyQueue"}", ], ], }, + "SSPY_ROOT_STACK": "Test", "SSPY_SUBSCRIBED_TO_SQS": "true", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, }, }, "Handler": "index.handler", - "Layers": Array [ - Object { + "Layers": [ + { "Ref": "ServerlessSpyExtensionEA4873A0", }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "MyLambdaServiceRole4539ECB6", "Arn", ], @@ -109,27 +81,27 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "MyLambdaServiceRole4539ECB6": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyLambdaServiceRole4539ECB6": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -140,12 +112,12 @@ Object { }, "Type": "AWS::IAM::Role", }, - "MyLambdaServiceRoleDefaultPolicy5BBC6F68": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ + "MyLambdaServiceRoleDefaultPolicy5BBC6F68": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ "sqs:ReceiveMessage", "sqs:ChangeMessageVisibility", "sqs:GetQueueUrl", @@ -153,515 +125,159 @@ Object { "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Object { - "Fn::GetAtt": Array [ + "Resource": { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, }, - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "MyLambdaServiceRole4539ECB6", }, ], }, "Type": "AWS::IAM::Policy", }, - "MyLambdaSqsEventSourceTestMyQueueE040091DE4AC535F": Object { - "Properties": Object { - "EventSourceArn": Object { - "Fn::GetAtt": Array [ + "MyLambdaSqsEventSourceTestMyQueueE040091DE4AC535F": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ "MyQueueE6CA6235", "Arn", ], }, - "FunctionName": Object { + "FunctionName": { "Ref": "MyLambdaCCE802FB", }, }, "Type": "AWS::Lambda::EventSourceMapping", }, - "MyQueueE6CA6235": Object { - "DeletionPolicy": "Delete", - "Type": "AWS::SQS::Queue", - "UpdateReplacePolicy": "Delete", - }, - "ServerlessSpyApiGwWebSocketB4986709": Object { - "Properties": Object { - "Name": "ApiGwWebSocket", - "ProtocolType": "WEBSOCKET", - "RouteSelectionExpression": "$request.body.action", - }, - "Type": "AWS::ApiGatewayV2::Api", - }, - "ServerlessSpyApiGwWebSocketStageC331FC25": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AutoDeploy": true, - "StageName": "prod", - }, - "Type": "AWS::ApiGatewayV2::Stage", - }, - "ServerlessSpyApiGwWebSocketconnectRoute312F1B97": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "AWS_IAM", - "RouteKey": "$connect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectD0BB4267": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketconnectRouteconnectPermission0ECF9CDC": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnect645F94AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$connect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoute1A0A3B9C": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "$disconnect", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnect27020FD4": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketdisconnectRoutedisconnectPermission49C4B30D": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnect798FB62E", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*$disconnect", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteCA382280": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "AuthorizationType": "NONE", - "RouteKey": "sendmessage", - "Target": Object { - "Fn::Join": Array [ - "", - Array [ - "integrations/", - Object { - "Ref": "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3", - }, - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Route", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessage655C76E3": Object { - "Properties": Object { - "ApiId": Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "IntegrationType": "AWS_PROXY", - "IntegrationUri": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":apigateway:", - Object { - "Ref": "AWS::Region", - }, - ":lambda:path/2015-03-31/functions/", - Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "/invocations", - ], - ], - }, - }, - "Type": "AWS::ApiGatewayV2::Integration", - }, - "ServerlessSpyApiGwWebSocketsendmessageRouteSendMessagePermission603B5AE9": Object { - "Properties": Object { - "Action": "lambda:InvokeFunction", - "FunctionName": Object { - "Fn::GetAtt": Array [ - "ServerlessSpySubscription0036DF4AB", - "Arn", - ], - }, - "Principal": "apigateway.amazonaws.com", - "SourceArn": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*sendmessage", - ], - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "ServerlessSpyExtensionEA4873A0": Object { - "Properties": Object { - "CompatibleRuntimes": Array [ - "nodejs12.x", - "nodejs14.x", - "nodejs16.x", - "nodejs18.x", - ], - "Content": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "1ae5bd4e741c0b4b5309e11738f23752e1bc35a43dffda96210f41c0e322a512.zip", - }, - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "ServerlessSpyOnConnect645F94AB": Object { - "DependsOn": Array [ - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "ServerlessSpyOnConnectServiceRoleFC57701A", + "MyPythonLambdaBD2BE2C6": { + "DependsOn": [ + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "MyPythonLambdaServiceRoleE254838E", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b4b02377de150bf7e6dfe0fdc41c2e02d54f01740b28ddffc04701aea77173d4.zip", + "S3Key": "a34102ca9b461fd6335e146271be5476c61e07b3b0ca21959ff0705dd70432d8.zip", }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", + "Environment": { + "Variables": { + "AWS_LAMBDA_EXEC_WRAPPER": "/opt/spy-wrapper", "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", + "SSPY_FUNCTION_NAME": "MyPythonLambda", + "SSPY_INFRA_MAPPING": { + "Fn::Join": [ + "", + [ + "{"", + { + "Fn::GetAtt": [ + "MyQueue22D001D59", + "Arn", + ], + }, + "":"Sqs#MyQueue2"}", + ], + ], }, + "SSPY_ROOT_STACK": "Test", + "SSPY_SUBSCRIBED_TO_SQS": "true", }, }, - "Handler": "index.handler", + "Handler": "dummy.handler", + "Layers": [ + { + "Ref": "ServerlessSpyPythonExtension718A6034", + }, + { + "Ref": "ServerlessSpySpyWrapperLayerBE5627BF", + }, + ], "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnConnectServiceRoleFC57701A", + "Role": { + "Fn::GetAtt": [ + "MyPythonLambdaServiceRoleE254838E", "Arn", ], }, - "Runtime": "nodejs18.x", + "Runtime": "python3.9", "Timeout": 5, }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", + "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "sqs:ReceiveMessage", + "sqs:ChangeMessageVisibility", + "sqs:GetQueueUrl", + "sqs:DeleteMessage", + "sqs:GetQueueAttributes", ], "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], + "Resource": { + "Fn::GetAtt": [ + "MyQueue22D001D59", + "Arn", + ], + }, + }, + { + "Action": "iot:*", + "Effect": "Allow", + "Resource": "*", }, ], "Version": "2012-10-17", }, - "PolicyName": "ServerlessSpyOnConnectServiceRoleDefaultPolicy3DA62E46", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnConnectServiceRoleFC57701A", + "PolicyName": "MyPythonLambdaServiceRoleDefaultPolicyEBB1A269", + "Roles": [ + { + "Ref": "MyPythonLambdaServiceRoleE254838E", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpyOnConnectServiceRoleFC57701A": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "MyPythonLambdaServiceRoleE254838E": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -672,151 +288,99 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyOnDisconnect798FB62E": Object { - "DependsOn": Array [ - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "ServerlessSpyOnDisconnectServiceRoleD2185195", - ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { - "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", - }, - "S3Key": "e3398e4b8f1ae3417d5afa7ec1158778b906c8238d308303c7bf9a72726d8041.zip", - }, - "Environment": Object { - "Variables": Object { - "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", - "NODE_OPTIONS": "--enable-source-maps", - "SSPY_DEBUG": "true", - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, - }, - }, - "Handler": "index.handler", - "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ - "ServerlessSpyOnDisconnectServiceRoleD2185195", + "MyPythonLambdaSqsEventSourceTestMyQueue26E21529BC3616E46": { + "Properties": { + "EventSourceArn": { + "Fn::GetAtt": [ + "MyQueue22D001D59", "Arn", ], }, - "Runtime": "nodejs18.x", - "Timeout": 5, + "FunctionName": { + "Ref": "MyPythonLambdaBD2BE2C6", + }, }, - "Type": "AWS::Lambda::Function", + "Type": "AWS::Lambda::EventSourceMapping", }, - "ServerlessSpyOnDisconnectServiceRoleD2185195": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": Object { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - ], - ], - }, + "MyQueue22D001D59": { + "DeletionPolicy": "Delete", + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, + "MyQueueE6CA6235": { + "DeletionPolicy": "Delete", + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, + "ServerlessSpyExtensionEA4873A0": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", ], + "CompatibleRuntimes": [ + "nodejs16.x", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "babbb172503f6a6ffc178f8d107bae18937392efdbc57c9a729dd35ef6228e53.zip", + }, }, - "Type": "AWS::IAM::Role", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - ], - "Version": "2012-10-17", + "ServerlessSpyPythonExtension718A6034": { + "Properties": { + "CompatibleArchitectures": [ + "x86_64", + ], + "CompatibleRuntimes": [ + "python3.9", + ], + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", + }, + "S3Key": "f0805f3798a1ec284ae50530bcfe1f7dc297a30367d2ef35819e3b21b57db6cd.zip", }, - "PolicyName": "ServerlessSpyOnDisconnectServiceRoleDefaultPolicy908DBF32", - "Roles": Array [ - Object { - "Ref": "ServerlessSpyOnDisconnectServiceRoleD2185195", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "ServerlessSpySpyWrapperLayerBE5627BF": { + "Properties": { + "Content": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - ], + "S3Key": "bf2df0858ecef77ac31b1994b46cd25f69a84fea5d58e9b5e5c6e458c33012f6.zip", + }, }, - "Type": "AWS::IAM::Policy", + "Type": "AWS::Lambda::LayerVersion", }, - "ServerlessSpySubscription0036DF4AB": Object { - "DependsOn": Array [ + "ServerlessSpySubscription0036DF4AB": { + "DependsOn": [ "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", "ServerlessSpySubscription0ServiceRoleF955D76C", ], - "Properties": Object { - "Code": Object { - "S3Bucket": Object { + "Properties": { + "Code": { + "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-\${AWS::AccountId}-\${AWS::Region}", }, - "S3Key": "b9b766ecfb7a00b14e4605f25e02ebeeca0e85d9996a77cf5266884f16bc057e.zip", + "S3Key": "2fc02cc64fedb8a5c7c3049c58656172132663d36b541073ada7da4078957efa.zip", }, - "Environment": Object { - "Variables": Object { + "Environment": { + "Variables": { "AWS_NODEJS_CONNECTION_REUSE_ENABLED": "1", "NODE_OPTIONS": "--enable-source-maps", "SSPY_INFRA_MAPPING": "{}", - "SSPY_WS_ENDPOINT": Object { - "Fn::Join": Array [ - "", - Array [ - "https://", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - ".execute-api.", - Object { - "Ref": "AWS::Region", - }, - ".amazonaws.com/prod", - ], - ], - }, - "SSPY_WS_TABLE_NAME": Object { - "Ref": "ServerlessSpyWebSocketB4D8CE14", - }, + "SSPY_ROOT_STACK": "Test", }, }, "Handler": "index.handler", "MemorySize": 512, - "Role": Object { - "Fn::GetAtt": Array [ + "Role": { + "Fn::GetAtt": [ "ServerlessSpySubscription0ServiceRoleF955D76C", "Arn", ], @@ -826,116 +390,48 @@ Object { }, "Type": "AWS::Lambda::Function", }, - "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": Object { - "Properties": Object { - "PolicyDocument": Object { - "Statement": Array [ - Object { - "Action": Array [ - "dynamodb:BatchWriteItem", - "dynamodb:PutItem", - "dynamodb:UpdateItem", - "dynamodb:DeleteItem", - "dynamodb:DescribeTable", - ], + "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "iot:*", "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": Array [ - "dynamodb:BatchGetItem", - "dynamodb:GetRecords", - "dynamodb:GetShardIterator", - "dynamodb:Query", - "dynamodb:GetItem", - "dynamodb:Scan", - "dynamodb:ConditionCheckItem", - "dynamodb:DescribeTable", - ], - "Effect": "Allow", - "Resource": Array [ - Object { - "Fn::GetAtt": Array [ - "ServerlessSpyWebSocketB4D8CE14", - "Arn", - ], - }, - Object { - "Ref": "AWS::NoValue", - }, - ], - }, - Object { - "Action": "execute-api:ManageConnections", - "Effect": "Allow", - "Resource": Object { - "Fn::Join": Array [ - "", - Array [ - "arn:", - Object { - "Ref": "AWS::Partition", - }, - ":execute-api:", - Object { - "Ref": "AWS::Region", - }, - ":", - Object { - "Ref": "AWS::AccountId", - }, - ":", - Object { - "Ref": "ServerlessSpyApiGwWebSocketB4986709", - }, - "/*/*/@connections/*", - ], - ], - }, + "Resource": "*", }, ], "Version": "2012-10-17", }, "PolicyName": "ServerlessSpySubscription0ServiceRoleDefaultPolicyD8FA77F4", - "Roles": Array [ - Object { + "Roles": [ + { "Ref": "ServerlessSpySubscription0ServiceRoleF955D76C", }, ], }, "Type": "AWS::IAM::Policy", }, - "ServerlessSpySubscription0ServiceRoleF955D76C": Object { - "Properties": Object { - "AssumeRolePolicyDocument": Object { - "Statement": Array [ - Object { + "ServerlessSpySubscription0ServiceRoleF955D76C": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { "Action": "sts:AssumeRole", "Effect": "Allow", - "Principal": Object { + "Principal": { "Service": "lambda.amazonaws.com", }, }, ], "Version": "2012-10-17", }, - "ManagedPolicyArns": Array [ - Object { - "Fn::Join": Array [ + "ManagedPolicyArns": [ + { + "Fn::Join": [ "", - Array [ + [ "arn:", - Object { + { "Ref": "AWS::Partition", }, ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", @@ -946,43 +442,23 @@ Object { }, "Type": "AWS::IAM::Role", }, - "ServerlessSpyWebSocketB4D8CE14": Object { - "DeletionPolicy": "Retain", - "Properties": Object { - "AttributeDefinitions": Array [ - Object { - "AttributeName": "connectionId", - "AttributeType": "S", - }, - ], - "BillingMode": "PAY_PER_REQUEST", - "KeySchema": Array [ - Object { - "AttributeName": "connectionId", - "KeyType": "HASH", - }, - ], - }, - "Type": "AWS::DynamoDB::Table", - "UpdateReplacePolicy": "Retain", - }, }, - "Rules": Object { - "CheckBootstrapVersion": Object { - "Assertions": Array [ - Object { - "Assert": Object { - "Fn::Not": Array [ - Object { - "Fn::Contains": Array [ - Array [ + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ "1", "2", "3", "4", "5", ], - Object { + { "Ref": "BootstrapVersion", }, ], diff --git a/test/cdk/test/e2e.test.ts b/test/cdk/test/e2e.test.ts index 84f336f..5687bcc 100644 --- a/test/cdk/test/e2e.test.ts +++ b/test/cdk/test/e2e.test.ts @@ -27,7 +27,7 @@ describe('E2e', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyE2e', }); }); diff --git a/test/cdk/test/esmLambda.test.ts b/test/cdk/test/esmLambda.test.ts index 7b98053..7da68da 100644 --- a/test/cdk/test/esmLambda.test.ts +++ b/test/cdk/test/esmLambda.test.ts @@ -26,7 +26,7 @@ describe('EsmLambda', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyEsmLambda', }); }); diff --git a/test/cdk/test/eventBridgeToLambda.test.ts b/test/cdk/test/eventBridgeToLambda.test.ts index 946571f..fcbb31f 100644 --- a/test/cdk/test/eventBridgeToLambda.test.ts +++ b/test/cdk/test/eventBridgeToLambda.test.ts @@ -30,7 +30,7 @@ describe('EventBridge to Lambda', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyEventBridgeToLambda', }); }); @@ -102,6 +102,27 @@ describe('EventBridge to Lambda', () => { source: 'test-source', }, }); + ( + await ( + await serverlessSpyListener.waitForFunctionMyPythonLambdaRequest< + EventBridgeEvent<'test', TestData> + >({ + condition: (d) => d.request.detail.id === id, + }) + ) + .toMatchObject({ + request: { + detail: data, + source: 'test-source', + }, + }) + .followedByResponse>({}) + ).toMatchObject({ + request: { + detail: data, + source: 'test-source', + }, + }); }); test('Snapshot', () => { diff --git a/test/cdk/test/lambda.test.ts b/test/cdk/test/lambda.test.ts index aa8b882..e69c81e 100644 --- a/test/cdk/test/lambda.test.ts +++ b/test/cdk/test/lambda.test.ts @@ -26,7 +26,7 @@ describe('Lambda', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambda', }); }); diff --git a/test/cdk/test/lambdaToDynamoDb.test.ts b/test/cdk/test/lambdaToDynamoDb.test.ts index d8a6d1b..9757b2c 100644 --- a/test/cdk/test/lambdaToDynamoDb.test.ts +++ b/test/cdk/test/lambdaToDynamoDb.test.ts @@ -26,7 +26,7 @@ describe('Lambda to DynamoDB', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambdaToDynamoDb', }); }); diff --git a/test/cdk/test/lambdaToEventBridge.test.ts b/test/cdk/test/lambdaToEventBridge.test.ts index 6b3d1cd..15a984a 100644 --- a/test/cdk/test/lambdaToEventBridge.test.ts +++ b/test/cdk/test/lambdaToEventBridge.test.ts @@ -26,7 +26,7 @@ describe('Lambda to EventBridge', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambdaToEventBridge', }); }); diff --git a/test/cdk/test/lambdaToS3.test.ts b/test/cdk/test/lambdaToS3.test.ts index 8871832..af374ff 100644 --- a/test/cdk/test/lambdaToS3.test.ts +++ b/test/cdk/test/lambdaToS3.test.ts @@ -26,7 +26,7 @@ describe('Lambda to S3', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambdaToS3', }); }); diff --git a/test/cdk/test/lambdaToSnS.test.ts b/test/cdk/test/lambdaToSnS.test.ts index 559ca66..5129032 100644 --- a/test/cdk/test/lambdaToSnS.test.ts +++ b/test/cdk/test/lambdaToSnS.test.ts @@ -26,7 +26,7 @@ describe('Lambda to SNS', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambdaToSns', }); }); diff --git a/test/cdk/test/lambdaToSqs.test.ts b/test/cdk/test/lambdaToSqs.test.ts index fa1998a..faa4031 100644 --- a/test/cdk/test/lambdaToSqs.test.ts +++ b/test/cdk/test/lambdaToSqs.test.ts @@ -26,7 +26,7 @@ describe('Lambda to SQS', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpyLambdaToSqs', }); }); diff --git a/test/cdk/test/pythonLambda.test.ts b/test/cdk/test/pythonLambda.test.ts new file mode 100644 index 0000000..8d1d05c --- /dev/null +++ b/test/cdk/test/pythonLambda.test.ts @@ -0,0 +1,388 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda'; +import { App } from 'aws-cdk-lib'; +import { Template } from 'aws-cdk-lib/assertions'; +import { v4 as uuidv4 } from 'uuid'; +import { createServerlessSpyListener } from '../../../listener/createServerlessSpyListener'; +import { ServerlessSpyListener } from '../../../listener/ServerlessSpyListener'; +import { ServerlessSpyEvents } from '../serverlessSpyEvents/ServerlessSpyEventsPythonLambda'; +import { PythonLambdaStack } from '../src/pythonLambdaStack'; +import { TestData } from './TestData'; + +jest.setTimeout(30000); + +describe('PythonLambda', () => { + const exportLocation = path.join(__dirname, '../cdkOutput.json'); + let serverlessSpyListener: ServerlessSpyListener; + let lambdaClient: LambdaClient; + + if (!fs.existsSync(exportLocation)) { + throw new Error(`File ${exportLocation} does not exists.`); + } + const output = JSON.parse(fs.readFileSync(exportLocation).toString())[ + 'ServerlessSpyPythonLambda' + ]; + + beforeEach(async () => { + lambdaClient = new LambdaClient({}); + serverlessSpyListener = + await createServerlessSpyListener({ + scope: 'ServerlessSpyPythonLambda', + }); + }); + + afterEach(async () => { + serverlessSpyListener.stop(); + lambdaClient.destroy(); + }); + + test('Basic test', async () => { + const myData1 = { + id: uuidv4(), + message: 'Hello 1', + }; + + await lambdaClient.send( + new InvokeCommand({ + FunctionName: output.FunctionNameMyLambda, + InvocationType: 'RequestResponse', + LogType: 'Tail', + Payload: JSON.stringify(myData1) as any, + }) + ); + + await testWithoutConditionsAndWithoutChaining( + serverlessSpyListener, + myData1 + ); + + await testWithConditionsAndWithoutChaining(serverlessSpyListener, myData1); + await testWithConditionsAndWithChaining(serverlessSpyListener, myData1); + await testFullyChained(serverlessSpyListener, myData1); + + //************** DATA 2 ************************** + + const myData2 = { + id: uuidv4(), + message: 'Hello 2', + }; + + await lambdaClient.send( + new InvokeCommand({ + FunctionName: output.FunctionNameMyLambda, + InvocationType: 'RequestResponse', + LogType: 'Tail', + Payload: JSON.stringify(myData2) as any, + }) + ); + + await testWithConditionsAndWithChaining(serverlessSpyListener, myData2); + + //this will not work, because we would get the first event + // const requestData2 = await ( + // await serverlessSpyListener.waitForFunctionMyLambdaRequest() + // ).getData(); + + const followedResponse2 = await ( + await serverlessSpyListener.waitForFunctionMyLambdaRequest({ + condition: (d) => d.request.id === myData2.id, + }) + ).followedByResponse(); + + followedResponse2.toMatchObject({ + request: myData2, + response: { + ...myData2, + message: `${myData2.message} ServerlessSpy`, + }, + }); + + const responseDataSameRequest2 = followedResponse2.getData(); + + expect(responseDataSameRequest2.request).toMatchObject(myData2); + expect(responseDataSameRequest2.response).toMatchObject({ + ...myData2, + message: `${myData2.message} ServerlessSpy`, + }); + + ( + await serverlessSpyListener.waitForFunctionMyLambdaResponse({ + condition: (d) => d.response.id === myData2.id, + }) + ).toMatchObject({ + request: myData2, + response: { + ...myData2, + message: `${myData2.message} ServerlessSpy`, + }, + }); + }); + + test('Test error', async () => { + const lambdaClient = new LambdaClient({}); + + const myData1 = { + id: uuidv4(), + message: 'Hello 1', + }; + + await lambdaClient.send( + new InvokeCommand({ + FunctionName: output.FunctionNameMyLambdaThatFails, + InvocationType: 'RequestResponse', + LogType: 'Tail', + Payload: JSON.stringify(myData1) as any, + }) + ); + + const errorResponse = ( + await serverlessSpyListener.waitForFunctionMyLambdaThatFailsError() + ).getData(); + + expect(errorResponse.error).toMatchObject({ + message: 'My test error', + name: 'Error', + stack: expect.any(String), + }); + + ( + await serverlessSpyListener.waitForFunctionMyLambdaThatFailsError() + ).toMatchObject({ + request: myData1, + error: { + message: 'My test error', + name: 'Error', + stack: expect.any(String), + }, + }); + }); + + test('Snapshot', () => { + const app = new App(); + const stack = new PythonLambdaStack(app, 'Test', { + generateSpyEventsFile: false, + }); + const template = Template.fromStack(stack); + expect(template.toJSON()).toMatchSnapshot(); + }); +}); + +async function testWithConditionsAndWithChaining( + serverlessSpyListener: ServerlessSpyListener, + myData: TestData +) { + // request + const awaitedRequest = + await serverlessSpyListener.waitForFunctionMyLambdaRequest({ + condition: (d) => d.request.id === myData.id, + }); + + awaitedRequest.toMatchObject({ + request: myData, + }); + + const requestData = awaitedRequest.getData(); + + expect(requestData.request).toMatchObject(myData); + + //console log + const awaitedFollowedConsole = await awaitedRequest.followedByConsole(); + + awaitedFollowedConsole.toMatchObject({ + request: myData, + console: { + message: 'My console log message', + optionalParams: [myData], + }, + }); + + const consoleData = awaitedFollowedConsole.getData(); + + expect(consoleData.console).toMatchObject({ + message: 'My console log message', + optionalParams: [myData], + }); + + //response + const awaitedFollowedResponse = await awaitedRequest.followedByResponse(); + + awaitedFollowedResponse.toMatchObject({ + request: myData, + response: { + ...myData, + message: `${myData.message} ServerlessSpy`, + }, + }); + + const responseData = awaitedFollowedResponse.getData(); + + expect(responseData.request).toMatchObject(myData); + expect(responseData.response).toMatchObject({ + ...myData, + message: `${myData.message} ServerlessSpy`, + }); +} + +async function testFullyChained( + serverlessSpyListener: ServerlessSpyListener, + myData: TestData +) { + ( + await ( + await ( + await serverlessSpyListener.waitForFunctionMyLambdaRequest({ + condition: (d) => d.request.id === myData.id, + }) + ) + .toMatchObject({ + request: myData, + }) + .followedByConsole() + ) + .toMatchObject({ + request: myData, + console: { + message: 'My console log message', + optionalParams: [myData], + }, + }) + .followedByResponse() + ).toMatchObject({ + request: myData, + response: { + ...myData, + message: `${myData.message} ServerlessSpy`, + }, + }); + + //no checking the data + await ( + await ( + await serverlessSpyListener.waitForFunctionMyLambdaRequest({ + condition: (d) => d.request.id === myData.id, + }) + ).followedByConsole() + ).followedByResponse(); +} + +async function testWithoutConditionsAndWithoutChaining( + serverlessSpyListener: ServerlessSpyListener, + data: TestData +) { + //request + const awaitedRequest = + await serverlessSpyListener.waitForFunctionMyLambdaRequest(); + + awaitedRequest.toMatchObject({ + request: data, + }); + console.log('request found'); + + const requestData = awaitedRequest.getData(); + + expect(requestData.request).toMatchObject(data); + console.log('matched data'); + + //TODO: Pretty sure it's the console logs that aren't set up properly + //console log + const awaitedConsole = + await serverlessSpyListener.waitForFunctionMyLambdaConsole(); + + awaitedConsole.toMatchObject({ + request: data, + console: { + message: 'My console log message', + optionalParams: [data], + }, + }); + + const consoleData = awaitedConsole.getData(); + + expect(consoleData.console).toMatchObject({ + message: 'My console log message', + optionalParams: [data], + }); + + //response + const awaitedResponse = + await serverlessSpyListener.waitForFunctionMyLambdaResponse(); + + awaitedResponse.toMatchObject({ + request: data, + response: { + ...data, + message: `${data.message} ServerlessSpy`, + }, + }); + + const responseData = awaitedResponse.getData(); + + expect(responseData.request).toMatchObject(data); + expect(responseData.response).toMatchObject({ + ...data, + message: `${data.message} ServerlessSpy`, + }); +} + +async function testWithConditionsAndWithoutChaining( + serverlessSpyListener: ServerlessSpyListener, + data: TestData +) { + //request + const awaitedRequest = + await serverlessSpyListener.waitForFunctionMyLambdaRequest({ + condition: (d) => d.request.id === data.id, + }); + + awaitedRequest.toMatchObject({ + request: data, + }); + + const requestData = awaitedRequest.getData(); + + expect(requestData.request).toMatchObject(data); + + //console log + const awaitedConsole = + await serverlessSpyListener.waitForFunctionMyLambdaConsole({ + condition: (d) => d.request.id === data.id, + }); + + awaitedConsole.toMatchObject({ + request: data, + console: { + message: 'My console log message', + optionalParams: [data], + }, + }); + + const consoleData = awaitedConsole.getData(); + + expect(consoleData.console).toMatchObject({ + message: 'My console log message', + optionalParams: [data], + }); + + //response + const awaitedResponse = + await serverlessSpyListener.waitForFunctionMyLambdaResponse({ + condition: (d) => d.response.id === data.id, + }); + + awaitedResponse.toMatchObject({ + request: data, + response: { + ...data, + message: `${data.message} ServerlessSpy`, + }, + }); + + const responseData = awaitedResponse.getData(); + + expect(responseData.request).toMatchObject(data); + expect(responseData.response).toMatchObject({ + ...data, + message: `${data.message} ServerlessSpy`, + }); +} diff --git a/test/cdk/test/snsToLambda.test.ts b/test/cdk/test/snsToLambda.test.ts index 0f961f9..1895d17 100644 --- a/test/cdk/test/snsToLambda.test.ts +++ b/test/cdk/test/snsToLambda.test.ts @@ -27,7 +27,7 @@ describe('SNS to Lambda', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpySnsToLambda', }); }); @@ -95,6 +95,41 @@ describe('SNS to Lambda', () => { ]), }, }); + + ( + await ( + await serverlessSpyListener.waitForFunctionMyPythonLambdaRequest( + { + condition: (d) => + !!d.request.Records.map( + (r) => JSON.parse(r.Sns.Message) as TestData + ).find((d) => d.id === data.id), + } + ) + ) + .toMatchObject({ + request: { + Records: expect.arrayContaining([ + expect.objectContaining({ + Sns: expect.objectContaining({ + Message: JSON.stringify(data), + }), + }), + ]), + }, + }) + .followedByResponse({}) + ).toMatchObject({ + request: { + Records: expect.arrayContaining([ + expect.objectContaining({ + Sns: expect.objectContaining({ + Message: JSON.stringify(data), + }), + }), + ]), + }, + }); }); test('Snapshot', () => { diff --git a/test/cdk/test/snsToSqs.test.ts b/test/cdk/test/snsToSqs.test.ts index c48a308..5aeb298 100644 --- a/test/cdk/test/snsToSqs.test.ts +++ b/test/cdk/test/snsToSqs.test.ts @@ -8,7 +8,7 @@ import { v4 as uuidv4 } from 'uuid'; import { createServerlessSpyListener } from '../../../listener/createServerlessSpyListener'; import { ServerlessSpyListener } from '../../../listener/ServerlessSpyListener'; import { ServerlessSpyEvents } from '../serverlessSpyEvents/ServerlessSpyEventsSnsToSqs'; -import { SnsToLambdaStack } from '../src/snsToLambdaStack'; +import { SnsToSqsStack } from '../src/snsToSqsStack'; import { TestData } from './TestData'; jest.setTimeout(30000); @@ -27,7 +27,7 @@ describe('SNS to SQS', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpySnsToSqs', }); }); @@ -76,7 +76,7 @@ describe('SNS to SQS', () => { test('Snapshot', () => { const app = new App(); - const stack = new SnsToLambdaStack(app, 'Test', { + const stack = new SnsToSqsStack(app, 'Test', { generateSpyEventsFile: false, }); const template = Template.fromStack(stack); diff --git a/test/cdk/test/sqs.test.ts b/test/cdk/test/sqs.test.ts index acb2eab..66503b4 100644 --- a/test/cdk/test/sqs.test.ts +++ b/test/cdk/test/sqs.test.ts @@ -26,7 +26,7 @@ describe('SQS with option spySqsWithNoSubscriptionAndDropAllMessages', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpySqs', }); }); diff --git a/test/cdk/test/sqsToLambda.test.ts b/test/cdk/test/sqsToLambda.test.ts index 8a45140..9917929 100644 --- a/test/cdk/test/sqsToLambda.test.ts +++ b/test/cdk/test/sqsToLambda.test.ts @@ -27,7 +27,7 @@ describe('SQS to Lambda', () => { beforeEach(async () => { serverlessSpyListener = await createServerlessSpyListener({ - serverlessSpyWsUrl: output.ServerlessSpyWsUrl, + scope: 'ServerlessSpySqsToLambda', }); }); @@ -48,6 +48,11 @@ describe('SQS to Lambda', () => { QueueUrl: output.QueueUrlMyQueue, }); await sqsClient.send(sendMessageCommand); + const sendMessageCommand2 = new SendMessageCommand({ + MessageBody: JSON.stringify(data), + QueueUrl: output.QueueUrlMyQueue2, + }); + await sqsClient.send(sendMessageCommand2); ( await serverlessSpyListener.waitForSqsMyQueue({ @@ -83,6 +88,37 @@ describe('SQS to Lambda', () => { ]), }, }); + + ( + await ( + await serverlessSpyListener.waitForFunctionMyPythonLambdaRequest( + { + condition: (d) => + !!d.request.Records.map( + (r) => JSON.parse(r.body) as TestData + ).find((d) => d.id === data.id), + } + ) + ) + .toMatchObject({ + request: { + Records: expect.arrayContaining([ + expect.objectContaining({ + body: JSON.stringify(data), + }), + ]), + }, + }) + .followedByResponse({}) + ).toMatchObject({ + request: { + Records: expect.arrayContaining([ + expect.objectContaining({ + body: JSON.stringify(data), + }), + ]), + }, + }); }); test('Snapshot', () => { diff --git a/test/cdk/tsconfig.esm.json b/test/cdk/tsconfig.esm.json index a3e37cc..a262ad0 100644 --- a/test/cdk/tsconfig.esm.json +++ b/test/cdk/tsconfig.esm.json @@ -29,6 +29,5 @@ "require": [ "tsconfig-paths/register" ] - }, - "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"." + } } diff --git a/tsconfig.json b/tsconfig.json index ac5eb3b..c908337 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,6 @@ "inlineSourceMap": true, "inlineSources": true, "alwaysStrict": true, - "charset": "utf8", "declaration": true, "experimentalDecorators": true, "incremental": true, @@ -14,7 +13,6 @@ "es2020" ], "module": "CommonJS", - "newLine": "lf", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, "noImplicitAny": true, @@ -40,3 +38,4 @@ ], "_generated_by_jsii_": "Generated by jsii - safe to delete, and ideally should be in .gitignore" } + diff --git a/tsconfig.npm.json b/tsconfig.npm.json index a957d84..f3041c4 100644 --- a/tsconfig.npm.json +++ b/tsconfig.npm.json @@ -16,7 +16,6 @@ "inlineSourceMap": true, "inlineSources": true, "alwaysStrict": true, - "charset": "utf8", "declaration": true, "experimentalDecorators": true, "incremental": true, @@ -42,12 +41,12 @@ "tsBuildInfoFile": "lib/tsconfig.tsbuildinfo" }, "include": [ - "src/**/*.ts", - "common/**/*.ts", - "listener/**/*.ts", - "cli/**/*.ts", - "functions/**/*.ts", - "index.ts", + "src/**/*.ts", + "common/**/*.ts", + "listener/**/*.ts", + "cli/**/*.ts", + "functions/**/*.ts", + "index.ts", ], "exclude": ["cli/webServerlessSpy.ts"] }