diff --git a/infracost-usage.yml b/infracost-usage.yml index 9b1a0d80..52e70f83 100644 --- a/infracost-usage.yml +++ b/infracost-usage.yml @@ -21,6 +21,25 @@ resource_usage: monthly_select_data_scanned_gb: 0 # Monthly data scanned by S3 Select in GB. monthly_select_data_returned_gb: 0 # Monthly data returned by S3 Select in GB. early_delete_gb: 0 # If an archive is deleted within 1 months of being uploaded, you will be charged an early deletion fee per GB. + module.ttl_archiver.aws_s3_bucket.this: + aws_s3_bucket: + object_tags: 50000 # Total object tags. Only for AWS provider V3. + standard: # Usages of S3 Standard: + storage_gb: 30 # Total storage in GB. + monthly_tier_1_requests: 10000 # Monthly PUT, COPY, POST, LIST requests (Tier 1). + monthly_tier_2_requests: 125000 # Monthly GET, SELECT, and all other requests (Tier 2). + monthly_select_data_scanned_gb: 20 # Monthly data scanned by S3 Select in GB. + monthly_select_data_returned_gb: 2 # Monthly data returned by S3 Select in GB. + intelligent_tiering: # Usages of S3 Intelligent - Tiering: + frequent_access_storage_gb: 30 # Total storage for Frequent Access Tier in GB. + infrequent_access_storage_gb: 0 # Total storage for Infrequent Access Tier in GB. + monitored_objects: 0 # Total objects monitored by the Intelligent Tiering. + monthly_tier_1_requests: 0 # Monthly PUT, COPY, POST, LIST requests (Tier 1). + monthly_tier_2_requests: 0 # Monthly GET, SELECT, and all other requests (Tier 2). + monthly_lifecycle_transition_requests: 0 # Monthly Lifecycle Transition requests. + monthly_select_data_scanned_gb: 0 # Monthly data scanned by S3 Select in GB. + monthly_select_data_returned_gb: 0 # Monthly data returned by S3 Select in GB. + early_delete_gb: 0 # If an archive is deleted within 1 months of being uploaded, you will be charged an early deletion fee per GB. resource_type_default_usage: aws_acmpca_certificate_authority: @@ -204,7 +223,7 @@ resource_type_default_usage: aws_kinesisanalyticsv2_application_snapshot: durable_application_backup_gb: 208 # Total amount of durable application backups in GB. aws_kinesis_firehose_delivery_stream: - monthly_data_ingested_gb: 142 # Monthly data ingested by the Delivery Stream in GB. + monthly_data_ingested_gb: 20 # Monthly data ingested by the Delivery Stream in GB. aws_kinesis_stream: monthly_on_demand_data_in_gb: 62 # Monthly data ingested by the stream in GB. monthly_on_demand_data_out_gb: 125 # Monthly data egressed by the stream in GB total, (not per consumer application). @@ -282,8 +301,8 @@ resource_type_default_usage: storage_gb: 10 # Total storage in GB. monthly_tier_1_requests: 10000 # Monthly PUT, COPY, POST, LIST requests (Tier 1). monthly_tier_2_requests: 125000 # Monthly GET, SELECT, and all other requests (Tier 2). - monthly_select_data_scanned_gb: 2500 # Monthly data scanned by S3 Select in GB. - monthly_select_data_returned_gb: 7250 # Monthly data returned by S3 Select in GB. + monthly_select_data_scanned_gb: 0 # Monthly data scanned by S3 Select in GB. + monthly_select_data_returned_gb: 0 # Monthly data returned by S3 Select in GB. intelligent_tiering: # Usages of S3 Intelligent - Tiering: frequent_access_storage_gb: 30 # Total storage for Frequent Access Tier in GB. infrequent_access_storage_gb: 0 # Total storage for Infrequent Access Tier in GB. diff --git a/notebooks/.gitignore b/notebooks/.gitignore new file mode 100644 index 00000000..6abdab68 --- /dev/null +++ b/notebooks/.gitignore @@ -0,0 +1,219 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock +#poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +#pdm.lock +#pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +#pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Redis +*.rdb +*.aof +*.pid + +# RabbitMQ +mnesia/ +rabbitmq/ +rabbitmq-data/ + +# ActiveMQ +activemq-data/ + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.toml + +# Config +config.py diff --git a/notebooks/README.md b/notebooks/README.md new file mode 100644 index 00000000..6d972be0 --- /dev/null +++ b/notebooks/README.md @@ -0,0 +1,8 @@ +# Notebooks +IPYNB notebooks for ACM tasks + +## Getting Started +Create the file `config.py` with the following contents: +```python +AWS_PROFILE="" +``` diff --git a/notebooks/read_archived_s3.ipynb b/notebooks/read_archived_s3.ipynb new file mode 100644 index 00000000..be83569d --- /dev/null +++ b/notebooks/read_archived_s3.ipynb @@ -0,0 +1,84 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ba97204d", + "metadata": {}, + "source": [ + "## Read Archived Logs from S3\n", + "Make sure that you have signed into AWS and setup a profile.\n", + "\n", + "Also, create `config.py` with contents:\n", + "```python\n", + "ARCHIVE_S3_BUCKET = \"\"\n", + "AWS_PROFILE = \"\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22f8f0a6", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install s3fs pandas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84a7370f", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import config\n", + "\n", + "assert config.ARCHIVE_S3_BUCKET\n", + "assert config.AWS_PROFILE\n", + "module_to_read = \"ExampleTableWithStream\"\n", + "# configure this s3 path correctly based on the date you're looking for, etc.\n", + "s3_path = f\"s3://{config.ARCHIVE_S3_BUCKET}/resource={module_to_read}/**/*.gz\"\n", + "\n", + "df = pd.read_json(\n", + " s3_path,\n", + " lines=True,\n", + " compression=\"gzip\",\n", + " storage_options={\"profile\": config.AWS_PROFILE, \"expand\": True},\n", + ")\n", + "\n", + "print(df.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "328af1fa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/package.json b/package.json index a69261ea..760df3dd 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,14 @@ "type": "module", "workspaces": [ "src/api", - "src/ui" + "src/ui", + "src/archival" ], "packageManager": "yarn@1.22.22", "scripts": { "postinstall": "npm run setup", "setup": "git config blame.ignoreRevsFile .git-blame-ignore-revs", - "build": "concurrently --names 'api,ui' 'yarn workspace infra-core-api run build' 'yarn workspace infra-core-ui run build'", + "build": "concurrently --names 'api,ui,archival' 'yarn workspace infra-core-api run build' 'yarn workspace infra-core-ui run build' 'yarn workspace infra-core-archival run build'", "postbuild": "node src/api/createLambdaPackage.js && yarn lockfile-manage", "dev": "cross-env DISABLE_AUDIT_LOG=true concurrently --names 'api,ui' 'yarn workspace infra-core-api run dev' 'yarn workspace infra-core-ui run dev'", "lockfile-manage": "synp --with-workspace --source-file yarn.lock", @@ -38,6 +39,7 @@ "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.33.0", "@playwright/test": "^1.54.2", + "@smithy/types": "^4.3.2", "@tsconfig/node22": "^22.0.1", "@types/ioredis-mock": "^8.2.5", "@types/node": "^24.3.0", @@ -92,4 +94,4 @@ "pdfjs-dist": "^4.8.69", "form-data": "^4.0.4" } -} \ No newline at end of file +} diff --git a/src/api/build.js b/src/api/build.js index 23bf7ac0..f1311fde 100644 --- a/src/api/build.js +++ b/src/api/build.js @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ import esbuild from "esbuild"; import { resolve } from "path"; import { copy } from "esbuild-plugin-copy"; diff --git a/src/api/package.json b/src/api/package.json index 7deb619c..f8cd6941 100644 --- a/src/api/package.json +++ b/src/api/package.json @@ -16,14 +16,14 @@ }, "dependencies": { "@aws-sdk/client-cloudfront-keyvaluestore": "^3.859.0", - "@aws-sdk/client-dynamodb": "^3.797.0", - "@aws-sdk/client-lambda": "^3.835.0", + "@aws-sdk/client-dynamodb": "^3.859.0", + "@aws-sdk/client-lambda": "^3.859.0", "@aws-sdk/client-secrets-manager": "^3.859.0", - "@aws-sdk/client-ses": "^3.797.0", - "@aws-sdk/client-sqs": "^3.797.0", - "@aws-sdk/client-sts": "^3.797.0", - "@aws-sdk/signature-v4-crt": "^3.796.0", - "@aws-sdk/util-dynamodb": "^3.797.0", + "@aws-sdk/client-ses": "^3.859.0", + "@aws-sdk/client-sqs": "^3.859.0", + "@aws-sdk/client-sts": "^3.859.0", + "@aws-sdk/signature-v4-crt": "^3.859.0", + "@aws-sdk/util-dynamodb": "^3.859.0", "@azure/msal-node": "^3.5.1", "@fastify/auth": "^5.0.1", "@fastify/aws-lambda": "^6.0.0", diff --git a/src/api/warmer/lambda.ts b/src/api/warmer/lambda.ts index c476308c..6925b615 100644 --- a/src/api/warmer/lambda.ts +++ b/src/api/warmer/lambda.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ import { LambdaClient, InvokeCommand, diff --git a/src/archival/build.js b/src/archival/build.js new file mode 100644 index 00000000..fec8912e --- /dev/null +++ b/src/archival/build.js @@ -0,0 +1,40 @@ +/* eslint-disable no-console */ +import esbuild from "esbuild"; + +const commonParams = { + bundle: true, + format: "esm", + minify: true, + outExtension: { ".js": ".mjs" }, + loader: { + ".png": "file", + ".pkpass": "file", + ".json": "file", + }, // File loaders + target: "es2022", // Target ES2022 + sourcemap: true, + platform: "node", + external: ["@aws-sdk/*"], + banner: { + js: ` + import path from 'path'; + import { fileURLToPath } from 'url'; + import { createRequire as topLevelCreateRequire } from 'module'; + const require = topLevelCreateRequire(import.meta.url); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + `.trim(), + }, // Banner for compatibility with CommonJS +}; + +esbuild + .build({ + ...commonParams, + entryPoints: ["archival/dynamoStream.js"], + outdir: "../../dist/archival/", + }) + .then(() => console.log("Archival lambda build completed successfully!")) + .catch((error) => { + console.error("Archival lambda build failed:", error); + process.exit(1); + }); diff --git a/src/archival/dynamoStream.ts b/src/archival/dynamoStream.ts new file mode 100644 index 00000000..1c6e631a --- /dev/null +++ b/src/archival/dynamoStream.ts @@ -0,0 +1,141 @@ +/* eslint-disable no-console */ +import { + FirehoseClient, + PutRecordBatchCommand, +} from "@aws-sdk/client-firehose"; +import { unmarshall } from "@aws-sdk/util-dynamodb"; +import type { DynamoDBStreamEvent, Context } from "aws-lambda"; +import { AttributeValue } from "@aws-sdk/client-dynamodb"; + +const firehoseClient = new FirehoseClient({}); + +const FIREHOSE_STREAM_NAME = process.env.FIREHOSE_STREAM_NAME; + +if (!FIREHOSE_STREAM_NAME) { + console.error("The 'FIREHOSE_STREAM_NAME' environment variable is not set."); + throw new Error("'FIREHOSE_STREAM_NAME' is not set."); +} + +const toUtcIsoStringWithoutMillis = (date: Date): string => { + return `${date.toISOString().slice(0, 19)}Z`; +}; + +/** + * Defines a map where keys are DynamoDB table names and values are functions + * that extract a meaningful timestamp from a record. The function should + * return a value parseable by the `Date` constructor (e.g., ISO 8601 string or epoch milliseconds). + */ +const ARCHIVE_TIMESTAMP_MAPPER: Record< + string, + (record: Record) => string | number +> = { + "infra-core-api-room-requests-status": (record) => + record["createdAt#status"].split("#")[0], + "infra-core-api-events": (record) => record.createdAt, + "infra-core-api-audit-log": (record) => record.createdAt * 1000, // Convert Unix seconds to milliseconds +}; + +export const handler = async ( + event: DynamoDBStreamEvent, + _context: Context, +): Promise => { + const firehoseRecordsToSend: { Data: Buffer }[] = []; + + for (const record of event.Records) { + // 1. **Filter for TTL Deletions**: We only care about `REMOVE` events initiated by DynamoDB's TTL service. + if ( + record.eventName === "REMOVE" && + record.userIdentity?.principalId === "dynamodb.amazonaws.com" + ) { + // 2. **Extract Table Name**: The table name is parsed from the event source ARN. + // ARN format: arn:aws:dynamodb:region:account-id:table/TABLE_NAME/stream/... + const tableName = record.eventSourceARN?.split("/")[1]; + if (!tableName) { + console.warn( + `Could not parse table name from ARN: ${record.eventSourceARN}`, + ); + continue; // Skip this record if the ARN is malformed + } + + // 3. **Get and Deserialize Data**: The content of the expired record is in 'OldImage'. + const oldImage = record.dynamodb?.OldImage; + if (!oldImage) { + continue; // Skip if there's no data to archive + } + + // The `unmarshall` utility converts the DynamoDB format to a standard JavaScript object. + const deserializedData = unmarshall( + oldImage as { [key: string]: AttributeValue }, + ); + + // 4. **Construct the Payload**: Add metadata to the original record data. + const payload: Record = { + ...deserializedData, + __infra_archive_resource: tableName, + __infra_archive_timestamp: toUtcIsoStringWithoutMillis(new Date()), // Default timestamp is 'now' + }; + + // 5. **Apply Custom Timestamp**: If a specific timestamp extractor is defined for this table, use it. + if (tableName in ARCHIVE_TIMESTAMP_MAPPER) { + try { + const timestampSource = + ARCHIVE_TIMESTAMP_MAPPER[tableName](deserializedData); + payload.__infra_archive_timestamp = toUtcIsoStringWithoutMillis( + new Date(timestampSource), + ); + } catch (e) { + const error = e instanceof Error ? e.message : String(e); + console.error( + `Failed to extract timestamp for record from ${tableName}: ${error}. Using 'now' as timestamp.`, + ); + } + } + + firehoseRecordsToSend.push({ + Data: Buffer.from(JSON.stringify(payload)), + }); + } + } + + // 6. **Send Records to Firehose**: If we found any TTL-expired records, send them. + if (firehoseRecordsToSend.length > 0) { + console.info( + `Found ${firehoseRecordsToSend.length} TTL-expired records to archive.`, + ); + + // The PutRecordBatch API has a limit of 500 records per call. We loop + // in chunks of 500 to handle large events gracefully. + for (let i = 0; i < firehoseRecordsToSend.length; i += 500) { + const batch = firehoseRecordsToSend.slice(i, i + 500); + try { + const command = new PutRecordBatchCommand({ + DeliveryStreamName: FIREHOSE_STREAM_NAME, + Records: batch, + }); + const response = await firehoseClient.send(command); + + // Log any records that Firehose failed to ingest for monitoring purposes. + if (response.FailedPutCount && response.FailedPutCount > 0) { + console.error( + `Failed to put ${response.FailedPutCount} records to Firehose.`, + ); + // For critical apps, you could inspect `response.RequestResponses` for details. + } + } catch (e) { + const error = e instanceof Error ? e.message : String(e); + console.error(`Error sending batch to Firehose: ${error}`); + // Re-throwing the exception will cause Lambda to retry the entire event batch. + throw e; + } + } + } else { + console.info("No TTL-expired records found in this event."); + } + + return { + statusCode: 200, + body: JSON.stringify( + `Successfully processed ${firehoseRecordsToSend.length} records.`, + ), + }; +}; diff --git a/src/archival/package.json b/src/archival/package.json new file mode 100644 index 00000000..c71a33b1 --- /dev/null +++ b/src/archival/package.json @@ -0,0 +1,26 @@ +{ + "name": "infra-core-archival", + "version": "1.0.0", + "description": "Archives DynamoDB TTL-deleted items to Firehose", + "type": "module", + "main": "index.js", + "author": "ACM@UIUC", + "license": "BSD-3-Clause", + "scripts": { + "build": "tsc && node build.js", + "prettier": "prettier --check *.ts **/*.ts", + "lint": "eslint . --ext .ts --cache", + "prettier:write": "prettier --write *.ts **/*.ts" + }, + "devDependencies": { + "@types/aws-lambda": "^8.10.138", + "@types/node": "^24.3.0", + "typescript": "^5.9.2", + "esbuild": "^0.25.3" + }, + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.585.0", + "@aws-sdk/client-firehose": "^3.585.0", + "@aws-sdk/util-dynamodb": "^3.585.0" + } +} \ No newline at end of file diff --git a/src/archival/tsconfig.json b/src/archival/tsconfig.json new file mode 100644 index 00000000..a7ea8819 --- /dev/null +++ b/src/archival/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "module": "Node16", + "rootDir": "../", + "outDir": "../../dist", + "baseUrl": "../" + }, + "ts-node": { + "esm": true + }, + "include": ["../api/**/*.ts", "../common/**/*.ts"], + "exclude": ["../../node_modules", "../../dist"] +} diff --git a/src/data-archive/main.py b/src/data-archive/main.py deleted file mode 100644 index 4c15cf9b..00000000 --- a/src/data-archive/main.py +++ /dev/null @@ -1,5 +0,0 @@ -import boto3 - - -def lambda_handler(event, context): - print("hello world") diff --git a/terraform/envs/prod/main.tf b/terraform/envs/prod/main.tf index 55429683..4989d5b1 100644 --- a/terraform/envs/prod/main.tf +++ b/terraform/envs/prod/main.tf @@ -65,8 +65,29 @@ module "alarms" { resource_prefix = var.ProjectId main_cloudfront_distribution_id = module.frontend.main_cloudfront_distribution_id standard_sns_arn = var.GeneralSNSAlertArn - all_lambdas = toset([module.lambdas.core_api_lambda_name, module.lambdas.core_api_slow_lambda_name, module.lambdas.core_sqs_consumer_lambda_name]) - performance_noreq_lambdas = toset([module.lambdas.core_api_lambda_name]) + all_lambdas = toset([ + module.lambdas.core_api_lambda_name, + module.lambdas.core_api_slow_lambda_name, + module.lambdas.core_sqs_consumer_lambda_name, + module.archival.dynamo_archival_lambda_name + ]) + performance_noreq_lambdas = toset([module.lambdas.core_api_lambda_name]) + archival_firehose_stream = module.archival.firehose_stream_name +} + +module "archival" { + depends_on = [module.dynamo] + source = "../../modules/archival" + ProjectId = var.ProjectId + RunEnvironment = "dev" + LogRetentionDays = var.LogRetentionDays + BucketPrefix = local.bucket_prefix + MonitorTables = ["${var.ProjectId}-audit-log", "${var.ProjectId}-events", "${var.ProjectId}-room-requests"] + TableDeletionDays = tomap({ + "${var.ProjectId}-audit-log" : 1460, + "${var.ProjectId}-room-requests" : 730 + # events are held forever as a cool historical archive - if no one reads them it shouldn't cost us much. + }) } module "lambdas" { diff --git a/terraform/envs/qa/main.tf b/terraform/envs/qa/main.tf index 49d5c384..44136506 100644 --- a/terraform/envs/qa/main.tf +++ b/terraform/envs/qa/main.tf @@ -56,15 +56,37 @@ module "origin_verify" { ProjectId = var.ProjectId } -# module "ttl_archiver" { -# depends_on = [module.dynamo] -# source = "../../modules/archival" -# ProjectId = var.ProjectId -# RunEnvironment = "dev" -# LogRetentionDays = var.LogRetentionDays -# BucketPrefix = local.bucket_prefix -# MonitorTables = ["${var.ProjectId}-room-requests", "${var.ProjectId}-room-requests-status"] -# } +module "alarms" { + source = "../../modules/alarms" + priority_sns_arn = var.PrioritySNSAlertArn + resource_prefix = var.ProjectId + main_cloudfront_distribution_id = module.frontend.main_cloudfront_distribution_id + standard_sns_arn = var.GeneralSNSAlertArn + all_lambdas = toset([ + module.lambdas.core_api_lambda_name, + module.lambdas.core_api_slow_lambda_name, + module.lambdas.core_sqs_consumer_lambda_name, + module.archival.dynamo_archival_lambda_name + ]) + performance_noreq_lambdas = toset([module.lambdas.core_api_lambda_name]) + archival_firehose_stream = module.archival.firehose_stream_name +} + +module "archival" { + depends_on = [module.dynamo] + source = "../../modules/archival" + ProjectId = var.ProjectId + RunEnvironment = "dev" + LogRetentionDays = var.LogRetentionDays + BucketPrefix = local.bucket_prefix + MonitorTables = ["${var.ProjectId}-audit-log", "${var.ProjectId}-events", "${var.ProjectId}-room-requests"] + TableDeletionDays = tomap({ + "${var.ProjectId}-audit-log" : 15, + "${var.ProjectId}-room-requests" : 15 + "${var.ProjectId}-events" : 15 + // We delete pretty quickly in QA + }) +} resource "aws_cloudfront_key_value_store" "linkry_kv" { name = "${var.ProjectId}-cloudfront-linkry-kv" diff --git a/terraform/envs/qa/variables.tf b/terraform/envs/qa/variables.tf index 85070da4..a1848b67 100644 --- a/terraform/envs/qa/variables.tf +++ b/terraform/envs/qa/variables.tf @@ -32,3 +32,13 @@ variable "EmailDomain" { type = string default = "aws.qa.acmuiuc.org" } + +variable "GeneralSNSAlertArn" { + type = string + default = "arn:aws:sns:us-east-1:427040638965:infra-monitor-alerts" +} + +variable "PrioritySNSAlertArn" { + type = string + default = "arn:aws:sns:us-east-1:427040638965:infra-monitor-alerts" +} diff --git a/terraform/modules/alarms/main.tf b/terraform/modules/alarms/main.tf index 65a76a6b..1fb9761e 100644 --- a/terraform/modules/alarms/main.tf +++ b/terraform/modules/alarms/main.tf @@ -11,7 +11,7 @@ resource "aws_cloudwatch_metric_alarm" "app_dlq_messages_alarm" { alarm_description = "Items are present in the application DLQ, meaning some messages failed to process." namespace = "AWS/SQS" metric_name = "ApproximateNumberOfMessagesVisible" - statistic = "Maximum" + statistic = "Sum" period = 60 evaluation_periods = 1 comparison_operator = "GreaterThanThreshold" @@ -22,19 +22,20 @@ resource "aws_cloudwatch_metric_alarm" "app_dlq_messages_alarm" { alarm_actions = [ var.priority_sns_arn ] + treat_missing_data = "notBreaching" } resource "aws_cloudwatch_metric_alarm" "app_latency_alarm" { for_each = var.performance_noreq_lambdas alarm_name = "${each.value}-latency-high" - alarm_description = "${replace(each.value, var.resource_prefix, "")} Trailing Mean - 95% API gateway latency is > 1.25s for 2 times in 4 minutes." + alarm_description = "${replace(each.value, "${var.resource_prefix}-", "")} Trailing Mean - 95% API gateway latency is > 1.5s for 2 times in 4 minutes." namespace = "AWS/Lambda" metric_name = "UrlRequestLatency" extended_statistic = "tm95" period = "120" evaluation_periods = "2" comparison_operator = "GreaterThanThreshold" - threshold = "1250" + threshold = "1500" alarm_actions = [ var.standard_sns_arn ] @@ -46,7 +47,7 @@ resource "aws_cloudwatch_metric_alarm" "app_latency_alarm" { resource "aws_cloudwatch_metric_alarm" "app_no_requests_alarm" { for_each = var.performance_noreq_lambdas alarm_name = "${each.value}-no-requests" - alarm_description = "${replace(each.value, var.resource_prefix, "")}: no requests have been received in the past 5 minutes." + alarm_description = "${replace(each.value, "${var.resource_prefix}-", "")}: no requests have been received in the past 5 minutes." namespace = "AWS/Lambda" metric_name = "UrlRequestCount" statistic = "Sum" @@ -65,7 +66,7 @@ resource "aws_cloudwatch_metric_alarm" "app_no_requests_alarm" { resource "aws_cloudwatch_metric_alarm" "app_invocation_error_alarm" { for_each = var.all_lambdas alarm_name = "${each.value}-error-invocation" - alarm_description = "${replace(each.value, var.resource_prefix, "")} lambda threw an error, meaning the init of the application itself has encountered an error" + alarm_description = "${replace(each.value, "${var.resource_prefix}-", "")} lambda threw a critical error." namespace = "AWS/Lambda" metric_name = "Errors" statistic = "Sum" @@ -98,3 +99,22 @@ resource "aws_cloudwatch_metric_alarm" "app5xx_error_alarm" { DistributionId = var.main_cloudfront_distribution_id } } + +# firehose alarms +resource "aws_cloudwatch_metric_alarm" "firehost_archival_data_freshness" { + alarm_name = "${var.resource_prefix}-firehose-data-stale" + alarm_description = "Delivery of archival records to S3 is taking longer than 5 minutes." + namespace = "AWS/Firehose" + metric_name = "DeliveryToS3.DataFreshness" + statistic = "Maximum" + period = "300" + evaluation_periods = "1" + comparison_operator = "GreaterThanThreshold" + threshold = "300" + alarm_actions = [ + var.priority_sns_arn + ] + dimensions = { + DeliveryStreamName = var.archival_firehose_stream + } +} diff --git a/terraform/modules/alarms/variables.tf b/terraform/modules/alarms/variables.tf index 6054d87c..b6b8d526 100644 --- a/terraform/modules/alarms/variables.tf +++ b/terraform/modules/alarms/variables.tf @@ -27,3 +27,9 @@ variable "performance_noreq_lambdas" { description = "All Lambda functions to monitor for performance/no requests." type = set(string) } + + +variable "archival_firehose_stream" { + description = "Firehose stream to monitor for data archival job." + type = string +} diff --git a/terraform/modules/archival/main.tf b/terraform/modules/archival/main.tf index 95da6c1e..025222f9 100644 --- a/terraform/modules/archival/main.tf +++ b/terraform/modules/archival/main.tf @@ -1,20 +1,32 @@ data "archive_file" "api_lambda_code" { type = "zip" - source_dir = "${path.module}/../../../src/data-archive" - output_path = "${path.module}/../../../dist/terraform/data-archive.zip" + source_dir = "${path.module}/../../../dist/archival" + output_path = "${path.module}/../../../dist/terraform/archival.zip" } locals { - archive_lambda_name = "${var.ProjectId}-ddb-archival" + dynamo_stream_reader_lambda_name = "${var.ProjectId}-dynamo-archival" + firehose_stream_name = "${var.ProjectId}-archival-stream" } data "aws_caller_identity" "current" {} data "aws_region" "current" {} resource "aws_cloudwatch_log_group" "archive_logs" { - name = "/aws/lambda/${local.archive_lambda_name}" + name = "/aws/lambda/${local.dynamo_stream_reader_lambda_name}" retention_in_days = var.LogRetentionDays } +resource "aws_cloudwatch_log_group" "firehose_logs" { + name = "/aws/kinesisfirehose/${local.firehose_stream_name}" + retention_in_days = var.LogRetentionDays +} + +resource "aws_cloudwatch_log_stream" "firehose_logs_stream" { + log_group_name = aws_cloudwatch_log_group.firehose_logs.name + name = "DataArchivalS3Delivery" +} + + resource "aws_s3_bucket" "this" { bucket = "${var.BucketPrefix}-ddb-archive" } @@ -42,11 +54,41 @@ resource "aws_s3_bucket_lifecycle_configuration" "this" { id = "intelligent-tiering-transition" status = "Enabled" + filter {} + transition { - days = 30 + days = 1 storage_class = "INTELLIGENT_TIERING" } } + + rule { + id = "ExpireNoncurrentVersions" + status = "Enabled" + + filter {} + + noncurrent_version_expiration { + noncurrent_days = 5 + } + } + + dynamic "rule" { + for_each = var.TableDeletionDays + + content { + id = "expire-${rule.key}" + status = "Enabled" + + filter { + prefix = "resource=${rule.key}/" + } + + expiration { + days = rule.value + } + } + } } resource "aws_s3_bucket_intelligent_tiering_configuration" "this" { @@ -61,7 +103,7 @@ resource "aws_s3_bucket_intelligent_tiering_configuration" "this" { resource "aws_iam_role" "archive_role" { - name = "${local.archive_lambda_name}-exec-role" + name = "${local.dynamo_stream_reader_lambda_name}-exec-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ @@ -77,7 +119,7 @@ resource "aws_iam_role" "archive_role" { } resource "aws_iam_policy" "archive_lambda_policy" { - name = "${local.archive_lambda_name}-logging-policy" + name = "${local.dynamo_stream_reader_lambda_name}-logging-policy" policy = jsonencode({ Version = "2012-10-17" Statement = [ @@ -90,13 +132,138 @@ resource "aws_iam_policy" "archive_lambda_policy" { }) } + +data "aws_dynamodb_table" "existing_tables" { + for_each = toset(var.MonitorTables) + name = each.key +} + +resource "aws_lambda_event_source_mapping" "stream_mapping" { + for_each = toset(var.MonitorTables) + function_name = aws_lambda_function.api_lambda.arn + event_source_arn = data.aws_dynamodb_table.existing_tables[each.key].stream_arn + function_response_types = ["ReportBatchItemFailures"] + batch_size = 10 + enabled = true + starting_position = "LATEST" + + filter_criteria { + filter { + pattern = jsonencode({ + userIdentity = { + type = ["Service"] + principalId = ["dynamodb.amazonaws.com"] + } + }) + } + } + + depends_on = [aws_iam_policy.archive_policy] +} + +// firehose + +resource "aws_iam_role" "firehose_role" { + name = "${local.firehose_stream_name}-exec-role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Principal = { + Service = "firehose.amazonaws.com" + } + } + ] + }) +} + +resource "aws_iam_policy" "firehose_policy" { + name = "${local.firehose_stream_name}-s3-policy" + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Action = [ + "s3:AbortMultipartUpload", + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + "s3:ListBucketMultipartUploads", + "s3:PutObject" + ] + Resource = [ + aws_s3_bucket.this.arn, + "${aws_s3_bucket.this.arn}/*" + ] + }, + { + Effect = "Allow" + Action = [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ] + Resource = ["arn:aws:logs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:log-group:/aws/kinesisfirehose/${local.firehose_stream_name}:*"] + } + ] + }) +} + +resource "aws_iam_role_policy_attachment" "firehose_attach" { + role = aws_iam_role.firehose_role.name + policy_arn = aws_iam_policy.firehose_policy.arn +} + +resource "aws_kinesis_firehose_delivery_stream" "dynamic_stream" { + name = local.firehose_stream_name + destination = "extended_s3" + + extended_s3_configuration { + bucket_arn = aws_s3_bucket.this.arn + role_arn = aws_iam_role.firehose_role.arn + buffering_interval = 60 + buffering_size = 64 + compression_format = "GZIP" + + dynamic_partitioning_configuration { + enabled = true + } + + processing_configuration { + enabled = true + processors { + type = "MetadataExtraction" + parameters { + parameter_name = "MetadataExtractionQuery" + parameter_value = "{resource: .__infra_archive_resource, year: (.__infra_archive_timestamp | fromdateiso8601 | strftime(\"%Y\")), month: (.__infra_archive_timestamp | fromdateiso8601 | strftime(\"%m\")), day: (.__infra_archive_timestamp | fromdateiso8601 | strftime(\"%d\"))}" + } + parameters { + parameter_name = "JsonParsingEngine" + parameter_value = "JQ-1.6" + } + } + } + cloudwatch_logging_options { + enabled = true + log_group_name = aws_cloudwatch_log_group.firehose_logs.name + log_stream_name = aws_cloudwatch_log_stream.firehose_logs_stream.name + } + + prefix = "resource=!{partitionKeyFromQuery:resource}/year=!{partitionKeyFromQuery:year}/month=!{partitionKeyFromQuery:month}/day=!{partitionKeyFromQuery:day}/" + error_output_prefix = "firehose-errors/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/" + } +} + resource "aws_iam_role_policy_attachment" "archive_lambda_policy_attach" { role = aws_iam_role.archive_role.name policy_arn = aws_iam_policy.archive_lambda_policy.arn } resource "aws_iam_policy" "archive_policy" { - name = "${local.archive_lambda_name}-ddb-stream-policy" + name = "${local.dynamo_stream_reader_lambda_name}-ddb-stream-policy" policy = jsonencode({ Version = "2012-10-17" @@ -117,14 +284,9 @@ resource "aws_iam_policy" "archive_policy" { { Effect = "Allow" Action = [ - "s3:AbortMultipartUpload", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - "s3:ListBucketMultipartUploads", - "s3:PutObject" + "firehose:PutRecordBatch", ] - Resource = ["arn:aws:s3:::${aws_s3_bucket.this.id}/*", "arn:aws:s3:::${aws_s3_bucket.this.id}"] + Resource = [aws_kinesis_firehose_delivery_stream.dynamic_stream.arn] }, ] ) @@ -138,48 +300,28 @@ resource "aws_iam_role_policy_attachment" "archive_attach" { resource "aws_lambda_function" "api_lambda" { depends_on = [aws_cloudwatch_log_group.archive_logs] - function_name = local.archive_lambda_name + function_name = local.dynamo_stream_reader_lambda_name role = aws_iam_role.archive_role.arn architectures = ["arm64"] - handler = "lambda.handler" - runtime = "python3.13" + handler = "dynamoStream.handler" + runtime = "nodejs22.x" filename = data.archive_file.api_lambda_code.output_path timeout = 90 memory_size = 512 source_code_hash = data.archive_file.api_lambda_code.output_sha256 - description = "DynamoDB stream reader to archive data." + description = "DynamoDB TTL stream to archival firehose." environment { variables = { - "RunEnvironment" = var.RunEnvironment - "DESTINATION_BUCKET" = aws_s3_bucket.this.id + "RunEnvironment" = var.RunEnvironment + "FIREHOSE_STREAM_NAME" = local.firehose_stream_name } } } -data "aws_dynamodb_table" "existing_tables" { - for_each = toset(var.MonitorTables) - name = each.key +output "dynamo_archival_lambda_name" { + value = local.dynamo_stream_reader_lambda_name } -resource "aws_lambda_event_source_mapping" "stream_mapping" { - for_each = toset(var.MonitorTables) - function_name = aws_lambda_function.api_lambda.arn - event_source_arn = data.aws_dynamodb_table.existing_tables[each.key].stream_arn - function_response_types = ["ReportBatchItemFailures"] - batch_size = 10 - enabled = true - starting_position = "LATEST" - - filter_criteria { - filter { - pattern = jsonencode({ - userIdentity = { - type = ["Service"] - principalId = ["dynamodb.amazonaws.com"] - } - }) - } - } - - depends_on = [aws_iam_policy.archive_policy] +output "firehose_stream_name" { + value = local.firehose_stream_name } diff --git a/terraform/modules/archival/variables.tf b/terraform/modules/archival/variables.tf index a4f1670f..af499f06 100644 --- a/terraform/modules/archival/variables.tf +++ b/terraform/modules/archival/variables.tf @@ -7,10 +7,6 @@ variable "BucketPrefix" { type = string } -variable "MonitorTables" { - type = set(string) - description = "DynamoDB to monitor expire events for and archive." -} variable "LogRetentionDays" { type = number @@ -23,3 +19,13 @@ variable "RunEnvironment" { error_message = "The lambda run environment must be dev or prod." } } + +variable "MonitorTables" { + type = set(string) + description = "DynamoDB to monitor expire events for and archive." +} + +variable "TableDeletionDays" { + type = map(number) + description = "Number of days for a given day to hold onto the records once it is put into the bucket." +} diff --git a/terraform/modules/dynamo/main.tf b/terraform/modules/dynamo/main.tf index 09a6bf8a..a784e964 100644 --- a/terraform/modules/dynamo/main.tf +++ b/terraform/modules/dynamo/main.tf @@ -1,25 +1,3 @@ -resource "null_resource" "onetime_events_expiration" { - provisioner "local-exec" { - command = <<-EOT - set -e - python events-expiration.py - EOT - interpreter = ["bash", "-c"] - working_dir = "${path.module}/../../../onetime/" - } -} - -resource "null_resource" "onetime_sl_expiration" { - provisioner "local-exec" { - command = <<-EOT - set -e - python stripelink-expiration.py - EOT - interpreter = ["bash", "-c"] - working_dir = "${path.module}/../../../onetime/" - } -} - resource "aws_dynamodb_table" "app_audit_log" { billing_mode = "PAY_PER_REQUEST" name = "${var.ProjectId}-audit-log" @@ -41,6 +19,8 @@ resource "aws_dynamodb_table" "app_audit_log" { attribute_name = "expireAt" enabled = true } + stream_enabled = true + stream_view_type = "NEW_AND_OLD_IMAGES" } resource "aws_dynamodb_table" "membership_provisioning_log" { @@ -236,6 +216,8 @@ resource "aws_dynamodb_table" "events" { attribute_name = "expiresAt" enabled = true } + stream_enabled = true + stream_view_type = "NEW_AND_OLD_IMAGES" } resource "aws_dynamodb_table" "stripe_links" { diff --git a/tests/unit/archival/handler.test.ts b/tests/unit/archival/handler.test.ts new file mode 100644 index 00000000..6e0dc39e --- /dev/null +++ b/tests/unit/archival/handler.test.ts @@ -0,0 +1,186 @@ + +import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { mockClient } from 'aws-sdk-client-mock'; +import { FirehoseClient, PutRecordBatchCommand } from '@aws-sdk/client-firehose'; +import { marshall } from '@aws-sdk/util-dynamodb'; +import type { DynamoDBStreamEvent, Context } from 'aws-lambda'; + +const firehoseMock = mockClient(FirehoseClient); + +describe('DynamoDB TTL Archiver Lambda Handler', () => { + const MOCK_STREAM_NAME = 'my-test-firehose-stream'; + const MOCK_CONTEXT = {} as Context; + let handler: (event: DynamoDBStreamEvent, context: Context) => Promise; + + const createMockEvent = (records: any[]): DynamoDBStreamEvent => ({ + Records: records.map((record) => ({ + eventName: 'REMOVE', + userIdentity: { principalId: 'dynamodb.amazonaws.com', type: 'Service' }, + eventSourceARN: `arn:aws:dynamodb:us-east-1:123456789012:table/${record.tableName}/stream/2025-01-01T00:00:00.000`, + dynamodb: record.data ? { OldImage: marshall(record.data) } : {}, + ...record.overrides, + })), + }); + + + beforeEach(async () => { + vi.resetModules(); + firehoseMock.reset(); + vi.stubEnv("FIREHOSE_STREAM_NAME", MOCK_STREAM_NAME); + const module = await import('../../../src/archival/dynamoStream.js'); + handler = module.handler; + vi.useFakeTimers(); + vi.setSystemTime(new Date('2025-08-30T10:00:00.000Z')); + vi.spyOn(console, 'info').mockImplementation(() => { }); + vi.spyOn(console, 'warn').mockImplementation(() => { }); + vi.spyOn(console, 'error').mockImplementation(() => { }); + }); + + afterEach(() => { + vi.unstubAllEnvs(); + vi.useRealTimers(); + vi.restoreAllMocks(); + }); + + + it('should process a single TTL record and send it to Firehose', async () => { + firehoseMock.on(PutRecordBatchCommand).resolves({ FailedPutCount: 0 }); + const event = createMockEvent([ + { + tableName: 'some-generic-table', + data: { id: '123', value: 'data' }, + }, + ]); + + await handler(event, MOCK_CONTEXT); + + const commandCalls = firehoseMock.commandCalls(PutRecordBatchCommand); + expect(commandCalls).toHaveLength(1); + const commandInput = commandCalls[0].args[0].input; + + expect(commandInput.DeliveryStreamName).toBe(MOCK_STREAM_NAME); + expect(commandInput.Records).toHaveLength(1); + + const payload = JSON.parse(commandInput.Records![0].Data!.toString()); + expect(payload).toEqual({ + id: '123', + value: 'data', + __infra_archive_resource: 'some-generic-table', + __infra_archive_timestamp: '2025-08-30T10:00:00Z', + }); + }); + + it('should apply custom timestamp mapping for a matching table', async () => { + firehoseMock.on(PutRecordBatchCommand).resolves({ FailedPutCount: 0 }); + const event = createMockEvent([ + { + tableName: 'infra-core-api-room-requests-status', + data: { id: 'req-1', 'createdAt#status': '2025-05-20T18:30:00.123Z#PENDING' }, + }, + { + tableName: 'infra-core-api-audit-log', + data: { id: 'audit-1', createdAt: 1715340600 }, // Corresponds to 2024-05-10T11:30:00.000Z + }, + ]); + + await handler(event, MOCK_CONTEXT); + + const commandCalls = firehoseMock.commandCalls(PutRecordBatchCommand); + expect(commandCalls).toHaveLength(1); + const records = commandCalls[0].args[0].input.Records; + + expect(records).toHaveLength(2); + const payload1 = JSON.parse(records![0].Data!.toString()); + const payload2 = JSON.parse(records![1].Data!.toString()); + + expect(payload1.__infra_archive_timestamp).toBe('2025-05-20T18:30:00Z'); + expect(payload2.__infra_archive_timestamp).toBe('2024-05-10T11:30:00Z'); + }); + + it('should fall back to "now" if a custom timestamp mapper fails', async () => { + firehoseMock.on(PutRecordBatchCommand).resolves({ FailedPutCount: 0 }); + const event = createMockEvent([ + { + tableName: 'infra-core-api-room-requests-status', + data: { id: 'req-1', 'invalid-field': 'some-value' }, + }, + ]); + + await handler(event, MOCK_CONTEXT); + + expect(console.error).toHaveBeenCalledWith( + expect.stringContaining("Failed to extract timestamp for record from infra-core-api-room-requests-status") + ); + + const commandCalls = firehoseMock.commandCalls(PutRecordBatchCommand); + const payload = JSON.parse(commandCalls![0].args![0].input.Records![0].Data!.toString()); + expect(payload.__infra_archive_timestamp).toBe('2025-08-30T10:00:00Z'); + }); + + it('should correctly batch records into chunks of 500 for Firehose', async () => { + firehoseMock.on(PutRecordBatchCommand).resolves({ FailedPutCount: 0 }); + const records = Array.from({ length: 501 }, (_, i) => ({ + tableName: 'large-table', + data: { id: `item-${i}` }, + })); + const event = createMockEvent(records); + + await handler(event, MOCK_CONTEXT); + + const commandCalls = firehoseMock.commandCalls(PutRecordBatchCommand); + expect(commandCalls).toHaveLength(2); + expect(commandCalls[0].args[0].input.Records).toHaveLength(500); + expect(commandCalls[1].args[0].input.Records).toHaveLength(1); + expect(console.info).toHaveBeenCalledWith('Found 501 TTL-expired records to archive.'); + }); + + it('should ignore non-REMOVE events and not call Firehose', async () => { + const event = createMockEvent([ + { + tableName: 'some-table', + data: { id: '1' }, + overrides: { eventName: 'INSERT' }, + }, + ]); + + await handler(event, MOCK_CONTEXT); + + expect(firehoseMock.commandCalls(PutRecordBatchCommand)).toHaveLength(0); + expect(console.info).toHaveBeenCalledWith('No TTL-expired records found in this event.'); + }); + + it('should ignore REMOVE events not from the TTL service', async () => { + const event = createMockEvent([ + { + tableName: 'some-table', + data: { id: '1' }, + overrides: { userIdentity: { principalId: 'some-user', type: 'IAMUser' } }, + }, + ]); + + await handler(event, MOCK_CONTEXT); + + expect(firehoseMock.commandCalls(PutRecordBatchCommand)).toHaveLength(0); + }); + + it('should log an error if Firehose reports failed records but not throw', async () => { + firehoseMock.on(PutRecordBatchCommand).resolves({ FailedPutCount: 5 }); + const event = createMockEvent([{ tableName: 'some-table', data: { id: '1' } }]); + + await handler(event, MOCK_CONTEXT); + + expect(firehoseMock.commandCalls(PutRecordBatchCommand)).toHaveLength(1); + expect(console.error).toHaveBeenCalledWith('Failed to put 5 records to Firehose.'); + }); + + it('should throw an error if the Firehose client throws an exception', async () => { + const firehoseError = new Error('Firehose service is unavailable'); + firehoseMock.on(PutRecordBatchCommand).rejects(firehoseError); + const event = createMockEvent([{ tableName: 'some-table', data: { id: '1' } }]); + + await expect(handler(event, MOCK_CONTEXT)).rejects.toThrow('Firehose service is unavailable'); + + expect(console.error).toHaveBeenCalledWith('Error sending batch to Firehose: Firehose service is unavailable'); + }); + +}); diff --git a/tests/unit/vitest.config.ts b/tests/unit/vitest.config.ts index d52b4f45..a0cfdec4 100644 --- a/tests/unit/vitest.config.ts +++ b/tests/unit/vitest.config.ts @@ -10,8 +10,12 @@ export default defineConfig({ setupFiles: "./tests/unit/vitest.setup.ts", coverage: { provider: "istanbul", - include: ["src/api/**/*.ts", "src/common/**/*.ts"], - exclude: ["src/api/lambda.ts", "src/api/sqs/handlers/templates/*.ts"], + include: ["src/**/*.ts"], + exclude: [ + "src/api/lambda.ts", + "src/api/sqs/handlers/templates/*.ts", + "src/ui/**/*.ts", + ], thresholds: { statements: 50, functions: 60, diff --git a/yarn.lock b/yarn.lock index 85a2aae7..84054475 100644 --- a/yarn.lock +++ b/yarn.lock @@ -124,103 +124,148 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-dynamodb@^3.797.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.859.0.tgz#c43674f332afd5ddfc0779f593760076772aed5a" - integrity sha512-Bt840uICsGcn7IFewif8ARCF0CxtdTx9DX/LfUGRI+SVZcqyeEccmH2JJRRzThtEzKTXr+rCN6yaNB3c4RQY2g== +"@aws-sdk/client-dynamodb@^3.585.0", "@aws-sdk/client-dynamodb@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.879.0.tgz#03f1ba40396af226e5ea43f1d1f70a511f3ca600" + integrity sha512-wY4DWuDyk8Lni+bMhx5+Ka7EbK1ZtV/AZqK6KmDAIWNNhfL/wL5BiFTgqDhFcEMZgAfxoqu3VuUrZLwepKqSxA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.858.0" - "@aws-sdk/credential-provider-node" "3.859.0" - "@aws-sdk/middleware-endpoint-discovery" "3.840.0" - "@aws-sdk/middleware-host-header" "3.840.0" - "@aws-sdk/middleware-logger" "3.840.0" - "@aws-sdk/middleware-recursion-detection" "3.840.0" - "@aws-sdk/middleware-user-agent" "3.858.0" - "@aws-sdk/region-config-resolver" "3.840.0" - "@aws-sdk/types" "3.840.0" - "@aws-sdk/util-endpoints" "3.848.0" - "@aws-sdk/util-user-agent-browser" "3.840.0" - "@aws-sdk/util-user-agent-node" "3.858.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.7.2" - "@smithy/fetch-http-handler" "^5.1.0" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.17" - "@smithy/middleware-retry" "^4.1.18" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.1.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-endpoint-discovery" "3.873.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.25" - "@smithy/util-defaults-mode-node" "^4.0.25" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" "@smithy/util-utf8" "^4.0.0" - "@smithy/util-waiter" "^4.0.6" + "@smithy/util-waiter" "^4.0.7" "@types/uuid" "^9.0.1" tslib "^2.6.2" uuid "^9.0.1" -"@aws-sdk/client-lambda@^3.835.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.859.0.tgz#b9146504cfbdd4994b4c0a91fa0c5d28b3583c44" - integrity sha512-p9/6TrAESLLajn9ytJs6S6ErXyyEbxlO6v44oPXiDeNRKVQxevkG+brAfHDmh7dZk9EQkmyp5AWqo1dZrpkhdg== +"@aws-sdk/client-firehose@^3.585.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-firehose/-/client-firehose-3.879.0.tgz#882f0e198698ceb2923ed7bcbf78ce46ba3c19e2" + integrity sha512-Sfp75qTUJ1mdTYrDhi4TVHoDrc1KkkzujYy7DHa+nfwgkigD9VvkE0Mcv2g0LCTIRVtIuYkF+C88LSqoxyWOHQ== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.858.0" - "@aws-sdk/credential-provider-node" "3.859.0" - "@aws-sdk/middleware-host-header" "3.840.0" - "@aws-sdk/middleware-logger" "3.840.0" - "@aws-sdk/middleware-recursion-detection" "3.840.0" - "@aws-sdk/middleware-user-agent" "3.858.0" - "@aws-sdk/region-config-resolver" "3.840.0" - "@aws-sdk/types" "3.840.0" - "@aws-sdk/util-endpoints" "3.848.0" - "@aws-sdk/util-user-agent-browser" "3.840.0" - "@aws-sdk/util-user-agent-node" "3.858.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.7.2" - "@smithy/eventstream-serde-browser" "^4.0.4" - "@smithy/eventstream-serde-config-resolver" "^4.1.2" - "@smithy/eventstream-serde-node" "^4.0.4" - "@smithy/fetch-http-handler" "^5.1.0" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.17" - "@smithy/middleware-retry" "^4.1.18" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.1.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.25" - "@smithy/util-defaults-mode-node" "^4.0.25" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" - "@smithy/util-stream" "^4.2.3" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" "@smithy/util-utf8" "^4.0.0" - "@smithy/util-waiter" "^4.0.6" + tslib "^2.6.2" + +"@aws-sdk/client-lambda@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.879.0.tgz#2c682245dc7fb46d759a10064c93a3fde5b411b6" + integrity sha512-o7MD029B6DPNniiHyeMuxII3/YAfOQo+VxVN3mj3L8KWBKKD2cweGVYUg6seJNl9zMC5ruF8mI46QynXAJirfg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/eventstream-serde-browser" "^4.0.5" + "@smithy/eventstream-serde-config-resolver" "^4.1.3" + "@smithy/eventstream-serde-node" "^4.0.5" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" + "@smithy/util-stream" "^4.2.4" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.7" tslib "^2.6.2" "@aws-sdk/client-secrets-manager@^3.859.0": @@ -270,96 +315,96 @@ tslib "^2.6.2" uuid "^9.0.1" -"@aws-sdk/client-ses@^3.797.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ses/-/client-ses-3.859.0.tgz#586fce51681a40bbae7bc0f0cd96e5d3a5895550" - integrity sha512-ek+4EfDjSxl5spTuNp/BmViiipmtLWyDqoQZZwGaISiSJA5x1G5kDa28GnO92e+3jcPLjrJY8Q0P/CWrHJz/vQ== +"@aws-sdk/client-ses@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ses/-/client-ses-3.879.0.tgz#ac49fc7b2fb5fa8e2d3354e5d0f08481f21eea5d" + integrity sha512-6yydcKf01tXAIsya5YBOcznvGN4DN8crLEuYC0jwG+67loCeq2HZMO1rL3ouaIllCSgmO0l7KHDK62BQr3Z3Zg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.858.0" - "@aws-sdk/credential-provider-node" "3.859.0" - "@aws-sdk/middleware-host-header" "3.840.0" - "@aws-sdk/middleware-logger" "3.840.0" - "@aws-sdk/middleware-recursion-detection" "3.840.0" - "@aws-sdk/middleware-user-agent" "3.858.0" - "@aws-sdk/region-config-resolver" "3.840.0" - "@aws-sdk/types" "3.840.0" - "@aws-sdk/util-endpoints" "3.848.0" - "@aws-sdk/util-user-agent-browser" "3.840.0" - "@aws-sdk/util-user-agent-node" "3.858.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.7.2" - "@smithy/fetch-http-handler" "^5.1.0" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.17" - "@smithy/middleware-retry" "^4.1.18" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.1.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.25" - "@smithy/util-defaults-mode-node" "^4.0.25" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" "@smithy/util-utf8" "^4.0.0" - "@smithy/util-waiter" "^4.0.6" + "@smithy/util-waiter" "^4.0.7" tslib "^2.6.2" -"@aws-sdk/client-sqs@^3.797.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.859.0.tgz#bcdc5ca03e8a3b0508326c48ac58d18f67a2c42d" - integrity sha512-u019wKVqtk6RxINTaTCpV0p7o5cun0aZSlhs1JNYGFHtSRUjxqbhRIMzkTZgUkABUwkbmPg4k72YlE/N17zdSw== +"@aws-sdk/client-sqs@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.879.0.tgz#c1898c97d5c9442848c0ed9c897cfd2e8c1d27d5" + integrity sha512-xZWFPtRcWENW7KQqV/BblNW/poZhDkRV2rkl/eZ3M2hiNOX7PdaI5dk4BtjYjcilBP3Nt5b2n8dUpiDlBnh43w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.858.0" - "@aws-sdk/credential-provider-node" "3.859.0" - "@aws-sdk/middleware-host-header" "3.840.0" - "@aws-sdk/middleware-logger" "3.840.0" - "@aws-sdk/middleware-recursion-detection" "3.840.0" - "@aws-sdk/middleware-sdk-sqs" "3.857.0" - "@aws-sdk/middleware-user-agent" "3.858.0" - "@aws-sdk/region-config-resolver" "3.840.0" - "@aws-sdk/types" "3.840.0" - "@aws-sdk/util-endpoints" "3.848.0" - "@aws-sdk/util-user-agent-browser" "3.840.0" - "@aws-sdk/util-user-agent-node" "3.858.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.7.2" - "@smithy/fetch-http-handler" "^5.1.0" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/md5-js" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.17" - "@smithy/middleware-retry" "^4.1.18" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.1.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-sdk-sqs" "3.879.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/md5-js" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.25" - "@smithy/util-defaults-mode-node" "^4.0.25" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" @@ -407,48 +452,92 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@^3.797.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.859.0.tgz#8830e0db75679f2c67091f64c75d0af59f743421" - integrity sha512-pWZGAmg26/45lrUw3oEzLf+YIHy1C9x3fFyy/mtQe0AtDsJX+7r4OJ7AToZHS/qZbkoUb9AbA5Y/jG4nEhCILw== +"@aws-sdk/client-sso@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz#44b7bcc051af7e89ffff7346bd5f5b0672b48390" + integrity sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.858.0" - "@aws-sdk/credential-provider-node" "3.859.0" - "@aws-sdk/middleware-host-header" "3.840.0" - "@aws-sdk/middleware-logger" "3.840.0" - "@aws-sdk/middleware-recursion-detection" "3.840.0" - "@aws-sdk/middleware-user-agent" "3.858.0" - "@aws-sdk/region-config-resolver" "3.840.0" - "@aws-sdk/types" "3.840.0" - "@aws-sdk/util-endpoints" "3.848.0" - "@aws-sdk/util-user-agent-browser" "3.840.0" - "@aws-sdk/util-user-agent-node" "3.858.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.7.2" - "@smithy/fetch-http-handler" "^5.1.0" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.17" - "@smithy/middleware-retry" "^4.1.18" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.1.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.25" - "@smithy/util-defaults-mode-node" "^4.0.25" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.879.0.tgz#38abb441b86a05d625d338b7558487d95b4946f2" + integrity sha512-1VboQslwT/ZkgnG4VOoWwCIxkbiBmqc8yJ/3c8p01BQGuMSQQmRRzX1eBr2M7GWOUy5a+f9ND8w+viKihY110g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-node" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" @@ -473,6 +562,27 @@ fast-xml-parser "5.2.5" tslib "^2.6.2" +"@aws-sdk/core@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.879.0.tgz#c6ee6b927347b2f89419bfbff77844cdff2b8c10" + integrity sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA== + dependencies: + "@aws-sdk/types" "3.862.0" + "@aws-sdk/xml-builder" "3.873.0" + "@smithy/core" "^3.9.0" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/property-provider" "^4.0.5" + "@smithy/protocol-http" "^5.1.3" + "@smithy/signature-v4" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-utf8" "^4.0.0" + fast-xml-parser "5.2.5" + tslib "^2.6.2" + "@aws-sdk/credential-provider-env@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.858.0.tgz#6dd149bbf7334be11fafdce4cd238db9c32cb6cd" @@ -484,6 +594,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-env@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz#8de1561de6de585bffb8b7ff13ec7a88cb696de6" + integrity sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/property-provider" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-http@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.858.0.tgz#b384babaa45814a9f8aff29d88185ef592deabac" @@ -500,6 +621,22 @@ "@smithy/util-stream" "^4.2.3" tslib "^2.6.2" +"@aws-sdk/credential-provider-http@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz#d01b8d32f27c25fd27fb92758b0f0470223df7a9" + integrity sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/property-provider" "^4.0.5" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/util-stream" "^4.2.4" + tslib "^2.6.2" + "@aws-sdk/credential-provider-ini@3.859.0": version "3.859.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz#b38a554a894e734eb6fb5bf49aba39284d2f9201" @@ -519,6 +656,25 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-ini@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz#67a2ad53b37f2d713bb49cbfcc7283fccdc140b9" + integrity sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/credential-provider-env" "3.879.0" + "@aws-sdk/credential-provider-http" "3.879.0" + "@aws-sdk/credential-provider-process" "3.879.0" + "@aws-sdk/credential-provider-sso" "3.879.0" + "@aws-sdk/credential-provider-web-identity" "3.879.0" + "@aws-sdk/nested-clients" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/credential-provider-imds" "^4.0.7" + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-node@3.859.0": version "3.859.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz#a05c269a2dc8a1676eca9086d11cfea142cb4958" @@ -537,6 +693,24 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-node@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz#379a7edadd8fdfe72fe768d44ee323871b80a2f9" + integrity sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA== + dependencies: + "@aws-sdk/credential-provider-env" "3.879.0" + "@aws-sdk/credential-provider-http" "3.879.0" + "@aws-sdk/credential-provider-ini" "3.879.0" + "@aws-sdk/credential-provider-process" "3.879.0" + "@aws-sdk/credential-provider-sso" "3.879.0" + "@aws-sdk/credential-provider-web-identity" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/credential-provider-imds" "^4.0.7" + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.858.0.tgz#80583aa76d04643e9ed5c6cb47aab1fc81138dd8" @@ -549,6 +723,18 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-process@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz#7db16b740833005758e60c6c7f18a49a635dc700" + integrity sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-sso@3.859.0": version "3.859.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz#8c369be3913b51ce6ea620d68ad7f280bcdae829" @@ -563,6 +749,20 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-sso@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz#a9891cb0d74ab8e665e08b84c6caf1be55db87c8" + integrity sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ== + dependencies: + "@aws-sdk/client-sso" "3.879.0" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/token-providers" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/credential-provider-web-identity@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.858.0.tgz#9fc99ef87fa0a39f6a87c95c2134b799fc4e54c9" @@ -575,33 +775,45 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/crt-loader@3.858.0": - version "3.858.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/crt-loader/-/crt-loader-3.858.0.tgz#9b0f4e6c21a48bc63e63ebab14c37add92d0af82" - integrity sha512-IGhqH0fTQJ3aLOVOZf+UqtFklsKGUmvXBJIW/TY/84hEFAtbVEZJv33MOMjYRcrntxC5deBtcFtUVpqY62I2Ow== +"@aws-sdk/credential-provider-web-identity@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz#743bf63f85370ec98df67987e36b131ae0854b6b" + integrity sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg== dependencies: - "@aws-sdk/util-user-agent-node" "3.858.0" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/nested-clients" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/property-provider" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + +"@aws-sdk/crt-loader@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/crt-loader/-/crt-loader-3.879.0.tgz#dd054b56384c99f35575fa0b9e2cbb067ed4ab13" + integrity sha512-OqAb+VopEKEp3Jie0kFI9jqJ6xzKKt/A3YHldX1CP/qo/P5+l/K1KeFQvw+VbQl5yndD7nwCEP1s5GL/qBigBQ== + dependencies: + "@aws-sdk/util-user-agent-node" "3.879.0" aws-crt "^1.24.0" tslib "^2.6.2" -"@aws-sdk/endpoint-cache@3.804.0": - version "3.804.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.804.0.tgz#4192196aa3e9f6cef8b0967a2c493648d38c627c" - integrity sha512-TQVDkA/lV6ua75ELZaichMzlp6x7tDa1bqdy/+0ZftmODPtKXuOOEcJxmdN7Ui/YRo1gkRz2D9txYy7IlNg1Og== +"@aws-sdk/endpoint-cache@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.873.0.tgz#f0b271d43210924731b15feebc13d9252a567f96" + integrity sha512-EHd+5bSp/hZc78SMq9cUCIsX0B4ekZtFUVSSLEXyYv8x/nHFTnTqN9TsxV8bjlztR3aSUeoKSk5qxu/dVGgiQw== dependencies: mnemonist "0.38.3" tslib "^2.6.2" -"@aws-sdk/middleware-endpoint-discovery@3.840.0": - version "3.840.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.840.0.tgz#0db23aa407723f839e1b42b4f535ff50dfeaa347" - integrity sha512-IJDShY5NOg9luTE8h4o2Bm+gsPnHIU0tVWCjMz8vZMLevYjKdIsatcXiu3huTOjKSnelzC9fBHfU6KKsHmjjBQ== +"@aws-sdk/middleware-endpoint-discovery@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.873.0.tgz#aecb0ca137167b0ff23eb39f0f7aca7509af1629" + integrity sha512-qKQocn1MzaLS9dt5xt3MvQsZaQzRsmOFdazWXkMup1AtFrULSUklsbHjm5fg5xyFPN8ipNzPi+MCXcgPzfpKkg== dependencies: - "@aws-sdk/endpoint-cache" "3.804.0" - "@aws-sdk/types" "3.840.0" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/protocol-http" "^5.1.2" - "@smithy/types" "^4.3.1" + "@aws-sdk/endpoint-cache" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" tslib "^2.6.2" "@aws-sdk/middleware-host-header@3.840.0": @@ -614,6 +826,16 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-host-header@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz#81e9c2f61674b96337472bcaefd85ce3b7a24f7b" + integrity sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA== + dependencies: + "@aws-sdk/types" "3.862.0" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/middleware-logger@3.840.0": version "3.840.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz#d92ade1817ac7dc78a3567c1239bb1a3f3b1b57a" @@ -623,6 +845,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-logger@3.876.0": + version "3.876.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz#16ee45f7bcd887badc8f12d80eef9ba18a0ac97c" + integrity sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA== + dependencies: + "@aws-sdk/types" "3.862.0" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/middleware-recursion-detection@3.840.0": version "3.840.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz#8ea2c00af258db0b64ea394e044cedb6101b5ffd" @@ -633,6 +864,16 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-recursion-detection@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz#1f9086542800d355d85332acea7accf1856e408b" + integrity sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg== + dependencies: + "@aws-sdk/types" "3.862.0" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/middleware-sdk-s3@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.858.0.tgz#48eae3b04e97ec448f57449001fe4ddfd9ba5ffb" @@ -653,14 +894,34 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-sqs@3.857.0": - version "3.857.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.857.0.tgz#19352f27d5f2b0adfafc8811fcc2ff2b3bcc9f5d" - integrity sha512-m2CyA7Qhesqkx5esqkwYsb6M16Ny5HX/x38A1/qCdAxYAdkmD3mZoHaXHSb4L6kg/HCPkbxxZO8db1xm4P8t1w== +"@aws-sdk/middleware-sdk-s3@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz#41fe59a1d902ae1c92731c7ef8aa0e1df2d6dfe0" + integrity sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-arn-parser" "3.873.0" + "@smithy/core" "^3.9.0" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/protocol-http" "^5.1.3" + "@smithy/signature-v4" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-stream" "^4.2.4" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-sdk-sqs@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.879.0.tgz#e22590fb11086b8855d1d16c615846c2f893d4a8" + integrity sha512-X/EwCU6AUF9ts67lgUBfg658WhsGn965R4Jm27WYJsxv7BRTDtVoyMvaof3GAUKAzJPGoEKr5ekX38wE6tS0gA== dependencies: - "@aws-sdk/types" "3.840.0" - "@smithy/smithy-client" "^4.4.9" - "@smithy/types" "^4.3.1" + "@aws-sdk/types" "3.862.0" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" "@smithy/util-hex-encoding" "^4.0.0" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" @@ -678,6 +939,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-user-agent@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz#e207d6ae2a82059d843200d92a2f7ccbaa3cbc67" + integrity sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@smithy/core" "^3.9.0" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/nested-clients@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.858.0.tgz#171466f44a65818b6233fd38dae6116344bd4401" @@ -722,6 +996,50 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@aws-sdk/nested-clients@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz#478f7c54c26d40dc564747a1caa6b2d10c1ba471" + integrity sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.879.0" + "@aws-sdk/middleware-host-header" "3.873.0" + "@aws-sdk/middleware-logger" "3.876.0" + "@aws-sdk/middleware-recursion-detection" "3.873.0" + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/region-config-resolver" "3.873.0" + "@aws-sdk/types" "3.862.0" + "@aws-sdk/util-endpoints" "3.879.0" + "@aws-sdk/util-user-agent-browser" "3.873.0" + "@aws-sdk/util-user-agent-node" "3.879.0" + "@smithy/config-resolver" "^4.1.5" + "@smithy/core" "^3.9.0" + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/hash-node" "^4.0.5" + "@smithy/invalid-dependency" "^4.0.5" + "@smithy/middleware-content-length" "^4.0.5" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-retry" "^4.1.20" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/protocol-http" "^5.1.3" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.27" + "@smithy/util-defaults-mode-node" "^4.0.27" + "@smithy/util-endpoints" "^3.0.7" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@aws-sdk/region-config-resolver@3.840.0": version "3.840.0" resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz#240690ead3131c4c47186b4929776439fe2f6729" @@ -734,18 +1052,30 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" -"@aws-sdk/signature-v4-crt@^3.796.0": - version "3.858.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.858.0.tgz#86a3533bda82b1bb3092e4c2bad08d205335b661" - integrity sha512-LU5kACHicznf3d/wdmLUUBbv0J53OVAq/A+Vsz340i/1At7mmf2fRpjiVJuCoUAbAh+uEe82qp7N6xXP9Yu4sA== +"@aws-sdk/region-config-resolver@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz#9a5ddf8aa5a068d1c728dda3ef7e5b31561f7419" + integrity sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg== dependencies: - "@aws-sdk/crt-loader" "3.858.0" - "@aws-sdk/signature-v4-multi-region" "3.858.0" - "@aws-sdk/types" "3.840.0" - "@smithy/querystring-parser" "^4.0.4" - "@smithy/signature-v4" "^5.1.2" - "@smithy/types" "^4.3.1" - "@smithy/util-middleware" "^4.0.4" + "@aws-sdk/types" "3.862.0" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/types" "^4.3.2" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + tslib "^2.6.2" + +"@aws-sdk/signature-v4-crt@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.879.0.tgz#02ed9d6717055e09c85096c9988eb80a2d4d3e1d" + integrity sha512-Xrl6blxa+NEtnbMAfkcUCd7HlgJkcQ0/dDkxnoIa9n+U/ZldVpOSQEwjiM06dyTJf0pyA1LoHakPQOA8EYv2Vg== + dependencies: + "@aws-sdk/crt-loader" "3.879.0" + "@aws-sdk/signature-v4-multi-region" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/querystring-parser" "^4.0.5" + "@smithy/signature-v4" "^5.1.3" + "@smithy/types" "^4.3.2" + "@smithy/util-middleware" "^4.0.5" tslib "^2.6.2" "@aws-sdk/signature-v4-multi-region@3.858.0": @@ -760,6 +1090,18 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/signature-v4-multi-region@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz#ce164fe2a7f417bf341237ca017973d79910ecba" + integrity sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/protocol-http" "^5.1.3" + "@smithy/signature-v4" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/token-providers@3.859.0": version "3.859.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz#7da5352d45bb8f684279afecec134a1d9d92866f" @@ -773,6 +1115,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/token-providers@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz#7c2806f23dc740853da6fe6b7d8a76ef19d4b428" + integrity sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw== + dependencies: + "@aws-sdk/core" "3.879.0" + "@aws-sdk/nested-clients" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/types@3.840.0", "@aws-sdk/types@^3.222.0": version "3.840.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.840.0.tgz#aadc6843d5c1f24b3d1d228059e702a355bf07c3" @@ -781,6 +1136,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/types@3.862.0": + version "3.862.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.862.0.tgz#2f5622e1aa3a5281d4f419f5d2c90f87dd5ff0cf" + integrity sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/util-arn-parser@3.804.0": version "3.804.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz#d0b52bf5f9ae5b2c357a635551e5844dcad074c8" @@ -788,10 +1151,17 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-dynamodb@^3.797.0": - version "3.859.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.859.0.tgz#a98e2855926570025f19e46a43513701433a4ac6" - integrity sha512-NsV8PoPg0dq3TkAMiFF2J31k+AZa3ibB5ChpffNrboRhlISQyUZiWJV5Pv6lMKDKyo8TkRhxAoQDUr9spNs2cg== +"@aws-sdk/util-arn-parser@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz#12c5ea852574dfb6fe78eaac1666433dff1acffa" + integrity sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-dynamodb@^3.585.0", "@aws-sdk/util-dynamodb@^3.859.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.879.0.tgz#ee1bb187344ef993641a326a420b25b4089f5517" + integrity sha512-KyzsV7mv6Kz9udz16AEeutYzl4++rg0oTeMJLiSZ9TcI7DiZYiJLr8oRWRKyvXpP4/30HQhhW2ycJPHQoTHprA== dependencies: tslib "^2.6.2" @@ -806,6 +1176,17 @@ "@smithy/util-endpoints" "^3.0.6" tslib "^2.6.2" +"@aws-sdk/util-endpoints@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz#e30c15beede883d327dbd290c47512d6d700a2e9" + integrity sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A== + dependencies: + "@aws-sdk/types" "3.862.0" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + "@smithy/util-endpoints" "^3.0.7" + tslib "^2.6.2" + "@aws-sdk/util-locate-window@^3.0.0": version "3.804.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz#a2ee8dc5d9c98276986e8e1ba03c0c84d9afb0f5" @@ -823,6 +1204,16 @@ bowser "^2.11.0" tslib "^2.6.2" +"@aws-sdk/util-user-agent-browser@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz#0fcc3c1877ae74aa692cc0b4ad874bc9a6ee1ad6" + integrity sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA== + dependencies: + "@aws-sdk/types" "3.862.0" + "@smithy/types" "^4.3.2" + bowser "^2.11.0" + tslib "^2.6.2" + "@aws-sdk/util-user-agent-node@3.858.0": version "3.858.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.858.0.tgz#bdf767443486371f1c7432dd4d1e178f8a45074c" @@ -834,6 +1225,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/util-user-agent-node@3.879.0": + version "3.879.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz#e14001b5fd08d14dab2dd12d08ecd1322ec99615" + integrity sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ== + dependencies: + "@aws-sdk/middleware-user-agent" "3.879.0" + "@aws-sdk/types" "3.862.0" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@aws-sdk/util-utf8-browser@^3.259.0": version "3.259.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" @@ -849,6 +1251,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/xml-builder@3.873.0": + version "3.873.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz#b5a3acfdeecfc1b7fee8a7773cb2a45590eb5701" + integrity sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@azure/msal-browser@^4.11.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.18.0.tgz#ea11137669916f6aca67448a424e029417fc99de" @@ -1354,7 +1764,7 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/compat@^1.3.2": +"@eslint/compat@^1.2.8", "@eslint/compat@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.3.2.tgz#1a8766e447fad3d091b1a88b9f78f867832285b7" integrity sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA== @@ -2108,6 +2518,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/abort-controller@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.5.tgz#2872a12d0f11dfdcc4254b39566d5f24ab26a4ab" + integrity sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/config-resolver@^4.1.4": version "4.1.4" resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.1.4.tgz#05d8eab8bb8eb73bec90c222fc19ac5608b1384e" @@ -2119,6 +2537,17 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" +"@smithy/config-resolver@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.1.5.tgz#3cb7cde8d13ca64630e5655812bac9ffe8182469" + integrity sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw== + dependencies: + "@smithy/node-config-provider" "^4.1.4" + "@smithy/types" "^4.3.2" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + tslib "^2.6.2" + "@smithy/core@^3.7.2": version "3.7.2" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.7.2.tgz#ae21591dbb983df7d986cc984123cf43f64e3a5a" @@ -2134,6 +2563,23 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/core@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.9.0.tgz#0d0c05136143d5207afc7bbed2367b6baf8de388" + integrity sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A== + dependencies: + "@smithy/middleware-serde" "^4.0.9" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-stream" "^4.2.4" + "@smithy/util-utf8" "^4.0.0" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + "@smithy/credential-provider-imds@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz#4cfd79a619cdbc9a75fcdc51a1193685f6a8944e" @@ -2145,49 +2591,60 @@ "@smithy/url-parser" "^4.0.4" tslib "^2.6.2" -"@smithy/eventstream-codec@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz#35abc26d6829cc61a0d14950857ccc5320bf92d2" - integrity sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig== +"@smithy/credential-provider-imds@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz#d8bb566ffd8d9e556810b83d6e0b01b39036b810" + integrity sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw== + dependencies: + "@smithy/node-config-provider" "^4.1.4" + "@smithy/property-provider" "^4.0.5" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz#e742a4badaaf985ac9abcf4283ff4c39d7e48438" + integrity sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^4.3.1" + "@smithy/types" "^4.3.2" "@smithy/util-hex-encoding" "^4.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz#0c57cf0b66862106100a796751003733ce3f5273" - integrity sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA== +"@smithy/eventstream-serde-browser@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz#fbebe76edf542d656fe3b187ac6b1e47a63f735f" + integrity sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ== dependencies: - "@smithy/eventstream-serde-universal" "^4.0.4" - "@smithy/types" "^4.3.1" + "@smithy/eventstream-serde-universal" "^4.0.5" + "@smithy/types" "^4.3.2" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz#4d41c1ecad1a9b1c694f32865a2f0d4b5bc0162d" - integrity sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ== +"@smithy/eventstream-serde-config-resolver@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz#59a01611feaef9830da592bf726ee8eef4f2c11d" + integrity sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA== dependencies: - "@smithy/types" "^4.3.1" + "@smithy/types" "^4.3.2" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz#0fbd0ac288f02bf485eb307a14254ea8d8767746" - integrity sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w== +"@smithy/eventstream-serde-node@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz#44f962898cfb3de806725ea5d88e904c7f3955d7" + integrity sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g== dependencies: - "@smithy/eventstream-serde-universal" "^4.0.4" - "@smithy/types" "^4.3.1" + "@smithy/eventstream-serde-universal" "^4.0.5" + "@smithy/types" "^4.3.2" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz#48b2b416dc0f576917c36373efaa4012f7310ab0" - integrity sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA== +"@smithy/eventstream-serde-universal@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz#ec34b9999c7db3e057d67acb14ec0c8627c7ae2e" + integrity sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw== dependencies: - "@smithy/eventstream-codec" "^4.0.4" - "@smithy/types" "^4.3.1" + "@smithy/eventstream-codec" "^4.0.5" + "@smithy/types" "^4.3.2" tslib "^2.6.2" "@smithy/fetch-http-handler@^5.1.0": @@ -2201,6 +2658,17 @@ "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" +"@smithy/fetch-http-handler@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz#a444c99bffdf314deb447370429cc3e719f1a866" + integrity sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ== + dependencies: + "@smithy/protocol-http" "^5.1.3" + "@smithy/querystring-builder" "^4.0.5" + "@smithy/types" "^4.3.2" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + "@smithy/hash-node@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.4.tgz#f867cfe6b702ed8893aacd3e097f8ca8ecba579e" @@ -2211,6 +2679,16 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/hash-node@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.5.tgz#16cf8efe42b8b611b1f56f78464b97b27ca6a3ec" + integrity sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ== + dependencies: + "@smithy/types" "^4.3.2" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/invalid-dependency@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz#8c2c539b2f22e857b4652bd2427a3d7a8befd610" @@ -2219,6 +2697,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/invalid-dependency@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz#ed88e209668266b09c4b501f9bd656728b5ece60" + integrity sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/is-array-buffer@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" @@ -2233,12 +2719,12 @@ dependencies: tslib "^2.6.2" -"@smithy/md5-js@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.4.tgz#d7cb70b08c2a4d809d5cb905feab74fc9726a2f2" - integrity sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg== +"@smithy/md5-js@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.5.tgz#77216159386050dbcf6b58f16f4ac14ac5183474" + integrity sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA== dependencies: - "@smithy/types" "^4.3.1" + "@smithy/types" "^4.3.2" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" @@ -2251,6 +2737,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/middleware-content-length@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz#c5d6e47f5a9fbba20433602bec9bffaeeb821ff3" + integrity sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ== + dependencies: + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/middleware-endpoint@^4.1.17": version "4.1.17" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz#d6a87ccf5fe6a6edc5fe01832338854feaf18a12" @@ -2265,6 +2760,20 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" +"@smithy/middleware-endpoint@^4.1.19": + version "4.1.19" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz#613b843a274b7511862a73867b44cafe8a0a0d3c" + integrity sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ== + dependencies: + "@smithy/core" "^3.9.0" + "@smithy/middleware-serde" "^4.0.9" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + "@smithy/url-parser" "^4.0.5" + "@smithy/util-middleware" "^4.0.5" + tslib "^2.6.2" + "@smithy/middleware-retry@^4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz#4d57587722c341822cf8c58790f843008fef0f8e" @@ -2280,6 +2789,22 @@ tslib "^2.6.2" uuid "^9.0.1" +"@smithy/middleware-retry@^4.1.20": + version "4.1.20" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.20.tgz#7fa8617b424f813ab71025712094e61e0f31b0a3" + integrity sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q== + dependencies: + "@smithy/node-config-provider" "^4.1.4" + "@smithy/protocol-http" "^5.1.3" + "@smithy/service-error-classification" "^4.0.7" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-retry" "^4.0.7" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + "@smithy/middleware-serde@^4.0.8": version "4.0.8" resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz#3704c8cc46acd0a7f910a78ee1d2f23ce928701f" @@ -2289,6 +2814,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/middleware-serde@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz#71213158bb11c1d632829001ca3f233323fb2a7c" + integrity sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg== + dependencies: + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/middleware-stack@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz#58e0c6a0d7678c6ad4d6af8dd9a00f749ffac7c5" @@ -2297,6 +2831,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/middleware-stack@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz#577050d4c0afe816f1ea85f335b2ef64f73e4328" + integrity sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/node-config-provider@^4.1.3": version "4.1.3" resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz#6626fe26c6fe7b0df34f71cb72764ccba414a815" @@ -2307,6 +2849,16 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/node-config-provider@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz#42f231b7027e5a7ce003fd80180e586fe814944a" + integrity sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w== + dependencies: + "@smithy/property-provider" "^4.0.5" + "@smithy/shared-ini-file-loader" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/node-http-handler@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz#6b528cd0da0c35755b34afba207b7db972b0eb92" @@ -2318,6 +2870,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/node-http-handler@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz#dd806d9e08b6e73125040dd0808ab56d16a178e9" + integrity sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw== + dependencies: + "@smithy/abort-controller" "^4.0.5" + "@smithy/protocol-http" "^5.1.3" + "@smithy/querystring-builder" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/property-provider@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.4.tgz#303a8fd99665fff61eeb6ec3922eee53838962c5" @@ -2326,6 +2889,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/property-provider@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.5.tgz#d3b368b31d5b130f4c30cc0c91f9ebb28d9685fc" + integrity sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/protocol-http@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.1.2.tgz#8094860c2407f250b80c95899e0385112d6eb98b" @@ -2334,6 +2905,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/protocol-http@^5.1.3": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.1.3.tgz#86855b528c0e4cb9fa6fb4ed6ba3cdf5960f88f4" + integrity sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/querystring-builder@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz#f7546efd59d457b3d2525a330c6137e5f907864c" @@ -2343,6 +2922,15 @@ "@smithy/util-uri-escape" "^4.0.0" tslib "^2.6.2" +"@smithy/querystring-builder@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz#158ae170f8ec2d8af6b84cdaf774205a7dfacf68" + integrity sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A== + dependencies: + "@smithy/types" "^4.3.2" + "@smithy/util-uri-escape" "^4.0.0" + tslib "^2.6.2" + "@smithy/querystring-parser@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz#307ab95ee5f1a142ab46c2eddebeae68cb2f703d" @@ -2351,6 +2939,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/querystring-parser@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz#95706e56aa769f09dc8922d1b19ffaa06946e252" + integrity sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/service-error-classification@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz#5d4d3017f5b62258fbfc1067e14198e125a8286c" @@ -2358,6 +2954,13 @@ dependencies: "@smithy/types" "^4.3.1" +"@smithy/service-error-classification@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz#24072198a8c110d29677762162a5096e29eb4862" + integrity sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg== + dependencies: + "@smithy/types" "^4.3.2" + "@smithy/shared-ini-file-loader@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz#33c63468b95cfd5e7d642c8131d7acc034025e00" @@ -2366,6 +2969,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/shared-ini-file-loader@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz#8d8a493276cd82a7229c755bef8d375256c5ebb9" + integrity sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/signature-v4@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.1.2.tgz#5afd9d428bd26bb660bee8075b6e89fe93600c22" @@ -2380,6 +2991,20 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/signature-v4@^5.1.3": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.1.3.tgz#92a4f6e9ce66730eeb0d996cd0478c5cbaf5b3f5" + integrity sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.5" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/smithy-client@^4.4.9": version "4.4.9" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.4.9.tgz#973875a750908266aaf5f73c0714016b7e883609" @@ -2393,6 +3018,19 @@ "@smithy/util-stream" "^4.2.3" tslib "^2.6.2" +"@smithy/smithy-client@^4.5.0": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.5.0.tgz#d8663d757d590a5049818f138ff024784eba9577" + integrity sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A== + dependencies: + "@smithy/core" "^3.9.0" + "@smithy/middleware-endpoint" "^4.1.19" + "@smithy/middleware-stack" "^4.0.5" + "@smithy/protocol-http" "^5.1.3" + "@smithy/types" "^4.3.2" + "@smithy/util-stream" "^4.2.4" + tslib "^2.6.2" + "@smithy/types@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.3.1.tgz#c11276ea16235d798f47a68aef9f44d3dbb70dd4" @@ -2400,6 +3038,13 @@ dependencies: tslib "^2.6.2" +"@smithy/types@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.3.2.tgz#66ac513e7057637de262e41ac15f70cf464c018a" + integrity sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw== + dependencies: + tslib "^2.6.2" + "@smithy/url-parser@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.4.tgz#049143f4c156356e177bd69242675db26fe4f4db" @@ -2409,6 +3054,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/url-parser@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.5.tgz#1824a9c108b85322c5a31f345f608d47d06f073a" + integrity sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw== + dependencies: + "@smithy/querystring-parser" "^4.0.5" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/util-base64@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" @@ -2466,6 +3120,17 @@ bowser "^2.11.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-browser@^4.0.27": + version "4.0.27" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.27.tgz#2ad80730a6e90ff82872d20ea7ea05b9d3b0f175" + integrity sha512-i/Fu6AFT5014VJNgWxKomBJP/GB5uuOsM4iHdcmplLm8B1eAqnRItw4lT2qpdO+mf+6TFmf6dGcggGLAVMZJsQ== + dependencies: + "@smithy/property-provider" "^4.0.5" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + bowser "^2.11.0" + tslib "^2.6.2" + "@smithy/util-defaults-mode-node@^4.0.25": version "4.0.25" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz#8e307a15a73c56af44674aaa74cd089b3b42b019" @@ -2479,6 +3144,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/util-defaults-mode-node@^4.0.27": + version "4.0.27" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.27.tgz#119793c1ba38e1b6dcc9b7ccc17f2ab4cd56f653" + integrity sha512-3W0qClMyxl/ELqTA39aNw1N+pN0IjpXT7lPFvZ8zTxqVFP7XCpACB9QufmN4FQtd39xbgS7/Lekn7LmDa63I5w== + dependencies: + "@smithy/config-resolver" "^4.1.5" + "@smithy/credential-provider-imds" "^4.0.7" + "@smithy/node-config-provider" "^4.1.4" + "@smithy/property-provider" "^4.0.5" + "@smithy/smithy-client" "^4.5.0" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/util-endpoints@^3.0.6": version "3.0.6" resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz#a24b0801a1b94c0de26ad83da206b9add68117f2" @@ -2488,6 +3166,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/util-endpoints@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz#9d52f2e7e7a1ea4814ae284270a5f1d3930b3773" + integrity sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ== + dependencies: + "@smithy/node-config-provider" "^4.1.4" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/util-hex-encoding@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" @@ -2503,6 +3190,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/util-middleware@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.5.tgz#405caf2a66e175ce8ca6c747fa1245b3f5386879" + integrity sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ== + dependencies: + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/util-retry@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.6.tgz#f931fdd1f01786b21a82711e185c58410e8e41c7" @@ -2512,6 +3207,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/util-retry@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.7.tgz#3169450193e917da170a87557fcbdfe0faa86779" + integrity sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ== + dependencies: + "@smithy/service-error-classification" "^4.0.7" + "@smithy/types" "^4.3.2" + tslib "^2.6.2" + "@smithy/util-stream@^4.2.3": version "4.2.3" resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.2.3.tgz#7980fb94dbee96301b0b2610de8ae1700c7daab1" @@ -2526,6 +3230,20 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/util-stream@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.2.4.tgz#fa9f0e2fd5a8a5adbd013066b475ea8f9d4f900f" + integrity sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ== + dependencies: + "@smithy/fetch-http-handler" "^5.1.1" + "@smithy/node-http-handler" "^4.1.1" + "@smithy/types" "^4.3.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/util-uri-escape@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" @@ -2549,13 +3267,13 @@ "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.6.tgz#38044da5053f0d9118df05f55cd8fbec14ecf9da" - integrity sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg== +"@smithy/util-waiter@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.7.tgz#c013cf6a5918c21f8b430b4a825dbac132163f4a" + integrity sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A== dependencies: - "@smithy/abort-controller" "^4.0.4" - "@smithy/types" "^4.3.1" + "@smithy/abort-controller" "^4.0.5" + "@smithy/types" "^4.3.2" tslib "^2.6.2" "@storybook/addon-actions@8.6.14": @@ -2634,10 +3352,10 @@ polished "^4.2.2" ts-dedent "^2.2.0" -"@storybook/addon-links@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-9.1.2.tgz#54e944a431bec0c575d4e3eedd6c99b855e82650" - integrity sha512-drAWdhn5cRo5WcaORoCYfJ6tgTAw1m+ZJb1ICyNtTU6i/0nErV8jJjt7AziUcUIyzaGVJAkAMNC3+R4uDPSFDA== +"@storybook/addon-links@^9.1.0": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-9.1.3.tgz#14e3066325071c4157e1dfb61f613c54628ff83c" + integrity sha512-zLpOf9UYtxEaCQgbpOqOAW0f/puumwzTNA/AHDkqwe/BAOtBXyS/bocQIO6Oxj8z4kp+bYqxW6c2OA0/EyII0Q== dependencies: "@storybook/global" "^5.0.0" @@ -2677,12 +3395,12 @@ "@storybook/icons" "^1.2.12" ts-dedent "^2.0.0" -"@storybook/builder-vite@9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-9.1.2.tgz#3cdc40ddb68b9f0976d327321bede0f7fb670a44" - integrity sha512-5Y7e5wnSzFxCGP63UNRRZVoxHe1znU4dYXazJBobAlEcUPBk7A0sH2716tA6bS4oz92oG9tgvn1g996hRrw4ow== +"@storybook/builder-vite@9.1.3": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-9.1.3.tgz#9d488584cf186adbaa053302b527d23e444ee4c8" + integrity sha512-bstS/GsVJ5zVkRKAJociocA2omxU4CaNAP58fxS280JiRYgcrRaydDd7vwk6iGJ3xWbzwV0wH8SP54LVNyRY6Q== dependencies: - "@storybook/csf-plugin" "9.1.2" + "@storybook/csf-plugin" "9.1.3" ts-dedent "^2.0.0" "@storybook/components@^8.0.0": @@ -2702,10 +3420,10 @@ dependencies: unplugin "^1.3.1" -"@storybook/csf-plugin@9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-9.1.2.tgz#7bc5f29578ee55b2da8c38daf1815a4fa354c564" - integrity sha512-bfMh6r+RieBLPWtqqYN70le2uTE4JzOYPMYSCagHykUti3uM/1vRFaZNkZtUsRy5GwEzE5jLdDXioG1lOEeT2Q== +"@storybook/csf-plugin@9.1.3": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-9.1.3.tgz#e3e604d89e3278bcdbcc854dac2cc6b8b0e05f6d" + integrity sha512-wqh+tTCX2WZqVDVjhk/a6upsyYj/Kc85Wf6ywPx4pcFYxQZxiKF/wtuM9yzEpZC6fZHNvlKkzXWvP4wJOnm+zg== dependencies: unplugin "^1.3.1" @@ -2737,33 +3455,33 @@ resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.6.14.tgz#02fc8aeab701040744d93b6ef46b9e5727123370" integrity sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw== -"@storybook/react-dom-shim@9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-9.1.2.tgz#09731ce72de13bf92e439485c628fb093720c5f0" - integrity sha512-nw7BLAHCJswPZGsuL0Gs2AvFUWriusCTgPBmcHppSw/AqvT4XRFRDE+5q3j04/XKuZBrAA2sC4L+HuC0uzEChQ== +"@storybook/react-dom-shim@9.1.3": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-9.1.3.tgz#b5d25546fc8fcc41d10c6d2aaf0e70fb284a9a32" + integrity sha512-zIgFwZqV8cvE+lzJDcD13rItxoWyYNUWu7eJQAnHz5RnyHhpu6rFgQej7i6J3rPmy9xVe+Rq6XsXgDNs6pIekQ== -"@storybook/react-vite@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-9.1.2.tgz#82d1d388d13879bbbb493c53ce21634426e08e81" - integrity sha512-dv3CBjOzmMoSyIotMtdmsBRjB25i19OjFP0IZqauLeUoVm6QddILW7JRcZVLrzhATyBEn+sEAdWQ4j79Z11HAg== +"@storybook/react-vite@^9.1.0": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-9.1.3.tgz#41bfb58efba00756578ea72be02a1b84b8298ab6" + integrity sha512-iNRRxA5G9Yaw5etbRdCMnJtjI1VkzA7juc+/caVhKKut25sI8cOF4GRPLCbotLz9xmitQR2X7beZMPPVIYk86A== dependencies: "@joshwooding/vite-plugin-react-docgen-typescript" "0.6.1" "@rollup/pluginutils" "^5.0.2" - "@storybook/builder-vite" "9.1.2" - "@storybook/react" "9.1.2" + "@storybook/builder-vite" "9.1.3" + "@storybook/react" "9.1.3" find-up "^7.0.0" magic-string "^0.30.0" react-docgen "^8.0.0" resolve "^1.22.8" tsconfig-paths "^4.2.0" -"@storybook/react@9.1.2", "@storybook/react@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-9.1.2.tgz#eaf19220eb9e7baed21ea5f9611348f1714b8492" - integrity sha512-VVXu1HrhDExj/yj+heFYc8cgIzBruXy1UYT3LW0WiJyadgzYz3J41l/Lf/j2FCppyxwlXb19Uv51plb1F1C77w== +"@storybook/react@9.1.3", "@storybook/react@^9.1.0": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-9.1.3.tgz#9a1070ca5d08b5cc2388583749a2ef7ffb2654e6" + integrity sha512-CgJMk4Y8EfoFxWiTB53QxnN+nQbAkw+NBaNjsaaeDNOE1R0ximP/fn5b2jcLvM+b5ojjJiJL1QCzFyoPWImHIQ== dependencies: "@storybook/global" "^5.0.0" - "@storybook/react-dom-shim" "9.1.2" + "@storybook/react-dom-shim" "9.1.3" "@storybook/test@8.6.14": version "8.6.14" @@ -2859,7 +3577,19 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/jest-dom@^6.6.3", "@testing-library/jest-dom@^6.7.0": +"@testing-library/jest-dom@^6.4.8": + version "6.8.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.8.0.tgz#697db9424f0d21d8216f1958fa0b1b69b5f43923" + integrity sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + picocolors "^1.1.1" + redent "^3.0.0" + +"@testing-library/jest-dom@^6.6.3": version "6.7.0" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.7.0.tgz#cff6452ba03b215c16d97b48adfc4e1ac54c3e03" integrity sha512-RI2e97YZ7MRa+vxP4UUnMuMFL2buSsf0ollxUbTgrbPLKhMn8KVTx7raS6DYjC7v1NDVrioOvaShxsguLNISCA== @@ -2910,7 +3640,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== -"@types/aws-lambda@^8.10.152": +"@types/aws-lambda@^8.10.138", "@types/aws-lambda@^8.10.152": version "8.10.152" resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.152.tgz#f68424a8175f0a54a2a941e65b76c3f51f3bd89d" integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== @@ -3099,6 +3829,13 @@ dependencies: csstype "^3.0.2" +"@types/react@^19.1.2": + version "19.1.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.12.tgz#7bfaa76aabbb0b4fe0493c21a3a7a93d33e8937b" + integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== + dependencies: + csstype "^3.0.2" + "@types/resolve@^1.20.2": version "1.20.6" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" @@ -3185,6 +3922,21 @@ natural-compare "^1.4.0" ts-api-utils "^2.1.0" +"@typescript-eslint/eslint-plugin@8.41.0", "@typescript-eslint/eslint-plugin@^8.0.1": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz#42209e2ce3e2274de0f5f9b75c777deedacaa558" + integrity sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/type-utils" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + graphemer "^1.4.0" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" + "@typescript-eslint/parser@8.40.0", "@typescript-eslint/parser@^8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.40.0.tgz#1bc9f3701ced29540eb76ff2d95ce0d52ddc7e69" @@ -3196,6 +3948,17 @@ "@typescript-eslint/visitor-keys" "8.40.0" debug "^4.3.4" +"@typescript-eslint/parser@8.41.0", "@typescript-eslint/parser@^8.0.1": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.41.0.tgz#677f5b2b3fa947ee1eac4129220c051b1990d898" + integrity sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg== + dependencies: + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + debug "^4.3.4" + "@typescript-eslint/project-service@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.40.0.tgz#1b7ba6079ff580c3215882fe75a43e5d3ed166b9" @@ -3205,6 +3968,15 @@ "@typescript-eslint/types" "^8.40.0" debug "^4.3.4" +"@typescript-eslint/project-service@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.41.0.tgz#08ebf882d413a038926e73fda36e00c3dba84882" + integrity sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.41.0" + "@typescript-eslint/types" "^8.41.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz#2fbfcc8643340d8cd692267e61548b946190be8a" @@ -3213,11 +3985,24 @@ "@typescript-eslint/types" "8.40.0" "@typescript-eslint/visitor-keys" "8.40.0" +"@typescript-eslint/scope-manager@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz#c8aba12129cb9cead1f1727f58e6a0fcebeecdb5" + integrity sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ== + dependencies: + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + "@typescript-eslint/tsconfig-utils@8.40.0", "@typescript-eslint/tsconfig-utils@^8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz#8e8fdb9b988854aedd04abdde3239c4bdd2d26e4" integrity sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw== +"@typescript-eslint/tsconfig-utils@8.41.0", "@typescript-eslint/tsconfig-utils@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz#134dee36eb16cdd78095a20bca0516d10b5dda75" + integrity sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw== + "@typescript-eslint/type-utils@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz#a7e4a1f0815dd0ba3e4eef945cc87193ca32c422" @@ -3229,11 +4014,27 @@ debug "^4.3.4" ts-api-utils "^2.1.0" +"@typescript-eslint/type-utils@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz#68d401e38fccf239925447e97bdbd048a9891ae5" + integrity sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ== + dependencies: + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + debug "^4.3.4" + ts-api-utils "^2.1.0" + "@typescript-eslint/types@8.40.0", "@typescript-eslint/types@^8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.40.0.tgz#0b580fdf643737aa5c01285314b5c6e9543846a9" integrity sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg== +"@typescript-eslint/types@8.41.0", "@typescript-eslint/types@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" + integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== + "@typescript-eslint/typescript-estree@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz#295149440ce7da81c790a4e14e327599a3a1e5c9" @@ -3250,6 +4051,22 @@ semver "^7.6.0" ts-api-utils "^2.1.0" +"@typescript-eslint/typescript-estree@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz#7c9cff8b4334ce96f14e9689692e8cf426ce4d59" + integrity sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ== + dependencies: + "@typescript-eslint/project-service" "8.41.0" + "@typescript-eslint/tsconfig-utils" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + "@typescript-eslint/utils@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.40.0.tgz#8d0c6430ed2f5dc350784bb0d8be514da1e54054" @@ -3260,6 +4077,16 @@ "@typescript-eslint/types" "8.40.0" "@typescript-eslint/typescript-estree" "8.40.0" +"@typescript-eslint/utils@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.41.0.tgz#17cb3b766c1626311004ea41ffd8c27eb226b953" + integrity sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/visitor-keys@8.40.0": version "8.40.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz#c1b45196981311fed7256863be4bfb2d3eda332a" @@ -3268,6 +4095,14 @@ "@typescript-eslint/types" "8.40.0" eslint-visitor-keys "^4.2.1" +"@typescript-eslint/visitor-keys@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz#16eb99b55d207f6688002a2cf425e039579aa9a9" + integrity sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg== + dependencies: + "@typescript-eslint/types" "8.41.0" + eslint-visitor-keys "^4.2.1" + "@ungap/with-resolvers@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz#63a07b13bbf10ffff074a36498cce8d82aeeecc4" @@ -8816,10 +9651,10 @@ storybook-dark-mode@^4.0.2: fast-deep-equal "^3.1.3" memoizerific "^1.11.3" -storybook@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-9.1.2.tgz#b81a5d984caba3d88ce6b5cf405cb4970bad8672" - integrity sha512-TYcq7WmgfVCAQge/KueGkVlM/+g33sQcmbATlC3X6y/g2FEeSSLGrb6E6d3iemht8oio+aY6ld3YOdAnMwx45Q== +storybook@^9.1.0: + version "9.1.3" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-9.1.3.tgz#0e0faeb7895d7bdb65b4d19f47c613ab2dc35988" + integrity sha512-Sm+qP3iGb/QKx/jTYdfE0mIeTmA2HF+5k9fD70S9oOJq3F9UdW8MLgs+5PE+E/xAfDjZU4OWAKEOyA6EYIvQHg== dependencies: "@storybook/global" "^5.0.0" "@testing-library/jest-dom" "^6.6.3" @@ -9076,7 +9911,7 @@ stylelint-scss@^6.12.0: postcss-selector-parser "^7.1.0" postcss-value-parser "^4.2.0" -stylelint@^16.23.1: +stylelint@^16.19.1, stylelint@^16.23.1: version "16.23.1" resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.23.1.tgz#e5f5ee173adf989db0855b825e66f9ccdde3c78a" integrity sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw== @@ -9532,6 +10367,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript-eslint@^8.31.0: + version "8.41.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.41.0.tgz#a13879a5998717140fefb0d808c8c2fbde1cb769" + integrity sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw== + dependencies: + "@typescript-eslint/eslint-plugin" "8.41.0" + "@typescript-eslint/parser" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + typescript-eslint@^8.40.0: version "8.40.0" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.40.0.tgz#27541748f3ca889c9698327bdacf815f7dc61804" @@ -9731,7 +10576,7 @@ vite-tsconfig-paths@^5.0.1: globrex "^0.1.2" tsconfck "^3.0.3" -"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0", vite@^7.1.3: +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0", vite@^7.0.6: version "7.1.3" resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.3.tgz#8d70cb02fd6346b4bf1329a6760800538ef0faea" integrity sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==