├── .DS_Store ├── .gitignore ├── README.md ├── dynamodb-basic-operations ├── .DS_Store ├── .gitignore ├── .npmignore ├── README.md ├── config.sample.json ├── dynamodb │ └── index.js ├── functions │ └── handler.js ├── img │ └── dynamodb_basic_operations.png ├── package-lock.json ├── package.json └── serverless.yml ├── images └── youtube_channel.png ├── lambda-circuit-breaker ├── .gitignore ├── config.sample.json ├── functions │ ├── circuit-breaker-error.js │ └── circuit-breaker.js └── serverless.yml ├── lambda-function-url ├── .gitignore ├── config.example.json ├── config.json ├── handler.js └── serverless.yml ├── s3-object-lambda ├── .gitignore ├── README.md ├── config.example.json ├── functions │ └── add-watermark.js ├── img │ └── s3-object-lambda-architecture.png ├── package-lock.json ├── package.json └── serverless.yml ├── s3-signed-url ├── .DS_Store ├── .gitignore ├── .npmignore ├── config.example.json ├── functions │ └── handler.js ├── package-lock.json ├── package.json └── serverless.yml ├── s3-with-lambda ├── .gitignore ├── .npmignore ├── README.md ├── config.example.json ├── functions │ └── handler.js ├── package.json └── serverless.yml ├── secure-api-gateway-custom-authorizer ├── .gitignore ├── .npmignore ├── README.md ├── bin │ └── secure-api-gateway-custom-authorizer.js ├── cdk.json ├── config.example.json ├── functions │ ├── custom-auth-lib.js │ ├── custom-auth.js │ └── protected.js ├── jest.config.js ├── lib │ └── secure-api-gateway-custom-authorizer-stack.js ├── package-lock.json ├── package.json └── test │ └── secure-api-gateway-custom-authorizer.test.js └── upload-to-s3-from-lambda ├── .gitignore ├── .npmignore ├── config.example.json ├── handler.js └── serverless.yml /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AWS Serverless Samples 2 | 3 | Hello, this repository contains a collection of serverless samples. I explain most of them in my Youtube Channel. 4 | 5 | [Subscribe](https://www.youtube.com/channel/UCrgmzG2o4xlBYzm7OB7qZFA) to get new content every week! 6 | 7 | ![Youtube Preview](./images/youtube_channel.png) -------------------------------------------------------------------------------- /dynamodb-basic-operations/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/dynamodb-basic-operations/.DS_Store -------------------------------------------------------------------------------- /dynamodb-basic-operations/.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | node_modules 3 | .serverless 4 | 5 | -------------------------------------------------------------------------------- /dynamodb-basic-operations/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /dynamodb-basic-operations/README.md: -------------------------------------------------------------------------------- 1 | # DynamoDB Basic Operations with NodeJS 2 | 3 | This repo is an example on how to integrate AWS DynamoDB Library using Lambda and NodeJS. I have implemented the four basic operations: 4 | 5 | 1. Get Item 6 | 2. Save Item 7 | 3. Delete Item 8 | 4. Update Item 9 | 10 | You can follow the tutorial on my Youtube channel: 11 | 12 | [![dynamodb_basic_operations](img/dynamodb_basic_operations.png)](https://youtu.be/zicuiVmV5bQ) 13 | -------------------------------------------------------------------------------- /dynamodb-basic-operations/config.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "eu-west-2", 3 | "STAGE": "dev", 4 | "DYNAMODB_TABLE": "NexmoIntercomIntegration", 5 | } -------------------------------------------------------------------------------- /dynamodb-basic-operations/dynamodb/index.js: -------------------------------------------------------------------------------- 1 | const AWS = require( 'aws-sdk' ); 2 | const dynamoDb = new AWS.DynamoDB.DocumentClient(); 3 | const config = require( '../config.json' ); 4 | 5 | const tableName = config.DYNAMODB_TABLE; 6 | 7 | const saveItem = async (item) => { 8 | const params = { 9 | TableName: tableName, 10 | Item: item 11 | }; 12 | 13 | await dynamoDb.put(params).promise(); 14 | return item.itemId; 15 | }; 16 | 17 | const getItem = async (itemId) => { 18 | const params = { 19 | Key: { 20 | itemId: itemId 21 | }, 22 | TableName: tableName 23 | }; 24 | 25 | const result = await dynamoDb.get(params).promise() 26 | return result.Item 27 | }; 28 | 29 | const deleteItem = async (itemId) => { 30 | const params = { 31 | Key: { 32 | itemId: itemId 33 | }, 34 | TableName: tableName 35 | }; 36 | 37 | return dynamoDb.delete(params).promise(); 38 | }; 39 | 40 | const updateItem = async (itemId, paramsName, paramsValue) => { 41 | const params = { 42 | TableName: tableName, 43 | Key: { 44 | itemId 45 | }, 46 | ConditionExpression: 'attribute_exists(itemId)', 47 | UpdateExpression: 'set ' + paramsName + ' = :v', 48 | ExpressionAttributeValues: { 49 | ':v': paramsValue 50 | }, 51 | ReturnValues: 'ALL_NEW' 52 | }; 53 | 54 | const result = await dynamoDb.update(params).promise() 55 | return result.Attributes; 56 | }; 57 | 58 | module.exports = { 59 | saveItem, 60 | updateItem, 61 | getItem, 62 | deleteItem 63 | } -------------------------------------------------------------------------------- /dynamodb-basic-operations/functions/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const { v4: uuidv4 } = require('uuid'); 3 | const dynamoModule = require("../dynamodb") 4 | 5 | function createResponse(statusCode, message) { 6 | return { 7 | statusCode: statusCode, 8 | body: JSON.stringify(message) 9 | }; 10 | } 11 | 12 | module.exports.deleteItem = async (event) => { 13 | const itemId = event.pathParameters.itemId; 14 | const response = await dynamoModule.deleteItem(itemId) 15 | return createResponse(200, "Item Deleted"); 16 | 17 | }; 18 | 19 | module.exports.saveItem = async (event) => { 20 | const item = JSON.parse(event.body); 21 | item.itemId = uuidv4(); 22 | const response = await dynamoModule.saveItem(item) 23 | return createResponse(200, response); 24 | }; 25 | 26 | module.exports.getItem = async (event) => { 27 | const itemId = event.pathParameters.itemId; 28 | 29 | const response = await dynamoModule.getItem(itemId) 30 | return createResponse(200, response); 31 | }; 32 | 33 | module.exports.updateItem = async (event) => { 34 | const itemId = event.pathParameters.itemId; 35 | 36 | const body = JSON.parse(event.body); 37 | const paramName = body.paramName; 38 | const paramValue = body.paramValue; 39 | 40 | const response = await dynamoModule.updateItem(itemId, paramName, paramValue) 41 | return createResponse(200, response); 42 | }; 43 | 44 | -------------------------------------------------------------------------------- /dynamodb-basic-operations/img/dynamodb_basic_operations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/dynamodb-basic-operations/img/dynamodb_basic_operations.png -------------------------------------------------------------------------------- /dynamodb-basic-operations/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "uuid": { 6 | "version": "8.3.2", 7 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 8 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /dynamodb-basic-operations/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dynamodb-basic-operations", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "dependencies": { 7 | "uuid": "^8.3.2" 8 | }, 9 | "devDependencies": {}, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/enricop89/dynamodb-basic-operations.git" 16 | }, 17 | "author": "Enrico Portolan", 18 | "license": "ISC", 19 | "bugs": { 20 | "url": "https://github.com/enricop89/dynamodb-basic-operations/issues" 21 | }, 22 | "homepage": "https://github.com/enricop89/dynamodb-basic-operations#readme" 23 | } 24 | -------------------------------------------------------------------------------- /dynamodb-basic-operations/serverless.yml: -------------------------------------------------------------------------------- 1 | service: dynamodb-basic-operations 2 | frameworkVersion: '2' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs12.x 7 | lambdaHashingVersion: 20201221 8 | 9 | stage: ${file(config.json):STAGE} 10 | region: ${file(config.json):REGION} 11 | iamRoleStatements: 12 | - Effect: "Allow" 13 | Action: 14 | - "dynamodb:GetItem" 15 | - "dynamodb:PutItem" 16 | - "dynamodb:UpdateItem" 17 | - "dynamodb:DeleteItem" 18 | Resource: 19 | - "arn:aws:dynamodb:${self:provider.region}:*:table/${file(config.json):DYNAMODB_TABLE}" 20 | 21 | functions: 22 | saveItem: 23 | handler: functions/handler.saveItem 24 | events: 25 | - http: 26 | path: item 27 | method: post 28 | getItem: 29 | handler: functions/handler.getItem 30 | events: 31 | - http: 32 | path: item/{itemId} 33 | method: get 34 | deleteItem: 35 | handler: functions/handler.deleteItem 36 | events: 37 | - http: 38 | path: item/{itemId} 39 | method: delete 40 | updateItem: 41 | handler: functions/handler.updateItem 42 | events: 43 | - http: 44 | path: item/{itemId} 45 | method: put 46 | resources: 47 | Resources: 48 | BasicOperationsTable: 49 | Type: "AWS::DynamoDB::Table" 50 | Properties: 51 | AttributeDefinitions: 52 | - AttributeName: "itemId" 53 | AttributeType: "S" 54 | KeySchema: 55 | - AttributeName: "itemId" 56 | KeyType: "HASH" 57 | ProvisionedThroughput: 58 | ReadCapacityUnits: 1 59 | WriteCapacityUnits: 1 60 | TableName: ${file(config.json):DYNAMODB_TABLE} 61 | -------------------------------------------------------------------------------- /images/youtube_channel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/images/youtube_channel.png -------------------------------------------------------------------------------- /lambda-circuit-breaker/.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless 7 | 8 | config.json -------------------------------------------------------------------------------- /lambda-circuit-breaker/config.sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "eu-west-2", 3 | "STAGE": "dev", 4 | "DYNAMODB_TABLE": "NexmoIntercomIntegration", 5 | "ERROR_THRESHOLD": 5, 6 | "CLEAR_ERROR_TIMEOUT": 30 7 | } -------------------------------------------------------------------------------- /lambda-circuit-breaker/functions/circuit-breaker-error.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk') 2 | AWS.config.region = process.env.AWS_REGION || 'us-east-1' 3 | var dynamoDB = new AWS.DynamoDB({apiVersion: '2012-08-10'}); 4 | const config = require('../config.json') 5 | module.exports.handler = async (event) => { 6 | console.log(event) 7 | const now = Date.now() 8 | 9 | const resetTime = Math.round((now / 1000)+ config.CLEAR_ERROR_TIMEOUT).toString(); // We reset the circuit after 30 seconds 10 | 11 | var params = { 12 | TableName: config.DYNAMODB_TABLE, 13 | Item: { 14 | 'PK' : {S: event.detail.serviceName}, 15 | 'SK' : {N: resetTime}, 16 | 'ErrorType': {S: event.detail.errorType}, 17 | 'TTL': {N: resetTime} // TTL must be a number and in seconds 18 | } 19 | }; 20 | 21 | // Call DynamoDB to add the item to the table 22 | let result = await dynamoDB.putItem(params).promise(); 23 | console.log("Dynamo Put Result", result) 24 | return; 25 | }; 26 | -------------------------------------------------------------------------------- /lambda-circuit-breaker/functions/circuit-breaker.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk') 2 | AWS.config.region = process.env.AWS_REGION || 'us-east-1' 3 | const eventbridge = new AWS.EventBridge(); 4 | const dynamo = new AWS.DynamoDB(); 5 | const config = require('../config.json') 6 | 7 | function probability(n) { // Credit to https://stackoverflow.com/questions/26271868/is-there-a-simpler-way-to-implement-a-probability-function-in-javascript 8 | return Math.random() < n; 9 | } 10 | 11 | module.exports.handler = async (event) => { 12 | let serviceName = 'awesomeapi.com'; // default value 13 | console.log("event", event) 14 | let body; 15 | if (event && event.body) { 16 | body = JSON.parse(event.body); 17 | serviceName = body.serviceName 18 | } 19 | const now = Math.round(Date.now()/1000); 20 | console.log("Now", now) 21 | console.log("serviceName", serviceName) 22 | 23 | var dynamoParams = { 24 | ExpressionAttributeValues: { 25 | ":serviceName": {"S": serviceName}, 26 | ":now": {"N": now.toString() } ///1658943934801 27 | }, 28 | KeyConditionExpression: "PK = :serviceName and SK >= :now", 29 | TableName: config.DYNAMODB_TABLE, 30 | }; 31 | 32 | const errors = await dynamo.query(dynamoParams).promise(); 33 | 34 | console.log('Errors Result: ', JSON.stringify(errors)); 35 | 36 | // Check Error Threshold 37 | if(errors.Count < config.ERROR_THRESHOLD){ 38 | let errorType = ''; 39 | const isError = probability(.9); 40 | if (isError) { 41 | // I need to log the error. How? I send the event to eventBridge 42 | errorType = "External Service Call Failed"; 43 | var params = { 44 | Entries: [ 45 | { 46 | DetailType: 'httpcallerror', 47 | EventBusName: 'default', 48 | Source: 'eventbridge.circuit-breaker', 49 | Time: new Date(), 50 | // Main event body 51 | Detail: JSON.stringify({ 52 | status: 'fail', 53 | serviceName, 54 | errorType, 55 | now 56 | }) 57 | } 58 | ] 59 | }; 60 | 61 | const result = await eventbridge.putEvents(params).promise(); 62 | 63 | console.log('[EventBridge Result:]', result) 64 | return { 65 | statusCode: 500, 66 | body: "External Service Call Failed" 67 | } 68 | } 69 | else { 70 | return { 71 | statusCode: 200, 72 | body: JSON.stringify("Function is successfull"), 73 | } 74 | } 75 | 76 | } else { 77 | return { 78 | statusCode: 500, 79 | body: `The circuit is close. We have detected too many errors for ${serviceName}` 80 | } 81 | } 82 | } -------------------------------------------------------------------------------- /lambda-circuit-breaker/serverless.yml: -------------------------------------------------------------------------------- 1 | service: lambda-circuit-breaker 2 | frameworkVersion: '3' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs14.x 7 | stage: ${file(config.json):STAGE} 8 | region: ${file(config.json):REGION} 9 | iamRoleStatements: 10 | - Effect: "Allow" 11 | Action: 12 | - "dynamodb:GetItem" 13 | - "dynamodb:Query" 14 | - "dynamodb:PutItem" 15 | - "dynamodb:UpdateItem" 16 | - "dynamodb:DeleteItem" 17 | Resource: 18 | - "arn:aws:dynamodb:${self:provider.region}:*:table/${file(config.json):DYNAMODB_TABLE}" 19 | - Effect: "Allow" 20 | Action: 21 | - "events:Put*" 22 | Resource: 23 | - "arn:aws:events:${self:provider.region}:*:event-bus/default" 24 | 25 | functions: 26 | circuit-breaker: 27 | handler: functions/circuit-breaker.handler 28 | events: 29 | - httpApi: 30 | path: /call-api 31 | method: post 32 | circuit-breaker-error: 33 | handler: functions/circuit-breaker-error.handler 34 | events: 35 | - eventBridge: 36 | pattern: 37 | source: 38 | - eventbridge.circuit-breaker 39 | # detail-type: 40 | # - httpcallerror 41 | # detail: 42 | # eventSource: 43 | # - eventbridge.circuit-breaker 44 | # status: 45 | # - fail 46 | 47 | resources: 48 | Resources: 49 | ErrorTracker: 50 | Type: AWS::DynamoDB::Table 51 | Properties: 52 | AttributeDefinitions: 53 | - AttributeName: "PK" 54 | AttributeType: "S" 55 | - AttributeName: "SK" 56 | AttributeType: "N" 57 | KeySchema: 58 | - AttributeName: "PK" 59 | KeyType: "HASH" 60 | - AttributeName: "SK" 61 | KeyType: "RANGE" 62 | ProvisionedThroughput: 63 | ReadCapacityUnits: 1 64 | WriteCapacityUnits: 1 65 | TimeToLiveSpecification: 66 | AttributeName: 'TTL' 67 | Enabled: true 68 | TableName: ${file(config.json):DYNAMODB_TABLE} 69 | -------------------------------------------------------------------------------- /lambda-function-url/.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /lambda-function-url/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "us-east-1", 3 | "STAGE": "dev" 4 | } -------------------------------------------------------------------------------- /lambda-function-url/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "us-east-1", 3 | "STAGE": "dev" 4 | } -------------------------------------------------------------------------------- /lambda-function-url/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports.hello = async (event) => { 4 | return { 5 | statusCode: 200, 6 | body: JSON.stringify( 7 | { 8 | message: 'Hello, I am a Lambda Function URL', 9 | input: event, 10 | }, 11 | null, 12 | 2 13 | ), 14 | }; 15 | }; 16 | -------------------------------------------------------------------------------- /lambda-function-url/serverless.yml: -------------------------------------------------------------------------------- 1 | service: lambda-function-url-tutorial 2 | frameworkVersion: '3' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs12.x 7 | stage: ${file(config.json):STAGE} 8 | region: ${file(config.json):REGION} 9 | 10 | functions: 11 | lambda-function-url: 12 | handler: handler.hello 13 | url: 14 | cors: true 15 | -------------------------------------------------------------------------------- /s3-object-lambda/.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless 7 | 8 | config.json 9 | 10 | -------------------------------------------------------------------------------- /s3-object-lambda/README.md: -------------------------------------------------------------------------------- 1 | # S3 Object Lambda 2 | 3 | This project implementes S3 Object Lambda to add watermark text to images. 4 | 5 | ## Prerequisites 6 | 7 | 1. AWS account 8 | 2. Serverless Framewrok 9 | 3. NodeJS 10 | 11 | The project has been built using Serverless Framework to deploy the AWS Stack. The stack is composed of: 12 | 13 | 1. S3 Bucket (name configured in the config.json file) 14 | 2. Lambda function to add the watermark text 15 | 3. S3 Access Point linked to the S3 bucket 16 | 3. S3 Object Lambda to trigger the Lambda function 17 | 18 | ### Architecture 19 | 20 | ![./img/s3-object-lambda-architecture.png]() 21 | 22 | You can follow the tutorial at: -------------------------------------------------------------------------------- /s3-object-lambda/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "us-east-1", 3 | "STAGE": "dev", 4 | "S3_BUCKET": "my-s3-with-lambda-upload-example" 5 | } -------------------------------------------------------------------------------- /s3-object-lambda/functions/add-watermark.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | const axios = require('axios'); 3 | const Jimp = require('jimp'); 4 | 5 | const S3 = new AWS.S3() 6 | 7 | const addWatermark = async (image) => { 8 | if (!image){ 9 | return; 10 | } 11 | const imageToReturn = await Jimp.read(image); 12 | console.log("imageToReturn", imageToReturn) 13 | const font = await Jimp.loadFont(Jimp.FONT_SANS_32_BLACK); 14 | imageToReturn.print(font, 10, imageToReturn.bitmap.height - 50, "ENRICO PORTOLAN WATERMARK"); 15 | return imageToReturn.getBufferAsync(Jimp.MIME_PNG); 16 | } 17 | 18 | module.exports.handler = async (event, context) => { 19 | 20 | try { 21 | // Context given by s3-object-lambda event trigger. 22 | // inputS3Url is a presigned URL that the function can use to download the original object from the supporting Access Point 23 | console.log("Start Event", event) 24 | const { outputRoute, outputToken, inputS3Url } = event.getObjectContext || {}; 25 | 26 | const { data: originalImage } = await axios.get(inputS3Url, { responseType: 'arraybuffer' }); 27 | const imageWithWatermark = await addWatermark(originalImage); 28 | console.log("Return imageWithWatermark") 29 | await S3.writeGetObjectResponse({ 30 | RequestRoute: outputRoute, 31 | RequestToken: outputToken, 32 | Body: imageWithWatermark 33 | }).promise() 34 | 35 | return { 36 | statusCode: 200 37 | } 38 | 39 | } catch (e) { 40 | console.error("Error", e) 41 | return { 42 | statusCode: 500 43 | } 44 | } 45 | }; -------------------------------------------------------------------------------- /s3-object-lambda/img/s3-object-lambda-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/s3-object-lambda/img/s3-object-lambda-architecture.png -------------------------------------------------------------------------------- /s3-object-lambda/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "s3-object-lambda", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "axios": "^0.26.1", 9 | "jimp": "^0.16.1" 10 | } 11 | }, 12 | "node_modules/@babel/runtime": { 13 | "version": "7.17.8", 14 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", 15 | "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", 16 | "dependencies": { 17 | "regenerator-runtime": "^0.13.4" 18 | }, 19 | "engines": { 20 | "node": ">=6.9.0" 21 | } 22 | }, 23 | "node_modules/@jimp/bmp": { 24 | "version": "0.16.1", 25 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", 26 | "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", 27 | "dependencies": { 28 | "@babel/runtime": "^7.7.2", 29 | "@jimp/utils": "^0.16.1", 30 | "bmp-js": "^0.1.0" 31 | }, 32 | "peerDependencies": { 33 | "@jimp/custom": ">=0.3.5" 34 | } 35 | }, 36 | "node_modules/@jimp/core": { 37 | "version": "0.16.1", 38 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", 39 | "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", 40 | "dependencies": { 41 | "@babel/runtime": "^7.7.2", 42 | "@jimp/utils": "^0.16.1", 43 | "any-base": "^1.1.0", 44 | "buffer": "^5.2.0", 45 | "exif-parser": "^0.1.12", 46 | "file-type": "^9.0.0", 47 | "load-bmfont": "^1.3.1", 48 | "mkdirp": "^0.5.1", 49 | "phin": "^2.9.1", 50 | "pixelmatch": "^4.0.2", 51 | "tinycolor2": "^1.4.1" 52 | } 53 | }, 54 | "node_modules/@jimp/custom": { 55 | "version": "0.16.1", 56 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", 57 | "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", 58 | "dependencies": { 59 | "@babel/runtime": "^7.7.2", 60 | "@jimp/core": "^0.16.1" 61 | } 62 | }, 63 | "node_modules/@jimp/gif": { 64 | "version": "0.16.1", 65 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", 66 | "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", 67 | "dependencies": { 68 | "@babel/runtime": "^7.7.2", 69 | "@jimp/utils": "^0.16.1", 70 | "gifwrap": "^0.9.2", 71 | "omggif": "^1.0.9" 72 | }, 73 | "peerDependencies": { 74 | "@jimp/custom": ">=0.3.5" 75 | } 76 | }, 77 | "node_modules/@jimp/jpeg": { 78 | "version": "0.16.1", 79 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", 80 | "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", 81 | "dependencies": { 82 | "@babel/runtime": "^7.7.2", 83 | "@jimp/utils": "^0.16.1", 84 | "jpeg-js": "0.4.2" 85 | }, 86 | "peerDependencies": { 87 | "@jimp/custom": ">=0.3.5" 88 | } 89 | }, 90 | "node_modules/@jimp/plugin-blit": { 91 | "version": "0.16.1", 92 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", 93 | "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", 94 | "dependencies": { 95 | "@babel/runtime": "^7.7.2", 96 | "@jimp/utils": "^0.16.1" 97 | }, 98 | "peerDependencies": { 99 | "@jimp/custom": ">=0.3.5" 100 | } 101 | }, 102 | "node_modules/@jimp/plugin-blur": { 103 | "version": "0.16.1", 104 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", 105 | "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", 106 | "dependencies": { 107 | "@babel/runtime": "^7.7.2", 108 | "@jimp/utils": "^0.16.1" 109 | }, 110 | "peerDependencies": { 111 | "@jimp/custom": ">=0.3.5" 112 | } 113 | }, 114 | "node_modules/@jimp/plugin-circle": { 115 | "version": "0.16.1", 116 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", 117 | "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", 118 | "dependencies": { 119 | "@babel/runtime": "^7.7.2", 120 | "@jimp/utils": "^0.16.1" 121 | }, 122 | "peerDependencies": { 123 | "@jimp/custom": ">=0.3.5" 124 | } 125 | }, 126 | "node_modules/@jimp/plugin-color": { 127 | "version": "0.16.1", 128 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", 129 | "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", 130 | "dependencies": { 131 | "@babel/runtime": "^7.7.2", 132 | "@jimp/utils": "^0.16.1", 133 | "tinycolor2": "^1.4.1" 134 | }, 135 | "peerDependencies": { 136 | "@jimp/custom": ">=0.3.5" 137 | } 138 | }, 139 | "node_modules/@jimp/plugin-contain": { 140 | "version": "0.16.1", 141 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", 142 | "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", 143 | "dependencies": { 144 | "@babel/runtime": "^7.7.2", 145 | "@jimp/utils": "^0.16.1" 146 | }, 147 | "peerDependencies": { 148 | "@jimp/custom": ">=0.3.5", 149 | "@jimp/plugin-blit": ">=0.3.5", 150 | "@jimp/plugin-resize": ">=0.3.5", 151 | "@jimp/plugin-scale": ">=0.3.5" 152 | } 153 | }, 154 | "node_modules/@jimp/plugin-cover": { 155 | "version": "0.16.1", 156 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", 157 | "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", 158 | "dependencies": { 159 | "@babel/runtime": "^7.7.2", 160 | "@jimp/utils": "^0.16.1" 161 | }, 162 | "peerDependencies": { 163 | "@jimp/custom": ">=0.3.5", 164 | "@jimp/plugin-crop": ">=0.3.5", 165 | "@jimp/plugin-resize": ">=0.3.5", 166 | "@jimp/plugin-scale": ">=0.3.5" 167 | } 168 | }, 169 | "node_modules/@jimp/plugin-crop": { 170 | "version": "0.16.1", 171 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", 172 | "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", 173 | "dependencies": { 174 | "@babel/runtime": "^7.7.2", 175 | "@jimp/utils": "^0.16.1" 176 | }, 177 | "peerDependencies": { 178 | "@jimp/custom": ">=0.3.5" 179 | } 180 | }, 181 | "node_modules/@jimp/plugin-displace": { 182 | "version": "0.16.1", 183 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", 184 | "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", 185 | "dependencies": { 186 | "@babel/runtime": "^7.7.2", 187 | "@jimp/utils": "^0.16.1" 188 | }, 189 | "peerDependencies": { 190 | "@jimp/custom": ">=0.3.5" 191 | } 192 | }, 193 | "node_modules/@jimp/plugin-dither": { 194 | "version": "0.16.1", 195 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", 196 | "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", 197 | "dependencies": { 198 | "@babel/runtime": "^7.7.2", 199 | "@jimp/utils": "^0.16.1" 200 | }, 201 | "peerDependencies": { 202 | "@jimp/custom": ">=0.3.5" 203 | } 204 | }, 205 | "node_modules/@jimp/plugin-fisheye": { 206 | "version": "0.16.1", 207 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", 208 | "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", 209 | "dependencies": { 210 | "@babel/runtime": "^7.7.2", 211 | "@jimp/utils": "^0.16.1" 212 | }, 213 | "peerDependencies": { 214 | "@jimp/custom": ">=0.3.5" 215 | } 216 | }, 217 | "node_modules/@jimp/plugin-flip": { 218 | "version": "0.16.1", 219 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", 220 | "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", 221 | "dependencies": { 222 | "@babel/runtime": "^7.7.2", 223 | "@jimp/utils": "^0.16.1" 224 | }, 225 | "peerDependencies": { 226 | "@jimp/custom": ">=0.3.5", 227 | "@jimp/plugin-rotate": ">=0.3.5" 228 | } 229 | }, 230 | "node_modules/@jimp/plugin-gaussian": { 231 | "version": "0.16.1", 232 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", 233 | "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", 234 | "dependencies": { 235 | "@babel/runtime": "^7.7.2", 236 | "@jimp/utils": "^0.16.1" 237 | }, 238 | "peerDependencies": { 239 | "@jimp/custom": ">=0.3.5" 240 | } 241 | }, 242 | "node_modules/@jimp/plugin-invert": { 243 | "version": "0.16.1", 244 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", 245 | "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", 246 | "dependencies": { 247 | "@babel/runtime": "^7.7.2", 248 | "@jimp/utils": "^0.16.1" 249 | }, 250 | "peerDependencies": { 251 | "@jimp/custom": ">=0.3.5" 252 | } 253 | }, 254 | "node_modules/@jimp/plugin-mask": { 255 | "version": "0.16.1", 256 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", 257 | "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", 258 | "dependencies": { 259 | "@babel/runtime": "^7.7.2", 260 | "@jimp/utils": "^0.16.1" 261 | }, 262 | "peerDependencies": { 263 | "@jimp/custom": ">=0.3.5" 264 | } 265 | }, 266 | "node_modules/@jimp/plugin-normalize": { 267 | "version": "0.16.1", 268 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", 269 | "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", 270 | "dependencies": { 271 | "@babel/runtime": "^7.7.2", 272 | "@jimp/utils": "^0.16.1" 273 | }, 274 | "peerDependencies": { 275 | "@jimp/custom": ">=0.3.5" 276 | } 277 | }, 278 | "node_modules/@jimp/plugin-print": { 279 | "version": "0.16.1", 280 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", 281 | "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", 282 | "dependencies": { 283 | "@babel/runtime": "^7.7.2", 284 | "@jimp/utils": "^0.16.1", 285 | "load-bmfont": "^1.4.0" 286 | }, 287 | "peerDependencies": { 288 | "@jimp/custom": ">=0.3.5", 289 | "@jimp/plugin-blit": ">=0.3.5" 290 | } 291 | }, 292 | "node_modules/@jimp/plugin-resize": { 293 | "version": "0.16.1", 294 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", 295 | "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", 296 | "dependencies": { 297 | "@babel/runtime": "^7.7.2", 298 | "@jimp/utils": "^0.16.1" 299 | }, 300 | "peerDependencies": { 301 | "@jimp/custom": ">=0.3.5" 302 | } 303 | }, 304 | "node_modules/@jimp/plugin-rotate": { 305 | "version": "0.16.1", 306 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", 307 | "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", 308 | "dependencies": { 309 | "@babel/runtime": "^7.7.2", 310 | "@jimp/utils": "^0.16.1" 311 | }, 312 | "peerDependencies": { 313 | "@jimp/custom": ">=0.3.5", 314 | "@jimp/plugin-blit": ">=0.3.5", 315 | "@jimp/plugin-crop": ">=0.3.5", 316 | "@jimp/plugin-resize": ">=0.3.5" 317 | } 318 | }, 319 | "node_modules/@jimp/plugin-scale": { 320 | "version": "0.16.1", 321 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", 322 | "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", 323 | "dependencies": { 324 | "@babel/runtime": "^7.7.2", 325 | "@jimp/utils": "^0.16.1" 326 | }, 327 | "peerDependencies": { 328 | "@jimp/custom": ">=0.3.5", 329 | "@jimp/plugin-resize": ">=0.3.5" 330 | } 331 | }, 332 | "node_modules/@jimp/plugin-shadow": { 333 | "version": "0.16.1", 334 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", 335 | "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", 336 | "dependencies": { 337 | "@babel/runtime": "^7.7.2", 338 | "@jimp/utils": "^0.16.1" 339 | }, 340 | "peerDependencies": { 341 | "@jimp/custom": ">=0.3.5", 342 | "@jimp/plugin-blur": ">=0.3.5", 343 | "@jimp/plugin-resize": ">=0.3.5" 344 | } 345 | }, 346 | "node_modules/@jimp/plugin-threshold": { 347 | "version": "0.16.1", 348 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", 349 | "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", 350 | "dependencies": { 351 | "@babel/runtime": "^7.7.2", 352 | "@jimp/utils": "^0.16.1" 353 | }, 354 | "peerDependencies": { 355 | "@jimp/custom": ">=0.3.5", 356 | "@jimp/plugin-color": ">=0.8.0", 357 | "@jimp/plugin-resize": ">=0.8.0" 358 | } 359 | }, 360 | "node_modules/@jimp/plugins": { 361 | "version": "0.16.1", 362 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", 363 | "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", 364 | "dependencies": { 365 | "@babel/runtime": "^7.7.2", 366 | "@jimp/plugin-blit": "^0.16.1", 367 | "@jimp/plugin-blur": "^0.16.1", 368 | "@jimp/plugin-circle": "^0.16.1", 369 | "@jimp/plugin-color": "^0.16.1", 370 | "@jimp/plugin-contain": "^0.16.1", 371 | "@jimp/plugin-cover": "^0.16.1", 372 | "@jimp/plugin-crop": "^0.16.1", 373 | "@jimp/plugin-displace": "^0.16.1", 374 | "@jimp/plugin-dither": "^0.16.1", 375 | "@jimp/plugin-fisheye": "^0.16.1", 376 | "@jimp/plugin-flip": "^0.16.1", 377 | "@jimp/plugin-gaussian": "^0.16.1", 378 | "@jimp/plugin-invert": "^0.16.1", 379 | "@jimp/plugin-mask": "^0.16.1", 380 | "@jimp/plugin-normalize": "^0.16.1", 381 | "@jimp/plugin-print": "^0.16.1", 382 | "@jimp/plugin-resize": "^0.16.1", 383 | "@jimp/plugin-rotate": "^0.16.1", 384 | "@jimp/plugin-scale": "^0.16.1", 385 | "@jimp/plugin-shadow": "^0.16.1", 386 | "@jimp/plugin-threshold": "^0.16.1", 387 | "timm": "^1.6.1" 388 | }, 389 | "peerDependencies": { 390 | "@jimp/custom": ">=0.3.5" 391 | } 392 | }, 393 | "node_modules/@jimp/png": { 394 | "version": "0.16.1", 395 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", 396 | "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", 397 | "dependencies": { 398 | "@babel/runtime": "^7.7.2", 399 | "@jimp/utils": "^0.16.1", 400 | "pngjs": "^3.3.3" 401 | }, 402 | "peerDependencies": { 403 | "@jimp/custom": ">=0.3.5" 404 | } 405 | }, 406 | "node_modules/@jimp/tiff": { 407 | "version": "0.16.1", 408 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", 409 | "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", 410 | "dependencies": { 411 | "@babel/runtime": "^7.7.2", 412 | "utif": "^2.0.1" 413 | }, 414 | "peerDependencies": { 415 | "@jimp/custom": ">=0.3.5" 416 | } 417 | }, 418 | "node_modules/@jimp/types": { 419 | "version": "0.16.1", 420 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", 421 | "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", 422 | "dependencies": { 423 | "@babel/runtime": "^7.7.2", 424 | "@jimp/bmp": "^0.16.1", 425 | "@jimp/gif": "^0.16.1", 426 | "@jimp/jpeg": "^0.16.1", 427 | "@jimp/png": "^0.16.1", 428 | "@jimp/tiff": "^0.16.1", 429 | "timm": "^1.6.1" 430 | }, 431 | "peerDependencies": { 432 | "@jimp/custom": ">=0.3.5" 433 | } 434 | }, 435 | "node_modules/@jimp/utils": { 436 | "version": "0.16.1", 437 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", 438 | "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", 439 | "dependencies": { 440 | "@babel/runtime": "^7.7.2", 441 | "regenerator-runtime": "^0.13.3" 442 | } 443 | }, 444 | "node_modules/@types/node": { 445 | "version": "16.9.1", 446 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", 447 | "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" 448 | }, 449 | "node_modules/any-base": { 450 | "version": "1.1.0", 451 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", 452 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" 453 | }, 454 | "node_modules/axios": { 455 | "version": "0.26.1", 456 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 457 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 458 | "dependencies": { 459 | "follow-redirects": "^1.14.8" 460 | } 461 | }, 462 | "node_modules/base64-js": { 463 | "version": "1.5.1", 464 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 465 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 466 | "funding": [ 467 | { 468 | "type": "github", 469 | "url": "https://github.com/sponsors/feross" 470 | }, 471 | { 472 | "type": "patreon", 473 | "url": "https://www.patreon.com/feross" 474 | }, 475 | { 476 | "type": "consulting", 477 | "url": "https://feross.org/support" 478 | } 479 | ] 480 | }, 481 | "node_modules/bmp-js": { 482 | "version": "0.1.0", 483 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", 484 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" 485 | }, 486 | "node_modules/buffer": { 487 | "version": "5.7.1", 488 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 489 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 490 | "funding": [ 491 | { 492 | "type": "github", 493 | "url": "https://github.com/sponsors/feross" 494 | }, 495 | { 496 | "type": "patreon", 497 | "url": "https://www.patreon.com/feross" 498 | }, 499 | { 500 | "type": "consulting", 501 | "url": "https://feross.org/support" 502 | } 503 | ], 504 | "dependencies": { 505 | "base64-js": "^1.3.1", 506 | "ieee754": "^1.1.13" 507 | } 508 | }, 509 | "node_modules/buffer-equal": { 510 | "version": "0.0.1", 511 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 512 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", 513 | "engines": { 514 | "node": ">=0.4.0" 515 | } 516 | }, 517 | "node_modules/dom-walk": { 518 | "version": "0.1.2", 519 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 520 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 521 | }, 522 | "node_modules/exif-parser": { 523 | "version": "0.1.12", 524 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", 525 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" 526 | }, 527 | "node_modules/file-type": { 528 | "version": "9.0.0", 529 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", 530 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", 531 | "engines": { 532 | "node": ">=6" 533 | } 534 | }, 535 | "node_modules/follow-redirects": { 536 | "version": "1.14.9", 537 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", 538 | "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", 539 | "funding": [ 540 | { 541 | "type": "individual", 542 | "url": "https://github.com/sponsors/RubenVerborgh" 543 | } 544 | ], 545 | "engines": { 546 | "node": ">=4.0" 547 | }, 548 | "peerDependenciesMeta": { 549 | "debug": { 550 | "optional": true 551 | } 552 | } 553 | }, 554 | "node_modules/gifwrap": { 555 | "version": "0.9.4", 556 | "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", 557 | "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", 558 | "dependencies": { 559 | "image-q": "^4.0.0", 560 | "omggif": "^1.0.10" 561 | } 562 | }, 563 | "node_modules/global": { 564 | "version": "4.4.0", 565 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 566 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 567 | "dependencies": { 568 | "min-document": "^2.19.0", 569 | "process": "^0.11.10" 570 | } 571 | }, 572 | "node_modules/ieee754": { 573 | "version": "1.2.1", 574 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 575 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 576 | "funding": [ 577 | { 578 | "type": "github", 579 | "url": "https://github.com/sponsors/feross" 580 | }, 581 | { 582 | "type": "patreon", 583 | "url": "https://www.patreon.com/feross" 584 | }, 585 | { 586 | "type": "consulting", 587 | "url": "https://feross.org/support" 588 | } 589 | ] 590 | }, 591 | "node_modules/image-q": { 592 | "version": "4.0.0", 593 | "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", 594 | "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", 595 | "dependencies": { 596 | "@types/node": "16.9.1" 597 | } 598 | }, 599 | "node_modules/is-function": { 600 | "version": "1.0.2", 601 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", 602 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" 603 | }, 604 | "node_modules/jimp": { 605 | "version": "0.16.1", 606 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", 607 | "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", 608 | "dependencies": { 609 | "@babel/runtime": "^7.7.2", 610 | "@jimp/custom": "^0.16.1", 611 | "@jimp/plugins": "^0.16.1", 612 | "@jimp/types": "^0.16.1", 613 | "regenerator-runtime": "^0.13.3" 614 | } 615 | }, 616 | "node_modules/jpeg-js": { 617 | "version": "0.4.2", 618 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", 619 | "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" 620 | }, 621 | "node_modules/load-bmfont": { 622 | "version": "1.4.1", 623 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", 624 | "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", 625 | "dependencies": { 626 | "buffer-equal": "0.0.1", 627 | "mime": "^1.3.4", 628 | "parse-bmfont-ascii": "^1.0.3", 629 | "parse-bmfont-binary": "^1.0.5", 630 | "parse-bmfont-xml": "^1.1.4", 631 | "phin": "^2.9.1", 632 | "xhr": "^2.0.1", 633 | "xtend": "^4.0.0" 634 | } 635 | }, 636 | "node_modules/mime": { 637 | "version": "1.6.0", 638 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 639 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 640 | "bin": { 641 | "mime": "cli.js" 642 | }, 643 | "engines": { 644 | "node": ">=4" 645 | } 646 | }, 647 | "node_modules/min-document": { 648 | "version": "2.19.0", 649 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 650 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 651 | "dependencies": { 652 | "dom-walk": "^0.1.0" 653 | } 654 | }, 655 | "node_modules/minimist": { 656 | "version": "1.2.6", 657 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 658 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 659 | }, 660 | "node_modules/mkdirp": { 661 | "version": "0.5.6", 662 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 663 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 664 | "dependencies": { 665 | "minimist": "^1.2.6" 666 | }, 667 | "bin": { 668 | "mkdirp": "bin/cmd.js" 669 | } 670 | }, 671 | "node_modules/omggif": { 672 | "version": "1.0.10", 673 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", 674 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" 675 | }, 676 | "node_modules/pako": { 677 | "version": "1.0.11", 678 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 679 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 680 | }, 681 | "node_modules/parse-bmfont-ascii": { 682 | "version": "1.0.6", 683 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", 684 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" 685 | }, 686 | "node_modules/parse-bmfont-binary": { 687 | "version": "1.0.6", 688 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", 689 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" 690 | }, 691 | "node_modules/parse-bmfont-xml": { 692 | "version": "1.1.4", 693 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", 694 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", 695 | "dependencies": { 696 | "xml-parse-from-string": "^1.0.0", 697 | "xml2js": "^0.4.5" 698 | } 699 | }, 700 | "node_modules/parse-headers": { 701 | "version": "2.0.5", 702 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", 703 | "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" 704 | }, 705 | "node_modules/phin": { 706 | "version": "2.9.3", 707 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", 708 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" 709 | }, 710 | "node_modules/pixelmatch": { 711 | "version": "4.0.2", 712 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", 713 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", 714 | "dependencies": { 715 | "pngjs": "^3.0.0" 716 | }, 717 | "bin": { 718 | "pixelmatch": "bin/pixelmatch" 719 | } 720 | }, 721 | "node_modules/pngjs": { 722 | "version": "3.4.0", 723 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", 724 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", 725 | "engines": { 726 | "node": ">=4.0.0" 727 | } 728 | }, 729 | "node_modules/process": { 730 | "version": "0.11.10", 731 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 732 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 733 | "engines": { 734 | "node": ">= 0.6.0" 735 | } 736 | }, 737 | "node_modules/regenerator-runtime": { 738 | "version": "0.13.9", 739 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 740 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 741 | }, 742 | "node_modules/sax": { 743 | "version": "1.2.4", 744 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 745 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 746 | }, 747 | "node_modules/timm": { 748 | "version": "1.7.1", 749 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", 750 | "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" 751 | }, 752 | "node_modules/tinycolor2": { 753 | "version": "1.4.2", 754 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", 755 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==", 756 | "engines": { 757 | "node": "*" 758 | } 759 | }, 760 | "node_modules/utif": { 761 | "version": "2.0.1", 762 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", 763 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", 764 | "dependencies": { 765 | "pako": "^1.0.5" 766 | } 767 | }, 768 | "node_modules/xhr": { 769 | "version": "2.6.0", 770 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", 771 | "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", 772 | "dependencies": { 773 | "global": "~4.4.0", 774 | "is-function": "^1.0.1", 775 | "parse-headers": "^2.0.0", 776 | "xtend": "^4.0.0" 777 | } 778 | }, 779 | "node_modules/xml-parse-from-string": { 780 | "version": "1.0.1", 781 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", 782 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" 783 | }, 784 | "node_modules/xml2js": { 785 | "version": "0.4.23", 786 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 787 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 788 | "dependencies": { 789 | "sax": ">=0.6.0", 790 | "xmlbuilder": "~11.0.0" 791 | }, 792 | "engines": { 793 | "node": ">=4.0.0" 794 | } 795 | }, 796 | "node_modules/xmlbuilder": { 797 | "version": "11.0.1", 798 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 799 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 800 | "engines": { 801 | "node": ">=4.0" 802 | } 803 | }, 804 | "node_modules/xtend": { 805 | "version": "4.0.2", 806 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 807 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 808 | "engines": { 809 | "node": ">=0.4" 810 | } 811 | } 812 | }, 813 | "dependencies": { 814 | "@babel/runtime": { 815 | "version": "7.17.8", 816 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", 817 | "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", 818 | "requires": { 819 | "regenerator-runtime": "^0.13.4" 820 | } 821 | }, 822 | "@jimp/bmp": { 823 | "version": "0.16.1", 824 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", 825 | "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", 826 | "requires": { 827 | "@babel/runtime": "^7.7.2", 828 | "@jimp/utils": "^0.16.1", 829 | "bmp-js": "^0.1.0" 830 | } 831 | }, 832 | "@jimp/core": { 833 | "version": "0.16.1", 834 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", 835 | "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", 836 | "requires": { 837 | "@babel/runtime": "^7.7.2", 838 | "@jimp/utils": "^0.16.1", 839 | "any-base": "^1.1.0", 840 | "buffer": "^5.2.0", 841 | "exif-parser": "^0.1.12", 842 | "file-type": "^9.0.0", 843 | "load-bmfont": "^1.3.1", 844 | "mkdirp": "^0.5.1", 845 | "phin": "^2.9.1", 846 | "pixelmatch": "^4.0.2", 847 | "tinycolor2": "^1.4.1" 848 | } 849 | }, 850 | "@jimp/custom": { 851 | "version": "0.16.1", 852 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", 853 | "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", 854 | "requires": { 855 | "@babel/runtime": "^7.7.2", 856 | "@jimp/core": "^0.16.1" 857 | } 858 | }, 859 | "@jimp/gif": { 860 | "version": "0.16.1", 861 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", 862 | "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", 863 | "requires": { 864 | "@babel/runtime": "^7.7.2", 865 | "@jimp/utils": "^0.16.1", 866 | "gifwrap": "^0.9.2", 867 | "omggif": "^1.0.9" 868 | } 869 | }, 870 | "@jimp/jpeg": { 871 | "version": "0.16.1", 872 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", 873 | "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", 874 | "requires": { 875 | "@babel/runtime": "^7.7.2", 876 | "@jimp/utils": "^0.16.1", 877 | "jpeg-js": "0.4.2" 878 | } 879 | }, 880 | "@jimp/plugin-blit": { 881 | "version": "0.16.1", 882 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", 883 | "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", 884 | "requires": { 885 | "@babel/runtime": "^7.7.2", 886 | "@jimp/utils": "^0.16.1" 887 | } 888 | }, 889 | "@jimp/plugin-blur": { 890 | "version": "0.16.1", 891 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", 892 | "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", 893 | "requires": { 894 | "@babel/runtime": "^7.7.2", 895 | "@jimp/utils": "^0.16.1" 896 | } 897 | }, 898 | "@jimp/plugin-circle": { 899 | "version": "0.16.1", 900 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", 901 | "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", 902 | "requires": { 903 | "@babel/runtime": "^7.7.2", 904 | "@jimp/utils": "^0.16.1" 905 | } 906 | }, 907 | "@jimp/plugin-color": { 908 | "version": "0.16.1", 909 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", 910 | "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", 911 | "requires": { 912 | "@babel/runtime": "^7.7.2", 913 | "@jimp/utils": "^0.16.1", 914 | "tinycolor2": "^1.4.1" 915 | } 916 | }, 917 | "@jimp/plugin-contain": { 918 | "version": "0.16.1", 919 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", 920 | "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", 921 | "requires": { 922 | "@babel/runtime": "^7.7.2", 923 | "@jimp/utils": "^0.16.1" 924 | } 925 | }, 926 | "@jimp/plugin-cover": { 927 | "version": "0.16.1", 928 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", 929 | "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", 930 | "requires": { 931 | "@babel/runtime": "^7.7.2", 932 | "@jimp/utils": "^0.16.1" 933 | } 934 | }, 935 | "@jimp/plugin-crop": { 936 | "version": "0.16.1", 937 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", 938 | "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", 939 | "requires": { 940 | "@babel/runtime": "^7.7.2", 941 | "@jimp/utils": "^0.16.1" 942 | } 943 | }, 944 | "@jimp/plugin-displace": { 945 | "version": "0.16.1", 946 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", 947 | "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", 948 | "requires": { 949 | "@babel/runtime": "^7.7.2", 950 | "@jimp/utils": "^0.16.1" 951 | } 952 | }, 953 | "@jimp/plugin-dither": { 954 | "version": "0.16.1", 955 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", 956 | "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", 957 | "requires": { 958 | "@babel/runtime": "^7.7.2", 959 | "@jimp/utils": "^0.16.1" 960 | } 961 | }, 962 | "@jimp/plugin-fisheye": { 963 | "version": "0.16.1", 964 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", 965 | "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", 966 | "requires": { 967 | "@babel/runtime": "^7.7.2", 968 | "@jimp/utils": "^0.16.1" 969 | } 970 | }, 971 | "@jimp/plugin-flip": { 972 | "version": "0.16.1", 973 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", 974 | "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", 975 | "requires": { 976 | "@babel/runtime": "^7.7.2", 977 | "@jimp/utils": "^0.16.1" 978 | } 979 | }, 980 | "@jimp/plugin-gaussian": { 981 | "version": "0.16.1", 982 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", 983 | "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", 984 | "requires": { 985 | "@babel/runtime": "^7.7.2", 986 | "@jimp/utils": "^0.16.1" 987 | } 988 | }, 989 | "@jimp/plugin-invert": { 990 | "version": "0.16.1", 991 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", 992 | "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", 993 | "requires": { 994 | "@babel/runtime": "^7.7.2", 995 | "@jimp/utils": "^0.16.1" 996 | } 997 | }, 998 | "@jimp/plugin-mask": { 999 | "version": "0.16.1", 1000 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", 1001 | "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", 1002 | "requires": { 1003 | "@babel/runtime": "^7.7.2", 1004 | "@jimp/utils": "^0.16.1" 1005 | } 1006 | }, 1007 | "@jimp/plugin-normalize": { 1008 | "version": "0.16.1", 1009 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", 1010 | "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", 1011 | "requires": { 1012 | "@babel/runtime": "^7.7.2", 1013 | "@jimp/utils": "^0.16.1" 1014 | } 1015 | }, 1016 | "@jimp/plugin-print": { 1017 | "version": "0.16.1", 1018 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", 1019 | "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", 1020 | "requires": { 1021 | "@babel/runtime": "^7.7.2", 1022 | "@jimp/utils": "^0.16.1", 1023 | "load-bmfont": "^1.4.0" 1024 | } 1025 | }, 1026 | "@jimp/plugin-resize": { 1027 | "version": "0.16.1", 1028 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", 1029 | "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", 1030 | "requires": { 1031 | "@babel/runtime": "^7.7.2", 1032 | "@jimp/utils": "^0.16.1" 1033 | } 1034 | }, 1035 | "@jimp/plugin-rotate": { 1036 | "version": "0.16.1", 1037 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", 1038 | "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", 1039 | "requires": { 1040 | "@babel/runtime": "^7.7.2", 1041 | "@jimp/utils": "^0.16.1" 1042 | } 1043 | }, 1044 | "@jimp/plugin-scale": { 1045 | "version": "0.16.1", 1046 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", 1047 | "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", 1048 | "requires": { 1049 | "@babel/runtime": "^7.7.2", 1050 | "@jimp/utils": "^0.16.1" 1051 | } 1052 | }, 1053 | "@jimp/plugin-shadow": { 1054 | "version": "0.16.1", 1055 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", 1056 | "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", 1057 | "requires": { 1058 | "@babel/runtime": "^7.7.2", 1059 | "@jimp/utils": "^0.16.1" 1060 | } 1061 | }, 1062 | "@jimp/plugin-threshold": { 1063 | "version": "0.16.1", 1064 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", 1065 | "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", 1066 | "requires": { 1067 | "@babel/runtime": "^7.7.2", 1068 | "@jimp/utils": "^0.16.1" 1069 | } 1070 | }, 1071 | "@jimp/plugins": { 1072 | "version": "0.16.1", 1073 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", 1074 | "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", 1075 | "requires": { 1076 | "@babel/runtime": "^7.7.2", 1077 | "@jimp/plugin-blit": "^0.16.1", 1078 | "@jimp/plugin-blur": "^0.16.1", 1079 | "@jimp/plugin-circle": "^0.16.1", 1080 | "@jimp/plugin-color": "^0.16.1", 1081 | "@jimp/plugin-contain": "^0.16.1", 1082 | "@jimp/plugin-cover": "^0.16.1", 1083 | "@jimp/plugin-crop": "^0.16.1", 1084 | "@jimp/plugin-displace": "^0.16.1", 1085 | "@jimp/plugin-dither": "^0.16.1", 1086 | "@jimp/plugin-fisheye": "^0.16.1", 1087 | "@jimp/plugin-flip": "^0.16.1", 1088 | "@jimp/plugin-gaussian": "^0.16.1", 1089 | "@jimp/plugin-invert": "^0.16.1", 1090 | "@jimp/plugin-mask": "^0.16.1", 1091 | "@jimp/plugin-normalize": "^0.16.1", 1092 | "@jimp/plugin-print": "^0.16.1", 1093 | "@jimp/plugin-resize": "^0.16.1", 1094 | "@jimp/plugin-rotate": "^0.16.1", 1095 | "@jimp/plugin-scale": "^0.16.1", 1096 | "@jimp/plugin-shadow": "^0.16.1", 1097 | "@jimp/plugin-threshold": "^0.16.1", 1098 | "timm": "^1.6.1" 1099 | } 1100 | }, 1101 | "@jimp/png": { 1102 | "version": "0.16.1", 1103 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", 1104 | "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", 1105 | "requires": { 1106 | "@babel/runtime": "^7.7.2", 1107 | "@jimp/utils": "^0.16.1", 1108 | "pngjs": "^3.3.3" 1109 | } 1110 | }, 1111 | "@jimp/tiff": { 1112 | "version": "0.16.1", 1113 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", 1114 | "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", 1115 | "requires": { 1116 | "@babel/runtime": "^7.7.2", 1117 | "utif": "^2.0.1" 1118 | } 1119 | }, 1120 | "@jimp/types": { 1121 | "version": "0.16.1", 1122 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", 1123 | "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", 1124 | "requires": { 1125 | "@babel/runtime": "^7.7.2", 1126 | "@jimp/bmp": "^0.16.1", 1127 | "@jimp/gif": "^0.16.1", 1128 | "@jimp/jpeg": "^0.16.1", 1129 | "@jimp/png": "^0.16.1", 1130 | "@jimp/tiff": "^0.16.1", 1131 | "timm": "^1.6.1" 1132 | } 1133 | }, 1134 | "@jimp/utils": { 1135 | "version": "0.16.1", 1136 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", 1137 | "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", 1138 | "requires": { 1139 | "@babel/runtime": "^7.7.2", 1140 | "regenerator-runtime": "^0.13.3" 1141 | } 1142 | }, 1143 | "@types/node": { 1144 | "version": "16.9.1", 1145 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", 1146 | "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" 1147 | }, 1148 | "any-base": { 1149 | "version": "1.1.0", 1150 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", 1151 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" 1152 | }, 1153 | "axios": { 1154 | "version": "0.26.1", 1155 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1156 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1157 | "requires": { 1158 | "follow-redirects": "^1.14.8" 1159 | } 1160 | }, 1161 | "base64-js": { 1162 | "version": "1.5.1", 1163 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1164 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 1165 | }, 1166 | "bmp-js": { 1167 | "version": "0.1.0", 1168 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", 1169 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" 1170 | }, 1171 | "buffer": { 1172 | "version": "5.7.1", 1173 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 1174 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 1175 | "requires": { 1176 | "base64-js": "^1.3.1", 1177 | "ieee754": "^1.1.13" 1178 | } 1179 | }, 1180 | "buffer-equal": { 1181 | "version": "0.0.1", 1182 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 1183 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" 1184 | }, 1185 | "dom-walk": { 1186 | "version": "0.1.2", 1187 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 1188 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 1189 | }, 1190 | "exif-parser": { 1191 | "version": "0.1.12", 1192 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", 1193 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" 1194 | }, 1195 | "file-type": { 1196 | "version": "9.0.0", 1197 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", 1198 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" 1199 | }, 1200 | "follow-redirects": { 1201 | "version": "1.14.9", 1202 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", 1203 | "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" 1204 | }, 1205 | "gifwrap": { 1206 | "version": "0.9.4", 1207 | "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", 1208 | "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", 1209 | "requires": { 1210 | "image-q": "^4.0.0", 1211 | "omggif": "^1.0.10" 1212 | } 1213 | }, 1214 | "global": { 1215 | "version": "4.4.0", 1216 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 1217 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 1218 | "requires": { 1219 | "min-document": "^2.19.0", 1220 | "process": "^0.11.10" 1221 | } 1222 | }, 1223 | "ieee754": { 1224 | "version": "1.2.1", 1225 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1226 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1227 | }, 1228 | "image-q": { 1229 | "version": "4.0.0", 1230 | "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", 1231 | "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", 1232 | "requires": { 1233 | "@types/node": "16.9.1" 1234 | } 1235 | }, 1236 | "is-function": { 1237 | "version": "1.0.2", 1238 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", 1239 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" 1240 | }, 1241 | "jimp": { 1242 | "version": "0.16.1", 1243 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", 1244 | "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", 1245 | "requires": { 1246 | "@babel/runtime": "^7.7.2", 1247 | "@jimp/custom": "^0.16.1", 1248 | "@jimp/plugins": "^0.16.1", 1249 | "@jimp/types": "^0.16.1", 1250 | "regenerator-runtime": "^0.13.3" 1251 | } 1252 | }, 1253 | "jpeg-js": { 1254 | "version": "0.4.2", 1255 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", 1256 | "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" 1257 | }, 1258 | "load-bmfont": { 1259 | "version": "1.4.1", 1260 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", 1261 | "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", 1262 | "requires": { 1263 | "buffer-equal": "0.0.1", 1264 | "mime": "^1.3.4", 1265 | "parse-bmfont-ascii": "^1.0.3", 1266 | "parse-bmfont-binary": "^1.0.5", 1267 | "parse-bmfont-xml": "^1.1.4", 1268 | "phin": "^2.9.1", 1269 | "xhr": "^2.0.1", 1270 | "xtend": "^4.0.0" 1271 | } 1272 | }, 1273 | "mime": { 1274 | "version": "1.6.0", 1275 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1276 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1277 | }, 1278 | "min-document": { 1279 | "version": "2.19.0", 1280 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 1281 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 1282 | "requires": { 1283 | "dom-walk": "^0.1.0" 1284 | } 1285 | }, 1286 | "minimist": { 1287 | "version": "1.2.6", 1288 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1289 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" 1290 | }, 1291 | "mkdirp": { 1292 | "version": "0.5.6", 1293 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1294 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1295 | "requires": { 1296 | "minimist": "^1.2.6" 1297 | } 1298 | }, 1299 | "omggif": { 1300 | "version": "1.0.10", 1301 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", 1302 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" 1303 | }, 1304 | "pako": { 1305 | "version": "1.0.11", 1306 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1307 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 1308 | }, 1309 | "parse-bmfont-ascii": { 1310 | "version": "1.0.6", 1311 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", 1312 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" 1313 | }, 1314 | "parse-bmfont-binary": { 1315 | "version": "1.0.6", 1316 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", 1317 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" 1318 | }, 1319 | "parse-bmfont-xml": { 1320 | "version": "1.1.4", 1321 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", 1322 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", 1323 | "requires": { 1324 | "xml-parse-from-string": "^1.0.0", 1325 | "xml2js": "^0.4.5" 1326 | } 1327 | }, 1328 | "parse-headers": { 1329 | "version": "2.0.5", 1330 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", 1331 | "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" 1332 | }, 1333 | "phin": { 1334 | "version": "2.9.3", 1335 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", 1336 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" 1337 | }, 1338 | "pixelmatch": { 1339 | "version": "4.0.2", 1340 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", 1341 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", 1342 | "requires": { 1343 | "pngjs": "^3.0.0" 1344 | } 1345 | }, 1346 | "pngjs": { 1347 | "version": "3.4.0", 1348 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", 1349 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" 1350 | }, 1351 | "process": { 1352 | "version": "0.11.10", 1353 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1354 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 1355 | }, 1356 | "regenerator-runtime": { 1357 | "version": "0.13.9", 1358 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1359 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 1360 | }, 1361 | "sax": { 1362 | "version": "1.2.4", 1363 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1364 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1365 | }, 1366 | "timm": { 1367 | "version": "1.7.1", 1368 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", 1369 | "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" 1370 | }, 1371 | "tinycolor2": { 1372 | "version": "1.4.2", 1373 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", 1374 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" 1375 | }, 1376 | "utif": { 1377 | "version": "2.0.1", 1378 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", 1379 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", 1380 | "requires": { 1381 | "pako": "^1.0.5" 1382 | } 1383 | }, 1384 | "xhr": { 1385 | "version": "2.6.0", 1386 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", 1387 | "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", 1388 | "requires": { 1389 | "global": "~4.4.0", 1390 | "is-function": "^1.0.1", 1391 | "parse-headers": "^2.0.0", 1392 | "xtend": "^4.0.0" 1393 | } 1394 | }, 1395 | "xml-parse-from-string": { 1396 | "version": "1.0.1", 1397 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", 1398 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" 1399 | }, 1400 | "xml2js": { 1401 | "version": "0.4.23", 1402 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1403 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1404 | "requires": { 1405 | "sax": ">=0.6.0", 1406 | "xmlbuilder": "~11.0.0" 1407 | } 1408 | }, 1409 | "xmlbuilder": { 1410 | "version": "11.0.1", 1411 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1412 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1413 | }, 1414 | "xtend": { 1415 | "version": "4.0.2", 1416 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1417 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1418 | } 1419 | } 1420 | } 1421 | -------------------------------------------------------------------------------- /s3-object-lambda/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "axios": "^0.26.1", 4 | "jimp": "^0.16.1" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /s3-object-lambda/serverless.yml: -------------------------------------------------------------------------------- 1 | org: enricop89 2 | app: s3-object-lambda 3 | service: s3-object-lambda 4 | 5 | frameworkVersion: '3' 6 | 7 | 8 | provider: 9 | name: aws 10 | runtime: nodejs14.x 11 | stage: ${file(config.json):STAGE} 12 | region: ${file(config.json):REGION} 13 | 14 | iam: 15 | role: 16 | statements: 17 | - Effect: Allow 18 | Action: 19 | - s3-object-lambda:WriteGetObjectResponse 20 | Resource: "*" 21 | 22 | functions: 23 | addWatermark: 24 | handler: functions/add-watermark.handler 25 | description: lamba function to add watermark on images 26 | 27 | resources: 28 | Resources: 29 | bucket: 30 | Type: AWS::S3::Bucket 31 | Properties: 32 | BucketName: ${file(config.json):S3_BUCKET} 33 | 34 | bucketAccessPoint: 35 | Type: AWS::S3::AccessPoint 36 | Properties: 37 | Bucket: !Ref bucket 38 | Name: s3-access-point-image-watermark 39 | 40 | lambdaAccessPoint: 41 | Type: AWS::S3ObjectLambda::AccessPoint 42 | Properties: 43 | Name: s3-lambda-access-point-image-watermark 44 | ObjectLambdaConfiguration: 45 | CloudWatchMetricsEnabled: true 46 | SupportingAccessPoint: !Sub arn:aws:s3:${AWS::Region}:${AWS::AccountId}:accesspoint/s3-access-point-image-watermark 47 | 48 | TransformationConfigurations: 49 | - Actions: ["GetObject"] 50 | ContentTransformation: 51 | AwsLambda: 52 | FunctionArn: !GetAtt AddWatermarkLambdaFunction.Arn 53 | -------------------------------------------------------------------------------- /s3-signed-url/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/enricop89/aws-serverless-samples/773df34b7095695252d2da11108069029d6cf3c0/s3-signed-url/.DS_Store -------------------------------------------------------------------------------- /s3-signed-url/.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | node_modules 3 | .serverless -------------------------------------------------------------------------------- /s3-signed-url/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /s3-signed-url/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "us-east-1", 3 | "STAGE": "dev", 4 | "S3_BUCKET": "BasicS3Bucket" 5 | } -------------------------------------------------------------------------------- /s3-signed-url/functions/handler.js: -------------------------------------------------------------------------------- 1 | const { getSignedUrl } = require("@aws-sdk/s3-request-presigner"); 2 | const { createPresignedPost } = require("@aws-sdk/s3-presigned-post"); 3 | const { S3Client, GetObjectCommand } =require("@aws-sdk/client-s3"); 4 | 5 | const config = require('./../config.json'); 6 | const prePath = 'signed-url-demo/' 7 | const clientParams = { 8 | region: config.REGION 9 | } 10 | 11 | 12 | 13 | module.exports.createGetUrl = async (event) => { 14 | 15 | const pathParams = event.pathParameters; 16 | const client = new S3Client(clientParams); 17 | const Key = pathParams.fileKey || null; 18 | if (!Key) { 19 | throw new Error("Key not defined") 20 | } 21 | const getObjectParams = { 22 | Bucket: config.S3_BUCKET, 23 | Key: `${prePath}${Key}` 24 | } 25 | const command = new GetObjectCommand(getObjectParams); 26 | const url = await getSignedUrl(client, command, { expiresIn: 3600 }); 27 | return { 28 | statusCode: 200, 29 | body: JSON.stringify( 30 | { 31 | url 32 | }, 33 | null, 34 | 2 35 | ), 36 | }; 37 | }; 38 | 39 | module.exports.createPostUrl = async (event) => { 40 | 41 | const client = new S3Client(clientParams); 42 | const Key = `${prePath}${(Math.random() + 1).toString(36).substring(2)}` 43 | const { url, fields } = await createPresignedPost(client, { 44 | Bucket: config.S3_BUCKET, 45 | Key, 46 | Expires: 600, //Seconds before the presigned post expires. 3600 by default. 47 | }); 48 | return { 49 | statusCode: 200, 50 | body: JSON.stringify( 51 | { 52 | url, 53 | fields 54 | }, 55 | null, 56 | 2 57 | ), 58 | }; 59 | }; 60 | -------------------------------------------------------------------------------- /s3-signed-url/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "s3-signed-url", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@aws-crypto/crc32": { 8 | "version": "1.2.1", 9 | "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-1.2.1.tgz", 10 | "integrity": "sha512-Ydso55lIn3Vudui5jXNKcxmyVr9BNWeIkAhleGuG9zpb0Pu5yXf2Jth2A07fUyLSXX2gwfv0d84zwvKK2FMbuA==", 11 | "requires": { 12 | "@aws-crypto/util": "^1.2.1", 13 | "@aws-sdk/types": "^3.1.0", 14 | "tslib": "^1.11.1" 15 | }, 16 | "dependencies": { 17 | "tslib": { 18 | "version": "1.14.1", 19 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 20 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 21 | } 22 | } 23 | }, 24 | "@aws-crypto/ie11-detection": { 25 | "version": "1.0.0", 26 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz", 27 | "integrity": "sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA==", 28 | "requires": { 29 | "tslib": "^1.11.1" 30 | }, 31 | "dependencies": { 32 | "tslib": { 33 | "version": "1.14.1", 34 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 35 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 36 | } 37 | } 38 | }, 39 | "@aws-crypto/sha256-browser": { 40 | "version": "1.2.1", 41 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-1.2.1.tgz", 42 | "integrity": "sha512-WX/Wp6sXPhcBWx/w1aSJv3bDJL0ut5Ik6hl7yfqA1pn3cfsahl4rgHzRRXqYfJ+hnhnCqdgadS17wyBbVPsK+w==", 43 | "requires": { 44 | "@aws-crypto/ie11-detection": "^1.0.0", 45 | "@aws-crypto/sha256-js": "^1.2.1", 46 | "@aws-crypto/supports-web-crypto": "^1.0.0", 47 | "@aws-crypto/util": "^1.2.1", 48 | "@aws-sdk/types": "^3.1.0", 49 | "@aws-sdk/util-locate-window": "^3.0.0", 50 | "tslib": "^1.11.1" 51 | }, 52 | "dependencies": { 53 | "tslib": { 54 | "version": "1.14.1", 55 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 56 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 57 | } 58 | } 59 | }, 60 | "@aws-crypto/sha256-js": { 61 | "version": "1.2.1", 62 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.1.tgz", 63 | "integrity": "sha512-KtZ4qFDWZy6pKcky6RvwSytR/I8vPX9Z47pXh9sOuTcxjjtcegzS2uupg9vo0vbFcAWkSHVOEmNPh6ygiC3VFQ==", 64 | "requires": { 65 | "@aws-crypto/util": "^1.2.1", 66 | "@aws-sdk/types": "^3.1.0", 67 | "tslib": "^1.11.1" 68 | }, 69 | "dependencies": { 70 | "tslib": { 71 | "version": "1.14.1", 72 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 73 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 74 | } 75 | } 76 | }, 77 | "@aws-crypto/supports-web-crypto": { 78 | "version": "1.0.0", 79 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz", 80 | "integrity": "sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g==", 81 | "requires": { 82 | "tslib": "^1.11.1" 83 | }, 84 | "dependencies": { 85 | "tslib": { 86 | "version": "1.14.1", 87 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 88 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 89 | } 90 | } 91 | }, 92 | "@aws-crypto/util": { 93 | "version": "1.2.1", 94 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.1.tgz", 95 | "integrity": "sha512-H6Qrl28lzGGXZgLkdP7DQpJ3D3jJagQJugziThcqZCJVUT0HABHJt9EQMiiuf93KcUV/MMoisl56UfCxCFfmWQ==", 96 | "requires": { 97 | "@aws-sdk/types": "^3.1.0", 98 | "@aws-sdk/util-utf8-browser": "^3.0.0", 99 | "tslib": "^1.11.1" 100 | }, 101 | "dependencies": { 102 | "tslib": { 103 | "version": "1.14.1", 104 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 105 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 106 | } 107 | } 108 | }, 109 | "@aws-sdk/abort-controller": { 110 | "version": "3.34.0", 111 | "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.34.0.tgz", 112 | "integrity": "sha512-+Qz8/e5sieViXW2qKbfGsXt73Mo87duI2n8HwfDmshjPRXBjpaN478bFHmAjvq9L4MbvW3hSL0mEGrpPErP9Tw==", 113 | "requires": { 114 | "@aws-sdk/types": "3.34.0", 115 | "tslib": "^2.3.0" 116 | } 117 | }, 118 | "@aws-sdk/chunked-blob-reader": { 119 | "version": "3.34.0", 120 | "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.34.0.tgz", 121 | "integrity": "sha512-JNn8CYXN+nb0flJaHoL1s065Ln44pBXNeRfKo40GovIH7TttTLUaJYf726ntDBE+AnXQOFZGrVYUTxYvygFHwg==", 122 | "requires": { 123 | "tslib": "^2.3.0" 124 | } 125 | }, 126 | "@aws-sdk/chunked-blob-reader-native": { 127 | "version": "3.34.0", 128 | "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.34.0.tgz", 129 | "integrity": "sha512-9/+JiYHqRsK+fQ3beZy5m3ciTVSbKVXO6RV4r0ThnXaXOq551/O+mQQ1b0I2TmGL+M1IeRF0H9tv6cKuRmP3Iw==", 130 | "requires": { 131 | "@aws-sdk/util-base64-browser": "3.34.0", 132 | "tslib": "^2.3.0" 133 | } 134 | }, 135 | "@aws-sdk/client-s3": { 136 | "version": "3.34.0", 137 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.34.0.tgz", 138 | "integrity": "sha512-1QnWnkh1zlDEw5e7Po+0r7QANMvNVV/l6a0y18K+RFSm0yep+ojR7Xg9HFK4IV3AtVDFf5AtcSQcxI2DACZQ+Q==", 139 | "requires": { 140 | "@aws-crypto/sha256-browser": "^1.0.0", 141 | "@aws-crypto/sha256-js": "^1.0.0", 142 | "@aws-sdk/client-sts": "3.34.0", 143 | "@aws-sdk/config-resolver": "3.34.0", 144 | "@aws-sdk/credential-provider-node": "3.34.0", 145 | "@aws-sdk/eventstream-serde-browser": "3.34.0", 146 | "@aws-sdk/eventstream-serde-config-resolver": "3.34.0", 147 | "@aws-sdk/eventstream-serde-node": "3.34.0", 148 | "@aws-sdk/fetch-http-handler": "3.34.0", 149 | "@aws-sdk/hash-blob-browser": "3.34.0", 150 | "@aws-sdk/hash-node": "3.34.0", 151 | "@aws-sdk/hash-stream-node": "3.34.0", 152 | "@aws-sdk/invalid-dependency": "3.34.0", 153 | "@aws-sdk/md5-js": "3.34.0", 154 | "@aws-sdk/middleware-apply-body-checksum": "3.34.0", 155 | "@aws-sdk/middleware-bucket-endpoint": "3.34.0", 156 | "@aws-sdk/middleware-content-length": "3.34.0", 157 | "@aws-sdk/middleware-expect-continue": "3.34.0", 158 | "@aws-sdk/middleware-host-header": "3.34.0", 159 | "@aws-sdk/middleware-location-constraint": "3.34.0", 160 | "@aws-sdk/middleware-logger": "3.34.0", 161 | "@aws-sdk/middleware-retry": "3.34.0", 162 | "@aws-sdk/middleware-sdk-s3": "3.34.0", 163 | "@aws-sdk/middleware-serde": "3.34.0", 164 | "@aws-sdk/middleware-signing": "3.34.0", 165 | "@aws-sdk/middleware-ssec": "3.34.0", 166 | "@aws-sdk/middleware-stack": "3.34.0", 167 | "@aws-sdk/middleware-user-agent": "3.34.0", 168 | "@aws-sdk/node-config-provider": "3.34.0", 169 | "@aws-sdk/node-http-handler": "3.34.0", 170 | "@aws-sdk/protocol-http": "3.34.0", 171 | "@aws-sdk/smithy-client": "3.34.0", 172 | "@aws-sdk/types": "3.34.0", 173 | "@aws-sdk/url-parser": "3.34.0", 174 | "@aws-sdk/util-base64-browser": "3.34.0", 175 | "@aws-sdk/util-base64-node": "3.34.0", 176 | "@aws-sdk/util-body-length-browser": "3.34.0", 177 | "@aws-sdk/util-body-length-node": "3.34.0", 178 | "@aws-sdk/util-user-agent-browser": "3.34.0", 179 | "@aws-sdk/util-user-agent-node": "3.34.0", 180 | "@aws-sdk/util-utf8-browser": "3.34.0", 181 | "@aws-sdk/util-utf8-node": "3.34.0", 182 | "@aws-sdk/util-waiter": "3.34.0", 183 | "@aws-sdk/xml-builder": "3.34.0", 184 | "entities": "2.2.0", 185 | "fast-xml-parser": "3.19.0", 186 | "tslib": "^2.3.0" 187 | } 188 | }, 189 | "@aws-sdk/client-sso": { 190 | "version": "3.34.0", 191 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.34.0.tgz", 192 | "integrity": "sha512-2eBbOF1AssSSYCCelTYdJabyY46dvc5AjHWzAhCPI4mpvKp5UtIxjmV8MmlKhS3WmPHZEpUNYnjou9uc86MCqA==", 193 | "requires": { 194 | "@aws-crypto/sha256-browser": "^1.0.0", 195 | "@aws-crypto/sha256-js": "^1.0.0", 196 | "@aws-sdk/config-resolver": "3.34.0", 197 | "@aws-sdk/fetch-http-handler": "3.34.0", 198 | "@aws-sdk/hash-node": "3.34.0", 199 | "@aws-sdk/invalid-dependency": "3.34.0", 200 | "@aws-sdk/middleware-content-length": "3.34.0", 201 | "@aws-sdk/middleware-host-header": "3.34.0", 202 | "@aws-sdk/middleware-logger": "3.34.0", 203 | "@aws-sdk/middleware-retry": "3.34.0", 204 | "@aws-sdk/middleware-serde": "3.34.0", 205 | "@aws-sdk/middleware-stack": "3.34.0", 206 | "@aws-sdk/middleware-user-agent": "3.34.0", 207 | "@aws-sdk/node-config-provider": "3.34.0", 208 | "@aws-sdk/node-http-handler": "3.34.0", 209 | "@aws-sdk/protocol-http": "3.34.0", 210 | "@aws-sdk/smithy-client": "3.34.0", 211 | "@aws-sdk/types": "3.34.0", 212 | "@aws-sdk/url-parser": "3.34.0", 213 | "@aws-sdk/util-base64-browser": "3.34.0", 214 | "@aws-sdk/util-base64-node": "3.34.0", 215 | "@aws-sdk/util-body-length-browser": "3.34.0", 216 | "@aws-sdk/util-body-length-node": "3.34.0", 217 | "@aws-sdk/util-user-agent-browser": "3.34.0", 218 | "@aws-sdk/util-user-agent-node": "3.34.0", 219 | "@aws-sdk/util-utf8-browser": "3.34.0", 220 | "@aws-sdk/util-utf8-node": "3.34.0", 221 | "tslib": "^2.3.0" 222 | } 223 | }, 224 | "@aws-sdk/client-sts": { 225 | "version": "3.34.0", 226 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.34.0.tgz", 227 | "integrity": "sha512-jC+Z779fOyU8kk+Xlbu0Mox2mku91X40jZ0TAxNNEhe0i5mOxv8/L2SkE2daKTQxXBem/gTctQmrZ9g4fRm7dw==", 228 | "requires": { 229 | "@aws-crypto/sha256-browser": "^1.0.0", 230 | "@aws-crypto/sha256-js": "^1.0.0", 231 | "@aws-sdk/config-resolver": "3.34.0", 232 | "@aws-sdk/credential-provider-node": "3.34.0", 233 | "@aws-sdk/fetch-http-handler": "3.34.0", 234 | "@aws-sdk/hash-node": "3.34.0", 235 | "@aws-sdk/invalid-dependency": "3.34.0", 236 | "@aws-sdk/middleware-content-length": "3.34.0", 237 | "@aws-sdk/middleware-host-header": "3.34.0", 238 | "@aws-sdk/middleware-logger": "3.34.0", 239 | "@aws-sdk/middleware-retry": "3.34.0", 240 | "@aws-sdk/middleware-sdk-sts": "3.34.0", 241 | "@aws-sdk/middleware-serde": "3.34.0", 242 | "@aws-sdk/middleware-signing": "3.34.0", 243 | "@aws-sdk/middleware-stack": "3.34.0", 244 | "@aws-sdk/middleware-user-agent": "3.34.0", 245 | "@aws-sdk/node-config-provider": "3.34.0", 246 | "@aws-sdk/node-http-handler": "3.34.0", 247 | "@aws-sdk/protocol-http": "3.34.0", 248 | "@aws-sdk/smithy-client": "3.34.0", 249 | "@aws-sdk/types": "3.34.0", 250 | "@aws-sdk/url-parser": "3.34.0", 251 | "@aws-sdk/util-base64-browser": "3.34.0", 252 | "@aws-sdk/util-base64-node": "3.34.0", 253 | "@aws-sdk/util-body-length-browser": "3.34.0", 254 | "@aws-sdk/util-body-length-node": "3.34.0", 255 | "@aws-sdk/util-user-agent-browser": "3.34.0", 256 | "@aws-sdk/util-user-agent-node": "3.34.0", 257 | "@aws-sdk/util-utf8-browser": "3.34.0", 258 | "@aws-sdk/util-utf8-node": "3.34.0", 259 | "entities": "2.2.0", 260 | "fast-xml-parser": "3.19.0", 261 | "tslib": "^2.3.0" 262 | } 263 | }, 264 | "@aws-sdk/config-resolver": { 265 | "version": "3.34.0", 266 | "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.34.0.tgz", 267 | "integrity": "sha512-goAv4oFpDhsnCJehf0Cr0s4bCxOmfj5fz/SZXsLJbW3rGh8CE+s9hxkFqa1JBR/AN+OBDZ8NRRFIYwnftq9+xw==", 268 | "requires": { 269 | "@aws-sdk/signature-v4": "3.34.0", 270 | "@aws-sdk/types": "3.34.0", 271 | "tslib": "^2.3.0" 272 | } 273 | }, 274 | "@aws-sdk/credential-provider-env": { 275 | "version": "3.34.0", 276 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.34.0.tgz", 277 | "integrity": "sha512-vbsLvcZ1gPnjcToSNYMmc0YR1xz4WzkubpFGVXfwcG3iJcQnu+gKXWeCVEfVrjprlNHuqWXnCCi0rNIncKVavQ==", 278 | "requires": { 279 | "@aws-sdk/property-provider": "3.34.0", 280 | "@aws-sdk/types": "3.34.0", 281 | "tslib": "^2.3.0" 282 | } 283 | }, 284 | "@aws-sdk/credential-provider-imds": { 285 | "version": "3.34.0", 286 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.34.0.tgz", 287 | "integrity": "sha512-f56md7Xpd7nzkvRFoAaGf3VCXLuNN0jHh9HQFx4VnrQtp9dcVJK1G/2hYl1dlHFIvHBupWKOnzuUplyxyV55pQ==", 288 | "requires": { 289 | "@aws-sdk/node-config-provider": "3.34.0", 290 | "@aws-sdk/property-provider": "3.34.0", 291 | "@aws-sdk/types": "3.34.0", 292 | "@aws-sdk/url-parser": "3.34.0", 293 | "tslib": "^2.3.0" 294 | } 295 | }, 296 | "@aws-sdk/credential-provider-ini": { 297 | "version": "3.34.0", 298 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.34.0.tgz", 299 | "integrity": "sha512-8SPeje+0tnGPbQ21+TESNE7B8PaIuEGxbkvbMSCm+cKij8Oo6N+StSGZh+0FJhlh+QptWjR/yaH0MKYpIUFUGw==", 300 | "requires": { 301 | "@aws-sdk/credential-provider-env": "3.34.0", 302 | "@aws-sdk/credential-provider-imds": "3.34.0", 303 | "@aws-sdk/credential-provider-sso": "3.34.0", 304 | "@aws-sdk/credential-provider-web-identity": "3.34.0", 305 | "@aws-sdk/property-provider": "3.34.0", 306 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 307 | "@aws-sdk/types": "3.34.0", 308 | "@aws-sdk/util-credentials": "3.34.0", 309 | "tslib": "^2.3.0" 310 | } 311 | }, 312 | "@aws-sdk/credential-provider-node": { 313 | "version": "3.34.0", 314 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.34.0.tgz", 315 | "integrity": "sha512-aZkBWHe9bVNraQlhHageKPaxrZGGIFBTKJ1WT19cHZVnCj8ufCoogvct28eW1SEucn1jPBWPFhaX3/0y16Bc6Q==", 316 | "requires": { 317 | "@aws-sdk/credential-provider-env": "3.34.0", 318 | "@aws-sdk/credential-provider-imds": "3.34.0", 319 | "@aws-sdk/credential-provider-ini": "3.34.0", 320 | "@aws-sdk/credential-provider-process": "3.34.0", 321 | "@aws-sdk/credential-provider-sso": "3.34.0", 322 | "@aws-sdk/credential-provider-web-identity": "3.34.0", 323 | "@aws-sdk/property-provider": "3.34.0", 324 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 325 | "@aws-sdk/types": "3.34.0", 326 | "@aws-sdk/util-credentials": "3.34.0", 327 | "tslib": "^2.3.0" 328 | } 329 | }, 330 | "@aws-sdk/credential-provider-process": { 331 | "version": "3.34.0", 332 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.34.0.tgz", 333 | "integrity": "sha512-4n07qYfLLzjTLyrQTT7iuZTlKZLYyKT4yFjnKyJT3dOoFyW4jWFWjZyicY9TNg4D4f2ya6P3w+H+03DGof0Opw==", 334 | "requires": { 335 | "@aws-sdk/property-provider": "3.34.0", 336 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 337 | "@aws-sdk/types": "3.34.0", 338 | "@aws-sdk/util-credentials": "3.34.0", 339 | "tslib": "^2.3.0" 340 | } 341 | }, 342 | "@aws-sdk/credential-provider-sso": { 343 | "version": "3.34.0", 344 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.34.0.tgz", 345 | "integrity": "sha512-/xyUHA8o5dIaMoKVigjeIgGI1ofGBsVmb1cK16m3w0CDDUgyoEeQD+pust68rYiyuuhgaRqnRtVvjysPPJPMaA==", 346 | "requires": { 347 | "@aws-sdk/client-sso": "3.34.0", 348 | "@aws-sdk/property-provider": "3.34.0", 349 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 350 | "@aws-sdk/types": "3.34.0", 351 | "@aws-sdk/util-credentials": "3.34.0", 352 | "tslib": "^2.3.0" 353 | } 354 | }, 355 | "@aws-sdk/credential-provider-web-identity": { 356 | "version": "3.34.0", 357 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.34.0.tgz", 358 | "integrity": "sha512-4YvuKL2TOyEuktU7v1objIc9PoDMSm2Fxp90KJckitcGnLMsdcaoIV9GgF5nIZrZ7tOUg2ultamCJUkUFZYLMA==", 359 | "requires": { 360 | "@aws-sdk/property-provider": "3.34.0", 361 | "@aws-sdk/types": "3.34.0", 362 | "tslib": "^2.3.0" 363 | } 364 | }, 365 | "@aws-sdk/eventstream-marshaller": { 366 | "version": "3.34.0", 367 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.34.0.tgz", 368 | "integrity": "sha512-NVUBOfkhTpevatyRG2ijf9jzwUoAoBGbsxdZ5LE9A38pTUURIfNgE8sUId4KizfGGzaZ7HCWoqKo67r4SqQKUQ==", 369 | "requires": { 370 | "@aws-crypto/crc32": "^1.0.0", 371 | "@aws-sdk/types": "3.34.0", 372 | "@aws-sdk/util-hex-encoding": "3.34.0", 373 | "tslib": "^2.3.0" 374 | } 375 | }, 376 | "@aws-sdk/eventstream-serde-browser": { 377 | "version": "3.34.0", 378 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.34.0.tgz", 379 | "integrity": "sha512-+AFqMYfjCfaCcuBvvYzzD2qcub1TwycTHTbToYH8Ay8JJgmAInC2pdpGc91rQ5ZolLMTJXLmz1IzkcAGz9hCoQ==", 380 | "requires": { 381 | "@aws-sdk/eventstream-marshaller": "3.34.0", 382 | "@aws-sdk/eventstream-serde-universal": "3.34.0", 383 | "@aws-sdk/types": "3.34.0", 384 | "tslib": "^2.3.0" 385 | } 386 | }, 387 | "@aws-sdk/eventstream-serde-config-resolver": { 388 | "version": "3.34.0", 389 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.34.0.tgz", 390 | "integrity": "sha512-5ilswHm57qmrRKZCe9r+S4c0KibZ/lYgpV8rgNJV/3pwAOUqTxhLV3zmKIED/IUFZA0L7ap38Ivjy3RXXqQbXg==", 391 | "requires": { 392 | "@aws-sdk/types": "3.34.0", 393 | "tslib": "^2.3.0" 394 | } 395 | }, 396 | "@aws-sdk/eventstream-serde-node": { 397 | "version": "3.34.0", 398 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.34.0.tgz", 399 | "integrity": "sha512-NpeMW7Ts40O8l6o5SoP/GHDoaFzny9AfklpBPCtexlZOEHQmdk10DQc/q7mEAGQYIar7UorFJyYgwxArM1sxQA==", 400 | "requires": { 401 | "@aws-sdk/eventstream-marshaller": "3.34.0", 402 | "@aws-sdk/eventstream-serde-universal": "3.34.0", 403 | "@aws-sdk/types": "3.34.0", 404 | "tslib": "^2.3.0" 405 | } 406 | }, 407 | "@aws-sdk/eventstream-serde-universal": { 408 | "version": "3.34.0", 409 | "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.34.0.tgz", 410 | "integrity": "sha512-+im9dNPZS2SOZNpQgwOVAe6W4mW+pKEjwvJk3uae68o1oaWb1Gdtgrkt7mO7ARkqPiW4TyREy+MZnhgtmSw7Iw==", 411 | "requires": { 412 | "@aws-sdk/eventstream-marshaller": "3.34.0", 413 | "@aws-sdk/types": "3.34.0", 414 | "tslib": "^2.3.0" 415 | } 416 | }, 417 | "@aws-sdk/fetch-http-handler": { 418 | "version": "3.34.0", 419 | "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.34.0.tgz", 420 | "integrity": "sha512-evcyWkI0xsQYjSZOzYy+1ke8CwzOaUpg0+tCLPQwG4GKC+GmRWd0ABrxs8OmPBo4SHPQvDpUakX0CRiZu/gm/g==", 421 | "requires": { 422 | "@aws-sdk/protocol-http": "3.34.0", 423 | "@aws-sdk/querystring-builder": "3.34.0", 424 | "@aws-sdk/types": "3.34.0", 425 | "@aws-sdk/util-base64-browser": "3.34.0", 426 | "tslib": "^2.3.0" 427 | } 428 | }, 429 | "@aws-sdk/hash-blob-browser": { 430 | "version": "3.34.0", 431 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.34.0.tgz", 432 | "integrity": "sha512-KJOytiMubw6DjSuKEQsF6V/ACiPvcNWPGgez6GZBwA0oJmEbrmNbZIcDCH+6FMTGNTpY5wpVBQ3Qa4Ua/mc1IA==", 433 | "requires": { 434 | "@aws-sdk/chunked-blob-reader": "3.34.0", 435 | "@aws-sdk/chunked-blob-reader-native": "3.34.0", 436 | "@aws-sdk/types": "3.34.0", 437 | "tslib": "^2.3.0" 438 | } 439 | }, 440 | "@aws-sdk/hash-node": { 441 | "version": "3.34.0", 442 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.34.0.tgz", 443 | "integrity": "sha512-gAPr7p+MgLJ75YRQSELidq0bU/RduPI+kjyY516Od79CNwwe9DEN2JeQakXN3lUfExgp38P9onsRr1d6wKP4EQ==", 444 | "requires": { 445 | "@aws-sdk/types": "3.34.0", 446 | "@aws-sdk/util-buffer-from": "3.34.0", 447 | "tslib": "^2.3.0" 448 | } 449 | }, 450 | "@aws-sdk/hash-stream-node": { 451 | "version": "3.34.0", 452 | "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.34.0.tgz", 453 | "integrity": "sha512-GagLRqtiPz1x1xRJWWbx639JVl4Fgcs5k7zw3mY6nMqoiFE5FV0KSVFgyU/V/vLpZK4FYgxTkRSqlYr+xJK0dQ==", 454 | "requires": { 455 | "@aws-sdk/types": "3.34.0", 456 | "tslib": "^2.3.0" 457 | } 458 | }, 459 | "@aws-sdk/invalid-dependency": { 460 | "version": "3.34.0", 461 | "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.34.0.tgz", 462 | "integrity": "sha512-Seaiu1fT9k7F03KVi/rVf+buRAyAEAzg66ryg14GQW/cei/b/uD4+Gohyk+mRnMqDh4nNluCaktzhr7wSZGeVA==", 463 | "requires": { 464 | "@aws-sdk/types": "3.34.0", 465 | "tslib": "^2.3.0" 466 | } 467 | }, 468 | "@aws-sdk/is-array-buffer": { 469 | "version": "3.34.0", 470 | "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.34.0.tgz", 471 | "integrity": "sha512-YOblEaT5Fq7qHys8mSrNdJS3ZUsLviYyOk6q3ixmHPFcFpO3etGr5AnlDSFqlSm0jnX/0irmp3fbF96kMKLtUg==", 472 | "requires": { 473 | "tslib": "^2.3.0" 474 | } 475 | }, 476 | "@aws-sdk/md5-js": { 477 | "version": "3.34.0", 478 | "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.34.0.tgz", 479 | "integrity": "sha512-fQUDtojAzKyqKKJe/LhpZtDOI6fV+7PeBTtaFQxB3MamPMBUHlT70Wf5j59tcKZPrnkwJBP43CbXnNjZ0BLMzQ==", 480 | "requires": { 481 | "@aws-sdk/types": "3.34.0", 482 | "@aws-sdk/util-utf8-browser": "3.34.0", 483 | "@aws-sdk/util-utf8-node": "3.34.0", 484 | "tslib": "^2.3.0" 485 | } 486 | }, 487 | "@aws-sdk/middleware-apply-body-checksum": { 488 | "version": "3.34.0", 489 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-3.34.0.tgz", 490 | "integrity": "sha512-4yCT/wJh3tt0YostJTrfPzvV8whM5ftD83vnKuG50fY+MFlenoJdbW0oel5WwSq34CE6jMn3F9kX3H4EBxL9bg==", 491 | "requires": { 492 | "@aws-sdk/is-array-buffer": "3.34.0", 493 | "@aws-sdk/protocol-http": "3.34.0", 494 | "@aws-sdk/types": "3.34.0", 495 | "tslib": "^2.3.0" 496 | } 497 | }, 498 | "@aws-sdk/middleware-bucket-endpoint": { 499 | "version": "3.34.0", 500 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.34.0.tgz", 501 | "integrity": "sha512-S5dSB6DioDef6bPNwtzQ1DU/7QOxPMcPgR4m0mLYlA7hNHBxpNKxNjt7xXz4liKsu3GAseSTCHSCg2ZmHMIsHA==", 502 | "requires": { 503 | "@aws-sdk/protocol-http": "3.34.0", 504 | "@aws-sdk/types": "3.34.0", 505 | "@aws-sdk/util-arn-parser": "3.34.0", 506 | "tslib": "^2.3.0" 507 | } 508 | }, 509 | "@aws-sdk/middleware-content-length": { 510 | "version": "3.34.0", 511 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.34.0.tgz", 512 | "integrity": "sha512-+5NnSDEDxcAWXDQSXe1P+Dywrb6sYKSaoiu+kNcYB21mTwG3i9St1A2Q0wNMsdRMRVwSg/lJV5MbY5Mbk0+D5w==", 513 | "requires": { 514 | "@aws-sdk/protocol-http": "3.34.0", 515 | "@aws-sdk/types": "3.34.0", 516 | "tslib": "^2.3.0" 517 | } 518 | }, 519 | "@aws-sdk/middleware-expect-continue": { 520 | "version": "3.34.0", 521 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.34.0.tgz", 522 | "integrity": "sha512-MZPmnFsHKcVSKSqwvqfCoGtp6fO2QXHQ0b7adW3x3TKagreX5k2xn6XU197nyDwfC8C+gWLirHUoEDCkQPxNSw==", 523 | "requires": { 524 | "@aws-sdk/middleware-header-default": "3.34.0", 525 | "@aws-sdk/protocol-http": "3.34.0", 526 | "@aws-sdk/types": "3.34.0", 527 | "tslib": "^2.3.0" 528 | } 529 | }, 530 | "@aws-sdk/middleware-header-default": { 531 | "version": "3.34.0", 532 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.34.0.tgz", 533 | "integrity": "sha512-cY95WgbmMMmvMlOEbX/DIIACy5c+97KdCZsFhKkF7lkkNJRsH7iHbgwqTfbdVhTAz0t8ADg1n4+c/7PlCOS1FA==", 534 | "requires": { 535 | "@aws-sdk/protocol-http": "3.34.0", 536 | "@aws-sdk/types": "3.34.0", 537 | "tslib": "^2.3.0" 538 | } 539 | }, 540 | "@aws-sdk/middleware-host-header": { 541 | "version": "3.34.0", 542 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.34.0.tgz", 543 | "integrity": "sha512-3ZcBTicauGp0reKQ8Pw8ardk9kRTO7/lWAKGV7f0PnfOoGn+zUqVP0qvaHL3VNVdTJEz6fkkU7pJ0duCVCnpmA==", 544 | "requires": { 545 | "@aws-sdk/protocol-http": "3.34.0", 546 | "@aws-sdk/types": "3.34.0", 547 | "tslib": "^2.3.0" 548 | } 549 | }, 550 | "@aws-sdk/middleware-location-constraint": { 551 | "version": "3.34.0", 552 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.34.0.tgz", 553 | "integrity": "sha512-JZfoBWPfeq23CaQ9+JOMukFTM5+yAK9EhcjiKXQtwxv9P46SU7iwiWc/cW3OiLCbJ3sds0+c9WnfbINcDoeaUg==", 554 | "requires": { 555 | "@aws-sdk/types": "3.34.0", 556 | "tslib": "^2.3.0" 557 | } 558 | }, 559 | "@aws-sdk/middleware-logger": { 560 | "version": "3.34.0", 561 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.34.0.tgz", 562 | "integrity": "sha512-EBVp3tkEbMSW9ikMzejucYLOf+G98+vGqWSkvGbR0N8lBHs2za+fufBqknEY8lD7a8RLFQ3enevl8DMJ9d75pA==", 563 | "requires": { 564 | "@aws-sdk/types": "3.34.0", 565 | "tslib": "^2.3.0" 566 | } 567 | }, 568 | "@aws-sdk/middleware-retry": { 569 | "version": "3.34.0", 570 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.34.0.tgz", 571 | "integrity": "sha512-PKWlJWhr7b3jEsTDRBXf7mIUkjnGMQiYvNs3G1kdwrySbii2yEOlwy7KXAAo/TCwuL10W+HZG7EZwkwXNg7LTQ==", 572 | "requires": { 573 | "@aws-sdk/protocol-http": "3.34.0", 574 | "@aws-sdk/service-error-classification": "3.34.0", 575 | "@aws-sdk/types": "3.34.0", 576 | "tslib": "^2.3.0", 577 | "uuid": "^8.3.2" 578 | }, 579 | "dependencies": { 580 | "uuid": { 581 | "version": "8.3.2", 582 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 583 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 584 | } 585 | } 586 | }, 587 | "@aws-sdk/middleware-sdk-s3": { 588 | "version": "3.34.0", 589 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.34.0.tgz", 590 | "integrity": "sha512-fn+LPtf/SQQA9tTOk7WtCmvZZ5VfHfYDzNpcy7GJUIJXwr4Dvs3D07uHfSCiQdbvxiKpdmBFXb9bAbk5jQJ1eA==", 591 | "requires": { 592 | "@aws-sdk/protocol-http": "3.34.0", 593 | "@aws-sdk/signature-v4": "3.34.0", 594 | "@aws-sdk/types": "3.34.0", 595 | "@aws-sdk/util-arn-parser": "3.34.0", 596 | "tslib": "^2.3.0" 597 | } 598 | }, 599 | "@aws-sdk/middleware-sdk-sts": { 600 | "version": "3.34.0", 601 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.34.0.tgz", 602 | "integrity": "sha512-tJPkij4H0z4AbjOnRlcUP99dJud4SlH9fYfnxQ1CeG1PO0Zz1zTEc+2Sc93068bS4K4nrD4QaVsoOokvjW/4MQ==", 603 | "requires": { 604 | "@aws-sdk/middleware-signing": "3.34.0", 605 | "@aws-sdk/property-provider": "3.34.0", 606 | "@aws-sdk/protocol-http": "3.34.0", 607 | "@aws-sdk/signature-v4": "3.34.0", 608 | "@aws-sdk/types": "3.34.0", 609 | "tslib": "^2.3.0" 610 | } 611 | }, 612 | "@aws-sdk/middleware-serde": { 613 | "version": "3.34.0", 614 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.34.0.tgz", 615 | "integrity": "sha512-oU2oa6hy1+DrFROD+K00NkRNdrsNgryay6rCA/jSUfwGEFmvN3iANTgXkEEvEKCSYqyh/ai998jk+6v60ChFBQ==", 616 | "requires": { 617 | "@aws-sdk/types": "3.34.0", 618 | "tslib": "^2.3.0" 619 | } 620 | }, 621 | "@aws-sdk/middleware-signing": { 622 | "version": "3.34.0", 623 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.34.0.tgz", 624 | "integrity": "sha512-dlxyxIg6Mrjx6GzUVQoQV9M/n3kEvs6aMEzR3DTF0i8CGqWtKXE5OZhsjLVRflVOejONM7NEXwNeFHr+lQ4Z9w==", 625 | "requires": { 626 | "@aws-sdk/property-provider": "3.34.0", 627 | "@aws-sdk/protocol-http": "3.34.0", 628 | "@aws-sdk/signature-v4": "3.34.0", 629 | "@aws-sdk/types": "3.34.0", 630 | "tslib": "^2.3.0" 631 | } 632 | }, 633 | "@aws-sdk/middleware-ssec": { 634 | "version": "3.34.0", 635 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.34.0.tgz", 636 | "integrity": "sha512-X2Qc61mRULPE+hlhruZEXdt9b3Yw+lHHPODivUftopclP2+Q1dyPyPNmMi8RrmfHk7FKvxGOryZO1XOeJOp6eA==", 637 | "requires": { 638 | "@aws-sdk/types": "3.34.0", 639 | "tslib": "^2.3.0" 640 | } 641 | }, 642 | "@aws-sdk/middleware-stack": { 643 | "version": "3.34.0", 644 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.34.0.tgz", 645 | "integrity": "sha512-7WI+spzWcTYWIP0MwTDlE+LsWGlpZq44mvRGnNHDjnTjqfr5C3kWSc86fedujvbaW5ZGTes5NGmKQf/PqAmUqQ==", 646 | "requires": { 647 | "tslib": "^2.3.0" 648 | } 649 | }, 650 | "@aws-sdk/middleware-user-agent": { 651 | "version": "3.34.0", 652 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.34.0.tgz", 653 | "integrity": "sha512-EZBy0fNhuenzxlVAx2GcgBFOGCTyHs1Gg1GB/qUIhqZ2MHY66Yogj4BqPkiOg+zo7nFwCjWQ9LRypYZYXCWMLw==", 654 | "requires": { 655 | "@aws-sdk/protocol-http": "3.34.0", 656 | "@aws-sdk/types": "3.34.0", 657 | "tslib": "^2.3.0" 658 | } 659 | }, 660 | "@aws-sdk/node-config-provider": { 661 | "version": "3.34.0", 662 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.34.0.tgz", 663 | "integrity": "sha512-VPDYLNkwvhAlhSWecMbmiXpa/n20i9S4z0/+pSB4kXT73MvH3us77ecYXD5g8IIRrAR+Oaq8hrQLDP88bbte9g==", 664 | "requires": { 665 | "@aws-sdk/property-provider": "3.34.0", 666 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 667 | "@aws-sdk/types": "3.34.0", 668 | "tslib": "^2.3.0" 669 | } 670 | }, 671 | "@aws-sdk/node-http-handler": { 672 | "version": "3.34.0", 673 | "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.34.0.tgz", 674 | "integrity": "sha512-Fyf0VsgatDr3puqIA4CHTqVKUPBveq0skQhXyPDXxXIllxExpqcrWu8fFqE2DalCqiDiDC7zR8Yh56syiBxmvA==", 675 | "requires": { 676 | "@aws-sdk/abort-controller": "3.34.0", 677 | "@aws-sdk/protocol-http": "3.34.0", 678 | "@aws-sdk/querystring-builder": "3.34.0", 679 | "@aws-sdk/types": "3.34.0", 680 | "tslib": "^2.3.0" 681 | } 682 | }, 683 | "@aws-sdk/property-provider": { 684 | "version": "3.34.0", 685 | "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.34.0.tgz", 686 | "integrity": "sha512-Xkj6l14bYhKnzUXenBn8TANvR5p4pzLZF8Uk/pCVYZFgotOd5gVTC89SAQa4Lw2PzwoTqOsWKglS7CWi4KaBDg==", 687 | "requires": { 688 | "@aws-sdk/types": "3.34.0", 689 | "tslib": "^2.3.0" 690 | } 691 | }, 692 | "@aws-sdk/protocol-http": { 693 | "version": "3.34.0", 694 | "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.34.0.tgz", 695 | "integrity": "sha512-VPzI/VcDXqoWcyJNc0p/ee1pjGXFC8PmaZwK7PO3FkNEa8BE/9IbfVg3AGIekEDIXwpdZAjQeLCmOsMx866S2Q==", 696 | "requires": { 697 | "@aws-sdk/types": "3.34.0", 698 | "tslib": "^2.3.0" 699 | } 700 | }, 701 | "@aws-sdk/querystring-builder": { 702 | "version": "3.34.0", 703 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.34.0.tgz", 704 | "integrity": "sha512-lDkJPvDsR+Ou0NIWUJlVCpi6vDNaPVgxtP2r/4kktoSYzwFz4UCkmKcDRdL4cxEZ6LYA0QkjtkyfQotoZMuIXA==", 705 | "requires": { 706 | "@aws-sdk/types": "3.34.0", 707 | "@aws-sdk/util-uri-escape": "3.34.0", 708 | "tslib": "^2.3.0" 709 | } 710 | }, 711 | "@aws-sdk/querystring-parser": { 712 | "version": "3.34.0", 713 | "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.34.0.tgz", 714 | "integrity": "sha512-IMpHNQOSPVk7qaDDaFL6xmTW4VuMbTxyhRdrVmxZXWWgRvMRs2chjXdq3iyTtpnKq5GNnEdPY7udjfWqYoaN8A==", 715 | "requires": { 716 | "@aws-sdk/types": "3.34.0", 717 | "tslib": "^2.3.0" 718 | } 719 | }, 720 | "@aws-sdk/s3-presigned-post": { 721 | "version": "3.34.0", 722 | "resolved": "https://registry.npmjs.org/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.34.0.tgz", 723 | "integrity": "sha512-QVUQ3k755Hu6TmbhkhJxp7Jk1+IiWQ9azuaiT3ks3MCUT7aYCrBRWwzMvDoJGsXRQJGBF4gS+8y/z2WL0owDzQ==", 724 | "requires": { 725 | "@aws-sdk/signature-v4": "3.34.0", 726 | "@aws-sdk/types": "3.34.0", 727 | "@aws-sdk/util-format-url": "3.34.0", 728 | "@aws-sdk/util-hex-encoding": "3.34.0", 729 | "tslib": "^2.3.0" 730 | } 731 | }, 732 | "@aws-sdk/s3-request-presigner": { 733 | "version": "3.34.0", 734 | "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.34.0.tgz", 735 | "integrity": "sha512-Ip5+G4wJ/i0MghR4nohvlqb1fk9E2rXMWC3gdWgt85sqBOwSq/Ip9SOvtUAWgSjXGYaD7vAEkw8XI7p481fODQ==", 736 | "requires": { 737 | "@aws-sdk/middleware-sdk-s3": "3.34.0", 738 | "@aws-sdk/protocol-http": "3.34.0", 739 | "@aws-sdk/signature-v4": "3.34.0", 740 | "@aws-sdk/smithy-client": "3.34.0", 741 | "@aws-sdk/types": "3.34.0", 742 | "@aws-sdk/util-create-request": "3.34.0", 743 | "@aws-sdk/util-format-url": "3.34.0", 744 | "tslib": "^2.3.0" 745 | } 746 | }, 747 | "@aws-sdk/service-error-classification": { 748 | "version": "3.34.0", 749 | "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.34.0.tgz", 750 | "integrity": "sha512-RYmgfrGSfULduJf753rMlK0E+NoK6PUaACb5eiVKoGyo8NpzDFcDWVL2yAb40tAqI7ahhWz1uqGzb1sRPWSAIg==" 751 | }, 752 | "@aws-sdk/shared-ini-file-loader": { 753 | "version": "3.34.0", 754 | "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.34.0.tgz", 755 | "integrity": "sha512-zh238/JYpP9+7FkCODH+UYqL1StbBtidFOt8Vmo4MNdh10R31XImnL0npdhRLiZSkOoatpHc+ViCOeH+I67QiQ==", 756 | "requires": { 757 | "tslib": "^2.3.0" 758 | } 759 | }, 760 | "@aws-sdk/signature-v4": { 761 | "version": "3.34.0", 762 | "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.34.0.tgz", 763 | "integrity": "sha512-oKW5Frsu4TMc/8eLcRE4kdgKj1XqsVCry9VdjDgNpx37aeH7oggg75YDU+UZuhdF++hDr6uCa+DYxtluQ8g9sg==", 764 | "requires": { 765 | "@aws-sdk/is-array-buffer": "3.34.0", 766 | "@aws-sdk/types": "3.34.0", 767 | "@aws-sdk/util-hex-encoding": "3.34.0", 768 | "@aws-sdk/util-uri-escape": "3.34.0", 769 | "tslib": "^2.3.0" 770 | } 771 | }, 772 | "@aws-sdk/smithy-client": { 773 | "version": "3.34.0", 774 | "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.34.0.tgz", 775 | "integrity": "sha512-nhLNpqehOYuBVr2f2LodMbO1j8J97WBTjfiyosUhVh36WDmSCPu4LjAJuzOLPF6LXp4fBK0BA04rJQA6nyFC0g==", 776 | "requires": { 777 | "@aws-sdk/middleware-stack": "3.34.0", 778 | "@aws-sdk/types": "3.34.0", 779 | "tslib": "^2.3.0" 780 | } 781 | }, 782 | "@aws-sdk/types": { 783 | "version": "3.34.0", 784 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.34.0.tgz", 785 | "integrity": "sha512-rx9mJp+yKEgb6HVyMtytG+45xwiX3eaHy1VrPC0RV/Uxym1iGyFmpHYo+0/UgL1BTRrJXLA9gTfj15H5kyZ6/Q==" 786 | }, 787 | "@aws-sdk/url-parser": { 788 | "version": "3.34.0", 789 | "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.34.0.tgz", 790 | "integrity": "sha512-RqF5vQ3+kTRhNmsT7V9KqPnfrDsHZg8XjgEFdr29iKXEupOockQlJBVGTesy73y9nvnMueNKNZkk4VLeHEW6cg==", 791 | "requires": { 792 | "@aws-sdk/querystring-parser": "3.34.0", 793 | "@aws-sdk/types": "3.34.0", 794 | "tslib": "^2.3.0" 795 | } 796 | }, 797 | "@aws-sdk/util-arn-parser": { 798 | "version": "3.34.0", 799 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.34.0.tgz", 800 | "integrity": "sha512-iHhgluq84MsfZjIOZf43R4mFfaHUC6sVH6ghw6XfByWOsh4Y+vd1K4NuuoLo8DJYWLdPzRSnXmcBOoUdrd5L8w==", 801 | "requires": { 802 | "tslib": "^2.3.0" 803 | } 804 | }, 805 | "@aws-sdk/util-base64-browser": { 806 | "version": "3.34.0", 807 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.34.0.tgz", 808 | "integrity": "sha512-3ScDOSlrX4EnwWzYnDfKa3GjiLYnHfk2YEV5G+f/NOEKhsuTsj++PGvdLqbXc4m03rLiDBoMgN204tz78rSgsA==", 809 | "requires": { 810 | "tslib": "^2.3.0" 811 | } 812 | }, 813 | "@aws-sdk/util-base64-node": { 814 | "version": "3.34.0", 815 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.34.0.tgz", 816 | "integrity": "sha512-r7tPqydtuzjMH9BBPw34l8zlN84O8EuJPl2mx1JXFrDE+ADUx1VBU+KK1pnIFoFVb7/FWMVPeaKz1u0EjsSKRQ==", 817 | "requires": { 818 | "@aws-sdk/util-buffer-from": "3.34.0", 819 | "tslib": "^2.3.0" 820 | } 821 | }, 822 | "@aws-sdk/util-body-length-browser": { 823 | "version": "3.34.0", 824 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.34.0.tgz", 825 | "integrity": "sha512-Av7x9dKoygju9QBuTIGa7JITxGlIj7NhN22CxX3FThIIJofp5qbnTTiLURivM6jw6Wvf2sZ4mpP34xEeDvXG/A==", 826 | "requires": { 827 | "tslib": "^2.3.0" 828 | } 829 | }, 830 | "@aws-sdk/util-body-length-node": { 831 | "version": "3.34.0", 832 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.34.0.tgz", 833 | "integrity": "sha512-slrlSnPNQd/6pvTpvK0Z8z7hbrND0dEA+0/4Y3l47hBftznxhiKbLKiCg5a3iBjTxUB0qSQ03YNY/fK3DtPJTA==", 834 | "requires": { 835 | "tslib": "^2.3.0" 836 | } 837 | }, 838 | "@aws-sdk/util-buffer-from": { 839 | "version": "3.34.0", 840 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.34.0.tgz", 841 | "integrity": "sha512-G1XXPD3IfHYXEGwknC2ogn2CylxrYcdwwWbS1vGji9zP6YX8C/gf+moLtJz3bDlMwSHTLdzdH/RWBIL75djGKg==", 842 | "requires": { 843 | "@aws-sdk/is-array-buffer": "3.34.0", 844 | "tslib": "^2.3.0" 845 | } 846 | }, 847 | "@aws-sdk/util-create-request": { 848 | "version": "3.34.0", 849 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.34.0.tgz", 850 | "integrity": "sha512-HID+FtmBgOS+HuS4IIxDVGoYuU4YWYr9MJ/p6MspW4TzSYDWcESEpx7oA2hXH8pwmsBzblYgckEJZA1KofPOOQ==", 851 | "requires": { 852 | "@aws-sdk/middleware-stack": "3.34.0", 853 | "@aws-sdk/smithy-client": "3.34.0", 854 | "@aws-sdk/types": "3.34.0", 855 | "tslib": "^2.3.0" 856 | } 857 | }, 858 | "@aws-sdk/util-credentials": { 859 | "version": "3.34.0", 860 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.34.0.tgz", 861 | "integrity": "sha512-Spb7MtRMmAeHekaju85m5WOO8/C277+6pWvBQlh3vADwmxsBdyvDCIZtXLhlqW/zeUUKvr7atkuhW5h2Ck+gfw==", 862 | "requires": { 863 | "@aws-sdk/shared-ini-file-loader": "3.34.0", 864 | "tslib": "^2.3.0" 865 | } 866 | }, 867 | "@aws-sdk/util-format-url": { 868 | "version": "3.34.0", 869 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.34.0.tgz", 870 | "integrity": "sha512-WgytAzc9b7+wt+B4kVlB7/hXBn1sZcsZHpsSigk5zstHC07Fy9g4oOJwPC6YeLeoscXkR92Hr22Utcvfhy3AWQ==", 871 | "requires": { 872 | "@aws-sdk/querystring-builder": "3.34.0", 873 | "@aws-sdk/types": "3.34.0", 874 | "tslib": "^2.3.0" 875 | } 876 | }, 877 | "@aws-sdk/util-hex-encoding": { 878 | "version": "3.34.0", 879 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.34.0.tgz", 880 | "integrity": "sha512-eM1jKmD1SOCluLMqOxmbJRqPbuSyDGp1HELEAYt1zG2xy1pAugiJK7zyCcNZ8Wt/1RQQA1QnPnSTtQFK1GVzbA==", 881 | "requires": { 882 | "tslib": "^2.3.0" 883 | } 884 | }, 885 | "@aws-sdk/util-locate-window": { 886 | "version": "3.34.0", 887 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.34.0.tgz", 888 | "integrity": "sha512-/xZs6dJ+00H/vNi4+tRoj32XfkhDCYWiASI/wVMzpZG/F15SOipe9MWxUWrH7FAm+BSp5cHcdnLtzFoJmI5cCQ==", 889 | "requires": { 890 | "tslib": "^2.3.0" 891 | } 892 | }, 893 | "@aws-sdk/util-uri-escape": { 894 | "version": "3.34.0", 895 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.34.0.tgz", 896 | "integrity": "sha512-UxB5LfwB4BWdQyLJkkHz/U/gigQBkkfVhQHJx0Sg/yMH/PnTuUqdj+MWhezca/9VQShx24uBewXWV4ToybYULA==", 897 | "requires": { 898 | "tslib": "^2.3.0" 899 | } 900 | }, 901 | "@aws-sdk/util-user-agent-browser": { 902 | "version": "3.34.0", 903 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.34.0.tgz", 904 | "integrity": "sha512-7bSk/d0LPzGnYLkKI0Z91dsoPudoayRywrYjdEbTbD85d+2VDKuxszhACVV4hbcQSc7x0zCumRJE7rx3c2weIQ==", 905 | "requires": { 906 | "@aws-sdk/types": "3.34.0", 907 | "bowser": "^2.11.0", 908 | "tslib": "^2.3.0" 909 | } 910 | }, 911 | "@aws-sdk/util-user-agent-node": { 912 | "version": "3.34.0", 913 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.34.0.tgz", 914 | "integrity": "sha512-EupJGySosLRk9NWYajE4x6gEEW+ZiW4cdNlDUkDWng+qruxNJDxLIO2xRrPBFiA+s/DMy6HRXWROBWpGnqLB5w==", 915 | "requires": { 916 | "@aws-sdk/node-config-provider": "3.34.0", 917 | "@aws-sdk/types": "3.34.0", 918 | "tslib": "^2.3.0" 919 | } 920 | }, 921 | "@aws-sdk/util-utf8-browser": { 922 | "version": "3.34.0", 923 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.34.0.tgz", 924 | "integrity": "sha512-auB09BoFk5mPA444WmBpF5dZN+59ojrmpAcJf4zc0S/UfsWzAQDj7Lsj2aSu9O0xWoDmtzUWxfiwQqNIEqcNIA==", 925 | "requires": { 926 | "tslib": "^2.3.0" 927 | } 928 | }, 929 | "@aws-sdk/util-utf8-node": { 930 | "version": "3.34.0", 931 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.34.0.tgz", 932 | "integrity": "sha512-Okarq9OUG99UOcen3dYUQCw62Fm9DQk3zyt/7MMgbt9G6Sz6kQ6s1vtC4Ip+HxhALBQPFj8THcf2ijh55L6unQ==", 933 | "requires": { 934 | "@aws-sdk/util-buffer-from": "3.34.0", 935 | "tslib": "^2.3.0" 936 | } 937 | }, 938 | "@aws-sdk/util-waiter": { 939 | "version": "3.34.0", 940 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.34.0.tgz", 941 | "integrity": "sha512-UlrNCXnYJwB0ERX8CVDHD6jDqTU89CRMZsKxYJlfSnmQ5utQs4b2bxVhqDSE7aHFGW23SXEqQr5XlcSAixbYMA==", 942 | "requires": { 943 | "@aws-sdk/abort-controller": "3.34.0", 944 | "@aws-sdk/types": "3.34.0", 945 | "tslib": "^2.3.0" 946 | } 947 | }, 948 | "@aws-sdk/xml-builder": { 949 | "version": "3.34.0", 950 | "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.34.0.tgz", 951 | "integrity": "sha512-QJaSceH1Cjvx4gpWcWL0vttOdfFQjSlTyDr3dAiQtvYIKJyRKFgtVTe7+7FV+cuLLb1JniROMFGX0FPLOvAnow==", 952 | "requires": { 953 | "tslib": "^2.3.0" 954 | } 955 | }, 956 | "aws-sdk": { 957 | "version": "2.999.0", 958 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.999.0.tgz", 959 | "integrity": "sha512-OcnD7m+HCZv2qDzmS7TgABGf26mVPfIyah0Dgz7hHAxBtx78qFWi/s9U6BDxVBKWLg7OKWVHf0opiMG4ujteqg==", 960 | "requires": { 961 | "buffer": "4.9.2", 962 | "events": "1.1.1", 963 | "ieee754": "1.1.13", 964 | "jmespath": "0.15.0", 965 | "querystring": "0.2.0", 966 | "sax": "1.2.1", 967 | "url": "0.10.3", 968 | "uuid": "3.3.2", 969 | "xml2js": "0.4.19" 970 | } 971 | }, 972 | "base64-js": { 973 | "version": "1.5.1", 974 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 975 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 976 | }, 977 | "bowser": { 978 | "version": "2.11.0", 979 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 980 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" 981 | }, 982 | "buffer": { 983 | "version": "4.9.2", 984 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 985 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 986 | "requires": { 987 | "base64-js": "^1.0.2", 988 | "ieee754": "^1.1.4", 989 | "isarray": "^1.0.0" 990 | } 991 | }, 992 | "entities": { 993 | "version": "2.2.0", 994 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 995 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" 996 | }, 997 | "events": { 998 | "version": "1.1.1", 999 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 1000 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" 1001 | }, 1002 | "fast-xml-parser": { 1003 | "version": "3.19.0", 1004 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", 1005 | "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" 1006 | }, 1007 | "ieee754": { 1008 | "version": "1.1.13", 1009 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 1010 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 1011 | }, 1012 | "isarray": { 1013 | "version": "1.0.0", 1014 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1015 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1016 | }, 1017 | "jmespath": { 1018 | "version": "0.15.0", 1019 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 1020 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" 1021 | }, 1022 | "punycode": { 1023 | "version": "1.3.2", 1024 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1025 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1026 | }, 1027 | "querystring": { 1028 | "version": "0.2.0", 1029 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1030 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 1031 | }, 1032 | "sax": { 1033 | "version": "1.2.1", 1034 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 1035 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" 1036 | }, 1037 | "tslib": { 1038 | "version": "2.3.1", 1039 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1040 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1041 | }, 1042 | "url": { 1043 | "version": "0.10.3", 1044 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 1045 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 1046 | "requires": { 1047 | "punycode": "1.3.2", 1048 | "querystring": "0.2.0" 1049 | } 1050 | }, 1051 | "uuid": { 1052 | "version": "3.3.2", 1053 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1054 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1055 | }, 1056 | "xml2js": { 1057 | "version": "0.4.19", 1058 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 1059 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 1060 | "requires": { 1061 | "sax": ">=0.6.0", 1062 | "xmlbuilder": "~9.0.1" 1063 | } 1064 | }, 1065 | "xmlbuilder": { 1066 | "version": "9.0.7", 1067 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 1068 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" 1069 | } 1070 | } 1071 | } 1072 | -------------------------------------------------------------------------------- /s3-signed-url/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "s3-signed-url", 3 | "version": "1.0.0", 4 | "description": "s3 signed url example", 5 | "main": "functions/handler.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "aws", 11 | "s3", 12 | "signed-url" 13 | ], 14 | "author": "Enrico Portolan", 15 | "license": "ISC", 16 | "dependencies": { 17 | "@aws-sdk/client-s3": "^3.34.0", 18 | "@aws-sdk/s3-presigned-post": "^3.34.0", 19 | "@aws-sdk/s3-request-presigner": "^3.34.0", 20 | "aws-sdk": "^2.999.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /s3-signed-url/serverless.yml: -------------------------------------------------------------------------------- 1 | service: s3-signed-url 2 | frameworkVersion: '2' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs12.x 7 | lambdaHashingVersion: 20201221 8 | stage: ${file(config.json):STAGE} 9 | region: ${file(config.json):REGION} 10 | iamRoleStatements: 11 | - Effect: "Allow" 12 | Action: 13 | - "s3:GetObject" 14 | - "s3:GetObjectVersion" 15 | - "s3:PutObject" 16 | Resource: 17 | - "arn:aws:s3:::${file(config.json):S3_BUCKET}/*" 18 | 19 | 20 | functions: 21 | create-get-url: 22 | handler: functions/handler.createGetUrl 23 | events: 24 | - http: 25 | path: /object/{fileKey} 26 | method: get 27 | cors: true 28 | request: 29 | parameters: 30 | paths: 31 | fileKey: true 32 | create-post-url: 33 | handler: functions/handler.createPostUrl 34 | events: 35 | - http: 36 | path: /upload-url 37 | method: get 38 | cors: true 39 | -------------------------------------------------------------------------------- /s3-with-lambda/.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | node_modules 3 | .serverless -------------------------------------------------------------------------------- /s3-with-lambda/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /s3-with-lambda/README.md: -------------------------------------------------------------------------------- 1 | # AWS Amazon S3 to AWS Lambda 2 | 3 | This sample code shows how to trigger a Lambda function from an S3 bucket. -------------------------------------------------------------------------------- /s3-with-lambda/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "REGION": "us-east-1", 3 | "STAGE": "dev", 4 | "S3_BUCKET": "BasicS3Bucket" 5 | } -------------------------------------------------------------------------------- /s3-with-lambda/functions/handler.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk') 2 | const s3 = new AWS.S3() 3 | 4 | module.exports.readS3File = async (event) => { 5 | const Key = event.Records[0].s3.object.key; 6 | 7 | // Read the object from S3 8 | const data = await s3.getObject({ 9 | Bucket: event.Records[0].s3.bucket.name, 10 | Key 11 | }).promise(); 12 | 13 | const s3Object = JSON.parse(data.Body) 14 | console.log("s3Object", s3Object); 15 | 16 | return; 17 | }; 18 | -------------------------------------------------------------------------------- /s3-with-lambda/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "s3-with-lambda", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Enrico Portolan", 10 | "license": "ISC" 11 | } 12 | -------------------------------------------------------------------------------- /s3-with-lambda/serverless.yml: -------------------------------------------------------------------------------- 1 | service: s3-with-lambda 2 | frameworkVersion: '2' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs12.x 7 | lambdaHashingVersion: 20201221 8 | stage: ${file(config.json):STAGE} 9 | region: ${file(config.json):REGION} 10 | iamRoleStatements: 11 | - Effect: "Allow" 12 | Action: 13 | - "s3:GetObject" 14 | - "s3:GetObjectVersion" 15 | Resource: 16 | - "arn:aws:s3:::${file(config.json):S3_BUCKET}/*" 17 | 18 | 19 | functions: 20 | uploader: 21 | handler: functions/handler.readS3File 22 | events: 23 | - s3: 24 | bucket: ${file(config.json):S3_BUCKET} 25 | event: s3:ObjectCreated:* 26 | existing: true 27 | 28 | # you can add CloudFormation resource templates here 29 | resources: 30 | Resources: 31 | s3WithLambda: 32 | Type: AWS::S3::Bucket 33 | Properties: 34 | BucketName: ${file(config.json):S3_BUCKET} 35 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | 3 | # CDK asset staging directory 4 | .cdk.staging 5 | cdk.out 6 | 7 | config.json -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/.npmignore: -------------------------------------------------------------------------------- 1 | # CDK asset staging directory 2 | .cdk.staging 3 | cdk.out 4 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/README.md: -------------------------------------------------------------------------------- 1 | # Welcome to your CDK JavaScript project 2 | 3 | This is a blank project for CDK development with JavaScript. 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. The build step is not required when using JavaScript. 6 | 7 | ## Useful commands 8 | 9 | * `npm run test` perform the jest unit tests 10 | * `npx cdk deploy` deploy this stack to your default AWS account/region 11 | * `npx cdk diff` compare deployed stack with current state 12 | * `npx cdk synth` emits the synthesized CloudFormation template 13 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/bin/secure-api-gateway-custom-authorizer.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const cdk = require("aws-cdk-lib"); 4 | const { 5 | SecureApiGatewayCustomAuthorizerStack, 6 | } = require("../lib/secure-api-gateway-custom-authorizer-stack"); 7 | 8 | const app = new cdk.App(); 9 | new SecureApiGatewayCustomAuthorizerStack( 10 | app, 11 | "SecureApiGatewayCustomAuthorizerStack", 12 | { 13 | /* If you don't specify 'env', this stack will be environment-agnostic. 14 | * Account/Region-dependent features and context lookups will not work, 15 | * but a single synthesized template can be deployed anywhere. */ 16 | 17 | /* Uncomment the next line to specialize this stack for the AWS Account 18 | * and Region that are implied by the current CLI configuration. */ 19 | env: { 20 | account: process.env.CDK_DEFAULT_ACCOUNT, 21 | region: process.env.CDK_DEFAULT_REGION, 22 | }, 23 | 24 | /* Uncomment the next line if you know exactly what Account and Region you 25 | * want to deploy the stack to. */ 26 | // env: { account: '123456789012', region: 'us-east-1' }, 27 | 28 | /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ 29 | } 30 | ); 31 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "node bin/secure-api-gateway-custom-authorizer.js", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "jest.config.js", 11 | "package*.json", 12 | "yarn.lock", 13 | "node_modules", 14 | "test" 15 | ] 16 | }, 17 | "context": { 18 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 19 | "@aws-cdk/core:checkSecretUsage": true, 20 | "@aws-cdk/core:target-partitions": [ 21 | "aws", 22 | "aws-cn" 23 | ], 24 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 25 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 26 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 27 | "@aws-cdk/aws-iam:minimizePolicies": true, 28 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 29 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 30 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 31 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 32 | "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, 33 | "@aws-cdk/core:enablePartitionLiterals": true, 34 | "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, 35 | "@aws-cdk/aws-iam:standardizedServicePrincipals": true, 36 | "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, 37 | "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, 38 | "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, 39 | "@aws-cdk/aws-route53-patters:useCertificate": true, 40 | "@aws-cdk/customresources:installLatestAwsSdkDefault": false, 41 | "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, 42 | "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, 43 | "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, 44 | "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, 45 | "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, 46 | "@aws-cdk/aws-redshift:columnId": true, 47 | "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, 48 | "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, 49 | "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, 50 | "@aws-cdk/aws-kms:aliasNameRef": true, 51 | "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, 52 | "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, 53 | "@aws-cdk/aws-efs:denyAnonymousAccess": true, 54 | "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, 55 | "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, 56 | "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, 57 | "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, 58 | "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, 59 | "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, 60 | "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "JWKS_URI": "https://[your-subdomain].eu.auth0.com/.well-known/jwks.json", 3 | "ISSUER": "https://[your-subdomain].eu.auth0.com/", 4 | "AUDIENCE": "https://api-identifer" 5 | } -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/functions/custom-auth-lib.js: -------------------------------------------------------------------------------- 1 | const jwksClient = require("jwks-rsa"); 2 | const jwt = require("jsonwebtoken"); 3 | const util = require("util"); 4 | 5 | const getPolicyDocument = (effect, resource) => { 6 | const policyDocument = { 7 | Version: "2012-10-17", // default version 8 | Statement: [ 9 | { 10 | Action: "execute-api:Invoke", // default action 11 | Effect: effect, 12 | Resource: resource, 13 | }, 14 | ], 15 | }; 16 | return policyDocument; 17 | }; 18 | 19 | // extract and return the Bearer Token from the Lambda event parameters 20 | const getToken = (params) => { 21 | if (!params.type || params.type !== "TOKEN") { 22 | throw new Error('Expected "event.type" parameter to have value "TOKEN"'); 23 | } 24 | 25 | const tokenString = params.authorizationToken; 26 | if (!tokenString) { 27 | throw new Error('Expected "event.authorizationToken" parameter to be set'); 28 | } 29 | 30 | const match = tokenString.match(/^Bearer (.*)$/); 31 | if (!match || match.length < 2) { 32 | throw new Error( 33 | `Invalid Authorization token - ${tokenString} does not match "Bearer .*"` 34 | ); 35 | } 36 | return match[1]; 37 | }; 38 | 39 | const jwtOptions = { 40 | audience: process.env.AUDIENCE, 41 | issuer: process.env.TOKEN_ISSUER, 42 | }; 43 | 44 | module.exports.authenticate = (params) => { 45 | console.log("params", params); 46 | const token = getToken(params); 47 | 48 | const decoded = jwt.decode(token, { complete: true }); 49 | if (!decoded || !decoded.header || !decoded.header.kid) { 50 | throw new Error("invalid token"); 51 | } 52 | 53 | const getSigningKey = util.promisify(client.getSigningKey); 54 | return getSigningKey(decoded.header.kid) 55 | .then((key) => { 56 | const signingKey = key.publicKey || key.rsaPublicKey; 57 | return jwt.verify(token, signingKey, jwtOptions); 58 | }) 59 | .then((decoded) => ({ 60 | principalId: decoded.sub, 61 | policyDocument: getPolicyDocument("Allow", params.methodArn), 62 | context: { scope: decoded.scope }, 63 | })); 64 | }; 65 | 66 | const client = jwksClient({ 67 | cache: true, 68 | rateLimit: true, 69 | jwksRequestsPerMinute: 10, // Default value 70 | jwksUri: process.env.JWKS_URI, 71 | }); 72 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/functions/custom-auth.js: -------------------------------------------------------------------------------- 1 | const lib = require("./custom-auth-lib"); 2 | let data; 3 | 4 | // Lambda function index.handler - thin wrapper around lib.authenticate 5 | module.exports.handler = async (event, context, callback) => { 6 | try { 7 | data = await lib.authenticate(event); 8 | } catch (err) { 9 | console.log(err); 10 | return context.fail("Unauthorized"); 11 | } 12 | return data; 13 | }; 14 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/functions/protected.js: -------------------------------------------------------------------------------- 1 | // craete a lambda nodejs function 2 | 3 | module.exports.handler = async (event) => { 4 | const responseMessage = "Hello from Secure API Gateway Custom Authorizer!"; 5 | 6 | return { 7 | statusCode: 200, 8 | body: JSON.stringify({ 9 | message: responseMessage, 10 | }), 11 | }; 12 | }; 13 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: 'node' 3 | } 4 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/lib/secure-api-gateway-custom-authorizer-stack.js: -------------------------------------------------------------------------------- 1 | const { Stack, Duration } = require("aws-cdk-lib"); 2 | const nodejs = require("aws-cdk-lib/aws-lambda-nodejs"); 3 | const lambda = require("aws-cdk-lib/aws-lambda"); 4 | const apigateway = require("aws-cdk-lib/aws-apigateway"); 5 | const config = require("../config"); 6 | 7 | class SecureApiGatewayCustomAuthorizerStack extends Stack { 8 | /** 9 | * 10 | * @param {Construct} scope 11 | * @param {string} id 12 | * @param {StackProps=} props 13 | */ 14 | constructor(scope, id, props) { 15 | super(scope, id, props); 16 | 17 | // Define AWS Lambda 18 | const handler = new nodejs.NodejsFunction( 19 | this, 20 | "SecureApiGatewayCustomAuthorizerLambda", 21 | { 22 | runtime: lambda.Runtime.NODEJS_20_X, 23 | handler: "handler", 24 | entry: "functions/protected.js", 25 | } 26 | ); 27 | 28 | const authLambda = new nodejs.NodejsFunction( 29 | this, 30 | "SecureApiGatewayCustomAuthorizerAuthLambda", 31 | { 32 | runtime: lambda.Runtime.NODEJS_20_X, 33 | handler: "handler", 34 | entry: "functions/custom-auth.js", 35 | environment: { 36 | AUDIENCE: config.AUDIENCE, 37 | TOKEN_ISSUER: config.ISSUER, 38 | JWKS_URI: config.JWKS_URI, 39 | }, 40 | } 41 | ); 42 | 43 | const api = new apigateway.RestApi(this, "secure-api-gw-custom-auth", { 44 | restApiName: "Secure API Gateway Custom Authorizer", 45 | description: "This is a sample API Gateway Custom Authorizer", 46 | }); 47 | 48 | const authorizer = new apigateway.TokenAuthorizer( 49 | this, 50 | "SecureApiGatewayCustomAuthorizer", 51 | { 52 | handler: authLambda, 53 | identitySources: [apigateway.IdentitySource.header("Authorization")], 54 | resultsCacheTtl: Duration.seconds(0), 55 | } 56 | ); 57 | 58 | const post = new apigateway.LambdaIntegration(handler, { 59 | requestTemplates: { "application/json": '{ "statusCode": "200" }' }, 60 | }); 61 | 62 | api.root.addMethod("POST", post, { 63 | authorizer: authorizer, 64 | authorizationType: apigateway.AuthorizationType.CUSTOM, 65 | }); 66 | } 67 | } 68 | 69 | module.exports = { SecureApiGatewayCustomAuthorizerStack }; 70 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "secure-api-gateway-custom-authorizer", 3 | "version": "0.1.0", 4 | "bin": { 5 | "secure-api-gateway-custom-authorizer": "bin/secure-api-gateway-custom-authorizer.js" 6 | }, 7 | "scripts": { 8 | "build": "echo \"The build step is not required when using JavaScript!\" && exit 0", 9 | "cdk": "cdk", 10 | "test": "jest" 11 | }, 12 | "devDependencies": { 13 | "aws-cdk": "2.110.1", 14 | "jest": "^29.7.0" 15 | }, 16 | "dependencies": { 17 | "aws-cdk-lib": "2.110.1", 18 | "constructs": "^10.0.0", 19 | "jsonwebtoken": "^9.0.2", 20 | "jwks-rsa": "^3.1.0", 21 | "util": "^0.12.5" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /secure-api-gateway-custom-authorizer/test/secure-api-gateway-custom-authorizer.test.js: -------------------------------------------------------------------------------- 1 | // const cdk = require('aws-cdk-lib'); 2 | // const { Template } = require('aws-cdk-lib/assertions'); 3 | // const SecureApiGatewayCustomAuthorizer = require('../lib/secure-api-gateway-custom-authorizer-stack'); 4 | 5 | // example test. To run these tests, uncomment this file along with the 6 | // example resource in lib/secure-api-gateway-custom-authorizer-stack.js 7 | test('SQS Queue Created', () => { 8 | // const app = new cdk.App(); 9 | // // WHEN 10 | // const stack = new SecureApiGatewayCustomAuthorizer.SecureApiGatewayCustomAuthorizerStack(app, 'MyTestStack'); 11 | // // THEN 12 | // const template = Template.fromStack(stack); 13 | 14 | // template.hasResourceProperties('AWS::SQS::Queue', { 15 | // VisibilityTimeout: 300 16 | // }); 17 | }); 18 | -------------------------------------------------------------------------------- /upload-to-s3-from-lambda/.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | node_modules 3 | .serverless -------------------------------------------------------------------------------- /upload-to-s3-from-lambda/.npmignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /upload-to-s3-from-lambda/config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "S3_BUCKET_NAME":"my-s3-with-lambda-upload-example" 3 | } -------------------------------------------------------------------------------- /upload-to-s3-from-lambda/handler.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const AWS = require('aws-sdk'); 4 | const S3 = new AWS.S3(); 5 | const config = require('./config.json') 6 | 7 | module.exports.uploadFn = async (event) => { 8 | const fileToUpload = { 9 | userId:"123456", 10 | email:"enrico@gmail.com", 11 | city:"London", 12 | country:"UK" 13 | } 14 | try { 15 | const params = { 16 | Bucket: config.S3_BUCKET_NAME, 17 | Key: `upload-to-s3/${fileToUpload.userId}`, 18 | Body: JSON.stringify(fileToUpload), 19 | ContentType: 'application/json; charset=utf-8' 20 | } 21 | await S3.putObject(params).promise(); 22 | console.log("Upload Completed"); 23 | } catch(e){ 24 | console.log(e) 25 | console.log("Upload Error", e); 26 | } 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /upload-to-s3-from-lambda/serverless.yml: -------------------------------------------------------------------------------- 1 | service: upload-to-s3-from-lambda 2 | frameworkVersion: '2' 3 | 4 | provider: 5 | name: aws 6 | runtime: nodejs12.x 7 | lambdaHashingVersion: 20201221 8 | 9 | # you can add statements to the Lambda function's IAM Role here 10 | iamRoleStatements: 11 | - Effect: "Allow" 12 | Action: 13 | - "s3:PutObject" 14 | Resource: 15 | - "arn:aws:s3:::${file(config.json):S3_BUCKET_NAME}/*" 16 | 17 | functions: 18 | hello: 19 | handler: handler.uploadFn 20 | --------------------------------------------------------------------------------