diff --git a/.gitignore b/.gitignore index 541f512..573ad88 100644 --- a/.gitignore +++ b/.gitignore @@ -199,3 +199,5 @@ infrastructure/src/stacServer/lambdas/api.zip infrastructure/src/stacServer/lambdas/ingest.zip stac-server + +**/package-lock.json \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 9a332ea..67c030f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,5 +21,13 @@ "lib" ], "formatFiles.runOrganizeImports": true, - "formatFiles.excludePattern": "*.log,*.tsbuildinfo" + "formatFiles.excludePattern": "*.log,*.tsbuildinfo", + "[shellscript]": { + "editor.defaultFormatter": "foxundermoon.shell-format" + }, + + "files.exclude": { + "**/*.js": true, + "**/*.map": true + } } diff --git a/README.md b/README.md index 2192eb6..302fdd4 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ To dive deep into AGIE components, please visit the following links: - [UI Module](typescript/packages/apps/ui) ### Success + Upon successful deployment of this guidance, you will be able to do the following: + - Enroll polygons (areas of interest, farm fields, geographical areas of land) for processing and analysis - Schedule the frequency of polygon analysis, for each polygon, to support one-time and recurring automated processing - Automate the searching, downloading, clipping, and processing of earth observation data into NDVI maps and meta data, per polygon @@ -42,7 +44,6 @@ Upon successful deployment of this guidance, you will be able to do the followin - Visualize processed imagery and meta data via an optional but integrated UI - Integrate, customize, extend and augment existing workflows to achieve business goals - ### Cost You will need to pay for the AWS services used while running this guidance. As of September 2024, the cost for running this Guidance with the default settings in the US East (N. Virginia) is approximately $147.66 per month for analyzing 1000 polygons every 5 days as illustrated in the sample table below. @@ -60,22 +61,17 @@ You will need to pay for the AWS services used while running this guidance. As o | US East (N. Virginia) | AGIE Modules Lambda | AWS Lambda | $0 | Average size of each request (50 KB) Requests (50,000 per month) | | Total | | | $147.66 | | - ## Prerequisites for Deployment In order to deploy `AGIE` from your local workstation, you need to install the following dependencies: - Active AWS Account +- [Node.js 20.x](https://nodejs.org/en/download/package-manager) - [AWS Command Line Interface](https://aws.amazon.com/cli/) - [Docker](https://docs.docker.com/engine/install/) - [Rush.js](https://rushjs.io/) -- Node.js 20.x -- [pnpm 9.0.2](https://www.npmjs.com/package/pnpm/v/9.0.2) -- [tsx](https://www.npmjs.com/package/tsx/v/4.18.0) -- It may be necessary to bootstrap your AWS environment. Bootstrapping is the process of preparing your AWS environment for usage with the AWS Cloud Development Kit (AWS CDK). Before you deploy a CDK stack into an AWS environment, the environment must first be bootstrapped. For more information about bootstrapping, please review the following: - - https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html - - https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html -- NOTE: AWS AGIE includes an optional UI module. The optional and integrated UI module includes functionality provided by Amazon Location Service. As of 7/24, Amazon Location Service is not available in certain AWS Regions, including us-west-1. Please review the most current list of Region availability of Amazon Location Service to ensure the optional UI module can be deployed within a Region that meets your company requirements. + +> NOTE: AWS AGIE includes an optional UI module. The optional and integrated UI module includes functionality provided by Amazon Location Service. As of 7/24, Amazon Location Service is not available in certain AWS Regions, including us-west-1. Please review the most current list of Region availability of Amazon Location Service to ensure the optional UI module can be deployed within a Region that meets your company requirements. ## Deployment @@ -84,61 +80,44 @@ In order to deploy `AGIE` from your local workstation, you need to install the f Run the following command to clone the solution repository into your local workstation: ```shell -$ git clone https://github.com/aws-solutions-library-samples/guidance-for-automated-geospatial-insights-engine-on-aws -$ cd guidance-for-automated-geospatial-insights-engine-on-aws -$ export AGIE_FOLDER=$PWD -$ export CLI_FOLDER="$PWD/typescript/packages/apps/cli" -``` - -### 2. Bundle the artifact from `Stac-server` repository - -AGIE conforms to the [STAC specification](https://github.com/radiantearth/stac-spec/blob/master/item-spec/item-spec.md) and generates [STAC item](https://github.com/radiantearth/stac-spec/blob/master/item-spec/item-spec.md) as a result of the analysis. It stores these analysis results in [Stac-server](https://github.com/stac-utils/stac-server). To make the deployment simpler, we port the infrastructure definition from `serverless` framework to `cdk`. Run the following command to bundle `Stac-server` NodeJS application codes which are referred by the [StacServer](infrastructure/src/stacServer/stacServer.stack.ts) stack - -```shell -$ cd $AGIE_FOLDER -$ git clone --depth 1 --branch v3.8.0 https://github.com/stac-utils/stac-server.git -$ cd stac-server && npm install && npm run build -$ cp dist/api/api.zip $AGIE_FOLDER/infrastructure/src/stacServer/lambdas && cp dist/ingest/ingest.zip $AGIE_FOLDER/infrastructure/src/stacServer/lambdas - +git clone https://github.com/aws-solutions-library-samples/guidance-for-automated-geospatial-insights-engine-on-aws +cd guidance-for-automated-geospatial-insights-engine-on-aws +export AGIE_FOLDER=$PWD +export CLI_FOLDER="$PWD/typescript/packages/apps/cli" ``` -### 3. Build the solution +### 2. Build the solution Run the following command to install the solution dependencies and build it: ```shell -$ cd $AGIE_FOLDER -$ rush update -$ rush build +cd $AGIE_FOLDER +rush update +rush build ``` -### 4. Deploy the solution +### 3. Deploy the solution Setup some environment variables which will be referenced by rest of the commands. Replace the following variables with the actual value. | Name | Description | |----------------------------------|-----------------------------------------------------------------------------------------------------------------------| -| AGIE_ADMINISTRATOR_EMAIL | Administrator's email. | -| AGIE_ADMINISTRATOR_MOBILE_NUMBER | Administrator's phone number (including the area code, e.g. +61xxxxxx). | | AWS_REGION | AGIE's AWS Region deployment. | | ENVIRONMENT | Environment (.e.g dev, stage or prod). You can have multiple environment deployed in the same AWS account and region. | - ```shell -$ export AGIE_ADMINISTRATOR_EMAIL= -$ export AGIE_ADMINISTRATOR_MOBILE_NUMBER= -$ export ENVIRONMENT= -$ export AWS_REGION= +export ENVIRONMENT= +export AWS_REGION= ``` -Run the following command to start the installation of AGIE: +The installer will guide you through a list of configurable settings that you can apply to your environment deployment. Run the following command to start the installation of AGIE: ```shell -$ cd $AGIE_FOLDER/infrastructure -$ npm run cdk -- deploy --concurrency=10 --require-approval never -c environment=$ENVIRONMENT -c administratorEmail=$AGIE_ADMINISTRATOR_EMAIL -c administratorPhoneNumber=$AGIE_ADMINISTRATOR_MOBILE_NUMBER --all +cd $CLI_FOLDER +bin/run.js install -e $ENVIRONMENT -r $AWS_REGION ``` -### 5. Deployment Validation +### 4. Deployment Validation To validate the deployment, open the CloudFormation console and verify the status of the following stacks @@ -152,28 +131,18 @@ To validate the deployment, open the CloudFormation console and verify the statu 8. agie-\-engine 9. agie-\-scheduler -### 6. Deploy the UI +### 5. Set your initial password -Run the following the bundle the Web UI assets and upload it to the web artifact buckets: - -```shell -$ cd $AGIE_FOLDER/typescript/packages/apps/ui -$ npm run deploy -``` - -### 7. Set your initial password - -Run the following command to set the password for the administrator user (replace the `` with your own) : +Run the following command to set the password for the administrator user (replace the `ADMINISTRATOR_EMAIL` and `` with your own) : ```shell export USER_POOL_ID=$(aws ssm get-parameter --name "/agie/$ENVIRONMENT/shared/cognitoUserPoolId" --query "Parameter.Value" --output text) -aws cognito-idp admin-set-user-password --user-pool-id $USER_POOL_ID --username $AGIE_ADMINISTRATOR_EMAIL --password --permanent +aws cognito-idp admin-set-user-password --user-pool-id $USER_POOL_ID --username --password --permanent ``` Now that you have everything set up, visit [walkthrough](docs/walkthrough.md) to get started on working with `AGIE`. - ## Next Steps - Instead of relying on the container provided by AGIE, you can integrate your own custom image processing implementation into the application. This approach allows you to have greater control over the image processing functionality and tailor it to your specific requirements. @@ -185,12 +154,13 @@ Now that you have everything set up, visit [walkthrough](docs/walkthrough.md) to When deleting resources, please follow these steps: ```shell -$ cd $AGIE_FOLDER/infrastructure -$ npm run cdk -- destroy --all +cd $CLI_FOLDER +bin/run.js remove -e $ENVIRONMENT -r $AWS_REGION ``` + Also, we've configured some resources not to be deleted automatically. Please follow these steps to delete them manually: -1. **Open the AWS Management Console**: Go to the AWS Management Console (https://console.aws.amazon.com) and sign in with your AWS credentials. +1. **Open the AWS Management Console**: Go to the AWS Management Console () and sign in with your AWS credentials. 2. **Navigate to the S3 Service**: In the AWS Management Console, search for the "S3" service or select it from the list of services. @@ -211,7 +181,3 @@ Also, we've configured some resources not to be deleted automatically. Please fo 8. **Confirm the Bucket Deletion**: A confirmation dialog will appear, asking you to type the bucket name to confirm the deletion. Type the bucket name exactly as shown and click the "Delete bucket" button to proceed. 9. **Repeat for Other Buckets**: If you have multiple S3 buckets created by your CDK deployment that you want to delete, repeat steps 4-8 for each bucket. - - - - diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index bef7657..8609992 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -109,12 +109,18 @@ importers: '@aws-sdk/client-cloudformation': specifier: ~3 version: 3.613.0 + '@aws-sdk/client-ec2': + specifier: ~3 + version: 3.658.1 '@aws-sdk/client-eventbridge': specifier: ~3 version: 3.613.0 '@aws-sdk/client-lambda': specifier: ~3 version: 3.613.0 + '@aws-sdk/client-opensearch': + specifier: ~3 + version: 3.658.1 '@aws-sdk/client-secrets-manager': specifier: ~3 version: 3.613.0 @@ -126,10 +132,13 @@ importers: version: 3.613.0 '@aws-sdk/credential-provider-node': specifier: ~3 - version: 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + version: 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) '@aws-sdk/util-utf8-node': specifier: ~3 version: 3.259.0 + '@inquirer/confirm': + specifier: ~4 + version: 4.0.1 '@inquirer/prompts': specifier: ~5 version: 5.1.2 @@ -151,6 +160,12 @@ importers: '@oclif/plugin-plugins': specifier: ~5 version: 5.3.4 + '@smithy/types': + specifier: ~3 + version: 3.4.2 + ajv: + specifier: ~8 + version: 8.16.0 aws-amplify: specifier: ~6 version: 6.4.0 @@ -190,6 +205,9 @@ importers: replace-in-file: specifier: ~7 version: 7.2.0 + rxjs: + specifier: ~7 + version: 7.8.1 shelljs: specifier: ~0 version: 0.8.5 @@ -199,9 +217,15 @@ importers: table: specifier: ~6 version: 6.8.2 + tsx: + specifier: ~4 + version: 4.16.2 ulid: specifier: ~2 version: 2.3.0 + validator: + specifier: ~13 + version: 13.12.0 devDependencies: '@oclif/test': specifier: ~3 @@ -227,6 +251,9 @@ importers: '@types/shelljs': specifier: ~0 version: 0.8.15 + '@types/validator': + specifier: ~13 + version: 13.12.0 chai: specifier: ~5 version: 5.1.1 @@ -1048,7 +1075,7 @@ importers: version: 6.1.12(@types/react@18.3.3)(aws-amplify@6.4.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(xstate@4.38.3) '@aws/amazon-location-utilities-auth-helper': specifier: ~1 - version: 1.0.6(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0)) + version: 1.0.6(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) '@cloudscape-design/components': specifier: ~3 version: 3.0.681(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1094,6 +1121,9 @@ importers: react-router-dom: specifier: ~6 version: 6.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tsx: + specifier: ~4 + version: 4.16.2 victory: specifier: ~37 version: 37.0.2(react@18.3.1) @@ -1179,7 +1209,7 @@ importers: version: 3.613.0 '@aws-sdk/credential-providers': specifier: ~3 - version: 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0)) + version: 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) '@opensearch-project/opensearch': specifier: ~2 version: 2.10.0 @@ -1538,7 +1568,7 @@ importers: version: 3.613.0 '@aws-sdk/client-sso-oidc': specifier: ~3 - version: 3.613.0(@aws-sdk/client-sts@3.613.0) + version: 3.613.0(@aws-sdk/client-sts@3.658.1) '@aws-sdk/util-utf8-node': specifier: ~3 version: 3.259.0 @@ -2022,6 +2052,10 @@ packages: resolution: {integrity: sha512-ewWv52AZKvAp0kJgnoAa3uRbXnqDRGVT30VQhbkE2uInEZWZODBCuXKBc6xTuc/Rh+WnQbhPf4RzFCfjMK5UyQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-ec2@3.658.1': + resolution: {integrity: sha512-J/TdGg7Z8pwIL826QKwaX/EgND5Tst5N5hKcjwnj0jGfsJOkRTMdZTwOgvShYWgs6BplFFZqkl3t2dKsNfsVcg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-eventbridge@3.613.0': resolution: {integrity: sha512-fxfxne/WTRWKDmkJlDwMHQBcZoP3DGCNnPbvGmDUestFqd7yjljHseQ/1g4J54TwY4jbX9nn3o/h+xt97mF06Q==} engines: {node: '>=16.0.0'} @@ -2042,6 +2076,10 @@ packages: resolution: {integrity: sha512-mehMGFw1Jk2EO4Y5FgYF4hIxaM6ux0t6y2zDpuHC8X55V/x8eenaLKdRGgTSSiykBzXQF3JiZUXV8ksvXoKkjQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-opensearch@3.658.1': + resolution: {integrity: sha512-NDJY2y9rrC5kowaUJMulWRMQQY9eT62iFvXFtYTw1p1DhS79Lkp2QcWv+34YMwHryaqdcDXXzmdBd4bi78nOZw==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-personalize-events@3.398.0': resolution: {integrity: sha512-dynXr8ZVMC2FxQS5QRr7cu90xAGfwgfZM5XDW2jm81UPK5Qqo2FbbEF4wvdXXbnkbvU5rsmxL1IjQiMGm+lWVg==} engines: {node: '>=14.0.0'} @@ -2080,6 +2118,12 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.613.0 + '@aws-sdk/client-sso-oidc@3.658.1': + resolution: {integrity: sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.658.1 + '@aws-sdk/client-sso@3.398.0': resolution: {integrity: sha512-CygL0jhfibw4kmWXG/3sfZMFNjcXo66XUuPC4BqZBk8Rj5vFoxp1vZeMkDLzTIk97Nvo5J5Bh+QnXKhub6AckQ==} engines: {node: '>=14.0.0'} @@ -2088,6 +2132,10 @@ packages: resolution: {integrity: sha512-gqXGFDkIpKHCKAbeJK4aIDt3tiwJ26Rf5Tqw9JS6BYXsdMeOB8FTzqD9R+Yc1epHd8s5L94sdqXT5PapgxFZrg==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.658.1': + resolution: {integrity: sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-sts@3.398.0': resolution: {integrity: sha512-/3Pa9wLMvBZipKraq3AtbmTfXW6q9kyvhwOno64f1Fz7kFb8ijQFMGoATS70B2pGEZTlxkUqJFWDiisT6Q6dFg==} engines: {node: '>=14.0.0'} @@ -2096,6 +2144,10 @@ packages: resolution: {integrity: sha512-S+KvQI4XEivY3vyIY+IPY7Fw8vFvX/q3pkNC9qEhnAs+/w7vT6vhVBHsaugYVlsMuNtNvmyc8P+Q/gzOEtLCTw==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-sts@3.658.1': + resolution: {integrity: sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-verifiedpermissions@3.613.0': resolution: {integrity: sha512-Pm6KoXTI9W75er4rHNKNsY4sR5dGrbrbsz1U4elkZs/znAnLGDEE7sCXAaAhWXMVumDJLuKSTZGdPJulR1dsLQ==} engines: {node: '>=16.0.0'} @@ -2104,6 +2156,10 @@ packages: resolution: {integrity: sha512-ptqw+DTxLr01+pKjDUuo53SEDzI+7nFM3WfQaEo0yhDg8vWw8PER4sWj1Ysx67ksctnZesPUjqxd5SHbtdBxiA==} engines: {node: '>=16.0.0'} + '@aws-sdk/core@3.658.1': + resolution: {integrity: sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.613.0': resolution: {integrity: sha512-kyzVox9VzIqUmu0TDl+Xdu+qHz5lUyVsggmewbmhlsk3BwE30jojXS+sQGTUPoTKcipU7xGH2bSENwIc53JrZg==} engines: {node: '>=16.0.0'} @@ -2116,10 +2172,18 @@ packages: resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-env@3.654.0': + resolution: {integrity: sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-http@3.613.0': resolution: {integrity: sha512-MCiUFxowFzprzIXFXsqbp/3DViJ7nFmBW+XJkoRQWqNmThbkz/E8sb40WmL9UFdZHJph2KDjzABKYH5f0lHZaA==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-http@3.658.1': + resolution: {integrity: sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-ini@3.398.0': resolution: {integrity: sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==} engines: {node: '>=14.0.0'} @@ -2130,6 +2194,12 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.613.0 + '@aws-sdk/credential-provider-ini@3.658.1': + resolution: {integrity: sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.658.1 + '@aws-sdk/credential-provider-node@3.398.0': resolution: {integrity: sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==} engines: {node: '>=14.0.0'} @@ -2138,6 +2208,10 @@ packages: resolution: {integrity: sha512-n3yd0CDuUKcQFhjRLAQfQpZyZ2ddrHC7QOKQqE+Fkx+Fs5zoG+NRLK1EBkBW/G9zk8Ck4+rG3OOI3CuNpJ2PCw==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-node@3.658.1': + resolution: {integrity: sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-process@3.398.0': resolution: {integrity: sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==} engines: {node: '>=14.0.0'} @@ -2146,6 +2220,10 @@ packages: resolution: {integrity: sha512-Ux35nGOSJKZWUIM3Ny0ROZ8cqPRUEkh+tR3X2o9ydEbFiLq3eMMyEnHJqx4EeUjLRchidlm4CCid9GxMe5/gdw==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-process@3.654.0': + resolution: {integrity: sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.398.0': resolution: {integrity: sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==} engines: {node: '>=14.0.0'} @@ -2154,6 +2232,10 @@ packages: resolution: {integrity: sha512-oQPGDKMMIxjvTcm86g07RPYeC7mCNk+29dPpY15ZAPRpAF7F0tircsC3wT9fHzNaKShEyK5LuI5Kg/uxsdy+Iw==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.658.1': + resolution: {integrity: sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-web-identity@3.398.0': resolution: {integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==} engines: {node: '>=14.0.0'} @@ -2164,6 +2246,12 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.609.0 + '@aws-sdk/credential-provider-web-identity@3.654.0': + resolution: {integrity: sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.654.0 + '@aws-sdk/credential-providers@3.613.0': resolution: {integrity: sha512-HsE68oJuhh7w4AFWuXk1avWuKXUKsNLOakZ4SnejEl77iFA+NywsGt1nm4VI/zsnjln4qrL32OnJ1fX3K+Xt0Q==} engines: {node: '>=16.0.0'} @@ -2206,6 +2294,10 @@ packages: resolution: {integrity: sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.654.0': + resolution: {integrity: sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==} + engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-location-constraint@3.609.0': resolution: {integrity: sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==} engines: {node: '>=16.0.0'} @@ -2218,6 +2310,10 @@ packages: resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-logger@3.654.0': + resolution: {integrity: sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.398.0': resolution: {integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==} engines: {node: '>=14.0.0'} @@ -2226,6 +2322,14 @@ packages: resolution: {integrity: sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==} engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.654.0': + resolution: {integrity: sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-sdk-ec2@3.658.1': + resolution: {integrity: sha512-CnkMajiLD8c+PyiqMjdRt3n87oZnd8jw+8mbtB0jX7Q9ED2z+oeG+RTZMXp2QEiZ0Q+7RyKjXf/PLRhARppFog==} + engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.609.0': resolution: {integrity: sha512-kvwjL6OJFhAGWoYaIWR7HmILjiVk6xVj6QEU6qZMA7FtGgvlKi4pLfs8Of+hQqo+2TEhUoxG/5t6WqwB8uxjsw==} engines: {node: '>=16.0.0'} @@ -2258,10 +2362,18 @@ packages: resolution: {integrity: sha512-nbq7MXRmeXm4IDqh+sJRAxGPAq0OfGmGIwKvJcw66hLoG8CmhhVMZmIAEBDFr57S+YajGwnLLRt+eMI05MMeVA==} engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-user-agent@3.654.0': + resolution: {integrity: sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.609.0': resolution: {integrity: sha512-lMHBG8zg9GWYBc9/XVPKyuAUd7iKqfPP7z04zGta2kGNOKbUTeqmAdc1gJGku75p4kglIPlGBorOxti8DhRmKw==} engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.654.0': + resolution: {integrity: sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/signature-v4-multi-region@3.609.0': resolution: {integrity: sha512-FJs0BxVMyYOKNu7nzFI1kehfgWoYmdto5B8BSS29geUACF7jlOoeCfNZWVrnMjvAxVlSQ5O7Mr575932BnsycA==} engines: {node: '>=16.0.0'} @@ -2281,6 +2393,12 @@ packages: peerDependencies: '@aws-sdk/client-sso-oidc': ^3.609.0 + '@aws-sdk/token-providers@3.654.0': + resolution: {integrity: sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.654.0 + '@aws-sdk/types@3.387.0': resolution: {integrity: sha512-YTjFabNwjTF+6yl88f0/tWff018qmmgMmjlw45s6sdVKueWxdxV68U7gepNLF2nhaQPZa6FDOBoA51NaviVs0Q==} engines: {node: '>=14.0.0'} @@ -2293,6 +2411,10 @@ packages: resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.654.0': + resolution: {integrity: sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==} + engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.568.0': resolution: {integrity: sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==} engines: {node: '>=16.0.0'} @@ -2315,6 +2437,14 @@ packages: resolution: {integrity: sha512-Rh+3V8dOvEeE1aQmUy904DYWtLUEJ7Vf5XBPlQ6At3pBhp+zpXbsnpZzVL33c8lW1xfj6YPwtO6gOeEsl1juCQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/util-endpoints@3.654.0': + resolution: {integrity: sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-format-url@3.654.0': + resolution: {integrity: sha512-2yAlJ/l1uTJhS52iu4+/EvdIyQhDBL+nATY8rEjFI0H+BHGVrJIH2CL4DByhvi2yvYwsqQX0HYah6pF/yoXukA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/util-locate-window@3.568.0': resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} engines: {node: '>=16.0.0'} @@ -2330,6 +2460,9 @@ packages: '@aws-sdk/util-user-agent-browser@3.609.0': resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} + '@aws-sdk/util-user-agent-browser@3.654.0': + resolution: {integrity: sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==} + '@aws-sdk/util-user-agent-node@3.398.0': resolution: {integrity: sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==} engines: {node: '>=14.0.0'} @@ -2348,6 +2481,15 @@ packages: aws-crt: optional: true + '@aws-sdk/util-user-agent-node@3.654.0': + resolution: {integrity: sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} @@ -2996,10 +3138,18 @@ packages: resolution: {integrity: sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA==} engines: {node: '>=18'} + '@inquirer/confirm@4.0.1': + resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==} + engines: {node: '>=18'} + '@inquirer/core@9.0.2': resolution: {integrity: sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA==} engines: {node: '>=18'} + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + '@inquirer/editor@2.1.14': resolution: {integrity: sha512-6nWpoJyVAKwAcv67bkbBmmi3f32xua79fP7TRmNUoR4K+B1GiOBsHO1YdvET/jvC+nTlBZL7puKAKyM7G+Lkzw==} engines: {node: '>=18'} @@ -3012,6 +3162,10 @@ packages: resolution: {integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==} engines: {node: '>=18'} + '@inquirer/figures@1.0.6': + resolution: {integrity: sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==} + engines: {node: '>=18'} + '@inquirer/input@2.2.1': resolution: {integrity: sha512-Yl1G6h7qWydzrJwqN777geeJVaAFL5Ly83aZlw4xHf8Z/BoTMfKRheyuMaQwOG7LQ4e5nQP7PxXdEg4SzQ+OKw==} engines: {node: '>=18'} @@ -3040,6 +3194,10 @@ packages: resolution: {integrity: sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw==} engines: {node: '>=18'} + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3750,6 +3908,10 @@ packages: resolution: {integrity: sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==} engines: {node: '>=16.0.0'} + '@smithy/abort-controller@3.1.4': + resolution: {integrity: sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==} + engines: {node: '>=16.0.0'} + '@smithy/chunked-blob-reader-native@3.0.0': resolution: {integrity: sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==} @@ -3764,10 +3926,18 @@ packages: resolution: {integrity: sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==} engines: {node: '>=16.0.0'} + '@smithy/config-resolver@3.0.8': + resolution: {integrity: sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==} + engines: {node: '>=16.0.0'} + '@smithy/core@2.2.6': resolution: {integrity: sha512-tBbVIv/ui7/lLTKayYJJvi8JLVL2SwOQTbNFEOrvzSE3ktByvsa1erwBOnAMo8N5Vu30g7lN4lLStrU75oDGuw==} engines: {node: '>=16.0.0'} + '@smithy/core@2.4.6': + resolution: {integrity: sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==} + engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@2.3.0': resolution: {integrity: sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==} engines: {node: '>=14.0.0'} @@ -3776,6 +3946,10 @@ packages: resolution: {integrity: sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ==} engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@3.2.3': + resolution: {integrity: sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==} + engines: {node: '>=16.0.0'} + '@smithy/eventstream-codec@2.2.0': resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} @@ -3823,6 +3997,9 @@ packages: '@smithy/fetch-http-handler@3.2.1': resolution: {integrity: sha512-0w0bgUvZmfa0vHN8a+moByhCJT07WN6AHKEhFSOLsDpnszm+5dLVv5utGaqbhOrZ/aF5x3xuPMs/oMCd+4O5xg==} + '@smithy/fetch-http-handler@3.2.8': + resolution: {integrity: sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==} + '@smithy/hash-blob-browser@3.1.2': resolution: {integrity: sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==} @@ -3834,6 +4011,10 @@ packages: resolution: {integrity: sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==} engines: {node: '>=16.0.0'} + '@smithy/hash-node@3.0.6': + resolution: {integrity: sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==} + engines: {node: '>=16.0.0'} + '@smithy/hash-stream-node@3.1.2': resolution: {integrity: sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==} engines: {node: '>=16.0.0'} @@ -3844,6 +4025,9 @@ packages: '@smithy/invalid-dependency@3.0.3': resolution: {integrity: sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==} + '@smithy/invalid-dependency@3.0.6': + resolution: {integrity: sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==} + '@smithy/is-array-buffer@1.1.0': resolution: {integrity: sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==} engines: {node: '>=14.0.0'} @@ -3870,6 +4054,10 @@ packages: resolution: {integrity: sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==} engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@3.0.8': + resolution: {integrity: sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==} + engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@2.5.1': resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} engines: {node: '>=14.0.0'} @@ -3878,10 +4066,18 @@ packages: resolution: {integrity: sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@3.1.3': + resolution: {integrity: sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==} + engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@2.3.1': resolution: {integrity: sha512-P2bGufFpFdYcWvqpyqqmalRtwFUNUA8vHjJR5iGqbfR6mp65qKOLcUd6lTr4S9Gn/enynSrSf3p3FVgVAf6bXA==} engines: {node: '>=14.0.0'} + '@smithy/middleware-retry@3.0.21': + resolution: {integrity: sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==} + engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@3.0.9': resolution: {integrity: sha512-Mrv9omExU1gA7Y0VEJG2LieGfPYtwwcEiOnVGZ54a37NEMr66TJ0glFslOJFuKWG6izg5DpKIUmDV9rRxjm47Q==} engines: {node: '>=16.0.0'} @@ -3894,6 +4090,10 @@ packages: resolution: {integrity: sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@3.0.6': + resolution: {integrity: sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==} + engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@1.1.0': resolution: {integrity: sha512-XynYiIvXNea2BbLcppvpNK0zu8o2woJqgnmxqYTn4FWagH/Hr2QIk8LOsUz7BIJ4tooFhmx8urHKCdlPbbPDCA==} engines: {node: '>=14.0.0'} @@ -3906,6 +4106,10 @@ packages: resolution: {integrity: sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@3.0.6': + resolution: {integrity: sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==} + engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@2.3.0': resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} engines: {node: '>=14.0.0'} @@ -3914,6 +4118,10 @@ packages: resolution: {integrity: sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==} engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@3.1.7': + resolution: {integrity: sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==} + engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@1.1.0': resolution: {integrity: sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg==} engines: {node: '>=14.0.0'} @@ -3926,6 +4134,10 @@ packages: resolution: {integrity: sha512-Td3rUNI7qqtoSLTsJBtsyfoG4cF/XMFmJr6Z2dX8QNzIi6tIW6YmuyFml8mJ2cNpyWNqITKbROMOFrvQjmsOvw==} engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@3.2.3': + resolution: {integrity: sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==} + engines: {node: '>=16.0.0'} + '@smithy/property-provider@2.2.0': resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} @@ -3934,6 +4146,10 @@ packages: resolution: {integrity: sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==} engines: {node: '>=16.0.0'} + '@smithy/property-provider@3.1.6': + resolution: {integrity: sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==} + engines: {node: '>=16.0.0'} + '@smithy/protocol-http@1.2.0': resolution: {integrity: sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==} engines: {node: '>=14.0.0'} @@ -3950,6 +4166,10 @@ packages: resolution: {integrity: sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==} engines: {node: '>=16.0.0'} + '@smithy/protocol-http@4.1.3': + resolution: {integrity: sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==} + engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@1.1.0': resolution: {integrity: sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==} engines: {node: '>=14.0.0'} @@ -3962,6 +4182,10 @@ packages: resolution: {integrity: sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==} engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@3.0.6': + resolution: {integrity: sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==} + engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@2.2.0': resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} engines: {node: '>=14.0.0'} @@ -3970,6 +4194,10 @@ packages: resolution: {integrity: sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==} engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@3.0.6': + resolution: {integrity: sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==} + engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@2.1.5': resolution: {integrity: sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==} engines: {node: '>=14.0.0'} @@ -3978,6 +4206,10 @@ packages: resolution: {integrity: sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==} engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@3.0.6': + resolution: {integrity: sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==} + engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@2.4.0': resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} engines: {node: '>=14.0.0'} @@ -3986,6 +4218,10 @@ packages: resolution: {integrity: sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==} engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@3.1.7': + resolution: {integrity: sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==} + engines: {node: '>=16.0.0'} + '@smithy/signature-v4@2.3.0': resolution: {integrity: sha512-ui/NlpILU+6HAQBfJX8BBsDXuKSNrjTSuOYArRblcrErwKFutjrCNb/OExfVRyj9+26F9J+ZmfWT+fKWuDrH3Q==} engines: {node: '>=14.0.0'} @@ -3994,6 +4230,10 @@ packages: resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} + '@smithy/signature-v4@4.1.4': + resolution: {integrity: sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==} + engines: {node: '>=16.0.0'} + '@smithy/smithy-client@1.1.0': resolution: {integrity: sha512-j32SGgVhv2G9nBTmel9u3OXux8KG20ssxuFakJrEeDug3kqbl1qrGzVLCe+Eib402UDtA0Sp1a4NZ2SEXDBxag==} engines: {node: '>=14.0.0'} @@ -4006,6 +4246,10 @@ packages: resolution: {integrity: sha512-nZbJZB0XI3YnaFBWGDBr7kjaew6O0oNYNmopyIz6gKZEbxzrtH7rwvU1GcVxcSFoOwWecLJEe79fxEMljHopFQ==} engines: {node: '>=16.0.0'} + '@smithy/smithy-client@3.3.5': + resolution: {integrity: sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==} + engines: {node: '>=16.0.0'} + '@smithy/types@1.2.0': resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==} engines: {node: '>=14.0.0'} @@ -4014,8 +4258,8 @@ packages: resolution: {integrity: sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==} engines: {node: '>=14.0.0'} - '@smithy/types@3.3.0': - resolution: {integrity: sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==} + '@smithy/types@3.4.2': + resolution: {integrity: sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==} engines: {node: '>=16.0.0'} '@smithy/url-parser@2.2.0': @@ -4024,6 +4268,9 @@ packages: '@smithy/url-parser@3.0.3': resolution: {integrity: sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==} + '@smithy/url-parser@3.0.6': + resolution: {integrity: sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==} + '@smithy/util-base64@1.1.0': resolution: {integrity: sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==} engines: {node: '>=14.0.0'} @@ -4074,6 +4321,10 @@ packages: resolution: {integrity: sha512-RtKW+8j8skk17SYowucwRUjeh4mCtnm5odCL0Lm2NtHQBsYKrNW0od9Rhopu9wF1gHMfHeWF7i90NwBz/U22Kw==} engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@3.0.21': + resolution: {integrity: sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==} + engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@3.0.9': resolution: {integrity: sha512-WKPcElz92MAQG09miBdb0GxEH/MwD5GfE8g07WokITq5g6J1ROQfYCKC1wNnkqAGfrSywT7L0rdvvqlBplqiyA==} engines: {node: '>= 10.0.0'} @@ -4082,6 +4333,10 @@ packages: resolution: {integrity: sha512-vkMXHQ0BcLFysBMWgSBLSk3+leMpFSyyFj8zQtv5ZyUBx8/owVh1/pPEkzmW/DR/Gy/5c8vjLDD9gZjXNKbrpA==} engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@3.0.21': + resolution: {integrity: sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==} + engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@3.0.9': resolution: {integrity: sha512-dQLrUqFxqpf0GvEKEuFdgXcdZwz6oFm752h4d6C7lQz+RLddf761L2r7dSwGWzESMMB3wKj0jL+skRhEGlecjw==} engines: {node: '>= 10.0.0'} @@ -4090,6 +4345,10 @@ packages: resolution: {integrity: sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==} engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@2.1.2': + resolution: {integrity: sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==} + engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@1.1.0': resolution: {integrity: sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==} engines: {node: '>=14.0.0'} @@ -4114,6 +4373,10 @@ packages: resolution: {integrity: sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==} engines: {node: '>=16.0.0'} + '@smithy/util-middleware@3.0.6': + resolution: {integrity: sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==} + engines: {node: '>=16.0.0'} + '@smithy/util-retry@2.2.0': resolution: {integrity: sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==} engines: {node: '>= 14.0.0'} @@ -4122,6 +4385,10 @@ packages: resolution: {integrity: sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==} engines: {node: '>=16.0.0'} + '@smithy/util-retry@3.0.6': + resolution: {integrity: sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==} + engines: {node: '>=16.0.0'} + '@smithy/util-stream-node@1.1.0': resolution: {integrity: sha512-gC7La6Xh/Q6ruY2tF2kSmVYxZpca9nKMYsbPSNDUv6EKW6kMHO3UqxTQ4kixynUOz2uZ3igvuX+1d2w+LaD2dw==} engines: {node: '>=14.0.0'} @@ -4138,6 +4405,10 @@ packages: resolution: {integrity: sha512-w9i//7egejAIvplX821rPWWgaiY1dxsQUw0hXX7qwa/uZ9U3zplqTQ871jWadkcVB9gFDhkPWYVZf4yfFbZ0xA==} engines: {node: '>=16.0.0'} + '@smithy/util-stream@3.1.8': + resolution: {integrity: sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==} + engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@1.1.0': resolution: {integrity: sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==} engines: {node: '>=14.0.0'} @@ -4174,6 +4445,10 @@ packages: resolution: {integrity: sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==} engines: {node: '>=16.0.0'} + '@smithy/util-waiter@3.1.5': + resolution: {integrity: sha512-jYOSvM3H6sZe3CHjzD2VQNCjWBJs+4DbtwBMvUp9y5EnnwNa7NQxTeYeQw0CKCAdGGZ3QvVkyJmvbvs5M/B10A==} + engines: {node: '>=16.0.0'} + '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -4737,6 +5012,9 @@ packages: '@types/node@20.14.10': resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + '@types/node@22.7.4': + resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5108,9 +5386,19 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -6582,6 +6870,10 @@ packages: resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} hasBin: true + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -9525,6 +9817,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -9642,6 +9937,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -10255,7 +10554,7 @@ snapshots: '@aws-crypto/crc32@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.398.0 + '@aws-sdk/types': 3.654.0 tslib: 1.14.1 '@aws-crypto/crc32@5.2.0': @@ -10299,7 +10598,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.609.0 + '@aws-sdk/types': 3.654.0 '@aws-sdk/util-locate-window': 3.568.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 @@ -10313,7 +10612,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.609.0 + '@aws-sdk/types': 3.654.0 tslib: 2.6.3 '@aws-crypto/supports-web-crypto@3.0.0': @@ -10326,7 +10625,7 @@ snapshots: '@aws-crypto/util@3.0.0': dependencies: - '@aws-sdk/types': 3.398.0 + '@aws-sdk/types': 3.654.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -10367,7 +10666,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10413,7 +10712,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10462,7 +10761,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10510,7 +10809,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10556,7 +10855,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10603,7 +10902,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10620,6 +10919,55 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-ec2@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-sdk-ec2': 3.658.1 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.1.5 + tslib: 2.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-eventbridge@3.613.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -10652,7 +11000,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10786,7 +11134,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10834,7 +11182,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10850,6 +11198,52 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-opensearch@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-personalize-events@3.398.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 @@ -10938,7 +11332,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -10985,7 +11379,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11032,7 +11426,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11079,7 +11473,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11127,7 +11521,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11173,7 +11567,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11221,7 +11615,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11267,7 +11661,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11282,49 +11676,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.398.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.398.0 - '@aws-sdk/middleware-logger': 3.398.0 - '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-user-agent': 3.398.0 - '@aws-sdk/types': 3.398.0 - '@aws-sdk/util-endpoints': 3.398.0 - '@aws-sdk/util-user-agent-browser': 3.398.0 - '@aws-sdk/util-user-agent-node': 3.398.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 2.0.5 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.3 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.609.0': + '@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.658.1 '@aws-sdk/core': 3.609.0 + '@aws-sdk/credential-provider-node': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) '@aws-sdk/middleware-host-header': 3.609.0 '@aws-sdk/middleware-logger': 3.609.0 '@aws-sdk/middleware-recursion-detection': 3.609.0 @@ -11348,7 +11706,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11363,16 +11721,103 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.398.0': + '@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.613.0 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.398.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.398.0 '@aws-sdk/middleware-host-header': 3.398.0 '@aws-sdk/middleware-logger': 3.398.0 '@aws-sdk/middleware-recursion-detection': 3.398.0 - '@aws-sdk/middleware-sdk-sts': 3.398.0 - '@aws-sdk/middleware-signing': 3.398.0 '@aws-sdk/middleware-user-agent': 3.398.0 '@aws-sdk/types': 3.398.0 '@aws-sdk/util-endpoints': 3.398.0 @@ -11399,17 +11844,144 @@ snapshots: '@smithy/util-defaults-mode-browser': 2.2.1 '@smithy/util-defaults-mode-node': 2.3.1 '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.0.0 - fast-xml-parser: 4.2.5 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.613.0': + '@aws-sdk/client-sso@3.609.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.613.0(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/core': 3.609.0 + '@aws-sdk/middleware-host-header': 3.609.0 + '@aws-sdk/middleware-logger': 3.609.0 + '@aws-sdk/middleware-recursion-detection': 3.609.0 + '@aws-sdk/middleware-user-agent': 3.609.0 + '@aws-sdk/region-config-resolver': 3.609.0 + '@aws-sdk/types': 3.609.0 + '@aws-sdk/util-endpoints': 3.609.0 + '@aws-sdk/util-user-agent-browser': 3.609.0 + '@aws-sdk/util-user-agent-node': 3.609.0 + '@smithy/config-resolver': 3.0.5 + '@smithy/core': 2.2.6 + '@smithy/fetch-http-handler': 3.2.1 + '@smithy/hash-node': 3.0.3 + '@smithy/invalid-dependency': 3.0.3 + '@smithy/middleware-content-length': 3.0.3 + '@smithy/middleware-endpoint': 3.0.5 + '@smithy/middleware-retry': 3.0.9 + '@smithy/middleware-serde': 3.0.3 + '@smithy/middleware-stack': 3.0.3 + '@smithy/node-config-provider': 3.1.4 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.3 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 + '@smithy/util-endpoints': 2.0.5 + '@smithy/util-middleware': 3.0.3 + '@smithy/util-retry': 3.0.3 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.658.1 + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/credential-provider-node': 3.398.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-sdk-sts': 3.398.0 + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.613.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.613.0(@aws-sdk/client-sts@3.613.0) '@aws-sdk/core': 3.609.0 '@aws-sdk/credential-provider-node': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) '@aws-sdk/middleware-host-header': 3.609.0 @@ -11435,7 +12007,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11450,6 +12022,51 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sts@3.658.1': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/core': 3.658.1 + '@aws-sdk/credential-provider-node': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/middleware-host-header': 3.654.0 + '@aws-sdk/middleware-logger': 3.654.0 + '@aws-sdk/middleware-recursion-detection': 3.654.0 + '@aws-sdk/middleware-user-agent': 3.654.0 + '@aws-sdk/region-config-resolver': 3.654.0 + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@aws-sdk/util-user-agent-browser': 3.654.0 + '@aws-sdk/util-user-agent-node': 3.654.0 + '@smithy/config-resolver': 3.0.8 + '@smithy/core': 2.4.6 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/hash-node': 3.0.6 + '@smithy/invalid-dependency': 3.0.6 + '@smithy/middleware-content-length': 3.0.8 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/middleware-stack': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/node-http-handler': 3.2.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.21 + '@smithy/util-defaults-mode-node': 3.0.21 + '@smithy/util-endpoints': 2.1.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-verifiedpermissions@3.613.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -11481,7 +12098,7 @@ snapshots: '@smithy/node-http-handler': 3.1.2 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 @@ -11503,16 +12120,29 @@ snapshots: '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 fast-xml-parser: 4.2.5 tslib: 2.6.3 + '@aws-sdk/core@3.658.1': + dependencies: + '@smithy/core': 2.4.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/signature-v4': 4.1.4 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-middleware': 3.0.6 + fast-xml-parser: 4.4.1 + tslib: 2.6.3 + '@aws-sdk/credential-provider-cognito-identity@3.613.0': dependencies: '@aws-sdk/client-cognito-identity': 3.613.0 '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 transitivePeerDependencies: - aws-crt @@ -11528,7 +12158,14 @@ snapshots: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-env@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/credential-provider-http@3.613.0': @@ -11539,10 +12176,22 @@ snapshots: '@smithy/property-provider': 3.1.3 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-stream': 3.0.6 tslib: 2.6.3 + '@aws-sdk/credential-provider-http@3.658.1': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/node-http-handler': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-stream': 3.1.8 + tslib: 2.6.3 + '@aws-sdk/credential-provider-ini@3.398.0': dependencies: '@aws-sdk/credential-provider-env': 3.398.0 @@ -11570,7 +12219,79 @@ snapshots: '@smithy/credential-provider-imds': 3.1.4 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.613.0 + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-sdk/client-sts': 3.613.0 + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.613.0 + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-sdk/client-sts': 3.613.0 + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11604,7 +12325,83 @@ snapshots: '@smithy/credential-provider-imds': 3.1.4 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.613.0 + '@aws-sdk/credential-provider-ini': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.609.0 + '@aws-sdk/credential-provider-http': 3.613.0 + '@aws-sdk/credential-provider-ini': 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/credential-provider-process': 3.609.0 + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.609.0 + '@smithy/credential-provider-imds': 3.1.4 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-ini': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/credential-provider-env': 3.654.0 + '@aws-sdk/credential-provider-http': 3.658.1 + '@aws-sdk/credential-provider-ini': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/credential-provider-process': 3.654.0 + '@aws-sdk/credential-provider-sso': 3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/credential-provider-web-identity': 3.654.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11624,7 +12421,15 @@ snapshots: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-process@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/credential-provider-sso@3.398.0': @@ -11646,7 +12451,59 @@ snapshots: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-sso@3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso': 3.609.0 + '@aws-sdk/token-providers': 3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-sso@3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': + dependencies: + '@aws-sdk/client-sso': 3.609.0 + '@aws-sdk/token-providers': 3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-sso@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': + dependencies: + '@aws-sdk/client-sso': 3.658.1 + '@aws-sdk/token-providers': 3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-sso@3.658.1(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso': 3.658.1 + '@aws-sdk/token-providers': 3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1)) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11664,10 +12521,34 @@ snapshots: '@aws-sdk/client-sts': 3.613.0 '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 - '@aws-sdk/credential-providers@3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))': + '@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-web-identity@3.654.0(@aws-sdk/client-sts@3.613.0)': + dependencies: + '@aws-sdk/client-sts': 3.613.0 + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/credential-provider-web-identity@3.654.0(@aws-sdk/client-sts@3.658.1)': + dependencies: + '@aws-sdk/client-sts': 3.658.1 + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/credential-providers@3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': dependencies: '@aws-sdk/client-cognito-identity': 3.613.0 '@aws-sdk/client-sso': 3.609.0 @@ -11675,15 +12556,15 @@ snapshots: '@aws-sdk/credential-provider-cognito-identity': 3.613.0 '@aws-sdk/credential-provider-env': 3.609.0 '@aws-sdk/credential-provider-http': 3.613.0 - '@aws-sdk/credential-provider-ini': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) - '@aws-sdk/credential-provider-node': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/credential-provider-ini': 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/credential-provider-node': 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))(@aws-sdk/client-sts@3.613.0) '@aws-sdk/credential-provider-process': 3.609.0 - '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-provider-sso': 3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.613.0) '@aws-sdk/types': 3.609.0 '@smithy/credential-provider-imds': 3.1.4 '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' @@ -11703,7 +12584,7 @@ snapshots: '@aws-sdk/client-dynamodb': 3.613.0 '@aws-sdk/util-dynamodb': 3.613.0(@aws-sdk/client-dynamodb@3.613.0) '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-bucket-endpoint@3.609.0': @@ -11712,7 +12593,7 @@ snapshots: '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.1.4 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-config-provider': 3.0.0 tslib: 2.6.3 @@ -11722,14 +12603,14 @@ snapshots: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-expect-continue@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-flexible-checksums@3.609.0': @@ -11739,7 +12620,7 @@ snapshots: '@aws-sdk/types': 3.609.0 '@smithy/is-array-buffer': 3.0.0 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 @@ -11754,13 +12635,20 @@ snapshots: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/middleware-host-header@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-location-constraint@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-logger@3.398.0': @@ -11772,7 +12660,13 @@ snapshots: '@aws-sdk/middleware-logger@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/middleware-logger@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-recursion-detection@3.398.0': @@ -11786,7 +12680,25 @@ snapshots: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/middleware-recursion-detection@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/middleware-sdk-ec2@3.658.1': + dependencies: + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-format-url': 3.654.0 + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/protocol-http': 4.1.3 + '@smithy/signature-v4': 4.1.4 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-sdk-s3@3.609.0': @@ -11797,7 +12709,7 @@ snapshots: '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-config-provider': 3.0.0 tslib: 2.6.3 @@ -11805,7 +12717,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 @@ -11833,14 +12745,14 @@ snapshots: '@smithy/property-provider': 3.1.3 '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 '@aws-sdk/middleware-ssec@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/middleware-user-agent@3.398.0': @@ -11856,25 +12768,42 @@ snapshots: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.609.0 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/middleware-user-agent@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@aws-sdk/util-endpoints': 3.654.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/region-config-resolver@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 + '@aws-sdk/region-config-resolver@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.6 + tslib: 2.6.3 + '@aws-sdk/signature-v4-multi-region@3.609.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.609.0 '@aws-sdk/types': 3.609.0 '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/smithy-client@3.374.0': @@ -11917,7 +12846,7 @@ snapshots: '@smithy/util-defaults-mode-browser': 2.2.1 '@smithy/util-defaults-mode-node': 2.3.1 '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.0.0 + '@smithy/util-utf8': 2.3.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt @@ -11928,7 +12857,43 @@ snapshots: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.609.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.613.0(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.609.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.609.0 + '@smithy/property-provider': 3.1.3 + '@smithy/shared-ini-file-loader': 3.1.4 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.613.0) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/token-providers@3.654.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.658.1))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.658.1(@aws-sdk/client-sts@3.658.1) + '@aws-sdk/types': 3.654.0 + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/types@3.387.0': @@ -11943,7 +12908,12 @@ snapshots: '@aws-sdk/types@3.609.0': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/types@3.654.0': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/util-arn-parser@3.568.0': @@ -11968,10 +12938,24 @@ snapshots: '@aws-sdk/util-endpoints@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-endpoints': 2.0.5 tslib: 2.6.3 + '@aws-sdk/util-endpoints@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 + '@smithy/util-endpoints': 2.1.2 + tslib: 2.6.3 + + '@aws-sdk/util-format-url@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/querystring-builder': 3.0.6 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + '@aws-sdk/util-locate-window@3.568.0': dependencies: tslib: 2.6.3 @@ -11991,7 +12975,14 @@ snapshots: '@aws-sdk/util-user-agent-browser@3.609.0': dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + bowser: 2.11.0 + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-browser@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/types': 3.4.2 bowser: 2.11.0 tslib: 2.6.3 @@ -12006,7 +12997,14 @@ snapshots: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@aws-sdk/util-user-agent-node@3.654.0': + dependencies: + '@aws-sdk/types': 3.654.0 + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@aws-sdk/util-utf8-browser@3.259.0': @@ -12020,14 +13018,14 @@ snapshots: '@aws-sdk/xml-builder@3.609.0': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 - '@aws/amazon-location-utilities-auth-helper@1.0.6(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0))': + '@aws/amazon-location-utilities-auth-helper@1.0.6(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0))': dependencies: '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/client-location': 3.613.0 - '@aws-sdk/credential-providers': 3.613.0(@aws-sdk/client-sso-oidc@3.613.0(@aws-sdk/client-sts@3.613.0)) + '@aws-sdk/credential-providers': 3.613.0(@aws-sdk/client-sso-oidc@3.658.1(@aws-sdk/client-sts@3.613.0)) '@aws-sdk/types': 3.609.0 '@smithy/util-hex-encoding': 2.2.0 transitivePeerDependencies: @@ -12592,7 +13590,7 @@ snapshots: '@fastify/ajv-compiler@3.6.0': dependencies: ajv: 8.16.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1(ajv@8.16.0) fast-uri: 2.4.0 '@fastify/awilix@5.1.0(awilix@10.0.2)(fastify@4.28.1)': @@ -12704,6 +13702,11 @@ snapshots: '@inquirer/core': 9.0.2 '@inquirer/type': 1.4.0 + '@inquirer/confirm@4.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + '@inquirer/core@9.0.2': dependencies: '@inquirer/figures': 1.0.3 @@ -12720,6 +13723,21 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.6 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.7.4 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + '@inquirer/editor@2.1.14': dependencies: '@inquirer/core': 9.0.2 @@ -12734,6 +13752,8 @@ snapshots: '@inquirer/figures@1.0.3': {} + '@inquirer/figures@1.0.6': {} + '@inquirer/input@2.2.1': dependencies: '@inquirer/core': 9.0.2 @@ -12780,6 +13800,10 @@ snapshots: dependencies: mute-stream: 1.0.0 + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -13684,7 +14708,7 @@ snapshots: dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1 + ajv-formats: 3.0.1(ajv@8.16.0) fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 @@ -13830,7 +14854,12 @@ snapshots: '@smithy/abort-controller@3.1.1': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/abort-controller@3.1.4': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/chunked-blob-reader-native@3.0.0': @@ -13853,11 +14882,19 @@ snapshots: '@smithy/config-resolver@3.0.5': dependencies: '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 + '@smithy/config-resolver@3.0.8': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.6 + tslib: 2.6.3 + '@smithy/core@2.2.6': dependencies: '@smithy/middleware-endpoint': 3.0.5 @@ -13865,10 +14902,23 @@ snapshots: '@smithy/middleware-serde': 3.0.3 '@smithy/protocol-http': 4.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 + '@smithy/core@2.4.6': + dependencies: + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-retry': 3.0.21 + '@smithy/middleware-serde': 3.0.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + '@smithy/credential-provider-imds@2.3.0': dependencies: '@smithy/node-config-provider': 2.3.0 @@ -13881,10 +14931,18 @@ snapshots: dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 tslib: 2.6.3 + '@smithy/credential-provider-imds@3.2.3': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + tslib: 2.6.3 + '@smithy/eventstream-codec@2.2.0': dependencies: '@aws-crypto/crc32': 3.0.0 @@ -13895,7 +14953,7 @@ snapshots: '@smithy/eventstream-codec@3.1.2': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-hex-encoding': 3.0.0 tslib: 2.6.3 @@ -13908,7 +14966,7 @@ snapshots: '@smithy/eventstream-serde-browser@3.0.4': dependencies: '@smithy/eventstream-serde-universal': 3.0.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/eventstream-serde-config-resolver@2.2.0': @@ -13918,7 +14976,7 @@ snapshots: '@smithy/eventstream-serde-config-resolver@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/eventstream-serde-node@2.2.0': @@ -13930,7 +14988,7 @@ snapshots: '@smithy/eventstream-serde-node@3.0.4': dependencies: '@smithy/eventstream-serde-universal': 3.0.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/eventstream-serde-universal@2.2.0': @@ -13942,7 +15000,7 @@ snapshots: '@smithy/eventstream-serde-universal@3.0.4': dependencies: '@smithy/eventstream-codec': 3.1.2 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/fetch-http-handler@1.1.0': @@ -13965,7 +15023,15 @@ snapshots: dependencies: '@smithy/protocol-http': 4.0.3 '@smithy/querystring-builder': 3.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.3 + + '@smithy/fetch-http-handler@3.2.8': + dependencies: + '@smithy/protocol-http': 4.1.3 + '@smithy/querystring-builder': 3.0.6 + '@smithy/types': 3.4.2 '@smithy/util-base64': 3.0.0 tslib: 2.6.3 @@ -13973,7 +15039,7 @@ snapshots: dependencies: '@smithy/chunked-blob-reader': 3.0.0 '@smithy/chunked-blob-reader-native': 3.0.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/hash-node@2.2.0': @@ -13985,14 +15051,21 @@ snapshots: '@smithy/hash-node@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/hash-node@3.0.6': + dependencies: + '@smithy/types': 3.4.2 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 '@smithy/hash-stream-node@3.1.2': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 @@ -14003,7 +15076,12 @@ snapshots: '@smithy/invalid-dependency@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/invalid-dependency@3.0.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/is-array-buffer@1.1.0': @@ -14026,7 +15104,7 @@ snapshots: '@smithy/md5-js@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 @@ -14039,7 +15117,13 @@ snapshots: '@smithy/middleware-content-length@3.0.3': dependencies: '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/middleware-content-length@3.0.8': + dependencies: + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/middleware-endpoint@2.5.1': @@ -14057,11 +15141,21 @@ snapshots: '@smithy/middleware-serde': 3.0.3 '@smithy/node-config-provider': 3.1.4 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/url-parser': 3.0.3 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 + '@smithy/middleware-endpoint@3.1.3': + dependencies: + '@smithy/middleware-serde': 3.0.6 + '@smithy/node-config-provider': 3.1.7 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 + '@smithy/url-parser': 3.0.6 + '@smithy/util-middleware': 3.0.6 + tslib: 2.6.3 + '@smithy/middleware-retry@2.3.1': dependencies: '@smithy/node-config-provider': 2.3.0 @@ -14074,13 +15168,25 @@ snapshots: tslib: 2.6.3 uuid: 9.0.1 + '@smithy/middleware-retry@3.0.21': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/protocol-http': 4.1.3 + '@smithy/service-error-classification': 3.0.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-retry': 3.0.6 + tslib: 2.6.3 + uuid: 9.0.1 + '@smithy/middleware-retry@3.0.9': dependencies: '@smithy/node-config-provider': 3.1.4 '@smithy/protocol-http': 4.0.3 '@smithy/service-error-classification': 3.0.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 tslib: 2.6.3 @@ -14093,7 +15199,12 @@ snapshots: '@smithy/middleware-serde@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/middleware-serde@3.0.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/middleware-stack@1.1.0': @@ -14107,7 +15218,12 @@ snapshots: '@smithy/middleware-stack@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/middleware-stack@3.0.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/node-config-provider@2.3.0': @@ -14121,7 +15237,14 @@ snapshots: dependencies: '@smithy/property-provider': 3.1.3 '@smithy/shared-ini-file-loader': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/node-config-provider@3.1.7': + dependencies: + '@smithy/property-provider': 3.1.6 + '@smithy/shared-ini-file-loader': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/node-http-handler@1.1.0': @@ -14145,7 +15268,15 @@ snapshots: '@smithy/abort-controller': 3.1.1 '@smithy/protocol-http': 4.0.3 '@smithy/querystring-builder': 3.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/node-http-handler@3.2.3': + dependencies: + '@smithy/abort-controller': 3.1.4 + '@smithy/protocol-http': 4.1.3 + '@smithy/querystring-builder': 3.0.6 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/property-provider@2.2.0': @@ -14155,7 +15286,12 @@ snapshots: '@smithy/property-provider@3.1.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/property-provider@3.1.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/protocol-http@1.2.0': @@ -14175,7 +15311,12 @@ snapshots: '@smithy/protocol-http@4.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/protocol-http@4.1.3': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/querystring-builder@1.1.0': @@ -14192,7 +15333,13 @@ snapshots: '@smithy/querystring-builder@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.3 + + '@smithy/querystring-builder@3.0.6': + dependencies: + '@smithy/types': 3.4.2 '@smithy/util-uri-escape': 3.0.0 tslib: 2.6.3 @@ -14203,7 +15350,12 @@ snapshots: '@smithy/querystring-parser@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/querystring-parser@3.0.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/service-error-classification@2.1.5': @@ -14212,7 +15364,11 @@ snapshots: '@smithy/service-error-classification@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + + '@smithy/service-error-classification@3.0.6': + dependencies: + '@smithy/types': 3.4.2 '@smithy/shared-ini-file-loader@2.4.0': dependencies: @@ -14221,7 +15377,12 @@ snapshots: '@smithy/shared-ini-file-loader@3.1.4': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/shared-ini-file-loader@3.1.7': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/signature-v4@2.3.0': @@ -14237,13 +15398,24 @@ snapshots: '@smithy/signature-v4@3.1.2': dependencies: '@smithy/is-array-buffer': 3.0.0 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-middleware': 3.0.3 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 + '@smithy/signature-v4@4.1.4': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.6 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + '@smithy/smithy-client@1.1.0': dependencies: '@smithy/middleware-stack': 1.1.0 @@ -14265,10 +15437,19 @@ snapshots: '@smithy/middleware-endpoint': 3.0.5 '@smithy/middleware-stack': 3.0.3 '@smithy/protocol-http': 4.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 '@smithy/util-stream': 3.0.6 tslib: 2.6.3 + '@smithy/smithy-client@3.3.5': + dependencies: + '@smithy/middleware-endpoint': 3.1.3 + '@smithy/middleware-stack': 3.0.6 + '@smithy/protocol-http': 4.1.3 + '@smithy/types': 3.4.2 + '@smithy/util-stream': 3.1.8 + tslib: 2.6.3 + '@smithy/types@1.2.0': dependencies: tslib: 2.6.3 @@ -14277,7 +15458,7 @@ snapshots: dependencies: tslib: 2.6.3 - '@smithy/types@3.3.0': + '@smithy/types@3.4.2': dependencies: tslib: 2.6.3 @@ -14290,7 +15471,13 @@ snapshots: '@smithy/url-parser@3.0.3': dependencies: '@smithy/querystring-parser': 3.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/url-parser@3.0.6': + dependencies: + '@smithy/querystring-parser': 3.0.6 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/util-base64@1.1.0': @@ -14357,11 +15544,19 @@ snapshots: bowser: 2.11.0 tslib: 2.6.3 + '@smithy/util-defaults-mode-browser@3.0.21': + dependencies: + '@smithy/property-provider': 3.1.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + bowser: 2.11.0 + tslib: 2.6.3 + '@smithy/util-defaults-mode-browser@3.0.9': dependencies: '@smithy/property-provider': 3.1.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 bowser: 2.11.0 tslib: 2.6.3 @@ -14375,6 +15570,16 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.6.3 + '@smithy/util-defaults-mode-node@3.0.21': + dependencies: + '@smithy/config-resolver': 3.0.8 + '@smithy/credential-provider-imds': 3.2.3 + '@smithy/node-config-provider': 3.1.7 + '@smithy/property-provider': 3.1.6 + '@smithy/smithy-client': 3.3.5 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + '@smithy/util-defaults-mode-node@3.0.9': dependencies: '@smithy/config-resolver': 3.0.5 @@ -14382,13 +15587,19 @@ snapshots: '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 '@smithy/smithy-client': 3.1.7 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/util-endpoints@2.0.5': dependencies: '@smithy/node-config-provider': 3.1.4 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/util-endpoints@2.1.2': + dependencies: + '@smithy/node-config-provider': 3.1.7 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/util-hex-encoding@1.1.0': @@ -14414,7 +15625,12 @@ snapshots: '@smithy/util-middleware@3.0.3': dependencies: - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/util-middleware@3.0.6': + dependencies: + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/util-retry@2.2.0': @@ -14426,7 +15642,13 @@ snapshots: '@smithy/util-retry@3.0.3': dependencies: '@smithy/service-error-classification': 3.0.3 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/util-retry@3.0.6': + dependencies: + '@smithy/service-error-classification': 3.0.6 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@smithy/util-stream-node@1.1.0': @@ -14462,7 +15684,18 @@ snapshots: dependencies: '@smithy/fetch-http-handler': 3.2.1 '@smithy/node-http-handler': 3.1.2 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + + '@smithy/util-stream@3.1.8': + dependencies: + '@smithy/fetch-http-handler': 3.2.8 + '@smithy/node-http-handler': 3.2.3 + '@smithy/types': 3.4.2 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 @@ -14510,7 +15743,13 @@ snapshots: '@smithy/util-waiter@3.1.2': dependencies: '@smithy/abort-controller': 3.1.1 - '@smithy/types': 3.3.0 + '@smithy/types': 3.4.2 + tslib: 2.6.3 + + '@smithy/util-waiter@3.1.5': + dependencies: + '@smithy/abort-controller': 3.1.4 + '@smithy/types': 3.4.2 tslib: 2.6.3 '@szmarczak/http-timer@1.1.2': @@ -15611,6 +16850,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@22.7.4': + dependencies: + undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -16128,12 +17371,12 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv-formats@2.1.1: - dependencies: + ajv-formats@2.1.1(ajv@8.16.0): + optionalDependencies: ajv: 8.16.0 - ajv-formats@3.0.1: - dependencies: + ajv-formats@3.0.1(ajv@8.16.0): + optionalDependencies: ajv: 8.16.0 ajv@6.12.6: @@ -16833,7 +18076,7 @@ snapshots: conf@12.0.0: dependencies: ajv: 8.16.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1(ajv@8.16.0) atomically: 2.0.3 debounce-fn: 5.1.2 dot-prop: 8.0.2 @@ -17898,7 +19141,7 @@ snapshots: dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.16.0 - ajv-formats: 3.0.1 + ajv-formats: 3.0.1(ajv@8.16.0) fast-deep-equal: 3.1.3 fast-uri: 2.4.0 json-schema-ref-resolver: 1.0.1 @@ -17928,6 +19171,10 @@ snapshots: dependencies: strnum: 1.0.5 + fast-xml-parser@4.4.1: + dependencies: + strnum: 1.0.5 + fastest-levenshtein@1.0.16: {} fastify-plugin@4.5.1: {} @@ -20958,6 +22205,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + union-value@1.0.1: dependencies: arr-union: 3.1.0 @@ -21080,6 +22329,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validator@13.12.0: {} + vary@1.1.2: {} victory-area@37.0.2(react@18.3.1): diff --git a/infrastructure/src/app.ts b/infrastructure/src/app.ts index e571bfb..2334434 100644 --- a/infrastructure/src/app.ts +++ b/infrastructure/src/app.ts @@ -20,14 +20,14 @@ import * as fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { EngineStack } from './engine/engine.stack.js'; +import { NotificationsStack } from './notifications/notifications.stack.js'; import { RegionsApiStack } from './regions/regions.stack.js'; import { RegionsExtensionStack } from './regionsExtension/regionsExtension.stack.js'; +import { ResultsStack } from './results/results.stack.js'; +import { SchedulerStack } from './scheduler/scheduler.stack.js'; import { SharedInfrastructureStack } from './shared/shared.stack.js'; import { verifiedPermissionsPolicyStoreIdParameter } from './shared/verifiedPermissions.construct.js'; import { StacServerStack } from './stacServer/stacServer.stack.js'; -import { ResultsStack } from './results/results.stack.js'; -import { SchedulerStack } from './scheduler/scheduler.stack.js'; -import { NotificationsStack } from './notifications/notifications.stack.js'; import { UIApiStack } from './ui/ui.stack.js'; const __filename = fileURLToPath(import.meta.url); @@ -50,8 +50,8 @@ const cognitoReplyToEmail = app.node.tryGetContext('cognitoReplyToEmail') as str const concurrencyLimit = parseInt(app.node.tryGetContext('concurrencyLimit') ?? 10); // optional configuration for STAC OpenSearch servers -const stacServerInstanceType = app.node.tryGetContext('stacServerInstanceType') as string ?? 'c5.large.search'; -const stacServerVolumeType = app.node.tryGetContext('stacServerVolumeType') as string ?? 'gp3'; +const stacServerInstanceType = (app.node.tryGetContext('stacServerInstanceType') as string) ?? 'c5.large.search'; +const stacServerVolumeType = (app.node.tryGetContext('stacServerVolumeType') as string) ?? 'gp3'; const stacServerVolumeSize = parseInt(app.node.tryGetContext('stacServerVolumeSize') ?? 20); const stacServerInstanceCount = parseInt(app.node.tryGetContext('stacServerInstanceCount') ?? 1); const stacServerDedicatedMasterEnabled = tryGetBooleanContext(app, 'stacServerDedicatedMasterEnabled', false); @@ -61,9 +61,9 @@ const stacServerZoneAwarenessEnabled = tryGetBooleanContext(app, 'stacServerZone const deleteBucket = tryGetBooleanContext(app, 'deleteBucket', false); // Sentinel-2 Open Data on AWS parameters -const sentinelTopicArn = app.node.tryGetContext('sentinelTopicArn') as string ?? 'arn:aws:sns:us-west-2:608149789419:cirrus-es-prod-publish'; -const sentinelApiUrl = app.node.tryGetContext('sentinelApiUrl') as string ?? 'https://earth-search.aws.element84.com/v1'; -const sentinelCollection = app.node.tryGetContext('sentinelCollection') as string ?? 'sentinel-2-c1-l2a'; +const sentinelTopicArn = (app.node.tryGetContext('sentinelTopicArn') as string) ?? 'arn:aws:sns:us-west-2:608149789419:cirrus-es-prod-publish'; +const sentinelApiUrl = (app.node.tryGetContext('sentinelApiUrl') as string) ?? 'https://earth-search.aws.element84.com/v1'; +const sentinelCollection = (app.node.tryGetContext('sentinelCollection') as string) ?? 'sentinel-2-c1-l2a'; // user VPC config const useExistingVpc = tryGetBooleanContext(app, 'useExistingVpc', false); @@ -71,17 +71,26 @@ const useExistingVpc = tryGetBooleanContext(app, 'useExistingVpc', false); // useRegionCache const useRegionCache = tryGetBooleanContext(app, 'useRegionCache', false); -let userVpcId; -let userIsolatedSubnetIds; -let userPrivateSubnetIds; -let userPublicSubnetIds; -let userAvailabilityZones; +let userVpcId: string; +let userIsolatedSubnetIds: string[]; +let userPrivateSubnetIds: string[]; +let userPublicSubnetIds: string[]; +let userAvailabilityZones: string[]; + if (useExistingVpc) { userVpcId = getOrThrow(app, 'existingVpcId'); - userIsolatedSubnetIds = getOrThrow(app, 'existingIsolatedSubnetIds').toString().split(','); - userPrivateSubnetIds = getOrThrow(app, 'existingPrivateSubnetIds').toString().split(','); - userPublicSubnetIds = getOrThrow(app, 'existingPublicSubnetIds').toString().split(','); - userAvailabilityZones = getOrThrow(app, 'userAvailabilityZones').toString().split(','); + + const existingIsolatedSubnetIds = getOrThrow(app, 'userIsolatedSubnetIds'); + userIsolatedSubnetIds = Array.isArray(existingIsolatedSubnetIds) ? existingIsolatedSubnetIds : existingIsolatedSubnetIds.toString().split(','); + + const existingPrivateSubnetIds = getOrThrow(app, 'userPrivateSubnetIds'); + userPrivateSubnetIds = Array.isArray(existingPrivateSubnetIds) ? existingPrivateSubnetIds : existingPrivateSubnetIds.toString().split(','); + + const existingPublicSubnetIds = getOrThrow(app, 'userPublicSubnetIds'); + userPublicSubnetIds = Array.isArray(existingPublicSubnetIds) ? existingPublicSubnetIds : existingPublicSubnetIds.toString().split(','); + + const availabilityZones = getOrThrow(app, 'availabilityZones'); + userAvailabilityZones = Array.isArray(availabilityZones) ? availabilityZones : availabilityZones.toString().split(','); } cdk.Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true })); @@ -89,10 +98,7 @@ cdk.Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true })); const stackName = (suffix: string) => `agie-${environment}-${suffix}`; const stackDescription = (moduleName: string) => `Infrastructure for AGIE ${moduleName} module`; -const deployPlatform = (callerEnvironment?: { - accountId?: string; - region?: string -}): void => { +const deployPlatform = (callerEnvironment?: { accountId?: string; region?: string }): void => { const sharedStack = new SharedInfrastructureStack(app, 'SharedStack', { stackName: stackName('shared'), description: `Infrastructure for AGIE Shared module -- Guidance for Automated Geospatial Insight Engine on AWS (SO9531).`, @@ -100,26 +106,28 @@ const deployPlatform = (callerEnvironment?: { administratorEmail, administratorPhoneNumber, deleteBucket, - userVpcConfig: useExistingVpc ? { - availabilityZones: userAvailabilityZones, - privateSubnetIds: userPrivateSubnetIds, - publicSubnetIds: userPublicSubnetIds, - isolatedSubnetIds: userIsolatedSubnetIds, - vpcId: userVpcId - } : undefined, + userVpcConfig: useExistingVpc + ? { + availabilityZones: userAvailabilityZones, + privateSubnetIds: userPrivateSubnetIds, + publicSubnetIds: userPublicSubnetIds, + isolatedSubnetIds: userIsolatedSubnetIds, + vpcId: userVpcId, + } + : undefined, userPoolEmail: cognitoFromEmail !== undefined ? { - fromEmail: cognitoFromEmail, - fromName: cognitoFromName, - replyTo: cognitoReplyToEmail, - sesVerifiedDomain: cognitoVerifiedDomain - } + fromEmail: cognitoFromEmail, + fromName: cognitoFromName, + replyTo: cognitoReplyToEmail, + sesVerifiedDomain: cognitoVerifiedDomain, + } : undefined, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); const regionsStack = new RegionsApiStack(app, 'RegionsModule', { @@ -131,8 +139,8 @@ const deployPlatform = (callerEnvironment?: { useRegionCache, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); regionsStack.addDependency(sharedStack); @@ -143,8 +151,8 @@ const deployPlatform = (callerEnvironment?: { environment, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); regionsExtensionStack.addDependency(regionsStack); @@ -161,8 +169,8 @@ const deployPlatform = (callerEnvironment?: { zoneAwarenessEnabled: stacServerZoneAwarenessEnabled, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); stacServerStack.addDependency(sharedStack); @@ -177,8 +185,8 @@ const deployPlatform = (callerEnvironment?: { sentinelCollection, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); engineStack.addDependency(sharedStack); @@ -189,11 +197,11 @@ const deployPlatform = (callerEnvironment?: { environment, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId + account: callerEnvironment?.accountId, }, stacServerTopicArn: stacServerStack.stacIngestTopicArn, stacApiEndpoint: stacServerStack.stacApiEndpoint, - stacApiResourceArn: stacServerStack.stacApiResourceArn + stacApiResourceArn: stacServerStack.stacApiResourceArn, }); resultStack.addDependency(sharedStack); @@ -211,8 +219,8 @@ const deployPlatform = (callerEnvironment?: { sentinelCollection, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); schedulerStack.addDependency(sharedStack); @@ -223,7 +231,7 @@ const deployPlatform = (callerEnvironment?: { const notificationsStack = new NotificationsStack(app, 'NotificationsModule', { stackName: stackName('notifications'), description: stackDescription('Notifications'), - environment + environment, }); notificationsStack.addDependency(sharedStack); @@ -237,24 +245,24 @@ const deployPlatform = (callerEnvironment?: { stacApiResourceArn: stacServerStack.stacApiResourceArn, env: { region: callerEnvironment?.region, - account: callerEnvironment?.accountId - } + account: callerEnvironment?.accountId, + }, }); uiStack.addDependency(sharedStack); }; const getCallerEnvironment = (): | { - accountId?: string; - region?: string; -} + accountId?: string; + region?: string; + } | undefined => { if (!fs.existsSync(`${__dirname}/predeploy.json`)) { throw new Error( 'Pre deployment file does not exist\n' + - 'Make sure you run the cdk using npm script which will run the predeploy script automatically\n' + - 'EXAMPLE\n' + - '$ npm run cdk deploy -- -e sampleEnvironment' + 'Make sure you run the cdk using npm script which will run the predeploy script automatically\n' + + 'EXAMPLE\n' + + '$ npm run cdk deploy -- -e sampleEnvironment' ); } const { callerEnvironment } = JSON.parse(fs.readFileSync(`${__dirname}/predeploy.json`, 'utf-8')); diff --git a/infrastructure/src/ui/ui.staticSite.construct.ts b/infrastructure/src/ui/ui.staticSite.construct.ts index 392e7de..d885eda 100644 --- a/infrastructure/src/ui/ui.staticSite.construct.ts +++ b/infrastructure/src/ui/ui.staticSite.construct.ts @@ -14,9 +14,9 @@ import * as cdk from 'aws-cdk-lib'; import * as cloudfront from 'aws-cdk-lib/aws-cloudfront'; import * as s3 from 'aws-cdk-lib/aws-s3'; +import { StringParameter } from 'aws-cdk-lib/aws-ssm'; import { NagSuppressions } from 'cdk-nag'; import { Construct } from 'constructs'; -import { StringParameter } from 'aws-cdk-lib/aws-ssm'; export const websiteBucketParameter = (environment: string) => `/agie/${environment}/ui/websiteBucket`; export const websiteUrlParameter = (environment: string) => `/agie/${environment}/ui/websiteUrl`; @@ -35,7 +35,9 @@ export class StaticSite extends Construct { versioned: true, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, encryption: s3.BucketEncryption.S3_MANAGED, - enforceSSL: true + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, }); const originAccessIdentity = new cloudfront.OriginAccessIdentity(this, 'OriginAccessIdentity'); @@ -46,15 +48,15 @@ export class StaticSite extends Construct { { s3OriginSource: { s3BucketSource: hostingBucket, - originAccessIdentity: originAccessIdentity + originAccessIdentity: originAccessIdentity, }, behaviors: [ { isDefaultBehavior: true, - viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS - } - ] - } + viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + }, + ], + }, ], viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, errorConfigurations: [ @@ -62,42 +64,40 @@ export class StaticSite extends Construct { errorCode: 404, errorCachingMinTtl: 0, responseCode: 200, - responsePagePath: '/index.html' + responsePagePath: '/index.html', }, { errorCode: 403, errorCachingMinTtl: 0, responseCode: 200, - responsePagePath: '/index.html' - } - ] + responsePagePath: '/index.html', + }, + ], }); - new StringParameter(this, 'WebsiteUrlParameter', { parameterName: websiteUrlParameter(props.environment), - stringValue: distribution.distributionDomainName + stringValue: distribution.distributionDomainName, }); - new StringParameter(this, 'WebsiteBucketParameter', { parameterName: websiteBucketParameter(props.environment), - stringValue: hostingBucket.bucketName + stringValue: hostingBucket.bucketName, }); this.distribution = distribution; new cdk.CfnOutput(this, 'WebsiteDomain', { value: distribution.distributionDomainName, - description: 'Domain for the CloudFront distribution' + description: 'Domain for the CloudFront distribution', }); NagSuppressions.addResourceSuppressions( [hostingBucket], [ { id: 'AwsSolutions-S1', - reason: 'No access logs for hosting bucket.' - } + reason: 'No access logs for hosting bucket.', + }, ], true ); @@ -107,12 +107,12 @@ export class StaticSite extends Construct { [ { id: 'AwsSolutions-CFR3', - reason: 'No access logs on distribution for now.' + reason: 'No access logs on distribution for now.', }, { id: 'AwsSolutions-CFR4', - reason: 'No TLSV1.1 or 1.2 on distribution for now.' - } + reason: 'No TLSV1.1 or 1.2 on distribution for now.', + }, ], true ); diff --git a/typescript/packages/apps/cli/bin/dev.js b/typescript/packages/apps/cli/bin/dev.js index ce840ce..d131ce2 100755 --- a/typescript/packages/apps/cli/bin/dev.js +++ b/typescript/packages/apps/cli/bin/dev.js @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx --trace-warnings +#!/usr/bin/env npx tsx --trace-warnings /* * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. @@ -12,16 +12,13 @@ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * and limitations under the License. */ -import path from 'path'; import oclif from '@oclif/core'; -import { fileURLToPath } from 'url'; +import path from 'path'; import tsNode from 'ts-node'; -import dotenv from 'dotenv'; -import loadValidatorFunction from './validator'; +import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -dotenv.config({ path: path.join(__dirname, '../.env') }); const project = path.join(__dirname, '../', 'tsconfig.json'); @@ -33,7 +30,5 @@ tsNode.register({ project }); // In dev mode, always show stack traces oclif.settings.debug = true; -loadValidatorFunction(); - // Start the CLI await oclif.execute({ development: true, dir: project }); diff --git a/typescript/packages/apps/cli/bin/validator b/typescript/packages/apps/cli/bin/validator deleted file mode 100644 index ae1f7eb..0000000 --- a/typescript/packages/apps/cli/bin/validator +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env node - -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - - -import conf from 'conf'; -import rushlib from '@microsoft/rush-lib'; -import fs from 'fs'; - -import path from 'path'; -import { fileURLToPath } from 'url'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const loadValidatorFunction = () => { - const config = new conf({ - projectName: 'agie', - schema: { - stacServerPath: { - type: 'string', - }, - stacServerApiLambdaFunctionName: { - type: 'string', - }, - stacServerIngestionLambdaFunctionName: { - type: 'string', - }, - stacServerIngestionTopicArn: { - type: 'string', - }, - stacServerOpenSearchEndPoint: { - type: 'string', - }, - stacServerOpenSearchAccessPolicy: { - type: 'string', - }, - agiePath: { - type: 'string', - }, - }, - }); - let agiePath = config.get('agiePath'); - if (!agiePath) { - agiePath = path.join(__dirname, '../../../../../'); - } - - const rushConfiguration = rushlib.RushConfiguration.loadFromDefaultLocation({ - startingFolder: agiePath, - }); - const modules = ['@agie/infrastructure']; - const [agiePackage] = modules.map((m) => { - const moduleConfiguration = rushConfiguration.findProjectByShorthandName(m); - const validatorLocation = `${moduleConfiguration.projectFolder}/dist/cjs/${process.env.VALIDATOR_MODULE_FILENAME}`; - if (!fs.existsSync(validatorLocation)) { - return {}; - } - return require(validatorLocation); - }); - - global.agiePackage = agiePackage; -}; - -export default loadValidatorFunction; diff --git a/typescript/packages/apps/cli/package.json b/typescript/packages/apps/cli/package.json index 50c9011..c709bc5 100644 --- a/typescript/packages/apps/cli/package.json +++ b/typescript/packages/apps/cli/package.json @@ -69,14 +69,17 @@ "dependencies": { "@aws-sdk/client-cloudformation": "~3", "@aws-sdk/client-eventbridge": "~3", + "@aws-sdk/client-ec2": "~3", "@aws-sdk/client-lambda": "~3", "@aws-sdk/client-ssm": "~3", "@aws-sdk/client-sts": "~3", + "@aws-sdk/client-opensearch": "~3", "@aws-sdk/client-secrets-manager": "~3", "@aws-sdk/credential-provider-node": "~3", "@aws-sdk/util-utf8-node": "~3", "@aws-amplify/auth": "~6", "aws-amplify": "~6", + "@inquirer/confirm": "~4", "@inquirer/prompts": "~5", "@inquirer/select": "~2", "@microsoft/rush-lib": "~5", @@ -84,7 +87,9 @@ "@oclif/core": "~3", "@oclif/plugin-help": "~6", "@oclif/plugin-plugins": "~5", + "@smithy/types": "~3", "axios": "~1", + "ajv": "~8", "compare-versions": "~6", "conf": "~12", "dayjs": "~1", @@ -99,7 +104,10 @@ "table": "~6", "ulid": "~2", "simple-git": "~3", - "replace-in-file": "~7" + "replace-in-file": "~7", + "validator": "~13", + "rxjs": "~7", + "tsx": "~4" }, "devDependencies": { "@oclif/test": "~3", @@ -110,6 +118,7 @@ "@types/mocha": "~10", "@types/node": "~20", "@types/shelljs": "~0", + "@types/validator": "~13", "chai": "~5", "esbuild": "~0", "eslint-config-oclif": "~5", diff --git a/typescript/packages/apps/cli/src/commands/auth.ts b/typescript/packages/apps/cli/src/commands/auth.ts index 768337d..311699f 100644 --- a/typescript/packages/apps/cli/src/commands/auth.ts +++ b/typescript/packages/apps/cli/src/commands/auth.ts @@ -12,13 +12,14 @@ */ import { Flags } from '@oclif/core'; -import { DeploymentCommand } from '../types/deploymentCommand.js'; import { Amplify } from 'aws-amplify'; import { confirmSignIn, fetchAuthSession, getCurrentUser, signIn } from 'aws-amplify/auth'; -import { getParameterValue } from "../utils/ssm.js"; +import { DeploymentCommand } from '../types/deploymentCommand.js'; +import { getParameterValue } from '../utils/ssm.js'; export interface AuthorizerUserProps { environment: string; + region: string; username: string; password: string; newPassword?: string; @@ -35,6 +36,11 @@ export class Auth extends DeploymentCommand { required: true, description: 'The environment to authenticate against.', }), + region: Flags.string({ + char: 'r', + required: true, + description: 'The AWS Region agie is deployed to.', + }), username: Flags.string({ char: 'u', required: true, @@ -58,8 +64,8 @@ export class Auth extends DeploymentCommand { ]; private async generateAuthToken(props: AuthorizerUserProps): Promise { - const userPoolClientId = await getParameterValue(userPoolClientIdParameter(props.environment)); - const userPoolId = await getParameterValue(userPoolIdParameter(props.environment)); + const userPoolClientId = await getParameterValue(userPoolClientIdParameter(props.environment), props.region); + const userPoolId = await getParameterValue(userPoolIdParameter(props.environment), props.region); Amplify.configure({ Auth: { @@ -92,7 +98,7 @@ export class Auth extends DeploymentCommand { if (signInDetails?.authFlowType === 'USER_SRP_AUTH') { const { idToken } = (await fetchAuthSession()).tokens ?? {}; loginFlowFinished = true; - return idToken.toString(); + return idToken!.toString(); } } } catch (err: any) { @@ -111,6 +117,7 @@ export class Auth extends DeploymentCommand { username: flags.username, password: flags.password, newPassword: flags.newPassword, + region: flags.region, }); console.log(token); } catch (error) { diff --git a/typescript/packages/apps/cli/src/commands/init.ts b/typescript/packages/apps/cli/src/commands/init.ts deleted file mode 100644 index 61def47..0000000 --- a/typescript/packages/apps/cli/src/commands/init.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import { Command } from "@oclif/core"; -import { Listr } from "listr2"; -import { AwsCliPackage } from "../packages/awscli.package.js"; -import { NodePackage } from "../packages/node.package.js"; -import { NpmPackage } from "../packages/npm.package.js"; - - -export default class Init extends Command { - public static description = "Install AGIE dependencies"; - public static examples = [ - "$ agie init", - ]; - - public async run(): Promise { - const tasks = new Listr([ - ...new AwsCliPackage(this).getTasks(), - ...new NodePackage(this).getTasks(), - ...new NpmPackage(this).getTasks()]); - await tasks.run(); - } -} diff --git a/typescript/packages/apps/cli/src/commands/install.ts b/typescript/packages/apps/cli/src/commands/install.ts index c1463fc..ec63237 100644 --- a/typescript/packages/apps/cli/src/commands/install.ts +++ b/typescript/packages/apps/cli/src/commands/install.ts @@ -12,90 +12,215 @@ */ import { Flags } from '@oclif/core'; -import { switchToAgieLocation } from '../utils/shell.js'; -import { getDeployedStackByName } from '../utils/cloudformation.js'; +import Ajv from 'ajv'; +import * as fs from 'fs'; +import { Listr, ListrTask } from 'listr2'; +import { Observable } from 'rxjs'; +import { default as shell, default as shelljs } from 'shelljs'; +import { simpleGit } from 'simple-git'; +import { promisify } from 'util'; import { AgieCommand } from '../types/agieCommand.js'; -import shell from 'shelljs'; +import { AnswersBuilder, ContextAnswer, schema } from '../utils/answers.js'; +import { getDeployedStackByName } from '../utils/cloudformation.js'; +import { switchToAgieInfrastructureFolder, switchToAgieRootFolder } from '../utils/shell.js'; const { SILENT_COMMAND_EXECUTION: isSilentStr } = process.env; const isSilent = isSilentStr ? isSilentStr === 'true' : false; +const execAsync = promisify(shell.exec); + export class AgieInstall extends AgieCommand { public static description = 'Install AGIE for the specified environment'; - public static examples = ['$ <%= config.bin %> <%= command.id %> -e stage -r us-west-2 -a dummyEmail@test.com -n +614xxxxxxxx']; + public static examples = ['$ <%= config.bin %> <%= command.id %> -e stage -r us-west-2']; public static enableJsonFlag = true; public static flags = { environment: Flags.string({ char: 'e', required: true, - description: 'The environment used to deploy the agie project to' + description: 'The environment used to deploy the agie project to.', }), region: Flags.string({ char: 'r', required: true, - description: 'The AWS Region agie is deployed to' + description: 'The AWS Region agie is deployed to.', }), - administratorEmail: Flags.string({ - char: 'a', - required: true, - description: 'The administrator Email address' + config: Flags.string({ + char: 'c', + description: 'Path to configuration file used for deployment.', }), - administratorPhoneNumber: Flags.string({ - char: 'n', - required: true, - description: 'Enter the administrator phone number, including + and the country code, for example +12065551212.' + headless: Flags.boolean({ + char: 'h', + description: 'If provided, bypass the questions. You will also need to specify the path configuration file using -c', + dependsOn: ['config'], }), role: Flags.string({ - description: 'The RoleArn for the CLI to assume for deployment', - char: 'l' - }), - useExistingVpc: Flags.string({ - description: 'Use existing vpc', - char: 'u' - }), - existingIsolatedSubnetIds: Flags.string({ - description: 'List of existing isolated subnet ids', - char: 'i', - dependsOn: ['useExistingVpc'] - }), - existingPrivateSubnetIds: Flags.string({ - description: 'List of existing private subnet ids', - char: 's', - dependsOn: ['useExistingVpc'] - }), - existingPublicSubnetIds: Flags.string({ - description: 'List of existing public subnet ids', - char: 'p', - dependsOn: ['useExistingVpc'] + description: 'The RoleArn for the CLI to assume for deployment.', + char: 'l', }), - userAvailabilityZones: Flags.string({ - description: 'List of the vpc availability zones', - char: 'z', - dependsOn: ['useExistingVpc'] - }), - existingVpcId: Flags.string({ - description: 'The id of the existing vpc', - char: 'v', - dependsOn: ['useExistingVpc'] - }) }; public async runChild(): Promise { const { flags } = await this.parse(AgieInstall); - await switchToAgieLocation(); + const { role, region, headless, config, ...rest } = flags; + + const answers = await this.getAnswersTask(flags.environment, region, role!, headless, config); + + const installTasks = await this.getAgieInstallTask(flags.role!, region, rest); + + const taskRunner: Listr = new Listr([this.getStacServerBundleTask(), ...installTasks], { exitOnError: true }); - const { role, region, ...rest } = flags; + await taskRunner.run({ answers }); + } + + private async getAnswersTask(environment: string, region: string, role: string, headless: boolean, config?: string): Promise { + const answersBuilder = new AnswersBuilder(environment, region, role); + let answers: ContextAnswer; - const params = Object.entries(rest).map(([k, v]) => `-c ${k}=${v}`).join(' '); - try { - await getDeployedStackByName('CDKToolkit', role); - } catch (error) { - if ((error as Error).message === 'Stack with id CDKToolkit does not exist') { - shell.exec(`npm run cdk -- bootstrap --all --concurrency=10 ${role ? '--r ' + role : ''} ${params}`, { silent: isSilent }); + if (config) { + answers = JSON.parse(fs.readFileSync(config!, { encoding: 'utf8' })); + const ajv = new Ajv.Ajv(); + // Validate schema + const validate = ajv.compile(schema); + if (!validate(answers)) { + throw new Error(JSON.stringify(validate.errors)); } + } else { + answers = await answersBuilder.loadFromParameterStore(); + } + + if (!headless) { + answers = await answersBuilder.loadFromUsers(answers); } - shell.exec(`npm run cdk -- deploy --all --concurrency=10 --require-approval never ${role ? '--r ' + role : ''} ${params}`, { silent: isSilent }); - this.log(`Finished Deployment of Agie to ${region}`); + + await answersBuilder.saveToParameterStore(answers); + return answers; + } + + private async getAgieInstallTask(role: string, region: string, rest: Record): Promise { + const params = Object.entries(rest) + .map(([k, v]) => `-c ${k}=${v}`) + .join(' '); + + const infrastructureFolder = await switchToAgieInfrastructureFolder(); + + return [ + { + title: 'Generating cdk.context.json', + task: (ctx) => { + const answers = ctx.answers; + fs.writeFileSync(`${infrastructureFolder}/cdk.context.json`, JSON.stringify(answers)); + }, + }, + { + title: 'Boostrapping cdk', + task: async (_, task) => { + try { + await getDeployedStackByName('CDKToolkit', region, role); + task.skip('Skip boostrapping cdk'); + return; + } catch (error) { + if ((error as Error).message === 'Stack with id CDKToolkit does not exist') { + task.output = `CDK has not been bootstrapped in ${region}, running bootstrap...`; + shell.cd(infrastructureFolder); + await execAsync( + `export AWS_REGION=${region} && export AWS_DEFAULT_REGION=${region} && npm run cdk -- bootstrap --all --concurrency=10 ${role ? '--r ' + role : ''} ${params}`, + { + silent: isSilent, + }, + ); + } + } + }, + }, + { + title: 'Deploying AGIE stacks', + task: async (ctx, task) => { + return new Observable((observer) => { + shell.cd(infrastructureFolder); + + var child = shelljs.exec( + `export AWS_REGION=${region} && export AWS_DEFAULT_REGION=${region} && npm run cdk -- deploy --all --concurrency=10 --require-approval never ${role ? '--r ' + role : ''} ${params}`, + { async: true, silent: isSilent }, + ); + + child?.stdout?.on('data', function (data) { + observer.next(data); + }); + + child?.stderr?.on('data', function (data) { + observer.next(data); + }); + + child.on('exit', function (code: number) { + if (code === 1) { + observer.error('Encountered error when deploying AGIE stacks'); + } else { + observer.complete(); + } + }); + }); + }, + }, + { + title: 'Deploying the demo UI', + task: async () => { + return new Observable((observer) => { + shell.cd(`${infrastructureFolder}/../typescript/packages/apps/ui`); + var child = shelljs.exec(`export ENVIRONMENT=${rest['environment']} && export AWS_REGION=${region} && npm run deploy`, { async: true, silent: isSilent }); + child?.stdout?.on('data', function (data) { + observer.next(data); + }); + + child?.stderr?.on('data', function (data) { + observer.next(data); + }); + + child.on('exit', function (code: number) { + if (code === 1) { + observer.error('Encountered error when deploying the demo UI'); + } else { + observer.complete(); + } + }); + }); + }, + }, + ]; + } + + private getStacServerBundleTask(): ListrTask { + return { + title: `Bundling stac-server (https://github.com/stac-utils/stac-server)`, + task: async (_, task) => { + const rootFolder = await switchToAgieRootFolder(); + if ( + fs.existsSync(`${rootFolder}/infrastructure/src/stacServer/lambdas/api.zip`) && + fs.existsSync(`${rootFolder}/infrastructure/src/stacServer/lambdas/ingest.zip`) + ) { + task.skip('Skip bundling, stac-server files had been bundled.'); + return; + } + + const folderName = `${rootFolder}/stac-server`; + if (!fs.existsSync(folderName)) { + const repository = `https://github.com/stac-utils/stac-server.git`; + task.output = `Cloning 📦 ${repository} into 📁 ${rootFolder}`; + const stacServerGit = simpleGit().outputHandler((_command, stdout, stderr) => { + stderr.pipe(process.stderr); + }); + await stacServerGit.clone(repository, folderName, { '--depth': 1, '--branch': 'v3.8.0' }); + } else { + task.output = `Folder ${folderName} already exists`; + } + + task.output = 'Bundling stac-server lambda and copying to AGIE cdk projects'; + + await execAsync( + `cd stac-server && npm install && npm run build && cp dist/api/api.zip ${rootFolder}/infrastructure/src/stacServer/lambdas && cp dist/ingest/ingest.zip ${rootFolder}/infrastructure/src/stacServer/lambdas`, + { silent: isSilent }, + ); + }, + }; } } diff --git a/typescript/packages/apps/cli/src/commands/remove.ts b/typescript/packages/apps/cli/src/commands/remove.ts new file mode 100644 index 0000000..5fdebe6 --- /dev/null +++ b/typescript/packages/apps/cli/src/commands/remove.ts @@ -0,0 +1,95 @@ +/* + * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance + * with the License. A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions + * and limitations under the License. + */ + +import { Flags } from '@oclif/core'; +import * as fs from 'fs'; +import { Listr } from 'listr2'; +import { Observable } from 'rxjs'; +import { default as shell, default as shelljs } from 'shelljs'; +import { AgieCommand } from '../types/agieCommand.js'; +import { AnswersBuilder } from '../utils/answers.js'; +import { switchToAgieInfrastructureFolder } from '../utils/shell.js'; + +const { SILENT_COMMAND_EXECUTION: isSilentStr } = process.env; +const isSilent = isSilentStr ? isSilentStr === 'true' : false; + +export class AgieRemove extends AgieCommand { + public static description = 'Remove AGIE for the specified environment'; + public static examples = ['$ <%= config.bin %> <%= command.id %> -e stage -r us-west-2']; + public static enableJsonFlag = true; + + public static flags = { + environment: Flags.string({ + char: 'e', + required: true, + description: 'The environment used to deploy the agie project to.', + }), + region: Flags.string({ + char: 'r', + required: true, + description: 'The AWS Region agie is deployed to.', + }), + role: Flags.string({ + description: 'The RoleArn for the CLI to assume for deployment.', + char: 'l', + }), + }; + + public async runChild(): Promise { + const { flags } = await this.parse(AgieRemove); + const { role, region, environment } = flags; + + const infrastructureFolder = await switchToAgieInfrastructureFolder(); + + const taskRunner = new Listr([ + { + title: 'Generating cdk.context.json', + task: async () => { + const answersBuilder = new AnswersBuilder(environment, region, role); + fs.writeFileSync(`${infrastructureFolder}/cdk.context.json`, JSON.stringify(await answersBuilder.loadFromParameterStore())); + }, + }, + { + title: 'Removing AGIE stacks', + task: () => { + return new Observable((observer) => { + shell.cd(infrastructureFolder); + + var child = shelljs.exec( + `export AWS_REGION=${region} && export AWS_DEFAULT_REGION=${region} && npm run cdk -- destroy --all --concurrency=10 --force ${role ? '--r ' + role : ''} -c environment=${environment}`, + { async: true, silent: isSilent }, + ); + + child?.stdout?.on('data', function (data) { + observer.next(data); + }); + + child?.stderr?.on('data', function (data) { + observer.next(data); + }); + + child.on('exit', function (code: number) { + if (code === 1) { + observer.error('Encountered error when removing AGIE stacks'); + } else { + observer.complete(); + } + }); + }); + }, + }, + ]); + + await taskRunner.run(); + } +} diff --git a/typescript/packages/apps/cli/src/custom-typings/conf.d.ts b/typescript/packages/apps/cli/src/custom-typings/conf.d.ts deleted file mode 100644 index 66bc0ac..0000000 --- a/typescript/packages/apps/cli/src/custom-typings/conf.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -declare module 'conf' { - export default class Conf { - constructor(props: { projectName: string, schema: unknown }) - - get(key: string): string; - - delete(key: string): void; - - set(key: string, value: string): void; - } -} diff --git a/typescript/packages/apps/cli/src/packages/awscli.package.js b/typescript/packages/apps/cli/src/packages/awscli.package.js deleted file mode 100644 index 7af1277..0000000 --- a/typescript/packages/apps/cli/src/packages/awscli.package.js +++ /dev/null @@ -1,156 +0,0 @@ -"use strict"; -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AwsCliPackage = void 0; -var shell_js_1 = require("../utils/shell.js"); -var base_package_js_1 = require("./base.package.js"); -var isSilentStr = process.env.SILENT_COMMAND_EXECUTION; -var isSilent = isSilentStr ? isSilentStr === 'true' : true; -var AwsCliPackage = /** @class */ (function (_super) { - __extends(AwsCliPackage, _super); - function AwsCliPackage() { - return _super !== null && _super.apply(this, arguments) || this; - } - AwsCliPackage.prototype.getLinuxTasks = function () { - var _this = this; - return [ - { - title: 'Installing AWS CLI', - task: function () { return __awaiter(_this, void 0, void 0, function () { - var error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 6]); - return [4 /*yield*/, (0, shell_js_1.execAsync)('aws --version | grep -q "aws-cli/2."', { silent: isSilent })]; - case 1: - _a.sent(); - return [3 /*break*/, 6]; - case 2: - error_1 = _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"', { silent: isSilent })]; - case 3: - _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('unzip -o awscliv2.zip', { silent: isSilent })]; - case 4: - _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('sudo ./aws/install --update', { silent: isSilent })]; - case 5: - _a.sent(); - return [3 /*break*/, 6]; - case 6: return [2 /*return*/]; - } - }); - }); }, - }, - ]; - }; - AwsCliPackage.prototype.getMacTasks = function () { - var _this = this; - return [ - { - title: 'Installing AWS CLI', - task: function () { return __awaiter(_this, void 0, void 0, function () { - var error_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 5]); - return [4 /*yield*/, (0, shell_js_1.execAsync)('aws --version | grep -q "aws-cli/2."', { silent: isSilent })]; - case 1: - _a.sent(); - return [3 /*break*/, 5]; - case 2: - error_2 = _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"', { silent: isSilent })]; - case 3: - _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('installer -pkg ./AWSCLIV2.pkg -target /', { silent: false })]; - case 4: - _a.sent(); - return [3 /*break*/, 5]; - case 5: return [2 /*return*/]; - } - }); - }); }, - }, - ]; - }; - AwsCliPackage.prototype.getWindowsTasks = function () { - var _this = this; - this.logger.log('AWS CLI in Windows cannot be installed through command line'); - return [ - { - title: 'Installing AWS CLI', - skip: function () { return true; }, - task: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { - return [2 /*return*/]; - }); }); }, - }, - ]; - }; - return AwsCliPackage; -}(base_package_js_1.BasePackage)); -exports.AwsCliPackage = AwsCliPackage; diff --git a/typescript/packages/apps/cli/src/packages/awscli.package.ts b/typescript/packages/apps/cli/src/packages/awscli.package.ts deleted file mode 100644 index f25b869..0000000 --- a/typescript/packages/apps/cli/src/packages/awscli.package.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import { ListrTask } from 'listr2'; -import { execAsync } from '../utils/shell.js'; -import { BasePackage } from './base.package.js'; - -const { SILENT_COMMAND_EXECUTION: isSilentStr } = process.env; -const isSilent = isSilentStr ? isSilentStr === 'true' : true; -export class AwsCliPackage extends BasePackage { - getLinuxTasks(): ListrTask[] { - return [ - { - title: 'Installing AWS CLI', - task: async () => { - try { - await execAsync('aws --version | grep -q "aws-cli/2."', { silent: isSilent }); - } catch (error) { - await execAsync('curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"', { silent: isSilent }); - await execAsync('unzip -o awscliv2.zip', { silent: isSilent }); - await execAsync('sudo ./aws/install --update', { silent: isSilent }); - } - }, - }, - ]; - } - - getMacTasks(): ListrTask[] { - return [ - { - title: 'Installing AWS CLI', - task: async () => { - try { - await execAsync('aws --version | grep -q "aws-cli/2."', { silent: isSilent }); - } catch (error) { - await execAsync('curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"', { silent: isSilent }); - await execAsync('installer -pkg ./AWSCLIV2.pkg -target /', { silent: false }); - } - }, - }, - ]; - } - - getWindowsTasks(): ListrTask[] { - this.logger.log('AWS CLI in Windows cannot be installed through command line'); - return [ - { - title: 'Installing AWS CLI', - skip: () => true, - task: async () => {}, - }, - ]; - } -} diff --git a/typescript/packages/apps/cli/src/packages/base.package.js b/typescript/packages/apps/cli/src/packages/base.package.js deleted file mode 100644 index 2d7ccaa..0000000 --- a/typescript/packages/apps/cli/src/packages/base.package.js +++ /dev/null @@ -1,36 +0,0 @@ -"use strict"; -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.BasePackage = void 0; -var os = require("os"); -var BasePackage = /** @class */ (function () { - function BasePackage(logger) { - this.logger = logger; - } - BasePackage.prototype.getTasks = function () { - switch (os.platform()) { - case "darwin": - return this.getMacTasks(); - case "linux": - return this.getLinuxTasks(); - case "win32": - return this.getWindowsTasks(); - default: - this.logger.error("the platform is not supported"); - return []; - } - }; - return BasePackage; -}()); -exports.BasePackage = BasePackage; diff --git a/typescript/packages/apps/cli/src/packages/base.package.ts b/typescript/packages/apps/cli/src/packages/base.package.ts deleted file mode 100644 index b0b1c4f..0000000 --- a/typescript/packages/apps/cli/src/packages/base.package.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import { ListrTask } from "listr2"; -import * as os from "os"; - -export interface Logger { - log(message: string): void; - - error(message: string): void; -} - -export abstract class BasePackage { - public constructor(protected logger: Logger) { - } - - abstract getMacTasks(): ListrTask[]; - - abstract getLinuxTasks(): ListrTask[]; - - abstract getWindowsTasks(): ListrTask[]; - - public getTasks(): ListrTask[] { - switch (os.platform()) { - case "darwin": - return this.getMacTasks(); - case "linux": - return this.getLinuxTasks(); - case "win32": - return this.getWindowsTasks(); - default: - this.logger.error("the platform is not supported"); - return []; - } - } -} diff --git a/typescript/packages/apps/cli/src/packages/node.package.js b/typescript/packages/apps/cli/src/packages/node.package.js deleted file mode 100644 index 4c3b3d3..0000000 --- a/typescript/packages/apps/cli/src/packages/node.package.js +++ /dev/null @@ -1,164 +0,0 @@ -"use strict"; -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.NodePackage = void 0; -var shell_js_1 = require("../utils/shell.js"); -var base_package_js_1 = require("./base.package.js"); -var isSilentStr = process.env.SILENT_COMMAND_EXECUTION; -var isSilent = isSilentStr ? isSilentStr === 'true' : true; -var NodePackage = /** @class */ (function (_super) { - __extends(NodePackage, _super); - function NodePackage() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.nonWindowsTask = [ - { - title: 'Installing nvm', - task: function () { return __awaiter(_this, void 0, void 0, function () { - var error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 4]); - return [4 /*yield*/, (0, shell_js_1.execAsync)('nvm -v | grep -q "0.3"', { silent: isSilent })]; - case 1: - _a.sent(); - return [3 /*break*/, 4]; - case 2: - error_1 = _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash', { silent: isSilent })]; - case 3: - _a.sent(); - return [3 /*break*/, 4]; - case 4: return [2 /*return*/]; - } - }); - }); }, - }, - { - title: 'Installing node v20', - task: function () { return __awaiter(_this, void 0, void 0, function () { - var error_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 4]); - return [4 /*yield*/, (0, shell_js_1.execAsync)('node --version | grep -q "v20."', { silent: isSilent })]; - case 1: - _a.sent(); - return [3 /*break*/, 4]; - case 2: - error_2 = _a.sent(); - return [4 /*yield*/, (0, shell_js_1.execAsync)('. ~/.nvm/nvm.sh && nvm install 20', { silent: isSilent })]; - case 3: - _a.sent(); - return [3 /*break*/, 4]; - case 4: return [2 /*return*/]; - } - }); - }); }, - }, - ]; - _this.windowsTask = [ - { - title: 'Installing nvm for Windows', - task: function () { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, (0, shell_js_1.execAsync)('winget install -e --id CoreyButler.NVMforWindows', { silent: isSilent })]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); }, - }, - { - title: 'Installing node v20', - task: function () { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, (0, shell_js_1.execAsync)('nvm install 20', { silent: isSilent })]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); }, - }, - ]; - return _this; - } - NodePackage.prototype.getLinuxTasks = function () { - return this.nonWindowsTask; - }; - NodePackage.prototype.getMacTasks = function () { - return this.nonWindowsTask; - }; - NodePackage.prototype.getWindowsTasks = function () { - return this.windowsTask; - }; - return NodePackage; -}(base_package_js_1.BasePackage)); -exports.NodePackage = NodePackage; diff --git a/typescript/packages/apps/cli/src/packages/node.package.ts b/typescript/packages/apps/cli/src/packages/node.package.ts deleted file mode 100644 index 474b55b..0000000 --- a/typescript/packages/apps/cli/src/packages/node.package.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import { ListrTask } from 'listr2'; -import { execAsync } from '../utils/shell.js'; -import { BasePackage } from './base.package.js'; - -const { SILENT_COMMAND_EXECUTION: isSilentStr } = process.env; -const isSilent = isSilentStr ? isSilentStr === 'true' : true; -export class NodePackage extends BasePackage { - private nonWindowsTask = [ - { - title: 'Installing nvm', - task: async () => { - try { - await execAsync('nvm -v | grep -q "0.3"', { silent: isSilent }); - } catch (error) { - await execAsync('curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash', { silent: isSilent }); - } - }, - }, - { - title: 'Installing node v20', - task: async () => { - try { - await execAsync('node --version | grep -q "v20."', { silent: isSilent }); - } catch (error) { - await execAsync('. ~/.nvm/nvm.sh && nvm install 20', { silent: isSilent }); - } - }, - }, - ]; - - private windowsTask = [ - { - title: 'Installing nvm for Windows', - task: async () => { - await execAsync('winget install -e --id CoreyButler.NVMforWindows', { silent: isSilent }); - }, - }, - { - title: 'Installing node v20', - task: async () => { - await execAsync('nvm install 20', { silent: isSilent }); - }, - }, - ]; - - getLinuxTasks(): ListrTask[] { - return this.nonWindowsTask; - } - - getMacTasks(): ListrTask[] { - return this.nonWindowsTask; - } - - getWindowsTasks(): ListrTask[] { - return this.windowsTask; - } -} diff --git a/typescript/packages/apps/cli/src/packages/npm.package.js b/typescript/packages/apps/cli/src/packages/npm.package.js deleted file mode 100644 index daf4db8..0000000 --- a/typescript/packages/apps/cli/src/packages/npm.package.js +++ /dev/null @@ -1,108 +0,0 @@ -"use strict"; -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.NpmPackage = void 0; -var shell_js_1 = require("../utils/shell.js"); -var base_package_js_1 = require("./base.package.js"); -var isSilentStr = process.env.SILENT_COMMAND_EXECUTION; -var isSilent = (isSilentStr) ? isSilentStr === "true" : true; -var NpmPackage = /** @class */ (function (_super) { - __extends(NpmPackage, _super); - function NpmPackage() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.commands = [ - { - title: "Installing rush", command: "npm install -g @microsoft/rush" - } - ]; - _this.installTasks = _this.commands.map(function (c) { - return { - title: c.title, - task: function () { return __awaiter(_this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, (0, shell_js_1.execAsync)(c.command, { silent: isSilent })]; - case 1: - _a.sent(); - return [2 /*return*/]; - } - }); - }); } - }; - }); - return _this; - } - NpmPackage.prototype.getLinuxTasks = function () { - return this.installTasks; - }; - NpmPackage.prototype.getMacTasks = function () { - return this.installTasks; - }; - NpmPackage.prototype.getWindowsTasks = function () { - return this.installTasks; - }; - return NpmPackage; -}(base_package_js_1.BasePackage)); -exports.NpmPackage = NpmPackage; diff --git a/typescript/packages/apps/cli/src/packages/npm.package.ts b/typescript/packages/apps/cli/src/packages/npm.package.ts deleted file mode 100644 index 520ba01..0000000 --- a/typescript/packages/apps/cli/src/packages/npm.package.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import { ListrTask } from "listr2"; -import { execAsync } from "../utils/shell.js"; -import { BasePackage } from "./base.package.js"; - -const { SILENT_COMMAND_EXECUTION:isSilentStr } = process.env; -const isSilent = (isSilentStr) ? isSilentStr === "true": true ; -export class NpmPackage extends BasePackage { - private commands = - [ - { - title: "Installing rush", command: "npm install -g @microsoft/rush" - } - ]; - - private installTasks = this.commands.map(c => { - return { - title: c.title, - task: async () => { - await execAsync(c.command, { silent: isSilent }); - } - }; - }); - - getLinuxTasks(): ListrTask[] { - return this.installTasks; - } - - getMacTasks(): ListrTask[] { - return this.installTasks; - } - - getWindowsTasks(): ListrTask[] { - return this.installTasks; - } -} diff --git a/typescript/packages/apps/cli/src/types/agieCommand.ts b/typescript/packages/apps/cli/src/types/agieCommand.ts index c503adb..4d7de30 100644 --- a/typescript/packages/apps/cli/src/types/agieCommand.ts +++ b/typescript/packages/apps/cli/src/types/agieCommand.ts @@ -12,7 +12,7 @@ */ import { Command } from '@oclif/core'; -import { switchToAgieLocation } from '../utils/shell.js'; +import { switchToAgieInfrastructureFolder } from '../utils/shell.js'; export abstract class AgieCommand extends Command { protected bashAndOperator = ' && '; @@ -20,7 +20,7 @@ export abstract class AgieCommand extends Command { abstract runChild(): Promise | Record[] | void>; public async run(): Promise | Record[] | void> { - await switchToAgieLocation(); + await switchToAgieInfrastructureFolder(); return await this.runChild(); } } diff --git a/typescript/packages/apps/cli/src/utils/answers.ts b/typescript/packages/apps/cli/src/utils/answers.ts new file mode 100644 index 0000000..8f6d15e --- /dev/null +++ b/typescript/packages/apps/cli/src/utils/answers.ts @@ -0,0 +1,278 @@ +import { DescribeSubnetsCommand, DescribeSubnetsCommandInput, DescribeVpcsCommand } from '@aws-sdk/client-ec2'; +import { ListInstanceTypeDetailsCommand } from '@aws-sdk/client-opensearch'; +import { GetParameterCommand, PutParameterCommand } from '@aws-sdk/client-ssm'; +import { checkbox, confirm, input, select } from '@inquirer/prompts'; +import { JSONSchemaType } from 'ajv'; +import validator from 'validator'; +import { getEc2Client, getOpenSearchClient, getSSMClient } from './awsClient.js'; + +export interface ContextAnswer { + administratorEmail: string; + administratorPhoneNumber: string; + deleteBucket: boolean; + // optional configuration for SES Cognito integration + cognitoFromEmail?: string; + cognitoVerifiedDomain?: string; + cognitoFromName?: string; + cognitoReplyToEmail?: string; + concurrencyLimit: number; + // STAC server configuration + configureStacServer: boolean; + stacServerInstanceType?: string; + stacServerVolumeType?: string; + stacServerVolumeSize?: number; + stacServerInstanceCount?: number; + stacServerDedicatedMasterEnabled?: boolean; + stacServerZoneAwarenessEnabled?: boolean; + // additional cache layer to improve Region API performance + useRegionCache?: boolean; + // network configuration + useExistingVpc?: boolean; + existingVpcId?: string; + userIsolatedSubnetIds?: (string | undefined)[]; + userPrivateSubnetIds?: (string | undefined)[]; + userPublicSubnetIds?: (string | undefined)[]; + availabilityZones?: (string | undefined)[]; +} + +export const schema: JSONSchemaType = { + type: 'object', + properties: { + administratorEmail: { type: 'string', nullable: false }, + administratorPhoneNumber: { type: 'string', nullable: false }, + deleteBucket: { type: 'boolean' }, + configureStacServer: { type: 'boolean' }, + cognitoFromEmail: { type: 'string', nullable: true }, + cognitoVerifiedDomain: { type: 'string', nullable: true }, + cognitoFromName: { type: 'string', nullable: true }, + cognitoReplyToEmail: { type: 'string', nullable: true }, + concurrencyLimit: { type: 'number' }, + stacServerInstanceType: { type: 'string', nullable: true }, + stacServerVolumeType: { type: 'string', nullable: true }, + stacServerVolumeSize: { type: 'number', nullable: true }, + stacServerInstanceCount: { type: 'number', nullable: true }, + stacServerDedicatedMasterEnabled: { type: 'boolean', nullable: true }, + stacServerZoneAwarenessEnabled: { type: 'boolean', nullable: true }, + useRegionCache: { type: 'boolean', nullable: true }, + useExistingVpc: { type: 'boolean', nullable: true }, + existingVpcId: { type: 'string', nullable: true }, + userIsolatedSubnetIds: { type: 'array', items: { type: 'string', nullable: true }, nullable: true }, + userPrivateSubnetIds: { type: 'array', items: { type: 'string', nullable: true }, nullable: true }, + userPublicSubnetIds: { type: 'array', items: { type: 'string', nullable: true }, nullable: true }, + availabilityZones: { type: 'array', items: { type: 'string', nullable: true }, nullable: true }, + }, + required: ['administratorEmail', 'administratorPhoneNumber'], + additionalProperties: true, +}; + +export class AnswersBuilder { + private readonly parameterName: string; + constructor( + private readonly environment: string, + private readonly region: string, + private readonly roleArn?: string, + ) { + this.parameterName = `/agie/${environment}/config`; + } + + public async loadFromUsers(answers: ContextAnswer): Promise { + answers.administratorEmail = await input({ + message: 'Enter your email address:', + validate: (a: string) => { + if (!validator.isEmail(a)) return 'Invalid email address. Please enter a valid email address.'; + + return true; + }, + default: answers.administratorEmail, + }); + + answers.administratorPhoneNumber = await input({ + message: 'Enter your mobile phone number (with country code):', + default: answers.administratorPhoneNumber, + validate: (a: string) => { + if (!validator.isMobilePhone(a, 'any', { strictMode: true })) return 'Invalid mobile phone number. Please enter a valid number with the country code.'; + return true; + }, + }); + + answers.configureStacServer = await confirm({ + message: 'Do you want to configure the OpenSearch server used by STAC Server?', + default: answers.configureStacServer ?? false, + }); + + const openSearchClient = await getOpenSearchClient(this.region, this.roleArn); + + if (answers.configureStacServer) { + const openSearchInstanceTypes = (await openSearchClient.send(new ListInstanceTypeDetailsCommand({ EngineVersion: 'OpenSearch_2.11' }))) + .InstanceTypeDetails!.sort((a, b) => a.InstanceType!.localeCompare(b.InstanceType!)) + .map((o) => ({ name: o.InstanceType, value: o.InstanceType })); + + answers.stacServerDedicatedMasterEnabled = await confirm({ + message: `A dedicated master node is a cluster node that performs cluster management tasks, but doesn't hold data or respond to data upload requests.\r\n Dedicated master nodes offload cluster management tasks to increase the stability of your search clusters.\r\n Do you want to use a dedicated master node for the OpenSearch Service domain?`, + default: answers.stacServerDedicatedMasterEnabled ?? false, + }); + + answers.stacServerZoneAwarenessEnabled = await confirm({ + message: `When you enable zone awareness, OpenSearch Service allocates the nodes and replica index shards that belong to a cluster across two Availability Zones (AZs) in the same region to prevent data loss and minimize downtime in the event of node or data center failure.\r\n Don't enable zone awareness if your cluster has no replica index shards or is a single-node cluster\r\n Do you want to enable zone awareness for the OpenSearch Service domain?`, + default: answers.stacServerZoneAwarenessEnabled ?? false, + }); + + answers.stacServerInstanceType = await select({ + message: 'The instance type for your data nodes:', + choices: openSearchInstanceTypes, + default: answers.stacServerInstanceType ?? 'c5.large.search', + }); + + answers.stacServerInstanceCount = parseInt( + await input({ + message: 'The number of data nodes (instances) to use in the OpenSearch Service domain:', + default: '1', + validate: (num: string) => { + if (validator.toInt(num) < 1) return 'Num of data nodes must be more than 1.'; + return true; + }, + }), + ); + + answers.stacServerVolumeSize = parseInt( + await input({ + message: + 'The size (in GiB) of the EBS volume for each data node. The minimum and maximum size of an EBS volume depends on the EBS volume type and the instance type to which it is attached:', + default: answers.stacServerVolumeSize?.toString() ?? '20', + validate: (num: string) => { + if (validator.toInt(num) < 20) return 'The size (in GiB) of the EBS volume must be more or equal than'; + return true; + }, + }), + ); + + answers.stacServerVolumeType = await select({ + message: 'The EBS volume type to use with the OpenSearch Service domain:', + choices: ['standard', 'gp2', 'io1', 'gp3'].map((o) => ({ name: o, value: o })), + default: answers.stacServerVolumeType ?? 'gp3', + }); + } + + answers.deleteBucket = await confirm({ message: 'Do you want to delete all the provisioned s3 buckets when AGIE is removed?', default: answers.deleteBucket ?? false }); + + answers.useRegionCache = await confirm({ + message: 'Do you want to enable memory cache for Regions API to improve query performance?', + default: answers.useRegionCache ?? false, + }); + + answers.useExistingVpc = await confirm({ + message: 'Do you want to use an existing VPC? If not, the AGIE deployment will create one for you.', + default: answers.useExistingVpc ?? false, + }); + + const ec2Client = await getEc2Client(this.region, this.roleArn); + + if (answers.useExistingVpc) { + const existingVpcList = + (await ec2Client.send(new DescribeVpcsCommand({}))).Vpcs?.map((vpc) => { + const vpcName = vpc.Tags?.find((t) => { + return t.Key === 'Name'; + }); + return { + name: vpcName ? vpcName.Value : vpc.VpcId, + value: vpc.VpcId, + }; + }) ?? []; + + answers.existingVpcId = await select({ + message: 'Select the existing VPC to use when deploying AGIE:', + choices: existingVpcList, + default: answers.existingVpcId, + }); + + if (answers.existingVpcId === undefined) { + throw new Error('VPC ID is required if using an existing VPC'); + } + + const describeSubnetsInput: DescribeSubnetsCommandInput = { + Filters: [{ Name: 'vpc-id', Values: [answers.existingVpcId] }], + }; + + const allSubnets = (await ec2Client.send(new DescribeSubnetsCommand(describeSubnetsInput))).Subnets; + + const availabilityZoneSet = new Set(); + allSubnets?.forEach((o) => availabilityZoneSet.add(o.AvailabilityZone!)); + answers.availabilityZones = Array.from(availabilityZoneSet); + + const existingVpcSubnets = ( + allSubnets?.map((s) => { + const subnetName = s.Tags?.find((t) => { + return t.Key === 'Name'; + }); + + return { + name: subnetName ? subnetName.Value : s.SubnetId, + value: s.SubnetId, + }; + }) ?? [] + ).sort((a, b) => a.name!.localeCompare(b.name!)); + + answers.userIsolatedSubnetIds = await checkbox({ + message: `Which subnets in vpc ${answers.existingVpcId} should AGIE use as isolated subnets?`, + required: true, + choices: existingVpcSubnets, + loop: false, + })!; + + const nonIsolatedSubnets: { name: string | undefined; value: string | undefined }[] = []; + + existingVpcSubnets.forEach((s) => { + if (!answers.userIsolatedSubnetIds?.some((esid) => esid === s.value)) { + nonIsolatedSubnets.push(s); + } + }); + + answers.userPrivateSubnetIds = await checkbox({ + message: `Which subnets in vpc ${answers.existingVpcId} should AGIE use as private subnets?`, + choices: nonIsolatedSubnets.sort((a, b) => a.name!.localeCompare(b.name!)), + loop: false, + }); + + const nonPrivateAndIsolatedSubnets: { name: string | undefined; value: string | undefined }[] = []; + + existingVpcSubnets.forEach((s) => { + if (!answers.userIsolatedSubnetIds?.some((esid) => esid === s.value) && !answers.userPrivateSubnetIds?.some((esid) => esid === s.value)) { + nonPrivateAndIsolatedSubnets.push(s); + } + }); + + answers.userPublicSubnetIds = await checkbox({ + message: `Which subnets in vpc ${answers.existingVpcId} should AGIE use as public subnets?`, + choices: nonPrivateAndIsolatedSubnets.sort((a, b) => a.value!.localeCompare(b.value!)), + loop: false, + }); + } + + return answers; + } + + public async saveToParameterStore(answers: ContextAnswer): Promise { + const ssmClient = await getSSMClient(this.region, this.roleArn); + await ssmClient.send(new PutParameterCommand({ Name: this.parameterName, Value: JSON.stringify(answers), Type: 'String', Overwrite: true })); + } + + public async loadFromParameterStore(): Promise { + const ssmClient = await getSSMClient(this.region, this.roleArn); + let response: ContextAnswer = { + administratorEmail: '', + administratorPhoneNumber: '', + deleteBucket: false, + concurrencyLimit: 10, + useRegionCache: false, + useExistingVpc: false, + configureStacServer: false, + }; + + try { + const answers = await ssmClient.send(new GetParameterCommand({ Name: this.parameterName })); + response = JSON.parse(answers.Parameter?.Value!); + } catch (Exception) {} + + return response; + } +} diff --git a/typescript/packages/apps/cli/src/utils/awsClient.ts b/typescript/packages/apps/cli/src/utils/awsClient.ts index 72f2df8..be8ad46 100644 --- a/typescript/packages/apps/cli/src/utils/awsClient.ts +++ b/typescript/packages/apps/cli/src/utils/awsClient.ts @@ -11,66 +11,44 @@ * and limitations under the License. */ -import { CloudFormationClient, CloudFormationClientConfig } from '@aws-sdk/client-cloudformation'; +import { CloudFormationClient } from '@aws-sdk/client-cloudformation'; +import { EC2Client } from '@aws-sdk/client-ec2'; +import { OpenSearchClient } from '@aws-sdk/client-opensearch'; +import { SSMClient } from '@aws-sdk/client-ssm'; import { AssumeRoleCommand, STSClient } from '@aws-sdk/client-sts'; +import { AwsCredentialIdentity } from '@smithy/types'; import { ulid } from 'ulid'; -import { SSMClient, SSMClientConfig } from "@aws-sdk/client-ssm"; -const stsClient = new STSClient({ region: process.env.AGIE_REGION ?? process.env.AWS_REGION }); - -async function getSSMClient(roleArn?: string): Promise { - const clientConfig: SSMClientConfig = { region: process.env.AGIE_REGION ?? process.env.AWS_REGION }; - let ssmClient; - if (roleArn) { - const command = new AssumeRoleCommand({ - RoleArn: roleArn, - RoleSessionName: `agie-cli-${ulid()}`, - }); +async function getTemporaryCredentials(region: string, roleArn: string): Promise { + const stsClient = new STSClient({ region }); + const command = new AssumeRoleCommand({ + RoleArn: roleArn, + RoleSessionName: `agie-cli-${ulid()}`, + }); + const { Credentials } = await stsClient.send(command); + return { accessKeyId: Credentials?.AccessKeyId || '', secretAccessKey: Credentials?.SecretAccessKey || '', sessionToken: Credentials?.SessionToken || '' }; +} - // eslint-disable-next-line @typescript-eslint/naming-convention - const { Credentials } = await stsClient.send(command); - ssmClient = new SSMClient({ - ...clientConfig, - credentials: { - accessKeyId: Credentials?.AccessKeyId || '', - secretAccessKey: Credentials?.SecretAccessKey || '', - sessionToken: Credentials?.SessionToken || '', - }, - }); - } else { - ssmClient = new SSMClient({ - ...clientConfig, - }); - } - return ssmClient; +async function getSSMClient(region: string, roleArn?: string): Promise { + const credentials = roleArn ? await getTemporaryCredentials(region, roleArn) : undefined; + return new SSMClient({ region, credentials }); } -async function getCloudFormationClient(roleArn?: string): Promise { - const clientConfig: CloudFormationClientConfig = { region: process.env.AGIE_REGION ?? process.env.AWS_REGION }; - let cfClient; - if (roleArn) { - const command = new AssumeRoleCommand({ - RoleArn: roleArn, - RoleSessionName: `agie-cli-${ulid()}`, - }); +const getEc2Client = async (region: string, roleArn?: string): Promise => { + const credentials = roleArn ? await getTemporaryCredentials(region, roleArn) : undefined; + + return new EC2Client({ region, credentials }); +}; + +const getOpenSearchClient = async (region: string, roleArn?: string): Promise => { + const credentials = roleArn ? await getTemporaryCredentials(region, roleArn) : undefined; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { Credentials } = await stsClient.send(command); + return new OpenSearchClient({ region, credentials }); +}; - cfClient = new CloudFormationClient({ - ...clientConfig, - credentials: { - accessKeyId: Credentials?.AccessKeyId || '', - secretAccessKey: Credentials?.SecretAccessKey || '', - sessionToken: Credentials?.SessionToken || '', - }, - }); - } else { - cfClient = new CloudFormationClient({ - ...clientConfig, - }); - } - return cfClient; +async function getCloudFormationClient(region: string, roleArn?: string): Promise { + const credentials = roleArn ? await getTemporaryCredentials(region, roleArn) : undefined; + return new CloudFormationClient({ region, credentials }); } -export { getCloudFormationClient, getSSMClient }; +export { getCloudFormationClient, getEc2Client, getOpenSearchClient, getSSMClient }; diff --git a/typescript/packages/apps/cli/src/utils/cloudformation.ts b/typescript/packages/apps/cli/src/utils/cloudformation.ts index 1179db2..2fb0999 100644 --- a/typescript/packages/apps/cli/src/utils/cloudformation.ts +++ b/typescript/packages/apps/cli/src/utils/cloudformation.ts @@ -19,8 +19,8 @@ export interface StackMetadata { status?: string; } -const getDeployedStackByName = async (stackName: string, roleArn?: string): Promise => { - const cfClient = await getCloudFormationClient(roleArn); +const getDeployedStackByName = async (stackName: string, region: string, roleArn?: string): Promise => { + const cfClient = await getCloudFormationClient(region, roleArn); return await cfClient.send(new DescribeStacksCommand({ StackName: stackName })).then(async (r) => { const stackName = r.Stacks?.[0].StackName; const stackStatus = r.Stacks?.[0].StackStatus; diff --git a/typescript/packages/apps/cli/src/utils/config.ts b/typescript/packages/apps/cli/src/utils/config.ts deleted file mode 100644 index 8e4e074..0000000 --- a/typescript/packages/apps/cli/src/utils/config.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance - * with the License. A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES - * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions - * and limitations under the License. - */ - -import Conf from 'conf'; - -const config = new Conf({ - projectName: 'agie', - schema: { - agiePath: { - type: 'string', - } - }, -}); - -export default config; diff --git a/typescript/packages/apps/cli/src/utils/shell.ts b/typescript/packages/apps/cli/src/utils/shell.ts index 7e9a570..ea1d9d2 100644 --- a/typescript/packages/apps/cli/src/utils/shell.ts +++ b/typescript/packages/apps/cli/src/utils/shell.ts @@ -11,12 +11,11 @@ * and limitations under the License. */ -import shell from 'shelljs'; -import { promisify } from 'util'; -import config from './config.js'; import rushlib from '@microsoft/rush-lib'; import path from 'path'; +import shell from 'shelljs'; import { fileURLToPath } from 'url'; +import { promisify } from 'util'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -25,14 +24,17 @@ const execAsync = promisify(shell.exec); export type Folder = string; -const switchToAgieLocation = async (): Promise => { - let agieLocation = config.get('agiePath'); - if (!agieLocation) { - agieLocation = path.join(__dirname, '../../../../../'); - } +const switchToAgieRootFolder = async (): Promise => { + const agieFolder = path.join(__dirname, '../../../../../..'); + shell.cd(agieFolder); + return agieFolder!; +}; + +const switchToAgieInfrastructureFolder = async (): Promise => { + const agieFolder = path.join(__dirname, '../../../../../..'); const rushConfiguration = rushlib.RushConfiguration.loadFromDefaultLocation({ - startingFolder: agieLocation, + startingFolder: agieFolder, }); const moduleConfiguration = rushConfiguration.findProjectByShorthandName('@agie/infrastructure'); @@ -43,4 +45,4 @@ const switchToAgieLocation = async (): Promise => { return moduleConfiguration.projectFolder; }; -export { execAsync, switchToAgieLocation }; +export { execAsync, switchToAgieInfrastructureFolder, switchToAgieRootFolder }; diff --git a/typescript/packages/apps/cli/src/utils/ssm.ts b/typescript/packages/apps/cli/src/utils/ssm.ts index 27fbcbc..2d9ba15 100644 --- a/typescript/packages/apps/cli/src/utils/ssm.ts +++ b/typescript/packages/apps/cli/src/utils/ssm.ts @@ -11,15 +11,15 @@ * and limitations under the License. */ -import { GetParameterCommand } from "@aws-sdk/client-ssm"; -import { getSSMClient } from "./awsClient.js"; +import { GetParameterCommand } from '@aws-sdk/client-ssm'; +import { getSSMClient } from './awsClient.js'; -async function getParameterValue(path: string, roleArn?: string): Promise { - const ssm = await getSSMClient(roleArn); +async function getParameterValue(path: string, region: string, roleArn?: string): Promise { + const ssm = await getSSMClient(region!, roleArn); const response = await ssm.send( new GetParameterCommand({ Name: path, - }) + }), ); return response.Parameter?.Value as string; } diff --git a/typescript/packages/apps/cli/tsconfig.json b/typescript/packages/apps/cli/tsconfig.json index 2ace36c..62b188d 100644 --- a/typescript/packages/apps/cli/tsconfig.json +++ b/typescript/packages/apps/cli/tsconfig.json @@ -3,9 +3,7 @@ "compilerOptions": { "outDir": "dist", "rootDir": "src", - "types": [ - "node" - ], + "types": ["node"], "declaration": true, "declarationMap": true, "sourceMap": true, @@ -14,22 +12,12 @@ "noPropertyAccessFromIndexSignature": false, // overrides of extends "strict": false, - "exactOptionalPropertyTypes": false + "exactOptionalPropertyTypes": false, + "strictNullChecks": true }, "ts-node": { "esm": true }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "./**/__mocks__/*.ts", - ".git", - ".history", - ".vscode", - "cdk.out", - "dist", - "lib", - "node_modules" - ] + "include": ["src/**/*.ts"], + "exclude": ["./**/__mocks__/*.ts", ".git", ".history", ".vscode", "cdk.out", "dist", "lib", "node_modules"] } diff --git a/typescript/packages/apps/ui/package.json b/typescript/packages/apps/ui/package.json index 82cf43e..e246f65 100644 --- a/typescript/packages/apps/ui/package.json +++ b/typescript/packages/apps/ui/package.json @@ -29,7 +29,8 @@ "victory": "~37", "@aws/amazon-location-utilities-auth-helper": "~1", "@reduxjs/toolkit": "~2", - "react-redux": "~9" + "react-redux": "~9", + "tsx": "~4" }, "devDependencies": { "@agie/regions": "workspace:*", diff --git a/typescript/packages/apps/ui/upload-to-s3.bash b/typescript/packages/apps/ui/upload-to-s3.bash index 3a924e3..a949c0a 100755 --- a/typescript/packages/apps/ui/upload-to-s3.bash +++ b/typescript/packages/apps/ui/upload-to-s3.bash @@ -14,7 +14,7 @@ # # Retrieve the website hosting bucket -AGIE_WEBSITE_BUCKET=$(aws ssm get-parameters --names /agie/${ENVIRONMENT}/ui/websiteBucket --query 'Parameters[0].Value' --output text) +AGIE_WEBSITE_BUCKET=$(aws ssm get-parameters --names /agie/${ENVIRONMENT}/ui/websiteBucket --query 'Parameters[0].Value' --output text --region $AWS_REGION) # Upload the bundled artifacts to the bucket -aws s3 sync ./dist s3://"$AGIE_WEBSITE_BUCKET" +aws s3 sync ./dist s3://"$AGIE_WEBSITE_BUCKET" --region $AWS_REGION diff --git a/typescript/packages/libraries/cdk-common/src/s3/s3.construct.ts b/typescript/packages/libraries/cdk-common/src/s3/s3.construct.ts index 696a717..281287b 100644 --- a/typescript/packages/libraries/cdk-common/src/s3/s3.construct.ts +++ b/typescript/packages/libraries/cdk-common/src/s3/s3.construct.ts @@ -46,7 +46,7 @@ export class S3 extends Construct { enforceSSL: true, autoDeleteObjects: props.deleteBucket, versioned: !props.deleteBucket, - serverAccessLogsPrefix: 'access-logs', + serverAccessLogsPrefix: 'access-logs/', removalPolicy: props.deleteBucket ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN, });