├── .gitignore ├── .npmignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── bin └── aws-lambda-duplex-stream-to-s3.ts ├── cdk.json ├── docs └── architecture.png ├── invoke.sh ├── lambda ├── lambda.ts ├── package-lock.json └── package.json ├── lib └── aws-lambda-duplex-stream-to-s3-stack.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | !jest.config.js 3 | *.d.ts 4 | node_modules 5 | 6 | # CDK asset staging directory 7 | .cdk.staging 8 | cdk.out 9 | 10 | # Outfile from invoke 11 | response.json 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | !*.d.ts 3 | 4 | # CDK asset staging directory 5 | .cdk.staging 6 | cdk.out 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *main* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 10 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 11 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 12 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 13 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 | 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AWS Lambda Duplex Stream to S3 2 | 3 | > An example of how to stream large files to S3 from an external source on AWS 4 | > Lambda using the JavaScript AWS SDK v3 5 | 6 | ![Architecture](./docs/architecture.png) 7 | 8 | ## Motivation 9 | 10 | In use cases where lambda needs to download and upload files that can range 11 | widely in size, using a standard up-front download and upload flow will 12 | require increasing the lambda memory configuration to be large enough to store 13 | the file while the transfer occurs. 14 | 15 | By using an approach with streams, the lambda memory configuration is no longer 16 | a constraint, allowing us to process files of any size as long as the transfer 17 | can occur within the maximum execution time (15 minutes). 18 | 19 | ## Prerequisites 20 | 21 | To deploy this CDK application, you will need the following: 22 | 23 | - [Node.js](https://nodejs.org/en/download/) v10 or later (LTS only) 24 | - Docker (for building the lambda function) 25 | - An AWS profile with valid IAM credentials 26 | 27 | ## Usage 28 | 29 | Deploy the CDK stack by cloning this repository then running: 30 | 31 | ```bash 32 | npm run build && npm run deploy 33 | ``` 34 | 35 | Run the `invoke.sh` script with a URL of large file (will take some time while 36 | the lambda pulls in the file and uploads): 37 | 38 | ```bash 39 | ./invoke.sh "https://ai2-public-datasets.s3.us-west-2.amazonaws.com/arc/ARC-V1-Feb2018.zip" # 649 MB file 40 | ``` 41 | 42 | Your lambda will then stream the incoming data from your URL while streaming the 43 | data to S3. 44 | 45 | Open the [S3 Console](https://s3.console.aws.amazon.com/s3/home?region=us-east-1) 46 | when the lambda has completed to see the file has been uploaded to your bucket. 47 | 48 | **Note**: If you need to specify an AWS profile other than `default` to use, 49 | set the `AWS_PROFILE` environment variable in your shell before running 50 | any commands. 51 | 52 | ## Cleaning Up 53 | 54 | Run the following command to remove all of the resources created by this CDK stack. 55 | 56 | ```bash 57 | npm run destroy 58 | ``` 59 | 60 | ## Security 61 | 62 | See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. 63 | 64 | ## License 65 | 66 | This library is licensed under the MIT-0 License. See the LICENSE file. 67 | -------------------------------------------------------------------------------- /bin/aws-lambda-duplex-stream-to-s3.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /** 3 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 4 | * SPDX-License-Identifier: MIT-0 5 | */ 6 | import 'source-map-support/register'; 7 | import * as cdk from 'aws-cdk-lib'; 8 | import { AwsLambdaDuplexStreamToS3Stack } from '../lib/aws-lambda-duplex-stream-to-s3-stack'; 9 | 10 | const app = new cdk.App(); 11 | new AwsLambdaDuplexStreamToS3Stack(app, 'AwsLambdaDuplexStreamToS3Stack', { 12 | /* If you don't specify 'env', this stack will be environment-agnostic. 13 | * Account/Region-dependent features and context lookups will not work, 14 | * but a single synthesized template can be deployed anywhere. */ 15 | 16 | /* Uncomment the next line to specialize this stack for the AWS Account 17 | * and Region that are implied by the current CLI configuration. */ 18 | // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION }, 19 | 20 | /* Uncomment the next line if you know exactly what Account and Region you 21 | * want to deploy the stack to. */ 22 | // env: { account: '123456789012', region: 'us-east-1' }, 23 | 24 | /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ 25 | }); 26 | -------------------------------------------------------------------------------- /cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "npx ts-node --prefer-ts-exts bin/aws-lambda-duplex-stream-to-s3.ts", 3 | "context": { 4 | "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, 5 | "@aws-cdk/core:stackRelativeExports": "true", 6 | "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, 7 | "@aws-cdk/aws-lambda:recognizeVersionProps": true, 8 | "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /docs/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/aws-lambda-duplex-stream-to-s3/8cf186ef80949a60f667c95807271069b55bc1aa/docs/architecture.png -------------------------------------------------------------------------------- /invoke.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | DEFAULT_URL="https://ai2-public-datasets.s3.us-west-2.amazonaws.com/arc/ARC-V1-Feb2018.zip" 3 | URL=${1:-$DEFAULT_URL} 4 | 5 | # Invoke our lambda function with the URL of the file to download 6 | aws lambda invoke \ 7 | --function-name duplex-stream-to-s3 \ 8 | --payload '{"url":"'"$URL"'"}' \ 9 | --cli-binary-format raw-in-base64-out \ 10 | --invocation-type RequestResponse \ 11 | response.json 12 | -------------------------------------------------------------------------------- /lambda/lambda.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: MIT-0 4 | */ 5 | 6 | import * as https from 'https'; 7 | import * as path from 'path'; 8 | import * as stream from 'stream'; 9 | import { Upload } from '@aws-sdk/lib-storage'; 10 | import { S3Client } from '@aws-sdk/client-s3'; 11 | 12 | interface CustomLambdaEvent { 13 | url: string; 14 | } 15 | 16 | const createUploadStream = ( 17 | url: string 18 | ): { passStream: stream.PassThrough; parallelUploadS3: Upload } => { 19 | const passStream = new stream.PassThrough(); 20 | const extension = path.extname(url); 21 | const uploadKeyName = `Upload-${new Date().toISOString()}${extension}`; 22 | const parallelUploadS3 = new Upload({ 23 | client: new S3Client({}), 24 | queueSize: 4, 25 | params: { 26 | Bucket: process.env.UPLOAD_BUCKET_NAME, 27 | Key: uploadKeyName, 28 | Body: passStream, 29 | }, 30 | }); 31 | 32 | parallelUploadS3.on('httpUploadProgress', (progress) => { 33 | console.log(`Uploaded part: ${progress.part}`); 34 | }); 35 | 36 | return { passStream, parallelUploadS3 }; 37 | }; 38 | 39 | export const handler = async (event: CustomLambdaEvent): Promise => { 40 | console.log('Processing event: ', JSON.stringify(event, null, 2)); 41 | try { 42 | const { parallelUploadS3, passStream } = createUploadStream(event.url); 43 | 44 | /** 45 | * Download the file from our URL and pipe the response to the PassThrough 46 | * stream being used in the S3 parallel upload. 47 | */ 48 | https.get(event.url, (stream) => { 49 | stream.pipe(passStream); 50 | }); 51 | 52 | await parallelUploadS3.done(); 53 | console.log('Done'); 54 | } catch (e) { 55 | console.log(e); 56 | throw e; 57 | } 58 | }; 59 | -------------------------------------------------------------------------------- /lambda/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lambda", 3 | "version": "1.0.0", 4 | "description": "Handler for downloading a large file and uploading it to S3 using streams", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "keywords": [], 9 | "author": "Ryan Sonshine", 10 | "dependencies": { 11 | "@aws-sdk/client-s3": "^3.382.0", 12 | "@aws-sdk/lib-storage": "^3.40.0", 13 | "aws-sdk": "^2.1354.0" 14 | }, 15 | "devDependencies": { 16 | "@types/aws-lambda": "^8.10.85" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/aws-lambda-duplex-stream-to-s3-stack.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: MIT-0 4 | */ 5 | import * as path from 'path'; 6 | import { 7 | aws_lambda_nodejs as lambda, 8 | aws_s3 as s3, 9 | Duration, 10 | RemovalPolicy, 11 | Stack, 12 | StackProps, 13 | } from 'aws-cdk-lib'; 14 | import { Construct } from 'constructs'; 15 | 16 | export class AwsLambdaDuplexStreamToS3Stack extends Stack { 17 | constructor(scope: Construct, id: string, props?: StackProps) { 18 | super(scope, id, props); 19 | 20 | const uploadBucket = new s3.Bucket(this, 'UploadBucket', { 21 | removalPolicy: RemovalPolicy.DESTROY, 22 | autoDeleteObjects: true, 23 | }); 24 | 25 | const streamLambda = new lambda.NodejsFunction(this, 'LambdaFunction', { 26 | functionName: 'duplex-stream-to-s3', 27 | entry: path.resolve(__dirname, '../lambda/lambda.ts'), 28 | memorySize: 256, 29 | timeout: Duration.minutes(15), 30 | environment: { 31 | UPLOAD_BUCKET_NAME: uploadBucket.bucketName, 32 | }, 33 | }); 34 | 35 | uploadBucket.grantWrite(streamLambda); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-lambda-duplex-stream-to-s3", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "aws-lambda-duplex-stream-to-s3", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "aws-cdk-lib": "^2.89.0", 12 | "constructs": "^10.0.0", 13 | "source-map-support": "^0.5.16" 14 | }, 15 | "bin": { 16 | "aws-lambda-duplex-stream-to-s3": "bin/aws-lambda-duplex-stream-to-s3.js" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "10.17.27", 20 | "aws-cdk": "^2.38.1", 21 | "esbuild": "^0.15.5", 22 | "ts-node": "^9.0.0", 23 | "typescript": "~3.9.7" 24 | } 25 | }, 26 | "node_modules/@aws-cdk/asset-awscli-v1": { 27 | "version": "2.2.200", 28 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", 29 | "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" 30 | }, 31 | "node_modules/@aws-cdk/asset-kubectl-v20": { 32 | "version": "2.1.2", 33 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", 34 | "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" 35 | }, 36 | "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { 37 | "version": "2.0.166", 38 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", 39 | "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" 40 | }, 41 | "node_modules/@esbuild/linux-loong64": { 42 | "version": "0.15.5", 43 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", 44 | "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", 45 | "cpu": [ 46 | "loong64" 47 | ], 48 | "dev": true, 49 | "optional": true, 50 | "os": [ 51 | "linux" 52 | ], 53 | "engines": { 54 | "node": ">=12" 55 | } 56 | }, 57 | "node_modules/@types/node": { 58 | "version": "10.17.27", 59 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", 60 | "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", 61 | "dev": true 62 | }, 63 | "node_modules/arg": { 64 | "version": "4.1.3", 65 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 66 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 67 | "dev": true 68 | }, 69 | "node_modules/aws-cdk": { 70 | "version": "2.38.1", 71 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.38.1.tgz", 72 | "integrity": "sha512-bIHRCkmbXBmJWw1Gq5UsAUUYKABuE/ah1iAA14hXLS8+9AJlF/Ptn+NsUCt9K5v17cRqtUoeaOAMAPrZs8l+YA==", 73 | "dev": true, 74 | "bin": { 75 | "cdk": "bin/cdk" 76 | }, 77 | "engines": { 78 | "node": ">= 14.15.0" 79 | }, 80 | "optionalDependencies": { 81 | "fsevents": "2.3.2" 82 | } 83 | }, 84 | "node_modules/aws-cdk-lib": { 85 | "version": "2.89.0", 86 | "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.89.0.tgz", 87 | "integrity": "sha512-UgyiS/u9d27MsL3M8Hz9yvi5AiJUQUGvqfQw6qDXrnyGMIC4gsNTc00VUT+LCXgtqQM/wF1jDUrODxkWglAiAw==", 88 | "bundleDependencies": [ 89 | "@balena/dockerignore", 90 | "case", 91 | "fs-extra", 92 | "ignore", 93 | "jsonschema", 94 | "minimatch", 95 | "punycode", 96 | "semver", 97 | "table", 98 | "yaml" 99 | ], 100 | "dependencies": { 101 | "@aws-cdk/asset-awscli-v1": "^2.2.200", 102 | "@aws-cdk/asset-kubectl-v20": "^2.1.2", 103 | "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.166", 104 | "@balena/dockerignore": "^1.0.2", 105 | "case": "1.6.3", 106 | "fs-extra": "^11.1.1", 107 | "ignore": "^5.2.4", 108 | "jsonschema": "^1.4.1", 109 | "minimatch": "^3.1.2", 110 | "punycode": "^2.3.0", 111 | "semver": "^7.5.4", 112 | "table": "^6.8.1", 113 | "yaml": "1.10.2" 114 | }, 115 | "engines": { 116 | "node": ">= 14.15.0" 117 | }, 118 | "peerDependencies": { 119 | "constructs": "^10.0.0" 120 | } 121 | }, 122 | "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { 123 | "version": "1.0.2", 124 | "inBundle": true, 125 | "license": "Apache-2.0" 126 | }, 127 | "node_modules/aws-cdk-lib/node_modules/ajv": { 128 | "version": "8.12.0", 129 | "inBundle": true, 130 | "license": "MIT", 131 | "dependencies": { 132 | "fast-deep-equal": "^3.1.1", 133 | "json-schema-traverse": "^1.0.0", 134 | "require-from-string": "^2.0.2", 135 | "uri-js": "^4.2.2" 136 | }, 137 | "funding": { 138 | "type": "github", 139 | "url": "https://github.com/sponsors/epoberezkin" 140 | } 141 | }, 142 | "node_modules/aws-cdk-lib/node_modules/ansi-regex": { 143 | "version": "5.0.1", 144 | "inBundle": true, 145 | "license": "MIT", 146 | "engines": { 147 | "node": ">=8" 148 | } 149 | }, 150 | "node_modules/aws-cdk-lib/node_modules/ansi-styles": { 151 | "version": "4.3.0", 152 | "inBundle": true, 153 | "license": "MIT", 154 | "dependencies": { 155 | "color-convert": "^2.0.1" 156 | }, 157 | "engines": { 158 | "node": ">=8" 159 | }, 160 | "funding": { 161 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 162 | } 163 | }, 164 | "node_modules/aws-cdk-lib/node_modules/astral-regex": { 165 | "version": "2.0.0", 166 | "inBundle": true, 167 | "license": "MIT", 168 | "engines": { 169 | "node": ">=8" 170 | } 171 | }, 172 | "node_modules/aws-cdk-lib/node_modules/balanced-match": { 173 | "version": "1.0.2", 174 | "inBundle": true, 175 | "license": "MIT" 176 | }, 177 | "node_modules/aws-cdk-lib/node_modules/brace-expansion": { 178 | "version": "1.1.11", 179 | "inBundle": true, 180 | "license": "MIT", 181 | "dependencies": { 182 | "balanced-match": "^1.0.0", 183 | "concat-map": "0.0.1" 184 | } 185 | }, 186 | "node_modules/aws-cdk-lib/node_modules/case": { 187 | "version": "1.6.3", 188 | "inBundle": true, 189 | "license": "(MIT OR GPL-3.0-or-later)", 190 | "engines": { 191 | "node": ">= 0.8.0" 192 | } 193 | }, 194 | "node_modules/aws-cdk-lib/node_modules/color-convert": { 195 | "version": "2.0.1", 196 | "inBundle": true, 197 | "license": "MIT", 198 | "dependencies": { 199 | "color-name": "~1.1.4" 200 | }, 201 | "engines": { 202 | "node": ">=7.0.0" 203 | } 204 | }, 205 | "node_modules/aws-cdk-lib/node_modules/color-name": { 206 | "version": "1.1.4", 207 | "inBundle": true, 208 | "license": "MIT" 209 | }, 210 | "node_modules/aws-cdk-lib/node_modules/concat-map": { 211 | "version": "0.0.1", 212 | "inBundle": true, 213 | "license": "MIT" 214 | }, 215 | "node_modules/aws-cdk-lib/node_modules/emoji-regex": { 216 | "version": "8.0.0", 217 | "inBundle": true, 218 | "license": "MIT" 219 | }, 220 | "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { 221 | "version": "3.1.3", 222 | "inBundle": true, 223 | "license": "MIT" 224 | }, 225 | "node_modules/aws-cdk-lib/node_modules/fs-extra": { 226 | "version": "11.1.1", 227 | "inBundle": true, 228 | "license": "MIT", 229 | "dependencies": { 230 | "graceful-fs": "^4.2.0", 231 | "jsonfile": "^6.0.1", 232 | "universalify": "^2.0.0" 233 | }, 234 | "engines": { 235 | "node": ">=14.14" 236 | } 237 | }, 238 | "node_modules/aws-cdk-lib/node_modules/graceful-fs": { 239 | "version": "4.2.11", 240 | "inBundle": true, 241 | "license": "ISC" 242 | }, 243 | "node_modules/aws-cdk-lib/node_modules/ignore": { 244 | "version": "5.2.4", 245 | "inBundle": true, 246 | "license": "MIT", 247 | "engines": { 248 | "node": ">= 4" 249 | } 250 | }, 251 | "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { 252 | "version": "3.0.0", 253 | "inBundle": true, 254 | "license": "MIT", 255 | "engines": { 256 | "node": ">=8" 257 | } 258 | }, 259 | "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { 260 | "version": "1.0.0", 261 | "inBundle": true, 262 | "license": "MIT" 263 | }, 264 | "node_modules/aws-cdk-lib/node_modules/jsonfile": { 265 | "version": "6.1.0", 266 | "inBundle": true, 267 | "license": "MIT", 268 | "dependencies": { 269 | "universalify": "^2.0.0" 270 | }, 271 | "optionalDependencies": { 272 | "graceful-fs": "^4.1.6" 273 | } 274 | }, 275 | "node_modules/aws-cdk-lib/node_modules/jsonschema": { 276 | "version": "1.4.1", 277 | "inBundle": true, 278 | "license": "MIT", 279 | "engines": { 280 | "node": "*" 281 | } 282 | }, 283 | "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { 284 | "version": "4.4.2", 285 | "inBundle": true, 286 | "license": "MIT" 287 | }, 288 | "node_modules/aws-cdk-lib/node_modules/lru-cache": { 289 | "version": "6.0.0", 290 | "inBundle": true, 291 | "license": "ISC", 292 | "dependencies": { 293 | "yallist": "^4.0.0" 294 | }, 295 | "engines": { 296 | "node": ">=10" 297 | } 298 | }, 299 | "node_modules/aws-cdk-lib/node_modules/minimatch": { 300 | "version": "3.1.2", 301 | "inBundle": true, 302 | "license": "ISC", 303 | "dependencies": { 304 | "brace-expansion": "^1.1.7" 305 | }, 306 | "engines": { 307 | "node": "*" 308 | } 309 | }, 310 | "node_modules/aws-cdk-lib/node_modules/punycode": { 311 | "version": "2.3.0", 312 | "inBundle": true, 313 | "license": "MIT", 314 | "engines": { 315 | "node": ">=6" 316 | } 317 | }, 318 | "node_modules/aws-cdk-lib/node_modules/require-from-string": { 319 | "version": "2.0.2", 320 | "inBundle": true, 321 | "license": "MIT", 322 | "engines": { 323 | "node": ">=0.10.0" 324 | } 325 | }, 326 | "node_modules/aws-cdk-lib/node_modules/semver": { 327 | "version": "7.5.4", 328 | "inBundle": true, 329 | "license": "ISC", 330 | "dependencies": { 331 | "lru-cache": "^6.0.0" 332 | }, 333 | "bin": { 334 | "semver": "bin/semver.js" 335 | }, 336 | "engines": { 337 | "node": ">=10" 338 | } 339 | }, 340 | "node_modules/aws-cdk-lib/node_modules/slice-ansi": { 341 | "version": "4.0.0", 342 | "inBundle": true, 343 | "license": "MIT", 344 | "dependencies": { 345 | "ansi-styles": "^4.0.0", 346 | "astral-regex": "^2.0.0", 347 | "is-fullwidth-code-point": "^3.0.0" 348 | }, 349 | "engines": { 350 | "node": ">=10" 351 | }, 352 | "funding": { 353 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 354 | } 355 | }, 356 | "node_modules/aws-cdk-lib/node_modules/string-width": { 357 | "version": "4.2.3", 358 | "inBundle": true, 359 | "license": "MIT", 360 | "dependencies": { 361 | "emoji-regex": "^8.0.0", 362 | "is-fullwidth-code-point": "^3.0.0", 363 | "strip-ansi": "^6.0.1" 364 | }, 365 | "engines": { 366 | "node": ">=8" 367 | } 368 | }, 369 | "node_modules/aws-cdk-lib/node_modules/strip-ansi": { 370 | "version": "6.0.1", 371 | "inBundle": true, 372 | "license": "MIT", 373 | "dependencies": { 374 | "ansi-regex": "^5.0.1" 375 | }, 376 | "engines": { 377 | "node": ">=8" 378 | } 379 | }, 380 | "node_modules/aws-cdk-lib/node_modules/table": { 381 | "version": "6.8.1", 382 | "inBundle": true, 383 | "license": "BSD-3-Clause", 384 | "dependencies": { 385 | "ajv": "^8.0.1", 386 | "lodash.truncate": "^4.4.2", 387 | "slice-ansi": "^4.0.0", 388 | "string-width": "^4.2.3", 389 | "strip-ansi": "^6.0.1" 390 | }, 391 | "engines": { 392 | "node": ">=10.0.0" 393 | } 394 | }, 395 | "node_modules/aws-cdk-lib/node_modules/universalify": { 396 | "version": "2.0.0", 397 | "inBundle": true, 398 | "license": "MIT", 399 | "engines": { 400 | "node": ">= 10.0.0" 401 | } 402 | }, 403 | "node_modules/aws-cdk-lib/node_modules/uri-js": { 404 | "version": "4.4.1", 405 | "inBundle": true, 406 | "license": "BSD-2-Clause", 407 | "dependencies": { 408 | "punycode": "^2.1.0" 409 | } 410 | }, 411 | "node_modules/aws-cdk-lib/node_modules/yallist": { 412 | "version": "4.0.0", 413 | "inBundle": true, 414 | "license": "ISC" 415 | }, 416 | "node_modules/aws-cdk-lib/node_modules/yaml": { 417 | "version": "1.10.2", 418 | "inBundle": true, 419 | "license": "ISC", 420 | "engines": { 421 | "node": ">= 6" 422 | } 423 | }, 424 | "node_modules/buffer-from": { 425 | "version": "1.1.2", 426 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 427 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 428 | }, 429 | "node_modules/constructs": { 430 | "version": "10.0.9", 431 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.0.9.tgz", 432 | "integrity": "sha512-C9la/fcnCKe3XIjKPbWuD49mnOYqSWdiMI6TNJmF0ao3pJw6Hap03Q4nsmCxpWMXuMzM546Kw/WnW7ElB3g4OA==", 433 | "engines": { 434 | "node": ">= 12.7.0" 435 | } 436 | }, 437 | "node_modules/create-require": { 438 | "version": "1.1.1", 439 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 440 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 441 | "dev": true 442 | }, 443 | "node_modules/diff": { 444 | "version": "4.0.2", 445 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 446 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 447 | "dev": true, 448 | "engines": { 449 | "node": ">=0.3.1" 450 | } 451 | }, 452 | "node_modules/esbuild": { 453 | "version": "0.15.5", 454 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", 455 | "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", 456 | "dev": true, 457 | "hasInstallScript": true, 458 | "bin": { 459 | "esbuild": "bin/esbuild" 460 | }, 461 | "engines": { 462 | "node": ">=12" 463 | }, 464 | "optionalDependencies": { 465 | "@esbuild/linux-loong64": "0.15.5", 466 | "esbuild-android-64": "0.15.5", 467 | "esbuild-android-arm64": "0.15.5", 468 | "esbuild-darwin-64": "0.15.5", 469 | "esbuild-darwin-arm64": "0.15.5", 470 | "esbuild-freebsd-64": "0.15.5", 471 | "esbuild-freebsd-arm64": "0.15.5", 472 | "esbuild-linux-32": "0.15.5", 473 | "esbuild-linux-64": "0.15.5", 474 | "esbuild-linux-arm": "0.15.5", 475 | "esbuild-linux-arm64": "0.15.5", 476 | "esbuild-linux-mips64le": "0.15.5", 477 | "esbuild-linux-ppc64le": "0.15.5", 478 | "esbuild-linux-riscv64": "0.15.5", 479 | "esbuild-linux-s390x": "0.15.5", 480 | "esbuild-netbsd-64": "0.15.5", 481 | "esbuild-openbsd-64": "0.15.5", 482 | "esbuild-sunos-64": "0.15.5", 483 | "esbuild-windows-32": "0.15.5", 484 | "esbuild-windows-64": "0.15.5", 485 | "esbuild-windows-arm64": "0.15.5" 486 | } 487 | }, 488 | "node_modules/esbuild-android-64": { 489 | "version": "0.15.5", 490 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", 491 | "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", 492 | "cpu": [ 493 | "x64" 494 | ], 495 | "dev": true, 496 | "optional": true, 497 | "os": [ 498 | "android" 499 | ], 500 | "engines": { 501 | "node": ">=12" 502 | } 503 | }, 504 | "node_modules/esbuild-android-arm64": { 505 | "version": "0.15.5", 506 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", 507 | "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", 508 | "cpu": [ 509 | "arm64" 510 | ], 511 | "dev": true, 512 | "optional": true, 513 | "os": [ 514 | "android" 515 | ], 516 | "engines": { 517 | "node": ">=12" 518 | } 519 | }, 520 | "node_modules/esbuild-darwin-64": { 521 | "version": "0.15.5", 522 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", 523 | "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", 524 | "cpu": [ 525 | "x64" 526 | ], 527 | "dev": true, 528 | "optional": true, 529 | "os": [ 530 | "darwin" 531 | ], 532 | "engines": { 533 | "node": ">=12" 534 | } 535 | }, 536 | "node_modules/esbuild-darwin-arm64": { 537 | "version": "0.15.5", 538 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", 539 | "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", 540 | "cpu": [ 541 | "arm64" 542 | ], 543 | "dev": true, 544 | "optional": true, 545 | "os": [ 546 | "darwin" 547 | ], 548 | "engines": { 549 | "node": ">=12" 550 | } 551 | }, 552 | "node_modules/esbuild-freebsd-64": { 553 | "version": "0.15.5", 554 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", 555 | "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", 556 | "cpu": [ 557 | "x64" 558 | ], 559 | "dev": true, 560 | "optional": true, 561 | "os": [ 562 | "freebsd" 563 | ], 564 | "engines": { 565 | "node": ">=12" 566 | } 567 | }, 568 | "node_modules/esbuild-freebsd-arm64": { 569 | "version": "0.15.5", 570 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", 571 | "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", 572 | "cpu": [ 573 | "arm64" 574 | ], 575 | "dev": true, 576 | "optional": true, 577 | "os": [ 578 | "freebsd" 579 | ], 580 | "engines": { 581 | "node": ">=12" 582 | } 583 | }, 584 | "node_modules/esbuild-linux-32": { 585 | "version": "0.15.5", 586 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", 587 | "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", 588 | "cpu": [ 589 | "ia32" 590 | ], 591 | "dev": true, 592 | "optional": true, 593 | "os": [ 594 | "linux" 595 | ], 596 | "engines": { 597 | "node": ">=12" 598 | } 599 | }, 600 | "node_modules/esbuild-linux-64": { 601 | "version": "0.15.5", 602 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", 603 | "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", 604 | "cpu": [ 605 | "x64" 606 | ], 607 | "dev": true, 608 | "optional": true, 609 | "os": [ 610 | "linux" 611 | ], 612 | "engines": { 613 | "node": ">=12" 614 | } 615 | }, 616 | "node_modules/esbuild-linux-arm": { 617 | "version": "0.15.5", 618 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", 619 | "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", 620 | "cpu": [ 621 | "arm" 622 | ], 623 | "dev": true, 624 | "optional": true, 625 | "os": [ 626 | "linux" 627 | ], 628 | "engines": { 629 | "node": ">=12" 630 | } 631 | }, 632 | "node_modules/esbuild-linux-arm64": { 633 | "version": "0.15.5", 634 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", 635 | "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", 636 | "cpu": [ 637 | "arm64" 638 | ], 639 | "dev": true, 640 | "optional": true, 641 | "os": [ 642 | "linux" 643 | ], 644 | "engines": { 645 | "node": ">=12" 646 | } 647 | }, 648 | "node_modules/esbuild-linux-mips64le": { 649 | "version": "0.15.5", 650 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", 651 | "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", 652 | "cpu": [ 653 | "mips64el" 654 | ], 655 | "dev": true, 656 | "optional": true, 657 | "os": [ 658 | "linux" 659 | ], 660 | "engines": { 661 | "node": ">=12" 662 | } 663 | }, 664 | "node_modules/esbuild-linux-ppc64le": { 665 | "version": "0.15.5", 666 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", 667 | "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", 668 | "cpu": [ 669 | "ppc64" 670 | ], 671 | "dev": true, 672 | "optional": true, 673 | "os": [ 674 | "linux" 675 | ], 676 | "engines": { 677 | "node": ">=12" 678 | } 679 | }, 680 | "node_modules/esbuild-linux-riscv64": { 681 | "version": "0.15.5", 682 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", 683 | "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", 684 | "cpu": [ 685 | "riscv64" 686 | ], 687 | "dev": true, 688 | "optional": true, 689 | "os": [ 690 | "linux" 691 | ], 692 | "engines": { 693 | "node": ">=12" 694 | } 695 | }, 696 | "node_modules/esbuild-linux-s390x": { 697 | "version": "0.15.5", 698 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", 699 | "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", 700 | "cpu": [ 701 | "s390x" 702 | ], 703 | "dev": true, 704 | "optional": true, 705 | "os": [ 706 | "linux" 707 | ], 708 | "engines": { 709 | "node": ">=12" 710 | } 711 | }, 712 | "node_modules/esbuild-netbsd-64": { 713 | "version": "0.15.5", 714 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", 715 | "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", 716 | "cpu": [ 717 | "x64" 718 | ], 719 | "dev": true, 720 | "optional": true, 721 | "os": [ 722 | "netbsd" 723 | ], 724 | "engines": { 725 | "node": ">=12" 726 | } 727 | }, 728 | "node_modules/esbuild-openbsd-64": { 729 | "version": "0.15.5", 730 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", 731 | "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", 732 | "cpu": [ 733 | "x64" 734 | ], 735 | "dev": true, 736 | "optional": true, 737 | "os": [ 738 | "openbsd" 739 | ], 740 | "engines": { 741 | "node": ">=12" 742 | } 743 | }, 744 | "node_modules/esbuild-sunos-64": { 745 | "version": "0.15.5", 746 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", 747 | "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", 748 | "cpu": [ 749 | "x64" 750 | ], 751 | "dev": true, 752 | "optional": true, 753 | "os": [ 754 | "sunos" 755 | ], 756 | "engines": { 757 | "node": ">=12" 758 | } 759 | }, 760 | "node_modules/esbuild-windows-32": { 761 | "version": "0.15.5", 762 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", 763 | "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", 764 | "cpu": [ 765 | "ia32" 766 | ], 767 | "dev": true, 768 | "optional": true, 769 | "os": [ 770 | "win32" 771 | ], 772 | "engines": { 773 | "node": ">=12" 774 | } 775 | }, 776 | "node_modules/esbuild-windows-64": { 777 | "version": "0.15.5", 778 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", 779 | "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", 780 | "cpu": [ 781 | "x64" 782 | ], 783 | "dev": true, 784 | "optional": true, 785 | "os": [ 786 | "win32" 787 | ], 788 | "engines": { 789 | "node": ">=12" 790 | } 791 | }, 792 | "node_modules/esbuild-windows-arm64": { 793 | "version": "0.15.5", 794 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", 795 | "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", 796 | "cpu": [ 797 | "arm64" 798 | ], 799 | "dev": true, 800 | "optional": true, 801 | "os": [ 802 | "win32" 803 | ], 804 | "engines": { 805 | "node": ">=12" 806 | } 807 | }, 808 | "node_modules/fsevents": { 809 | "version": "2.3.2", 810 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 811 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 812 | "dev": true, 813 | "hasInstallScript": true, 814 | "optional": true, 815 | "os": [ 816 | "darwin" 817 | ], 818 | "engines": { 819 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 820 | } 821 | }, 822 | "node_modules/make-error": { 823 | "version": "1.3.6", 824 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 825 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 826 | "dev": true 827 | }, 828 | "node_modules/source-map": { 829 | "version": "0.6.1", 830 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 831 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 832 | "engines": { 833 | "node": ">=0.10.0" 834 | } 835 | }, 836 | "node_modules/source-map-support": { 837 | "version": "0.5.20", 838 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", 839 | "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", 840 | "dependencies": { 841 | "buffer-from": "^1.0.0", 842 | "source-map": "^0.6.0" 843 | } 844 | }, 845 | "node_modules/ts-node": { 846 | "version": "9.1.1", 847 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", 848 | "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", 849 | "dev": true, 850 | "dependencies": { 851 | "arg": "^4.1.0", 852 | "create-require": "^1.1.0", 853 | "diff": "^4.0.1", 854 | "make-error": "^1.1.1", 855 | "source-map-support": "^0.5.17", 856 | "yn": "3.1.1" 857 | }, 858 | "bin": { 859 | "ts-node": "dist/bin.js", 860 | "ts-node-script": "dist/bin-script.js", 861 | "ts-node-transpile-only": "dist/bin-transpile.js", 862 | "ts-script": "dist/bin-script-deprecated.js" 863 | }, 864 | "engines": { 865 | "node": ">=10.0.0" 866 | }, 867 | "peerDependencies": { 868 | "typescript": ">=2.7" 869 | } 870 | }, 871 | "node_modules/typescript": { 872 | "version": "3.9.10", 873 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", 874 | "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", 875 | "dev": true, 876 | "bin": { 877 | "tsc": "bin/tsc", 878 | "tsserver": "bin/tsserver" 879 | }, 880 | "engines": { 881 | "node": ">=4.2.0" 882 | } 883 | }, 884 | "node_modules/yn": { 885 | "version": "3.1.1", 886 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 887 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 888 | "dev": true, 889 | "engines": { 890 | "node": ">=6" 891 | } 892 | } 893 | }, 894 | "dependencies": { 895 | "@aws-cdk/asset-awscli-v1": { 896 | "version": "2.2.200", 897 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", 898 | "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==" 899 | }, 900 | "@aws-cdk/asset-kubectl-v20": { 901 | "version": "2.1.2", 902 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", 903 | "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==" 904 | }, 905 | "@aws-cdk/asset-node-proxy-agent-v5": { 906 | "version": "2.0.166", 907 | "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz", 908 | "integrity": "sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg==" 909 | }, 910 | "@esbuild/linux-loong64": { 911 | "version": "0.15.5", 912 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", 913 | "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", 914 | "dev": true, 915 | "optional": true 916 | }, 917 | "@types/node": { 918 | "version": "10.17.27", 919 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.27.tgz", 920 | "integrity": "sha512-J0oqm9ZfAXaPdwNXMMgAhylw5fhmXkToJd06vuDUSAgEDZ/n/69/69UmyBZbc+zT34UnShuDSBqvim3SPnozJg==", 921 | "dev": true 922 | }, 923 | "arg": { 924 | "version": "4.1.3", 925 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 926 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 927 | "dev": true 928 | }, 929 | "aws-cdk": { 930 | "version": "2.38.1", 931 | "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.38.1.tgz", 932 | "integrity": "sha512-bIHRCkmbXBmJWw1Gq5UsAUUYKABuE/ah1iAA14hXLS8+9AJlF/Ptn+NsUCt9K5v17cRqtUoeaOAMAPrZs8l+YA==", 933 | "dev": true, 934 | "requires": { 935 | "fsevents": "2.3.2" 936 | } 937 | }, 938 | "aws-cdk-lib": { 939 | "version": "2.89.0", 940 | "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.89.0.tgz", 941 | "integrity": "sha512-UgyiS/u9d27MsL3M8Hz9yvi5AiJUQUGvqfQw6qDXrnyGMIC4gsNTc00VUT+LCXgtqQM/wF1jDUrODxkWglAiAw==", 942 | "requires": { 943 | "@aws-cdk/asset-awscli-v1": "^2.2.200", 944 | "@aws-cdk/asset-kubectl-v20": "^2.1.2", 945 | "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.166", 946 | "@balena/dockerignore": "^1.0.2", 947 | "case": "1.6.3", 948 | "fs-extra": "^11.1.1", 949 | "ignore": "^5.2.4", 950 | "jsonschema": "^1.4.1", 951 | "minimatch": "^3.1.2", 952 | "punycode": "^2.3.0", 953 | "semver": "^7.5.4", 954 | "table": "^6.8.1", 955 | "yaml": "1.10.2" 956 | }, 957 | "dependencies": { 958 | "@balena/dockerignore": { 959 | "version": "1.0.2", 960 | "bundled": true 961 | }, 962 | "ajv": { 963 | "version": "8.12.0", 964 | "bundled": true, 965 | "requires": { 966 | "fast-deep-equal": "^3.1.1", 967 | "json-schema-traverse": "^1.0.0", 968 | "require-from-string": "^2.0.2", 969 | "uri-js": "^4.2.2" 970 | } 971 | }, 972 | "ansi-regex": { 973 | "version": "5.0.1", 974 | "bundled": true 975 | }, 976 | "ansi-styles": { 977 | "version": "4.3.0", 978 | "bundled": true, 979 | "requires": { 980 | "color-convert": "^2.0.1" 981 | } 982 | }, 983 | "astral-regex": { 984 | "version": "2.0.0", 985 | "bundled": true 986 | }, 987 | "balanced-match": { 988 | "version": "1.0.2", 989 | "bundled": true 990 | }, 991 | "brace-expansion": { 992 | "version": "1.1.11", 993 | "bundled": true, 994 | "requires": { 995 | "balanced-match": "^1.0.0", 996 | "concat-map": "0.0.1" 997 | } 998 | }, 999 | "case": { 1000 | "version": "1.6.3", 1001 | "bundled": true 1002 | }, 1003 | "color-convert": { 1004 | "version": "2.0.1", 1005 | "bundled": true, 1006 | "requires": { 1007 | "color-name": "~1.1.4" 1008 | } 1009 | }, 1010 | "color-name": { 1011 | "version": "1.1.4", 1012 | "bundled": true 1013 | }, 1014 | "concat-map": { 1015 | "version": "0.0.1", 1016 | "bundled": true 1017 | }, 1018 | "emoji-regex": { 1019 | "version": "8.0.0", 1020 | "bundled": true 1021 | }, 1022 | "fast-deep-equal": { 1023 | "version": "3.1.3", 1024 | "bundled": true 1025 | }, 1026 | "fs-extra": { 1027 | "version": "11.1.1", 1028 | "bundled": true, 1029 | "requires": { 1030 | "graceful-fs": "^4.2.0", 1031 | "jsonfile": "^6.0.1", 1032 | "universalify": "^2.0.0" 1033 | } 1034 | }, 1035 | "graceful-fs": { 1036 | "version": "4.2.11", 1037 | "bundled": true 1038 | }, 1039 | "ignore": { 1040 | "version": "5.2.4", 1041 | "bundled": true 1042 | }, 1043 | "is-fullwidth-code-point": { 1044 | "version": "3.0.0", 1045 | "bundled": true 1046 | }, 1047 | "json-schema-traverse": { 1048 | "version": "1.0.0", 1049 | "bundled": true 1050 | }, 1051 | "jsonfile": { 1052 | "version": "6.1.0", 1053 | "bundled": true, 1054 | "requires": { 1055 | "graceful-fs": "^4.1.6", 1056 | "universalify": "^2.0.0" 1057 | } 1058 | }, 1059 | "jsonschema": { 1060 | "version": "1.4.1", 1061 | "bundled": true 1062 | }, 1063 | "lodash.truncate": { 1064 | "version": "4.4.2", 1065 | "bundled": true 1066 | }, 1067 | "lru-cache": { 1068 | "version": "6.0.0", 1069 | "bundled": true, 1070 | "requires": { 1071 | "yallist": "^4.0.0" 1072 | } 1073 | }, 1074 | "minimatch": { 1075 | "version": "3.1.2", 1076 | "bundled": true, 1077 | "requires": { 1078 | "brace-expansion": "^1.1.7" 1079 | } 1080 | }, 1081 | "punycode": { 1082 | "version": "2.3.0", 1083 | "bundled": true 1084 | }, 1085 | "require-from-string": { 1086 | "version": "2.0.2", 1087 | "bundled": true 1088 | }, 1089 | "semver": { 1090 | "version": "7.5.4", 1091 | "bundled": true, 1092 | "requires": { 1093 | "lru-cache": "^6.0.0" 1094 | } 1095 | }, 1096 | "slice-ansi": { 1097 | "version": "4.0.0", 1098 | "bundled": true, 1099 | "requires": { 1100 | "ansi-styles": "^4.0.0", 1101 | "astral-regex": "^2.0.0", 1102 | "is-fullwidth-code-point": "^3.0.0" 1103 | } 1104 | }, 1105 | "string-width": { 1106 | "version": "4.2.3", 1107 | "bundled": true, 1108 | "requires": { 1109 | "emoji-regex": "^8.0.0", 1110 | "is-fullwidth-code-point": "^3.0.0", 1111 | "strip-ansi": "^6.0.1" 1112 | } 1113 | }, 1114 | "strip-ansi": { 1115 | "version": "6.0.1", 1116 | "bundled": true, 1117 | "requires": { 1118 | "ansi-regex": "^5.0.1" 1119 | } 1120 | }, 1121 | "table": { 1122 | "version": "6.8.1", 1123 | "bundled": true, 1124 | "requires": { 1125 | "ajv": "^8.0.1", 1126 | "lodash.truncate": "^4.4.2", 1127 | "slice-ansi": "^4.0.0", 1128 | "string-width": "^4.2.3", 1129 | "strip-ansi": "^6.0.1" 1130 | } 1131 | }, 1132 | "universalify": { 1133 | "version": "2.0.0", 1134 | "bundled": true 1135 | }, 1136 | "uri-js": { 1137 | "version": "4.4.1", 1138 | "bundled": true, 1139 | "requires": { 1140 | "punycode": "^2.1.0" 1141 | } 1142 | }, 1143 | "yallist": { 1144 | "version": "4.0.0", 1145 | "bundled": true 1146 | }, 1147 | "yaml": { 1148 | "version": "1.10.2", 1149 | "bundled": true 1150 | } 1151 | } 1152 | }, 1153 | "buffer-from": { 1154 | "version": "1.1.2", 1155 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1156 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 1157 | }, 1158 | "constructs": { 1159 | "version": "10.0.9", 1160 | "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.0.9.tgz", 1161 | "integrity": "sha512-C9la/fcnCKe3XIjKPbWuD49mnOYqSWdiMI6TNJmF0ao3pJw6Hap03Q4nsmCxpWMXuMzM546Kw/WnW7ElB3g4OA==" 1162 | }, 1163 | "create-require": { 1164 | "version": "1.1.1", 1165 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1166 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1167 | "dev": true 1168 | }, 1169 | "diff": { 1170 | "version": "4.0.2", 1171 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1172 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1173 | "dev": true 1174 | }, 1175 | "esbuild": { 1176 | "version": "0.15.5", 1177 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", 1178 | "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", 1179 | "dev": true, 1180 | "requires": { 1181 | "@esbuild/linux-loong64": "0.15.5", 1182 | "esbuild-android-64": "0.15.5", 1183 | "esbuild-android-arm64": "0.15.5", 1184 | "esbuild-darwin-64": "0.15.5", 1185 | "esbuild-darwin-arm64": "0.15.5", 1186 | "esbuild-freebsd-64": "0.15.5", 1187 | "esbuild-freebsd-arm64": "0.15.5", 1188 | "esbuild-linux-32": "0.15.5", 1189 | "esbuild-linux-64": "0.15.5", 1190 | "esbuild-linux-arm": "0.15.5", 1191 | "esbuild-linux-arm64": "0.15.5", 1192 | "esbuild-linux-mips64le": "0.15.5", 1193 | "esbuild-linux-ppc64le": "0.15.5", 1194 | "esbuild-linux-riscv64": "0.15.5", 1195 | "esbuild-linux-s390x": "0.15.5", 1196 | "esbuild-netbsd-64": "0.15.5", 1197 | "esbuild-openbsd-64": "0.15.5", 1198 | "esbuild-sunos-64": "0.15.5", 1199 | "esbuild-windows-32": "0.15.5", 1200 | "esbuild-windows-64": "0.15.5", 1201 | "esbuild-windows-arm64": "0.15.5" 1202 | } 1203 | }, 1204 | "esbuild-android-64": { 1205 | "version": "0.15.5", 1206 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", 1207 | "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", 1208 | "dev": true, 1209 | "optional": true 1210 | }, 1211 | "esbuild-android-arm64": { 1212 | "version": "0.15.5", 1213 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", 1214 | "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", 1215 | "dev": true, 1216 | "optional": true 1217 | }, 1218 | "esbuild-darwin-64": { 1219 | "version": "0.15.5", 1220 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", 1221 | "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", 1222 | "dev": true, 1223 | "optional": true 1224 | }, 1225 | "esbuild-darwin-arm64": { 1226 | "version": "0.15.5", 1227 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", 1228 | "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", 1229 | "dev": true, 1230 | "optional": true 1231 | }, 1232 | "esbuild-freebsd-64": { 1233 | "version": "0.15.5", 1234 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", 1235 | "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", 1236 | "dev": true, 1237 | "optional": true 1238 | }, 1239 | "esbuild-freebsd-arm64": { 1240 | "version": "0.15.5", 1241 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", 1242 | "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", 1243 | "dev": true, 1244 | "optional": true 1245 | }, 1246 | "esbuild-linux-32": { 1247 | "version": "0.15.5", 1248 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", 1249 | "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", 1250 | "dev": true, 1251 | "optional": true 1252 | }, 1253 | "esbuild-linux-64": { 1254 | "version": "0.15.5", 1255 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", 1256 | "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", 1257 | "dev": true, 1258 | "optional": true 1259 | }, 1260 | "esbuild-linux-arm": { 1261 | "version": "0.15.5", 1262 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", 1263 | "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", 1264 | "dev": true, 1265 | "optional": true 1266 | }, 1267 | "esbuild-linux-arm64": { 1268 | "version": "0.15.5", 1269 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", 1270 | "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", 1271 | "dev": true, 1272 | "optional": true 1273 | }, 1274 | "esbuild-linux-mips64le": { 1275 | "version": "0.15.5", 1276 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", 1277 | "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", 1278 | "dev": true, 1279 | "optional": true 1280 | }, 1281 | "esbuild-linux-ppc64le": { 1282 | "version": "0.15.5", 1283 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", 1284 | "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", 1285 | "dev": true, 1286 | "optional": true 1287 | }, 1288 | "esbuild-linux-riscv64": { 1289 | "version": "0.15.5", 1290 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", 1291 | "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", 1292 | "dev": true, 1293 | "optional": true 1294 | }, 1295 | "esbuild-linux-s390x": { 1296 | "version": "0.15.5", 1297 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", 1298 | "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", 1299 | "dev": true, 1300 | "optional": true 1301 | }, 1302 | "esbuild-netbsd-64": { 1303 | "version": "0.15.5", 1304 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", 1305 | "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", 1306 | "dev": true, 1307 | "optional": true 1308 | }, 1309 | "esbuild-openbsd-64": { 1310 | "version": "0.15.5", 1311 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", 1312 | "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", 1313 | "dev": true, 1314 | "optional": true 1315 | }, 1316 | "esbuild-sunos-64": { 1317 | "version": "0.15.5", 1318 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", 1319 | "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", 1320 | "dev": true, 1321 | "optional": true 1322 | }, 1323 | "esbuild-windows-32": { 1324 | "version": "0.15.5", 1325 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", 1326 | "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", 1327 | "dev": true, 1328 | "optional": true 1329 | }, 1330 | "esbuild-windows-64": { 1331 | "version": "0.15.5", 1332 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", 1333 | "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", 1334 | "dev": true, 1335 | "optional": true 1336 | }, 1337 | "esbuild-windows-arm64": { 1338 | "version": "0.15.5", 1339 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", 1340 | "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", 1341 | "dev": true, 1342 | "optional": true 1343 | }, 1344 | "fsevents": { 1345 | "version": "2.3.2", 1346 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1347 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1348 | "dev": true, 1349 | "optional": true 1350 | }, 1351 | "make-error": { 1352 | "version": "1.3.6", 1353 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1354 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1355 | "dev": true 1356 | }, 1357 | "source-map": { 1358 | "version": "0.6.1", 1359 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1360 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1361 | }, 1362 | "source-map-support": { 1363 | "version": "0.5.20", 1364 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", 1365 | "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", 1366 | "requires": { 1367 | "buffer-from": "^1.0.0", 1368 | "source-map": "^0.6.0" 1369 | } 1370 | }, 1371 | "ts-node": { 1372 | "version": "9.1.1", 1373 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", 1374 | "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", 1375 | "dev": true, 1376 | "requires": { 1377 | "arg": "^4.1.0", 1378 | "create-require": "^1.1.0", 1379 | "diff": "^4.0.1", 1380 | "make-error": "^1.1.1", 1381 | "source-map-support": "^0.5.17", 1382 | "yn": "3.1.1" 1383 | } 1384 | }, 1385 | "typescript": { 1386 | "version": "3.9.10", 1387 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", 1388 | "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", 1389 | "dev": true 1390 | }, 1391 | "yn": { 1392 | "version": "3.1.1", 1393 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1394 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1395 | "dev": true 1396 | } 1397 | } 1398 | } 1399 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-lambda-duplex-stream-to-s3", 3 | "version": "0.1.0", 4 | "bin": { 5 | "aws-lambda-duplex-stream-to-s3": "bin/aws-lambda-duplex-stream-to-s3.js" 6 | }, 7 | "scripts": { 8 | "cdk": "cdk", 9 | "prebuild": "npm install && npm install --prefix ./lambda", 10 | "build": "CDK_NEW_BOOTSTRAP=1 cdk bootstrap && cdk synth", 11 | "deploy": "cdk deploy", 12 | "destroy": "cdk destroy" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "10.17.27", 16 | "aws-cdk": "^2.38.1", 17 | "esbuild": "^0.15.5", 18 | "ts-node": "^9.0.0", 19 | "typescript": "~3.9.7" 20 | }, 21 | "dependencies": { 22 | "aws-cdk-lib": "^2.89.0", 23 | "constructs": "^10.0.0", 24 | "source-map-support": "^0.5.16" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2018", 4 | "module": "commonjs", 5 | "lib": [ 6 | "es2018" 7 | ], 8 | "declaration": true, 9 | "strict": true, 10 | "noImplicitAny": true, 11 | "strictNullChecks": true, 12 | "noImplicitThis": true, 13 | "alwaysStrict": true, 14 | "noUnusedLocals": false, 15 | "noUnusedParameters": false, 16 | "noImplicitReturns": true, 17 | "noFallthroughCasesInSwitch": false, 18 | "inlineSourceMap": true, 19 | "inlineSources": true, 20 | "experimentalDecorators": true, 21 | "strictPropertyInitialization": false, 22 | "typeRoots": [ 23 | "./node_modules/@types" 24 | ] 25 | }, 26 | "exclude": [ 27 | "node_modules", 28 | "cdk.out" 29 | ] 30 | } 31 | --------------------------------------------------------------------------------