From 387e8ee7d265a70c75542932ce6d4ca2a7da22a4 Mon Sep 17 00:00:00 2001 From: Marat Levit Date: Mon, 29 Aug 2022 15:19:18 +1000 Subject: [PATCH] Large execution log support (#122) * Added example identifiers * Better support for larger execution logs * Better margin for loading button * Moved table info to footer * Better help text * Fixed card modal width * Fixed security vulnerabilities * Changelog * Readme updates * Added Zlib compression to large execution log files to overcome Lambda's 6MB response payload limit * Code cleanup * Added caching to Execution Log Read API * Fixed execution log not clearing between logs and more modal tweaks * Dependency updates and tweaks * Log processing pushed to backend * Removed Collection import * Increased memory based on tuning results https://lambda-power-tuning.show/#AAIABAAIABA=;BLR3RZpO+kQhHZdE5cCVRA==;B6kLONgjDTj4YSo4MfmoOA== * More tuning * no-wrap action column * Better data update functionality, no need to destroy each time * Updated API documentation * Small UI tweaks * Minor code fixes * Codacy cleanup * Function comment fixes * Reversed API_KEY const * Fixed other consts * Better display of long resource IDs * Fixed security alerts * Finalising change log * Version bump --- CHANGELOG.md | 6 +- api/README.md | 20 +- api/package-lock.json | 1220 ++++++++++++++++++++--- api/package.json | 5 +- api/serverless.yml | 17 +- api/src/execution_log/list.py | 2 +- api/src/execution_log/read.py | 49 +- app/README.md | 6 +- app/package-lock.json | 1177 ++++++++++++++++++++-- app/package.json | 2 +- app/src/airflow_cleanup.py | 7 +- app/src/amplify_cleanup.py | 5 +- app/src/cloudformation_cleanup.py | 5 +- app/src/cloudwatch_cleanup.py | 5 +- app/src/data/auto-cleanup-settings.json | 36 +- app/src/dynamodb_cleanup.py | 5 +- app/src/ec2_cleanup.py | 36 +- app/src/ecr_cleanup.py | 10 +- app/src/ecs_cleanup.py | 10 +- app/src/efs_cleanup.py | 5 +- app/src/eks_cleanup.py | 15 +- app/src/elasticache_cleanup.py | 10 +- app/src/elasticbeanstalk_cleanup.py | 5 +- app/src/elasticsearch_cleanup.py | 5 +- app/src/elb_cleanup.py | 5 +- app/src/emr_cleanup.py | 5 +- app/src/glue_cleanup.py | 15 +- app/src/iam_cleanup.py | 31 +- app/src/kafka_cleanup.py | 5 +- app/src/kinesis_cleanup.py | 5 +- app/src/lambda_cleanup.py | 5 +- app/src/main.py | 7 +- app/src/rds_cleanup.py | 12 +- app/src/redshift_cleanup.py | 10 +- app/src/s3_cleanup.py | 1 - app/src/sagemaker_cleanup.py | 15 +- app/src/transfer_cleanup.py | 8 +- app/test/__init__.py | 0 app/test/test_cloudformation.py | 119 --- app/test/test_dynamodb.py | 118 --- app/test/test_ec2.py | 298 ------ app/test/test_emr.py | 127 --- app/test/test_rds.py | 142 --- app/test/test_redshift.py | 256 ----- app/test/test_s3.py | 103 -- web/package.json | 2 +- web/src/css/style.css | 2 + web/src/index.html | 215 ++-- web/src/js/index.js | 84 +- 49 files changed, 2498 insertions(+), 1755 deletions(-) delete mode 100644 app/test/__init__.py delete mode 100644 app/test/test_cloudformation.py delete mode 100644 app/test/test_dynamodb.py delete mode 100644 app/test/test_ec2.py delete mode 100644 app/test/test_emr.py delete mode 100644 app/test/test_rds.py delete mode 100644 app/test/test_redshift.py delete mode 100644 app/test/test_s3.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c12aa058..12fdfeb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # AWS Auto Cleanup Changelog -- UNRELEASED +## 2.3.0 +- Added support for very large (20K+) execution log files. +- Added better resource ID placeholders giving users a better indication of expected value. +- Deprecated option to allowlist resources from execution log. - Fixed issue with not being able to allowlist ECR Images. -- Fixed issue with ECR Image cleanup never being run. ## 2.2.0 diff --git a/api/README.md b/api/README.md index 7677f1a2..c09d927c 100644 --- a/api/README.md +++ b/api/README.md @@ -442,7 +442,13 @@ dict { "message": "string", "request": { "key": "string" }, - "response": { "header": ["string"], "body": [["string"]] } + "response": { + "header": ["string"], + "body": [["string"]] // or Base64 encoded zlib compressed JSON object, + "statistics": { "key": { "key": "string" } }, + "is_compressed": "boolean", + "is_dry_run": "boolean" + } } ``` @@ -468,6 +474,18 @@ dict - _string_ + - **statistics** (dict) -- Statistics for the execution log. + + - _(dict)_ + + - **key** (string) -- Key for the statistics. + + - **string** (string) -- Value for the statistics. + + - **is_compressed** (boolean) -- Whether the execution log is compressed. + + - **is_dry_run** (boolean) -- Whether the execution log is a dry run. + ### Service #### Read diff --git a/api/package-lock.json b/api/package-lock.json index dfb064b9..9e153124 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "auto-cleanup-api", "version": "2.0.0", + "dependencies": { + "serverless-api-gateway-caching": "^1.8.1" + }, "devDependencies": { "serverless-manifest-plugin": "^1.0.6", "serverless-python-requirements": "^5.1.0" @@ -274,16 +277,16 @@ } }, "node_modules/@serverless/utils": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.0.3.tgz", - "integrity": "sha512-6oKLqAkK6CG2zjAs2rfuHEOLoK11K/oep5bwGTEb5JmFP/92JQtvyb+FxP4DknL4jYpiYj1Dd5sCt5auHhOASg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-aUjkkOTJ5wH7f3raSIDeTCR4JsAbd9p5Pjs7yW3sVOmu0qiTPHZOr1x1TIkb3WDHiAoQQY8zGhfzW7zLTcAA3Q==", "dev": true, "peer": true, "dependencies": { "archive-type": "^4.0.0", "chalk": "^4.1.2", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.0", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "content-disposition": "^0.5.4", "d": "^1.0.1", "decompress": "^4.2.1", @@ -293,8 +296,8 @@ "file-type": "^16.5.3", "filenamify": "^4.3.0", "get-stream": "^6.0.1", - "got": "^11.8.3", - "inquirer": "^8.2.0", + "got": "^11.8.5", + "inquirer": "^8.2.4", "js-yaml": "^4.1.0", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -303,8 +306,11 @@ "make-dir": "^3.1.0", "memoizee": "^0.4.15", "ncjsm": "^4.3.0", + "node-fetch": "^2.6.7", + "open": "^7.4.2", "p-event": "^4.2.0", "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", "type": "^2.6.0", "uni-global": "^1.0.0", "uuid": "^8.3.2", @@ -610,7 +616,7 @@ "node_modules/archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, "peer": true, "dependencies": { @@ -623,7 +629,7 @@ "node_modules/archive-type/node_modules/file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, "peer": true, "engines": { @@ -752,10 +758,23 @@ "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sdk": { - "version": "2.1127.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1127.0.tgz", - "integrity": "sha512-jtP0CV89m2XNfgi1SnomrK798QqLmR+340w4KOMF0vBkY9kvGzPLV9GBNcg3JPj45tML1H4hSIonYkUUFSLkYw==", + "version": "2.1181.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1181.0.tgz", + "integrity": "sha512-AAHSknRFAIjXBA/XNAL7gS79agr1LbS0oGimOJqJauGSJfWNaOpDc7z6OLNUQqGa5Joc3maD5QJcSKp1Pm/deQ==", "dev": true, "peer": true, "dependencies": { @@ -766,7 +785,8 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "util": "^0.12.4", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "engines": { @@ -776,7 +796,7 @@ "node_modules/aws-sdk/node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "peer": true, @@ -785,14 +805,13 @@ } }, "node_modules/aws-sdk/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, "peer": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/axios": { @@ -1141,9 +1160,9 @@ } }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true, "peer": true }, @@ -1178,15 +1197,15 @@ } }, "node_modules/cli-progress-footer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.1.tgz", - "integrity": "sha512-urD1hiEIQeZadVABtW5ExM8wse1phnmz15oJ4QEe46GQN87v1VBa0lZQ7gXkPELMzP6At4VY6v07baAiyztulw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", "dev": true, "peer": true, "dependencies": { "cli-color": "^2.0.2", "d": "^1.0.1", - "es5-ext": "^0.10.59", + "es5-ext": "^0.10.61", "mute-stream": "0.0.8", "process-utils": "^4.0.0", "timers-ext": "^0.1.7", @@ -1482,9 +1501,9 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", - "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", "dev": true, "peer": true }, @@ -1592,7 +1611,7 @@ "node_modules/decompress-tar/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true, "engines": { @@ -1696,7 +1715,7 @@ "node_modules/decompress-targz/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true, "engines": { @@ -1706,7 +1725,7 @@ "node_modules/decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "peer": true, "dependencies": { @@ -1722,7 +1741,7 @@ "node_modules/decompress-unzip/node_modules/file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, "peer": true, "engines": { @@ -1806,6 +1825,23 @@ "timers-ext": "^0.1.7" } }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "peer": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2005,6 +2041,62 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -2184,7 +2276,7 @@ "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, "peer": true, "engines": { @@ -2321,9 +2413,9 @@ } }, "node_modules/file-type": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", - "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dev": true, "peer": true, "dependencies": { @@ -2453,6 +2545,16 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -2560,6 +2662,35 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-amd-module-type": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", @@ -2623,6 +2754,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -2704,9 +2852,9 @@ } }, "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "peer": true, "dependencies": { @@ -2757,6 +2905,16 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2767,6 +2925,19 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -2780,6 +2951,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -2924,12 +3111,57 @@ "node": ">=12.0.0" } }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2943,6 +3175,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -2955,6 +3217,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -2988,6 +3266,22 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3017,6 +3311,19 @@ "dev": true, "peer": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3026,6 +3333,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -3064,6 +3387,36 @@ "dev": true, "peer": true }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3073,6 +3426,58 @@ "node": ">=0.10.0" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -3092,6 +3497,19 @@ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -3430,8 +3848,12 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -3977,6 +4399,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4617,6 +5068,24 @@ "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4818,7 +5287,7 @@ "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true, "peer": true }, @@ -4859,28 +5328,28 @@ } }, "node_modules/serverless": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.16.0.tgz", - "integrity": "sha512-z/UV32k+Pipii6CVtaCTDka5+rYExUwvF0Kx8808ghr7MstWclfL81x4CGDoXSTixRE/lus2KHLQfdljnunBnA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.21.0.tgz", + "integrity": "sha512-swDn12DWEN3jyb/DPrr+a5Gy+DcV+cI+Yuii+zjxGTPGrEDfLymPBEtx3e7YmxKWn174ekmRCfRNbbtffo3LcQ==", "dev": true, "hasInstallScript": true, "peer": true, "dependencies": { "@serverless/dashboard-plugin": "^6.2.2", "@serverless/platform-client": "^4.3.2", - "@serverless/utils": "^6.0.3", + "@serverless/utils": "^6.7.0", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "archiver": "^5.3.1", - "aws-sdk": "^2.1124.0", + "aws-sdk": "^2.1174.0", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.1", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "d": "^1.0.1", - "dayjs": "^1.11.1", + "dayjs": "^1.11.3", "decompress": "^4.2.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", @@ -4891,7 +5360,7 @@ "fs-extra": "^9.1.0", "get-stdin": "^8.0.0", "globby": "^11.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "graceful-fs": "^4.2.10", "https-proxy-agent": "^5.0.1", "is-docker": "^2.2.1", @@ -4928,6 +5397,15 @@ "node": ">=12.0" } }, + "node_modules/serverless-api-gateway-caching": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/serverless-api-gateway-caching/-/serverless-api-gateway-caching-1.8.1.tgz", + "integrity": "sha512-Kqh9x0F8tq4trInIZ/YmAuR+fTb9moWaP2/jFKcdr+77vDh4cZIkleH+/35nUOGuaNoruHiDlSKALGEp+VsdUw==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0" + } + }, "node_modules/serverless-manifest-plugin": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/serverless-manifest-plugin/-/serverless-manifest-plugin-1.0.9.tgz", @@ -5213,12 +5691,42 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { @@ -5598,6 +6106,22 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -5681,7 +6205,7 @@ "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "peer": true, "dependencies": { @@ -5692,14 +6216,14 @@ "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true, "peer": true }, "node_modules/url/node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "peer": true, @@ -5707,6 +6231,21 @@ "node": ">=0.4.x" } }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5783,12 +6322,50 @@ "which": "bin/which" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -5872,7 +6449,7 @@ "node_modules/xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "dev": true, "peer": true, "engines": { @@ -6217,16 +6794,16 @@ } }, "@serverless/utils": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.0.3.tgz", - "integrity": "sha512-6oKLqAkK6CG2zjAs2rfuHEOLoK11K/oep5bwGTEb5JmFP/92JQtvyb+FxP4DknL4jYpiYj1Dd5sCt5auHhOASg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-aUjkkOTJ5wH7f3raSIDeTCR4JsAbd9p5Pjs7yW3sVOmu0qiTPHZOr1x1TIkb3WDHiAoQQY8zGhfzW7zLTcAA3Q==", "dev": true, "peer": true, "requires": { "archive-type": "^4.0.0", "chalk": "^4.1.2", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.0", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "content-disposition": "^0.5.4", "d": "^1.0.1", "decompress": "^4.2.1", @@ -6236,8 +6813,8 @@ "file-type": "^16.5.3", "filenamify": "^4.3.0", "get-stream": "^6.0.1", - "got": "^11.8.3", - "inquirer": "^8.2.0", + "got": "^11.8.5", + "inquirer": "^8.2.4", "js-yaml": "^4.1.0", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -6246,8 +6823,11 @@ "make-dir": "^3.1.0", "memoizee": "^0.4.15", "ncjsm": "^4.3.0", + "node-fetch": "^2.6.7", + "open": "^7.4.2", "p-event": "^4.2.0", "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", "type": "^2.6.0", "uni-global": "^1.0.0", "uuid": "^8.3.2", @@ -6480,7 +7060,7 @@ "archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, "peer": true, "requires": { @@ -6490,7 +7070,7 @@ "file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, "peer": true } @@ -6605,10 +7185,17 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true + }, "aws-sdk": { - "version": "2.1127.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1127.0.tgz", - "integrity": "sha512-jtP0CV89m2XNfgi1SnomrK798QqLmR+340w4KOMF0vBkY9kvGzPLV9GBNcg3JPj45tML1H4hSIonYkUUFSLkYw==", + "version": "2.1181.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1181.0.tgz", + "integrity": "sha512-AAHSknRFAIjXBA/XNAL7gS79agr1LbS0oGimOJqJauGSJfWNaOpDc7z6OLNUQqGa5Joc3maD5QJcSKp1Pm/deQ==", "dev": true, "peer": true, "requires": { @@ -6619,21 +7206,22 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "util": "^0.12.4", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "dependencies": { "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true, "peer": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, "peer": true } @@ -6904,9 +7492,9 @@ "peer": true }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true, "peer": true }, @@ -6935,15 +7523,15 @@ } }, "cli-progress-footer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.1.tgz", - "integrity": "sha512-urD1hiEIQeZadVABtW5ExM8wse1phnmz15oJ4QEe46GQN87v1VBa0lZQ7gXkPELMzP6At4VY6v07baAiyztulw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", "dev": true, "peer": true, "requires": { "cli-color": "^2.0.2", "d": "^1.0.1", - "es5-ext": "^0.10.59", + "es5-ext": "^0.10.61", "mute-stream": "0.0.8", "process-utils": "^4.0.0", "timers-ext": "^0.1.7", @@ -7187,9 +7775,9 @@ } }, "dayjs": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", - "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", "dev": true, "peer": true }, @@ -7291,7 +7879,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true }, @@ -7384,7 +7972,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true } @@ -7393,7 +7981,7 @@ "decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "peer": true, "requires": { @@ -7406,7 +7994,7 @@ "file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, "peer": true }, @@ -7460,6 +8048,17 @@ "timers-ext": "^0.1.7" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "peer": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -7625,6 +8224,50 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -7774,7 +8417,7 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, "peer": true }, @@ -7890,9 +8533,9 @@ } }, "file-type": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", - "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dev": true, "peer": true, "requires": { @@ -7977,6 +8620,16 @@ "dev": true, "peer": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -8061,6 +8714,26 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true + }, "get-amd-module-type": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", @@ -8103,6 +8776,17 @@ "dev": true, "peer": true }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -8160,9 +8844,9 @@ } }, "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "peer": true, "requires": { @@ -8204,6 +8888,13 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8211,6 +8902,16 @@ "dev": true, "peer": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8218,6 +8919,16 @@ "dev": true, "peer": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -8344,12 +9055,45 @@ "wrap-ansi": "^7.0.0" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -8360,6 +9104,24 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "peer": true + }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -8369,6 +9131,16 @@ "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -8387,6 +9159,16 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8410,12 +9192,29 @@ "dev": true, "peer": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -8445,12 +9244,67 @@ "dev": true, "peer": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -8464,6 +9318,16 @@ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8771,8 +9635,12 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" }, "lodash.isplainobject": { "version": "4.0.6", @@ -9200,6 +10068,26 @@ "dev": true, "peer": true }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9660,6 +10548,18 @@ "picomatch": "^2.2.1" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9791,7 +10691,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true, "peer": true }, @@ -9824,27 +10724,27 @@ } }, "serverless": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.16.0.tgz", - "integrity": "sha512-z/UV32k+Pipii6CVtaCTDka5+rYExUwvF0Kx8808ghr7MstWclfL81x4CGDoXSTixRE/lus2KHLQfdljnunBnA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.21.0.tgz", + "integrity": "sha512-swDn12DWEN3jyb/DPrr+a5Gy+DcV+cI+Yuii+zjxGTPGrEDfLymPBEtx3e7YmxKWn174ekmRCfRNbbtffo3LcQ==", "dev": true, "peer": true, "requires": { "@serverless/dashboard-plugin": "^6.2.2", "@serverless/platform-client": "^4.3.2", - "@serverless/utils": "^6.0.3", + "@serverless/utils": "^6.7.0", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "archiver": "^5.3.1", - "aws-sdk": "^2.1124.0", + "aws-sdk": "^2.1174.0", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.1", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "d": "^1.0.1", - "dayjs": "^1.11.1", + "dayjs": "^1.11.3", "decompress": "^4.2.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", @@ -9855,7 +10755,7 @@ "fs-extra": "^9.1.0", "get-stdin": "^8.0.0", "globby": "^11.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "graceful-fs": "^4.2.10", "https-proxy-agent": "^5.0.1", "is-docker": "^2.2.1", @@ -9885,6 +10785,15 @@ "yaml-ast-parser": "0.0.43" } }, + "serverless-api-gateway-caching": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/serverless-api-gateway-caching/-/serverless-api-gateway-caching-1.8.1.tgz", + "integrity": "sha512-Kqh9x0F8tq4trInIZ/YmAuR+fTb9moWaP2/jFKcdr+77vDh4cZIkleH+/35nUOGuaNoruHiDlSKALGEp+VsdUw==", + "requires": { + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0" + } + }, "serverless-manifest-plugin": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/serverless-manifest-plugin/-/serverless-manifest-plugin-1.0.9.tgz", @@ -10130,6 +11039,30 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -10426,6 +11359,19 @@ "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -10491,7 +11437,7 @@ "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "peer": true, "requires": { @@ -10502,19 +11448,34 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true, "peer": true }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true, "peer": true } } }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10585,12 +11546,41 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -10648,7 +11638,7 @@ "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "dev": true, "peer": true }, diff --git a/api/package.json b/api/package.json index a1c4eaee..e841246e 100644 --- a/api/package.json +++ b/api/package.json @@ -1,7 +1,7 @@ { "name": "auto-cleanup-api", "description": "Auto Cleanup API", - "version": "2.0.0", + "version": "2.3.0", "private": true, "devDependencies": { "serverless-manifest-plugin": "^1.0.6", @@ -16,5 +16,8 @@ "scripts": { "deploy": "serverless deploy", "remove": "serverless remove" + }, + "dependencies": { + "serverless-api-gateway-caching": "^1.8.1" } } diff --git a/api/serverless.yml b/api/serverless.yml index c91c3534..225ac6b3 100644 --- a/api/serverless.yml +++ b/api/serverless.yml @@ -3,6 +3,8 @@ service: auto-cleanup-api custom: log_level: INFO # DEBUG for dev | INFO for prod region: ${opt:region, "ap-southeast-2"} # AWS deployment region + apiGatewayCaching: + enabled: true manifest: output: ../web/src/serverless.manifest.json silent: true @@ -25,7 +27,7 @@ provider: apiGateway: apiKeys: - ${self:service}-${self:provider.stage}-api-key - minimumCompressionSize: 1024 + minimumCompressionSize: 0 iam: role: statements: @@ -77,7 +79,7 @@ functions: handler: src/allowlist/read.lambda_handler name: ${self:service}-${self:provider.stage}-allowlist-read description: Read allowlist - memorySize: 128 + memorySize: 512 timeout: 30 package: patterns: @@ -137,7 +139,7 @@ functions: handler: src/service/read.lambda_handler name: ${self:service}-${self:provider.stage}-service-read description: Returns AWS services supported by Auto Cleanup - memorySize: 128 + memorySize: 512 timeout: 30 package: patterns: @@ -158,7 +160,7 @@ functions: handler: src/execution_log/list.lambda_handler name: ${self:service}-${self:provider.stage}-execution-log-list description: Returns execution logs - memorySize: 128 + memorySize: 512 timeout: 30 package: patterns: @@ -177,7 +179,7 @@ functions: handler: src/execution_log/read.lambda_handler name: ${self:service}-${self:provider.stage}-execution-log-read description: Returns execution logs - memorySize: 128 + memorySize: 2048 timeout: 30 package: patterns: @@ -192,6 +194,10 @@ functions: path: /execution/{key} cors: true private: true + caching: + enabled: true + cacheKeyParameters: + - name: request.path.key resources: Outputs: @@ -199,5 +205,6 @@ resources: Value: !Ref AWS::AccountId plugins: + - serverless-api-gateway-caching - serverless-manifest-plugin - serverless-python-requirements diff --git a/api/src/execution_log/list.py b/api/src/execution_log/list.py index 391cc779..5f9fa20f 100644 --- a/api/src/execution_log/list.py +++ b/api/src/execution_log/list.py @@ -45,4 +45,4 @@ def lambda_handler(event, context): None, ) - return get_return(200, f"List of execution logs retrieved", None, {"logs": logs}) + return get_return(200, "List of execution logs retrieved", None, {"logs": logs}) diff --git a/api/src/execution_log/read.py b/api/src/execution_log/read.py index ce8e325e..2c74fc22 100644 --- a/api/src/execution_log/read.py +++ b/api/src/execution_log/read.py @@ -1,6 +1,8 @@ +import base64 import csv import json import os +import zlib from urllib.parse import unquote import boto3 @@ -43,8 +45,7 @@ def lambda_handler(event, context): .read() .decode("utf-8") ) - - body = list(csv.reader(file_contents.splitlines())) + file_body = list(csv.reader(file_contents.splitlines())) except Exception as error: print(f"[ERROR] {error}") return get_return( @@ -54,9 +55,51 @@ def lambda_handler(event, context): None, ) + body = [] + statistics = {"action": {}, "service": {}, "region": {}} + + for row in file_body[1:]: + # Create smaller body object removing unecessary fields + body.append( + [ + row[6], + row[1], + row[2], + row[3], + row[4], + row[5], + ] + ) + + # Gather statistics, group by's + statistics["action"][row[5]] = statistics["action"].get(row[5], 0) + 1 + statistics["service"][row[2] + " " + row[3]] = ( + statistics["service"].get(row[2] + " " + row[3], 0) + 1 + ) + statistics["region"][row[1]] = statistics["region"].get(row[1], 0) + 1 + + header = ["timestamp", "region", "service", "resource", "id", "action"] + is_dry_run = True if file_body[1][7] == "True" else False + + # Compress data using zlib if file length is greater than 10,000 rows + is_compressed = True if len(file_body) > 10000 else False + body = ( + base64.b64encode(zlib.compress(bytes(json.dumps(body), "utf-8"))).decode( + "ascii" + ) + if is_compressed + else body + ) + return get_return( 200, f"Execution log for S3 file '{key}' retrieved", parameters, - {"header": body[0], "body": body[1:None]}, + { + "header": header, + "body": body, + "statistics": statistics, + "is_compressed": is_compressed, + "is_dry_run": is_dry_run, + }, ) diff --git a/app/README.md b/app/README.md index 8e8e41d8..f6ee439e 100644 --- a/app/README.md +++ b/app/README.md @@ -145,12 +145,12 @@ The below table indicates AWS resources that are supported by Auto Cleanup along | EKS Clusters | Cluster Name | `eks:cluster:cluster_name` | | EKS Fargate Profiles | Fargate Profile Name | `eks:fargate_profile:fargate_profile_name` | | EKS Node Groups | Node Group Name | `eks:node_group:node_group_name` | -| Elastic Beanstalk Applications | Application Name | `elasticbeanstalk:application:application_name` | +| Elastic Beanstalk Applications | Application Name | `elastic_beanstalk:application:application_name` | | ElastiCache Clusters | Cache Cluster ID | `elasticache:cluster:cache_cluster_id` | | ElastiCache Replication Groups | Replication Group ID | `elasticache:replication_group:replication_group_id` | -| Elasticsearch Service | Domain Name | `elasticsearch:domain:domain_name` | +| Elasticsearch Service | Domain Name | `elasticsearch_service:domain:domain_name` | | ELB Load Balancers | Load Balancer Name | `elb:load_balancer:load_balancer_name` | -| EMR Clusters | ID | `emr:cluster:id` | +| EMR Clusters | Job Flow ID | `emr:cluster:job_flow_id` | | Glue Crawlers | Crawler Name | `glue:crawler:crawler_name` | | Glue Databases | Database Name | `glue:database:database_name` | | Glue Dev Endpoints | Endpoint Name | `glue:dev_endpoint:endpoint_name` | diff --git a/app/package-lock.json b/app/package-lock.json index a8a3a210..94c5bf9a 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "auto-cleanup-app", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "auto-cleanup-app", - "version": "2.1.0", + "version": "2.2.0", "devDependencies": { "serverless-python-requirements": "^5.1.0" } @@ -167,16 +167,16 @@ } }, "node_modules/@serverless/utils": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.0.3.tgz", - "integrity": "sha512-6oKLqAkK6CG2zjAs2rfuHEOLoK11K/oep5bwGTEb5JmFP/92JQtvyb+FxP4DknL4jYpiYj1Dd5sCt5auHhOASg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-aUjkkOTJ5wH7f3raSIDeTCR4JsAbd9p5Pjs7yW3sVOmu0qiTPHZOr1x1TIkb3WDHiAoQQY8zGhfzW7zLTcAA3Q==", "dev": true, "peer": true, "dependencies": { "archive-type": "^4.0.0", "chalk": "^4.1.2", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.0", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "content-disposition": "^0.5.4", "d": "^1.0.1", "decompress": "^4.2.1", @@ -186,8 +186,8 @@ "file-type": "^16.5.3", "filenamify": "^4.3.0", "get-stream": "^6.0.1", - "got": "^11.8.3", - "inquirer": "^8.2.0", + "got": "^11.8.5", + "inquirer": "^8.2.4", "js-yaml": "^4.1.0", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -196,8 +196,11 @@ "make-dir": "^3.1.0", "memoizee": "^0.4.15", "ncjsm": "^4.3.0", + "node-fetch": "^2.6.7", + "open": "^7.4.2", "p-event": "^4.2.0", "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", "type": "^2.6.0", "uni-global": "^1.0.0", "uuid": "^8.3.2", @@ -440,7 +443,7 @@ "node_modules/archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, "peer": true, "dependencies": { @@ -453,7 +456,7 @@ "node_modules/archive-type/node_modules/file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, "peer": true, "engines": { @@ -574,10 +577,23 @@ "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sdk": { - "version": "2.1127.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1127.0.tgz", - "integrity": "sha512-jtP0CV89m2XNfgi1SnomrK798QqLmR+340w4KOMF0vBkY9kvGzPLV9GBNcg3JPj45tML1H4hSIonYkUUFSLkYw==", + "version": "2.1181.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1181.0.tgz", + "integrity": "sha512-AAHSknRFAIjXBA/XNAL7gS79agr1LbS0oGimOJqJauGSJfWNaOpDc7z6OLNUQqGa5Joc3maD5QJcSKp1Pm/deQ==", "dev": true, "peer": true, "dependencies": { @@ -588,7 +604,8 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "util": "^0.12.4", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "engines": { @@ -598,7 +615,7 @@ "node_modules/aws-sdk/node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "peer": true, @@ -607,14 +624,13 @@ } }, "node_modules/aws-sdk/node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, "peer": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/axios": { @@ -964,9 +980,9 @@ } }, "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true, "peer": true }, @@ -1001,15 +1017,15 @@ } }, "node_modules/cli-progress-footer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.1.tgz", - "integrity": "sha512-urD1hiEIQeZadVABtW5ExM8wse1phnmz15oJ4QEe46GQN87v1VBa0lZQ7gXkPELMzP6At4VY6v07baAiyztulw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", "dev": true, "peer": true, "dependencies": { "cli-color": "^2.0.2", "d": "^1.0.1", - "es5-ext": "^0.10.59", + "es5-ext": "^0.10.61", "mute-stream": "0.0.8", "process-utils": "^4.0.0", "timers-ext": "^0.1.7", @@ -1305,9 +1321,9 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", - "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", "dev": true, "peer": true }, @@ -1416,7 +1432,7 @@ "node_modules/decompress-tar/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true, "engines": { @@ -1520,7 +1536,7 @@ "node_modules/decompress-targz/node_modules/file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true, "engines": { @@ -1530,7 +1546,7 @@ "node_modules/decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "peer": true, "dependencies": { @@ -1546,7 +1562,7 @@ "node_modules/decompress-unzip/node_modules/file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, "peer": true, "engines": { @@ -1624,6 +1640,23 @@ "timers-ext": "^0.1.7" } }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "peer": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1690,6 +1723,62 @@ "once": "^1.4.0" } }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -1822,7 +1911,7 @@ "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, "peer": true, "engines": { @@ -1955,9 +2044,9 @@ } }, "node_modules/file-type": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", - "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dev": true, "peer": true, "dependencies": { @@ -2081,6 +2170,16 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -2189,6 +2288,35 @@ "dev": true, "peer": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2239,6 +2367,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -2307,9 +2452,9 @@ } }, "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "peer": true, "dependencies": { @@ -2361,6 +2506,16 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2371,6 +2526,19 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -2384,6 +2552,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -2508,6 +2692,51 @@ "node": ">=12.0.0" } }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2521,6 +2750,52 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -2555,6 +2830,22 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2585,6 +2876,19 @@ "dev": true, "peer": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2595,6 +2899,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -2633,6 +2953,36 @@ "dev": true, "peer": true }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -2642,6 +2992,58 @@ "node": ">=0.10.0" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -2655,6 +3057,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -3420,6 +3835,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3877,6 +4321,24 @@ "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4057,7 +4519,7 @@ "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true, "peer": true }, @@ -4099,28 +4561,28 @@ } }, "node_modules/serverless": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.16.0.tgz", - "integrity": "sha512-z/UV32k+Pipii6CVtaCTDka5+rYExUwvF0Kx8808ghr7MstWclfL81x4CGDoXSTixRE/lus2KHLQfdljnunBnA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.21.0.tgz", + "integrity": "sha512-swDn12DWEN3jyb/DPrr+a5Gy+DcV+cI+Yuii+zjxGTPGrEDfLymPBEtx3e7YmxKWn174ekmRCfRNbbtffo3LcQ==", "dev": true, "hasInstallScript": true, "peer": true, "dependencies": { "@serverless/dashboard-plugin": "^6.2.2", "@serverless/platform-client": "^4.3.2", - "@serverless/utils": "^6.0.3", + "@serverless/utils": "^6.7.0", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "archiver": "^5.3.1", - "aws-sdk": "^2.1124.0", + "aws-sdk": "^2.1174.0", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.1", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "d": "^1.0.1", - "dayjs": "^1.11.1", + "dayjs": "^1.11.3", "decompress": "^4.2.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", @@ -4131,7 +4593,7 @@ "fs-extra": "^9.1.0", "get-stdin": "^8.0.0", "globby": "^11.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "graceful-fs": "^4.2.10", "https-proxy-agent": "^5.0.1", "is-docker": "^2.2.1", @@ -4396,6 +4858,36 @@ "node": ">=8" } }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4716,6 +5208,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -4793,7 +5301,7 @@ "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "peer": true, "dependencies": { @@ -4804,14 +5312,14 @@ "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true, "peer": true }, "node_modules/url/node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "peer": true, @@ -4819,6 +5327,21 @@ "node": ">=0.4.x" } }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4885,12 +5408,50 @@ "which": "bin/which" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4965,7 +5526,7 @@ "node_modules/xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "dev": true, "peer": true, "engines": { @@ -5230,16 +5791,16 @@ } }, "@serverless/utils": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.0.3.tgz", - "integrity": "sha512-6oKLqAkK6CG2zjAs2rfuHEOLoK11K/oep5bwGTEb5JmFP/92JQtvyb+FxP4DknL4jYpiYj1Dd5sCt5auHhOASg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.7.0.tgz", + "integrity": "sha512-aUjkkOTJ5wH7f3raSIDeTCR4JsAbd9p5Pjs7yW3sVOmu0qiTPHZOr1x1TIkb3WDHiAoQQY8zGhfzW7zLTcAA3Q==", "dev": true, "peer": true, "requires": { "archive-type": "^4.0.0", "chalk": "^4.1.2", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.0", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "content-disposition": "^0.5.4", "d": "^1.0.1", "decompress": "^4.2.1", @@ -5249,8 +5810,8 @@ "file-type": "^16.5.3", "filenamify": "^4.3.0", "get-stream": "^6.0.1", - "got": "^11.8.3", - "inquirer": "^8.2.0", + "got": "^11.8.5", + "inquirer": "^8.2.4", "js-yaml": "^4.1.0", "jwt-decode": "^3.1.2", "lodash": "^4.17.21", @@ -5259,8 +5820,11 @@ "make-dir": "^3.1.0", "memoizee": "^0.4.15", "ncjsm": "^4.3.0", + "node-fetch": "^2.6.7", + "open": "^7.4.2", "p-event": "^4.2.0", "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", "type": "^2.6.0", "uni-global": "^1.0.0", "uuid": "^8.3.2", @@ -5456,7 +6020,7 @@ "archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, "peer": true, "requires": { @@ -5466,7 +6030,7 @@ "file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, "peer": true } @@ -5576,10 +6140,17 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true + }, "aws-sdk": { - "version": "2.1127.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1127.0.tgz", - "integrity": "sha512-jtP0CV89m2XNfgi1SnomrK798QqLmR+340w4KOMF0vBkY9kvGzPLV9GBNcg3JPj45tML1H4hSIonYkUUFSLkYw==", + "version": "2.1181.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1181.0.tgz", + "integrity": "sha512-AAHSknRFAIjXBA/XNAL7gS79agr1LbS0oGimOJqJauGSJfWNaOpDc7z6OLNUQqGa5Joc3maD5QJcSKp1Pm/deQ==", "dev": true, "peer": true, "requires": { @@ -5590,21 +6161,22 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "util": "^0.12.4", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "dependencies": { "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true, "peer": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", "dev": true, "peer": true } @@ -5876,9 +6448,9 @@ "peer": true }, "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true, "peer": true }, @@ -5907,15 +6479,15 @@ } }, "cli-progress-footer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.1.tgz", - "integrity": "sha512-urD1hiEIQeZadVABtW5ExM8wse1phnmz15oJ4QEe46GQN87v1VBa0lZQ7gXkPELMzP6At4VY6v07baAiyztulw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", "dev": true, "peer": true, "requires": { "cli-color": "^2.0.2", "d": "^1.0.1", - "es5-ext": "^0.10.59", + "es5-ext": "^0.10.61", "mute-stream": "0.0.8", "process-utils": "^4.0.0", "timers-ext": "^0.1.7", @@ -6159,9 +6731,9 @@ } }, "dayjs": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.1.tgz", - "integrity": "sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA==", + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", "dev": true, "peer": true }, @@ -6264,7 +6836,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true }, @@ -6357,7 +6929,7 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, "peer": true } @@ -6366,7 +6938,7 @@ "decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, "peer": true, "requires": { @@ -6379,7 +6951,7 @@ "file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, "peer": true }, @@ -6427,6 +6999,17 @@ "timers-ext": "^0.1.7" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "peer": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6484,6 +7067,50 @@ "once": "^1.4.0" } }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -6604,7 +7231,7 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", "dev": true, "peer": true }, @@ -6716,9 +7343,9 @@ } }, "file-type": { - "version": "16.5.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", - "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", "dev": true, "peer": true, "requires": { @@ -6798,6 +7425,16 @@ "dev": true, "peer": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -6883,6 +7520,26 @@ "dev": true, "peer": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -6915,6 +7572,17 @@ "dev": true, "peer": true }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -6965,9 +7633,9 @@ } }, "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "peer": true, "requires": { @@ -7010,6 +7678,13 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7017,6 +7692,16 @@ "dev": true, "peer": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -7024,6 +7709,16 @@ "dev": true, "peer": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -7130,6 +7825,39 @@ "wrap-ansi": "^7.0.0" } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7140,6 +7868,34 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "peer": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -7159,6 +7915,16 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7183,6 +7949,13 @@ "dev": true, "peer": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7190,6 +7963,16 @@ "dev": true, "peer": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -7219,12 +8002,67 @@ "dev": true, "peer": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -7232,6 +8070,16 @@ "dev": true, "peer": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7867,6 +8715,26 @@ "dev": true, "peer": true }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8190,6 +9058,18 @@ "picomatch": "^2.2.1" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8306,7 +9186,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", "dev": true, "peer": true }, @@ -8340,27 +9220,27 @@ } }, "serverless": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.16.0.tgz", - "integrity": "sha512-z/UV32k+Pipii6CVtaCTDka5+rYExUwvF0Kx8808ghr7MstWclfL81x4CGDoXSTixRE/lus2KHLQfdljnunBnA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.21.0.tgz", + "integrity": "sha512-swDn12DWEN3jyb/DPrr+a5Gy+DcV+cI+Yuii+zjxGTPGrEDfLymPBEtx3e7YmxKWn174ekmRCfRNbbtffo3LcQ==", "dev": true, "peer": true, "requires": { "@serverless/dashboard-plugin": "^6.2.2", "@serverless/platform-client": "^4.3.2", - "@serverless/utils": "^6.0.3", + "@serverless/utils": "^6.7.0", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "archiver": "^5.3.1", - "aws-sdk": "^2.1124.0", + "aws-sdk": "^2.1174.0", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^2.1.1", - "ci-info": "^3.3.0", - "cli-progress-footer": "^2.3.1", + "ci-info": "^3.3.2", + "cli-progress-footer": "^2.3.2", "d": "^1.0.1", - "dayjs": "^1.11.1", + "dayjs": "^1.11.3", "decompress": "^4.2.1", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", @@ -8371,7 +9251,7 @@ "fs-extra": "^9.1.0", "get-stdin": "^8.0.0", "globby": "^11.1.0", - "got": "^11.8.3", + "got": "^11.8.5", "graceful-fs": "^4.2.10", "https-proxy-agent": "^5.0.1", "is-docker": "^2.2.1", @@ -8587,6 +9467,30 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8846,6 +9750,19 @@ "dev": true, "peer": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -8905,7 +9822,7 @@ "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "dev": true, "peer": true, "requires": { @@ -8916,19 +9833,34 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true, "peer": true }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", "dev": true, "peer": true } } }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dev": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8989,12 +9921,41 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9046,7 +10007,7 @@ "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", "dev": true, "peer": true }, diff --git a/app/package.json b/app/package.json index 4cafac10..cd284d1f 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "auto-cleanup-app", "description": "Auto Cleanup App", - "version": "2.2.0", + "version": "2.3.0", "private": true, "devDependencies": { "serverless-python-requirements": "^5.1.0" diff --git a/app/src/airflow_cleanup.py b/app/src/airflow_cleanup.py index 755790a6..9603412b 100644 --- a/app/src/airflow_cleanup.py +++ b/app/src/airflow_cleanup.py @@ -1,8 +1,8 @@ -import fnmatch import sys import boto3 import botocore + from src.helper import Helper @@ -27,10 +27,7 @@ def run(self): self.environments() def environments(self): - """ - Deletes Airflow Environments. - """ - + """Deletes Airflow Environments.""" self.logging.debug("Started cleanup of Airflow Environments.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/amplify_cleanup.py b/app/src/amplify_cleanup.py index 4ea2811b..79590d53 100644 --- a/app/src/amplify_cleanup.py +++ b/app/src/amplify_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.apps() def apps(self): - """ - Deletes Amplify Apps. - """ - + """Deletes Amplify Apps.""" self.logging.debug("Started cleanup of Amplify Apps.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/cloudformation_cleanup.py b/app/src/cloudformation_cleanup.py index aeb420aa..a1123727 100644 --- a/app/src/cloudformation_cleanup.py +++ b/app/src/cloudformation_cleanup.py @@ -51,10 +51,7 @@ def run(self): self.stacks() def stacks(self): - """ - Deletes CloudFormation Stacks. - """ - + """Deletes CloudFormation Stacks.""" self.logging.debug("Started cleanup of CloudFormation Stacks.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/cloudwatch_cleanup.py b/app/src/cloudwatch_cleanup.py index 2b15b305..3b0fe935 100644 --- a/app/src/cloudwatch_cleanup.py +++ b/app/src/cloudwatch_cleanup.py @@ -27,10 +27,7 @@ def run(self): self.log_groups() def log_groups(self): - """ - Deletes CloudWatch Log Groups. - """ - + """Deletes CloudWatch Log Groups.""" self.logging.debug("Started cleanup of CloudWatch Log Groups.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/data/auto-cleanup-settings.json b/app/src/data/auto-cleanup-settings.json index 6f302336..342df94c 100644 --- a/app/src/data/auto-cleanup-settings.json +++ b/app/src/data/auto-cleanup-settings.json @@ -84,7 +84,7 @@ "BOOL": true }, "id": { - "S": "Log Group Name" + "S": "Log Group Name (e.g., /aws/lambda/auto-cleanup-app-prod)" }, "ttl": { "N": "30" @@ -118,7 +118,7 @@ "BOOL": true }, "id": { - "S": "Allocation ID" + "S": "Allocation ID (e.g., eipalloc-048e1ccf5ae5d63fb)" } } }, @@ -128,7 +128,7 @@ "BOOL": true }, "id": { - "S": "Imagine ID" + "S": "Image ID (e.g., ami-0cff7528ff583bf9a)" }, "ttl": { "N": "7" @@ -141,7 +141,7 @@ "BOOL": true }, "id": { - "S": "Instance ID" + "S": "Instance ID (e.g., i-0d97729996c07c6dd)" }, "ttl": { "N": "7" @@ -154,7 +154,7 @@ "BOOL": true }, "id": { - "S": "NAT Gateway ID" + "S": "NAT Gateway ID (e.g., nat-0d97729996c07c6dd)" }, "ttl": { "N": "7" @@ -167,7 +167,7 @@ "BOOL": true }, "id": { - "S": "Group ID" + "S": "Group ID (e.g., sg-0b3bbfe81679125ff)" } } }, @@ -177,7 +177,7 @@ "BOOL": true }, "id": { - "S": "Snapshot ID" + "S": "Snapshot ID (e.g., snap-0a3dda5966b9b089)" }, "ttl": { "N": "7" @@ -190,7 +190,7 @@ "BOOL": true }, "id": { - "S": "Volume ID" + "S": "Volume ID (e.g., vol-0462d1b55dd229191)" }, "ttl": { "N": "7" @@ -207,7 +207,7 @@ "BOOL": true }, "id": { - "S": "Imagine Digest" + "S": "Imagine Digest (e.g., sha256:f1d4ae3f7261a72e98c6ebefe)" }, "ttl": { "N": "7" @@ -264,7 +264,7 @@ "BOOL": true }, "id": { - "S": "File System ID" + "S": "File System ID (e.g., fs-0edccd369d527c526)" }, "ttl": { "N": "7" @@ -341,7 +341,7 @@ "BOOL": true }, "id": { - "S": "Cache Cluster ID" + "S": "Cache Cluster Name" }, "ttl": { "N": "7" @@ -405,7 +405,7 @@ "BOOL": true }, "id": { - "S": "id" + "S": "Job Flow ID" }, "ttl": { "N": "7" @@ -465,7 +465,7 @@ "BOOL": true }, "id": { - "S": "Access Key ID" + "S": "Access Key ID (e.g., AKIA5J4X5W3JGW1JIA4Y)" }, "ttl": { "N": "30" @@ -611,7 +611,7 @@ "BOOL": true }, "id": { - "S": "DB Instance Identifier" + "S": "DB Instance Name" }, "ttl": { "N": "7" @@ -624,7 +624,7 @@ "BOOL": true }, "id": { - "S": "DB Snapshot Identifier" + "S": "DB Snapshot Name" }, "ttl": { "N": "7" @@ -641,7 +641,7 @@ "BOOL": true }, "id": { - "S": "Cluster Identifier" + "S": "Cluster Name" }, "ttl": { "N": "7" @@ -654,7 +654,7 @@ "BOOL": true }, "id": { - "S": "Snapshot Identifier" + "S": "Snapshot Name" }, "ttl": { "N": "7" @@ -731,7 +731,7 @@ "BOOL": true }, "id": { - "S": "Server ID" + "S": "Server ID (e.g., s-eafc3fa17242456e9)" } } } diff --git a/app/src/dynamodb_cleanup.py b/app/src/dynamodb_cleanup.py index dc6f1d6a..d139e7a3 100644 --- a/app/src/dynamodb_cleanup.py +++ b/app/src/dynamodb_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.tables() def tables(self): - """ - Deletes DynamoDB Tables. - """ - + """Deletes DynamoDB Tables.""" self.logging.debug("Started cleanup of DynamoDB Tables.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/ec2_cleanup.py b/app/src/ec2_cleanup.py index dbf1b778..accbdb33 100644 --- a/app/src/ec2_cleanup.py +++ b/app/src/ec2_cleanup.py @@ -50,10 +50,7 @@ def run(self): self.volumes() def addresses(self): - """ - Deletes Addresses not allocated to an EC2 Instance. - """ - + """Deletes Addresses not allocated to an EC2 Instance.""" self.logging.debug("Started cleanup of EC2 Addresses.") is_cleaning_enabled = Helper.get_setting( @@ -121,10 +118,7 @@ def addresses(self): return True def images(self): - """ - Deletes Images not allocated to an EC2 Instance. - """ - + """Deletes Images not allocated to an EC2 Instance.""" self.logging.debug("Started cleanup of EC2 Images.") is_cleaning_enabled = Helper.get_setting( @@ -205,7 +199,6 @@ def instances(self): If Instance has termination protection enabled, the protection will be first disabled and then the Instance will be terminated. """ - self.logging.debug("Started cleanup of EC2 Instances.") is_cleaning_enabled = Helper.get_setting( @@ -340,10 +333,7 @@ def instances(self): return True def nat_gateways(self): - """ - Deletes NAT Gateways. - """ - + """Deletes NAT Gateways.""" self.logging.debug("Started cleanup of EC2 NAT Gateways.") is_cleaning_enabled = Helper.get_setting( @@ -424,18 +414,12 @@ def nat_gateways(self): return True def security_groups(self): - """ - Deletes Security Groups not attached to an EC2 Instance. - """ - + """Deletes Security Groups not attached to an EC2 Instance.""" self.logging.debug("Started cleanup of EC2 Security Groups.") is_cleaning_enabled = Helper.get_setting( self.settings, "services.ec2.security_group.clean", False ) - resource_maximum_age = Helper.get_setting( - self.settings, "services.ec2.security_group.ttl", 7 - ) resource_allowlist = Helper.get_allowlist(self.allowlist, "ec2.security_group") if is_cleaning_enabled: @@ -499,10 +483,7 @@ def security_groups(self): return True def snapshots(self): - """ - Deletes Snapshots not attached to EBS volumes. - """ - + """Deletes Snapshots not attached to EBS volumes.""" self.logging.debug("Started cleanup of EC2 Snapshots.") is_cleaning_enabled = Helper.get_setting( @@ -544,7 +525,7 @@ def snapshots(self): ] ).get("Images") except: - self.logging.error(f"Could not retrieve EC2 Images.") + self.logging.error("Could not retrieve EC2 Images.") self.logging.error(sys.exc_info()[1]) resource_action = "ERROR" else: @@ -614,10 +595,7 @@ def snapshots(self): return True def volumes(self): - """ - Deletes Volumes not attached to an EC2 Instance. - """ - + """Deletes Volumes not attached to an EC2 Instance.""" self.logging.debug("Started cleanup of EC2 Volumes.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/ecr_cleanup.py b/app/src/ecr_cleanup.py index 4b69d4bc..9ece8f7a 100644 --- a/app/src/ecr_cleanup.py +++ b/app/src/ecr_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.repositories() def repositories(self): - """ - Deletes ECR Repositories. - """ - + """Deletes ECR Repositories.""" self.logging.debug("Started cleanup of ECR Repositories.") is_cleaning_enabled = Helper.get_setting( @@ -126,10 +123,7 @@ def repositories(self): return True def images(self, repository): - """ - Deletes ECR Images for a Repository. - """ - + """Deletes ECR Images for a Repository.""" self.logging.debug( f"Started cleanup of ECR Images for ECR Repository '{repository}'." ) diff --git a/app/src/ecs_cleanup.py b/app/src/ecs_cleanup.py index 655f1092..b136e159 100644 --- a/app/src/ecs_cleanup.py +++ b/app/src/ecs_cleanup.py @@ -27,10 +27,7 @@ def run(self): self.clusters() def clusters(self): - """ - Deletes ECS Clusters. - """ - + """Deletes ECS Clusters.""" self.logging.debug("Started cleanup of ECS Clusters.") is_cleaning_enabled = Helper.get_setting( @@ -126,10 +123,7 @@ def clusters(self): return True def services(self): - """ - Deletes ECS Services. - """ - + """Deletes ECS Services.""" self.logging.debug("Started cleanup of ECS Services.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/efs_cleanup.py b/app/src/efs_cleanup.py index cfe5ff34..02ce57f3 100644 --- a/app/src/efs_cleanup.py +++ b/app/src/efs_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.file_systems() def file_systems(self): - """ - Deletes EFS File Systems. - """ - + """Deletes EFS File Systems.""" self.logging.debug("Started cleanup of EFS File Systems.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/eks_cleanup.py b/app/src/eks_cleanup.py index 8462a35a..6ffb563a 100644 --- a/app/src/eks_cleanup.py +++ b/app/src/eks_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.clusters() def clusters(self): - """ - Deletes EKS Clusters. - """ - + """Deletes EKS Clusters.""" self.logging.debug("Started cleanup of EKS Clusters.") is_cleaning_enabled = Helper.get_setting( @@ -141,10 +138,7 @@ def clusters(self): return True def fargate_profiles(self, cluster): - """ - Deletes EKS Fargate Profiles for a Cluster. - """ - + """Deletes EKS Fargate Profiles for a Cluster.""" self.logging.debug( f"Started cleanup of EKS Fargate Profiles for EKS Cluster {cluster}." ) @@ -240,10 +234,7 @@ def fargate_profiles(self, cluster): return True def node_groups(self, cluster): - """ - Deletes EKS Node Groups for a Cluster. - """ - + """Deletes EKS Node Groups for a Cluster.""" self.logging.debug( f"Started cleanup of EKS Node Groups for EKS Cluster {cluster}." ) diff --git a/app/src/elasticache_cleanup.py b/app/src/elasticache_cleanup.py index 3f999a20..881dca00 100644 --- a/app/src/elasticache_cleanup.py +++ b/app/src/elasticache_cleanup.py @@ -29,10 +29,7 @@ def run(self): self.replication_groups() def clusters(self): - """ - Deletes ElastiCache Clusters. - """ - + """Deletes ElastiCache Clusters.""" self.logging.debug("Started cleanup of ElastiCache Clusters.") is_cleaning_enabled = Helper.get_setting( @@ -111,10 +108,7 @@ def clusters(self): return True def replication_groups(self): - """ - Deletes ElastiCache Replication Groups. - """ - + """Deletes ElastiCache Replication Groups.""" self.logging.debug("Started cleanup of ElastiCache Replication Groups.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/elasticbeanstalk_cleanup.py b/app/src/elasticbeanstalk_cleanup.py index ecd58f81..d4814cb0 100644 --- a/app/src/elasticbeanstalk_cleanup.py +++ b/app/src/elasticbeanstalk_cleanup.py @@ -28,10 +28,7 @@ def run(self): self.applications() def applications(self): - """ - Deletes Elastic Beanstalk Applications. - """ - + """Deletes Elastic Beanstalk Applications.""" self.logging.debug("Started cleanup of Elastic Beanstalk Applications.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/elasticsearch_cleanup.py b/app/src/elasticsearch_cleanup.py index ff4aed9d..26183028 100644 --- a/app/src/elasticsearch_cleanup.py +++ b/app/src/elasticsearch_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.domains() def domains(self): - """ - Deletes Elasticsearch Service Domains. - """ - + """Deletes Elasticsearch Service Domains.""" self.logging.debug("Started cleanup of Elasticsearch Service Domains.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/elb_cleanup.py b/app/src/elb_cleanup.py index 0ecb9746..8654bcb9 100644 --- a/app/src/elb_cleanup.py +++ b/app/src/elb_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.load_balancers() def load_balancers(self): - """ - Deletes ELB Load Balancers. - """ - + """Deletes ELB Load Balancers.""" self.logging.debug("Started cleanup of ELB Load Balancers.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/emr_cleanup.py b/app/src/emr_cleanup.py index 777dc7db..2f2fc023 100644 --- a/app/src/emr_cleanup.py +++ b/app/src/emr_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.clusters() def clusters(self): - """ - Deletes EMR Clusters. - """ - + """Deletes EMR Clusters.""" self.logging.debug("Started cleanup of EMR Clusters.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/glue_cleanup.py b/app/src/glue_cleanup.py index 92fd7c56..89699d8f 100644 --- a/app/src/glue_cleanup.py +++ b/app/src/glue_cleanup.py @@ -28,10 +28,7 @@ def run(self): self.dev_endpoints() def crawlers(self): - """ - Deletes Glue Crawlers. - """ - + """Deletes Glue Crawlers.""" self.logging.debug("Started cleanup of Glue Crawlers.") is_cleaning_enabled = Helper.get_setting( @@ -109,10 +106,7 @@ def crawlers(self): return True def databases(self): - """ - Deletes Glue Databases. - """ - + """Deletes Glue Databases.""" self.logging.debug("Started cleanup of Glue Databases.") is_cleaning_enabled = Helper.get_setting( @@ -183,10 +177,7 @@ def databases(self): return True def dev_endpoints(self): - """ - Deletes Glue Dev Endpoints. - """ - + """Deletes Glue Dev Endpoints.""" self.logging.debug("Started cleanup of Glue Dev Endpoints.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/iam_cleanup.py b/app/src/iam_cleanup.py index 63b1b89a..21b3f5af 100644 --- a/app/src/iam_cleanup.py +++ b/app/src/iam_cleanup.py @@ -30,10 +30,7 @@ def run(self): self.users() def access_keys(self, user): - """ - Deletes IAM Access Keys for a User. - """ - + """Deletes IAM Access Keys for a User.""" self.logging.debug(f"Started cleanup of IAM Access Keys for IAM User '{user}'.") is_cleaning_enabled = Helper.get_setting( @@ -148,10 +145,7 @@ def access_keys(self, user): return True def policies(self): - """ - Deletes IAM Policies. - """ - + """Deletes IAM Policies.""" self.logging.debug("Started cleanup of IAM Policies.") is_cleaning_enabled = Helper.get_setting( @@ -363,10 +357,7 @@ def policies(self): return True def roles(self): - """ - Deletes IAM Roles. - """ - + """Deletes IAM Roles.""" self.logging.debug("Started cleanup of IAM Roles.") is_cleaning_enabled = Helper.get_setting( @@ -654,10 +645,7 @@ def roles(self): return True def user_policies(self, user): - """ - Deletes IAM User Policies. - """ - + """Deletes IAM User Policies.""" self.logging.debug( f"Started cleanup of IAM User Policies for IAM User '{user}'." ) @@ -729,10 +717,7 @@ def user_policies(self, user): return True def delete_login_profile(self, user): - """ - Deletes IAM Login Profile. - """ - + """Deletes IAM Login Profile.""" try: if not self.is_dry_run: self.client_iam.delete_login_profile(UserName=user) @@ -748,10 +733,7 @@ def delete_login_profile(self, user): return True def remove_user_from_group(self, user): - """ - Removes IAM User from IAM Group. - """ - + """Removes IAM User from IAM Group.""" try: paginator = self.client_iam.get_paginator("list_groups_for_user") resources = ( @@ -797,7 +779,6 @@ def users(self): ☑ Attached managed policies ( DetachUserPolicy ) ☑ Group memberships ( RemoveUserFromGroup ) """ - self.logging.debug("Started cleanup of IAM Users.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/kafka_cleanup.py b/app/src/kafka_cleanup.py index 391e9144..382d25c8 100644 --- a/app/src/kafka_cleanup.py +++ b/app/src/kafka_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.clusters() def clusters(self): - """ - Deletes Kafka Clusters. - """ - + """Deletes Kafka Clusters.""" self.logging.debug("Started cleanup of Kafka Clusters.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/kinesis_cleanup.py b/app/src/kinesis_cleanup.py index 024f092d..d5f2fb19 100644 --- a/app/src/kinesis_cleanup.py +++ b/app/src/kinesis_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.streams() def streams(self): - """ - Deletes Kinesis Streams. - """ - + """Deletes Kinesis Streams.""" self.logging.debug("Started cleanup of Kinesis Streams.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/lambda_cleanup.py b/app/src/lambda_cleanup.py index d995e3f5..4c8fa0f4 100644 --- a/app/src/lambda_cleanup.py +++ b/app/src/lambda_cleanup.py @@ -26,10 +26,7 @@ def run(self): self.functions() def functions(self): - """ - Deletes Lambda Functions. - """ - + """Deletes Lambda Functions.""" self.logging.debug("Started cleanup of Lambda Functions.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/main.py b/app/src/main.py index 4397181d..4824ddf7 100644 --- a/app/src/main.py +++ b/app/src/main.py @@ -58,7 +58,7 @@ def __init__(self, logging): @func_set_timeout(840) def run_cleanup(self): if self.dry_run: - self.logging.info(f"Auto Cleanup started in DRY RUN mode.") + self.logging.info("Auto Cleanup started in DRY RUN mode.") else: self.logging.info(f"Auto Cleanup started in DESTROY mode.") @@ -414,7 +414,6 @@ def setup_dynamodb(self): into their respective DynamoDB tables. Records will be skipped if they already exist in the table. """ - try: client = boto3.client("dynamodb") @@ -479,9 +478,7 @@ def setup_dynamodb(self): self.logging.error(sys.exc_info()[1]) def export_execution_log(self, execution_log, aws_request_id): - """ - Export a CSV file with all execution logs during run. - """ + """Export a CSV file with all execution logs during run.""" try: os.chdir(tempfile.gettempdir()) diff --git a/app/src/rds_cleanup.py b/app/src/rds_cleanup.py index 8427b616..810e21c5 100644 --- a/app/src/rds_cleanup.py +++ b/app/src/rds_cleanup.py @@ -34,7 +34,6 @@ def clusters(self): protection enabled, the protection will be first disabled and then the Cluster will be terminated. """ - self.logging.debug("Started cleanup of RDS Clusters.") is_cleaning_enabled = Helper.get_setting( @@ -151,10 +150,7 @@ def clusters(self): return True def cluster_snapshots(self): - """ - Deletes RDS Cluster Snapshots. - """ - + """Deletes RDS Cluster Snapshots.""" self.logging.debug("Started cleanup of RDS Cluster Snapshots.") is_cleaning_enabled = Helper.get_setting( @@ -240,7 +236,6 @@ def instances(self): protection enabled, the protection will be first disabled and then the Instance will be terminated. """ - self.logging.debug("Started cleanup of RDS Instances.") is_cleaning_enabled = Helper.get_setting( @@ -335,10 +330,7 @@ def instances(self): return True def snapshots(self): - """ - Deletes RDS Snapshots. - """ - + """Deletes RDS Snapshots.""" self.logging.debug("Started cleanup of RDS Snapshots.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/redshift_cleanup.py b/app/src/redshift_cleanup.py index 63aa7e4d..46876a1f 100644 --- a/app/src/redshift_cleanup.py +++ b/app/src/redshift_cleanup.py @@ -27,10 +27,7 @@ def run(self): self.snapshots() def clusters(self): - """ - Deletes Redshift Clusters. - """ - + """Deletes Redshift Clusters.""" self.logging.debug("Started cleanup of Redshift Clusters.") is_cleaning_enabled = Helper.get_setting( @@ -104,10 +101,7 @@ def clusters(self): return True def snapshots(self): - """ - Deletes Redshift Snapshots. - """ - + """Deletes Redshift Snapshots.""" self.logging.debug("Started cleanup of Redshift Snapshots.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/s3_cleanup.py b/app/src/s3_cleanup.py index e22a346d..8badf8a1 100644 --- a/app/src/s3_cleanup.py +++ b/app/src/s3_cleanup.py @@ -38,7 +38,6 @@ def buckets(self): Deletes Buckets. All Bucket Objects, Versions and Deleted Markers are first deleted before the Bucket can be deleted. """ - self.logging.debug("Started cleanup of S3 Buckets.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/sagemaker_cleanup.py b/app/src/sagemaker_cleanup.py index e20c9f8a..0c3a7a30 100644 --- a/app/src/sagemaker_cleanup.py +++ b/app/src/sagemaker_cleanup.py @@ -28,10 +28,7 @@ def run(self): self.notebook_instances() def apps(self): - """ - Deletes SageMaker Apps. - """ - + """Deletes SageMaker Apps.""" self.logging.debug("Started cleanup of SageMaker Apps.") is_cleaning_enabled = Helper.get_setting( @@ -112,10 +109,7 @@ def apps(self): return True def endpoints(self): - """ - Deletes SageMaker Endpoints. - """ - + """Deletes SageMaker Endpoints.""" self.logging.debug("Started cleanup of SageMaker Endpoints.") is_cleaning_enabled = Helper.get_setting( @@ -194,10 +188,7 @@ def endpoints(self): return True def notebook_instances(self): - """ - Deletes SageMaker Notebook Instances. - """ - + """Deletes SageMaker Notebook Instances.""" self.logging.debug("Started cleanup of SageMaker Notebook Instances.") is_cleaning_enabled = Helper.get_setting( diff --git a/app/src/transfer_cleanup.py b/app/src/transfer_cleanup.py index 5f1a0b52..f7400172 100644 --- a/app/src/transfer_cleanup.py +++ b/app/src/transfer_cleanup.py @@ -26,18 +26,12 @@ def run(self): self.servers() def servers(self): - """ - Deletes Transfer Servers. - """ - + """Deletes Transfer Servers.""" self.logging.debug("Started cleanup of Transfer Servers.") is_cleaning_enabled = Helper.get_setting( self.settings, "services.transfer.server.clean", False ) - resource_maximum_age = Helper.get_setting( - self.settings, "services.transfer.server.ttl", 7 - ) resource_allowlist = Helper.get_allowlist(self.allowlist, "transfer.server") if is_cleaning_enabled: diff --git a/app/test/__init__.py b/app/test/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/app/test/test_cloudformation.py b/app/test/test_cloudformation.py deleted file mode 100644 index a1534d03..00000000 --- a/app/test/test_cloudformation.py +++ /dev/null @@ -1,119 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import cloudformation_cleanup - - -class TestStacksMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_cloudformation(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"cloudformation": {"stacks": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = cloudformation_cleanup.CloudFormationCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test stack - test_class.client_cloudformation.create_stack( - StackName="sample-sqs", - TemplateBody='{"Resources":{"SQSQueue":{"Type":"AWS::SQS::Queue","Properties":{"QueueName":"test_queue"}}}}', - ) - - # validate stack creation - response = test_class.client_cloudformation.list_stacks() - assert response["StackSummaries"][0]["StackName"] == "sample-sqs" - - # test stacks functions - test_class.stacks() - - # validate stack deletion - response = test_class.client_cloudformation.list_stacks() - - assert response["StackSummaries"][0]["StackStatus"] == "DELETE_COMPLETE" - - -class TestStacksLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_cloudformation(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": { - "cloudformation": {"stacks": {"clean": True, "ttl": 5000}} - }, - } - execution_log = {"AWS": {}} - - test_class = cloudformation_cleanup.CloudFormationCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test stack - test_class.client_cloudformation.create_stack( - StackName="sample-sqs", - TemplateBody='{"Resources":{"SQSQueue":{"Type":"AWS::SQS::Queue","Properties":{"QueueName":"test_queue"}}}}', - ) - - # validate stack creation - response = test_class.client_cloudformation.list_stacks() - assert response["StackSummaries"][0]["StackName"] == "sample-sqs" - - # test stacks functions - test_class.stacks() - - # validate stack not deleted - response = test_class.client_cloudformation.list_stacks() - - assert response["StackSummaries"][0]["StackStatus"] == "CREATE_COMPLETE" - - -class TestStacksAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_cloudformation(): - allowlist = {"cloudformation": {"stack": ["sample-sqs"]}} - settings = { - "general": {"dry_run": False}, - "services": { - "cloudformation": {"stacks": {"clean": True, "ttl": 5000}} - }, - } - execution_log = {"AWS": {}} - - test_class = cloudformation_cleanup.CloudFormationCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test stack - test_class.client_cloudformation.create_stack( - StackName="sample-sqs", - TemplateBody='{"Resources":{"SQSQueue":{"Type":"AWS::SQS::Queue","Properties":{"QueueName":"test_queue"}}}}', - ) - - # validate stack creation - response = test_class.client_cloudformation.list_stacks() - assert response["StackSummaries"][0]["StackName"] == "sample-sqs" - - # test stacks functions - test_class.stacks() - - # validate stack not deleted - response = test_class.client_cloudformation.list_stacks() - - assert response["StackSummaries"][0]["StackStatus"] == "CREATE_COMPLETE" diff --git a/app/test/test_dynamodb.py b/app/test/test_dynamodb.py deleted file mode 100644 index 9fafd266..00000000 --- a/app/test/test_dynamodb.py +++ /dev/null @@ -1,118 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import dynamodb_cleanup - - -class TestTablesMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_dynamodb2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"dynamodb": {"tables": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = dynamodb_cleanup.DynamoDBCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_dynamodb.create_table( - TableName="settings-table", - KeySchema=[{"AttributeName": "key", "KeyType": "HASH"}], - AttributeDefinitions=[{"AttributeName": "key", "AttributeType": "S"}], - ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1}, - ) - - # validate table creation - response = test_class.client_dynamodb.list_tables() - assert "settings-table" in response["TableNames"] - - # test tables functions - test_class.tables() - - # # validate table deletion - response = test_class.client_dynamodb.list_tables() - assert response["TableNames"] == [] - - -class TestTablesLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_dynamodb2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"dynamodb": {"tables": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = dynamodb_cleanup.DynamoDBCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_dynamodb.create_table( - TableName="settings-table", - KeySchema=[{"AttributeName": "key", "KeyType": "HASH"}], - AttributeDefinitions=[{"AttributeName": "key", "AttributeType": "S"}], - ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1}, - ) - - # validate table creation - response = test_class.client_dynamodb.list_tables() - assert "settings-table" in response["TableNames"] - - # test tables functions - test_class.tables() - - # # validate table not deleted - response = test_class.client_dynamodb.list_tables() - assert "settings-table" in response["TableNames"] - - -class TestTablesAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_dynamodb2(): - allowlist = {"dynamodb": {"table": ["settings-table"]}} - settings = { - "general": {"dry_run": False}, - "services": {"dynamodb": {"tables": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = dynamodb_cleanup.DynamoDBCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_dynamodb.create_table( - TableName="settings-table", - KeySchema=[{"AttributeName": "key", "KeyType": "HASH"}], - AttributeDefinitions=[{"AttributeName": "key", "AttributeType": "S"}], - ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1}, - ) - - # validate table creation - response = test_class.client_dynamodb.list_tables() - assert "settings-table" in response["TableNames"] - - # test tables functions - test_class.tables() - - # # validate table not deleted - response = test_class.client_dynamodb.list_tables() - assert "settings-table" in response["TableNames"] diff --git a/app/test/test_ec2.py b/app/test/test_ec2.py deleted file mode 100644 index c070019a..00000000 --- a/app/test/test_ec2.py +++ /dev/null @@ -1,298 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import ec2_cleanup - - -class TestInstancesMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"instances": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.resource_ec2.create_instances( - ImageId="ami-43a15f3e", MinCount=1, MaxCount=1, InstanceType="t2.micro" - ) - - # validate instance creation - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["ImageId"] == "ami-43a15f3e" - - # test instances functions for running instace - test_class.instances() - - # # validate instance stopped - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["State"]["Name"] == "stopped" - - # test instances functions for stopped instance - test_class.instances() - - # # validate instance stopped - response = test_class.client_ec2.describe_instances() - assert ( - response["Reservations"][0]["Instances"][0]["State"]["Name"] == "terminated" - ) - - -class TestInstancesLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"instances": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.resource_ec2.create_instances( - ImageId="ami-43a15f3e", MinCount=1, MaxCount=1, InstanceType="t2.micro" - ) - - # validate instance creation - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["ImageId"] == "ami-43a15f3e" - - # test instances functions for running instace - test_class.instances() - - # # validate instance not stopped - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["State"]["Name"] == "running" - - -class TestInstancesAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"instances": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.resource_ec2.create_instances( - ImageId="ami-43a15f3e", MinCount=1, MaxCount=1, InstanceType="t2.micro" - ) - - # validate instance creation - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["ImageId"] == "ami-43a15f3e" - - # get instance id and add to allowlist - test_class.allowlist = { - "ec2": { - "instance": [response["Reservations"][0]["Instances"][0]["InstanceId"]] - } - } - - # test instances functions for running instace - test_class.instances() - - # # validate instance not stopped - response = test_class.client_ec2.describe_instances() - assert response["Reservations"][0]["Instances"][0]["State"]["Name"] == "running" - - -class TestSecurityGroupsNotAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"security_groups": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.client_ec2.create_security_group( - Description="test-security-group", GroupName="test-security-group" - ) - - # validate instance creation - response = test_class.client_ec2.describe_security_groups() - assert response["SecurityGroups"][1]["GroupName"] == "test-security-group" - - # test instances functions for running instace - test_class.security_groups() - - # validate instance stopped - response = test_class.client_ec2.describe_security_groups() - for group in response["SecurityGroups"]: - assert group["GroupName"] != "test-security-group" - - -class TestSecurityGroupsAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {"ec2": {"security_group": ["test-security-group"]}} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"security_groups": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.client_ec2.create_security_group( - Description="test-security-group", GroupName="test-security-group" - ) - - # validate instance creation - response = test_class.client_ec2.describe_security_groups() - assert response["SecurityGroups"][1]["GroupName"] == "test-security-group" - - # get security group id and add to allowlist - test_class.allowlist = { - "ec2": {"security_group": [response["SecurityGroups"][1]["GroupId"]]} - } - - # test instances functions for running instace - test_class.security_groups() - - # validate instance stopped - response = test_class.client_ec2.describe_security_groups() - assert response["SecurityGroups"][1]["GroupName"] == "test-security-group" - - -class TestVolumesMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"volumes": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.client_ec2.create_volume(AvailabilityZone="ap-southeast-2a", Size=10) - - # validate instance creation - response = test_class.client_ec2.describe_volumes() - assert len(response["Volumes"]) == 1 - - # test instances functions for running instace - test_class.volumes() - - # validate instance stopped - response = test_class.client_ec2.describe_volumes() - assert response["Volumes"] == [] - - -class TestVolumesLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"volumes": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.client_ec2.create_volume(AvailabilityZone="ap-southeast-2a", Size=10) - - # validate instance creation - response = test_class.client_ec2.describe_volumes() - assert len(response["Volumes"]) == 1 - - # test instances functions for running instace - test_class.volumes() - - # validate instance stopped - response = test_class.client_ec2.describe_volumes() - assert len(response["Volumes"]) == 1 - - -class TestVolumesAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_ec2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"ec2": {"volumes": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = ec2_cleanup.EC2Cleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test instance - test_class.client_ec2.create_volume(AvailabilityZone="ap-southeast-2a", Size=10) - - # validate instance creation - response = test_class.client_ec2.describe_volumes() - assert len(response["Volumes"]) == 1 - - # get volume id and add to allowlist - test_class.allowlist = {"ec2": {"volume": [response["Volumes"][0]["VolumeId"]]}} - - # test instances functions for running instace - test_class.volumes() - - # validate instance stopped - response = test_class.client_ec2.describe_volumes() - assert len(response["Volumes"]) == 1 diff --git a/app/test/test_emr.py b/app/test/test_emr.py deleted file mode 100644 index fc09adab..00000000 --- a/app/test/test_emr.py +++ /dev/null @@ -1,127 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import emr_cleanup - - -class TestClustersMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_emr(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"emr": {"clusters": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = emr_cleanup.EMRCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_emr.run_job_flow( - Name="test", - Instances={ - "MasterInstanceType": "m5.xlarge", - "SlaveInstanceType": "m5.xlarge", - "KeepJobFlowAliveWhenNoSteps": True, - }, - ) - - # validate cluster creation - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Name"] == "test" - - # test clusters functions - test_class.clusters() - - # validate cluster deletion - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Status"]["State"] == "TERMINATED" - - -class TestClustersLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_emr(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"emr": {"clusters": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = emr_cleanup.EMRCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_emr.run_job_flow( - Name="test", - Instances={ - "MasterInstanceType": "m5.xlarge", - "SlaveInstanceType": "m5.xlarge", - "KeepJobFlowAliveWhenNoSteps": True, - }, - ) - - # validate cluster creation - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Name"] == "test" - - # test clusters functions - test_class.clusters() - - # validate cluster not deleted - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Status"]["State"] == "WAITING" - - -class TestClustersAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_emr(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"emr": {"clusters": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = emr_cleanup.EMRCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_emr.run_job_flow( - Name="test", - Instances={ - "MasterInstanceType": "m5.xlarge", - "SlaveInstanceType": "m5.xlarge", - "KeepJobFlowAliveWhenNoSteps": True, - }, - ) - - # validate cluster creation - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Name"] == "test" - - # get test_class Cluster ID and add to allowlist - test_class.allowlist = {"emr": {"cluster": [response["Clusters"][0]["Id"]]}} - - # test clusters functions - test_class.clusters() - - # validate cluster not deleted - response = test_class.client_emr.list_clusters() - assert response["Clusters"][0]["Status"]["State"] == "WAITING" diff --git a/app/test/test_rds.py b/app/test/test_rds.py deleted file mode 100644 index e05266d5..00000000 --- a/app/test/test_rds.py +++ /dev/null @@ -1,142 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import rds_cleanup - - -class TestSnapshotsMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_rds2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"rds": {"snapshots": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = rds_cleanup.RDSCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_rds.create_db_instance( - DBName="test", - DBInstanceIdentifier="test123", - AllocatedStorage=10, - DBInstanceClass="db.m4.large", - Engine="mysql", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_rds.create_db_snapshot( - DBSnapshotIdentifier="snapshot123", DBInstanceIdentifier="test123" - ) - - # validate snapshot creation - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"][0]["DBSnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot deletion - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"] == [] - - -class TestSnapshotsLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_rds2(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"rds": {"snapshots": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = rds_cleanup.RDSCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_rds.create_db_instance( - DBName="test", - DBInstanceIdentifier="test123", - AllocatedStorage=10, - DBInstanceClass="db.m4.large", - Engine="mysql", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_rds.create_db_snapshot( - DBSnapshotIdentifier="snapshot123", DBInstanceIdentifier="test123" - ) - - # validate snapshot creation - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"][0]["DBSnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot deletion - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"][0]["DBSnapshotIdentifier"] == "snapshot123" - - -class TestSnapshotsAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_rds2(): - allowlist = {"rds": {"snapshot": ["snapshot123"]}} - settings = { - "general": {"dry_run": False}, - "services": {"rds": {"snapshots": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = rds_cleanup.RDSCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_rds.create_db_instance( - DBName="test", - DBInstanceIdentifier="test123", - AllocatedStorage=10, - DBInstanceClass="db.m4.large", - Engine="mysql", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_rds.create_db_snapshot( - DBSnapshotIdentifier="snapshot123", DBInstanceIdentifier="test123" - ) - - # validate snapshot creation - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"][0]["DBSnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot deletion - response = test_class.client_rds.describe_db_snapshots() - assert response["DBSnapshots"][0]["DBSnapshotIdentifier"] == "snapshot123" diff --git a/app/test/test_redshift.py b/app/test/test_redshift.py deleted file mode 100644 index 727b9778..00000000 --- a/app/test/test_redshift.py +++ /dev/null @@ -1,256 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import redshift_cleanup - - -class TestClustersMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"clusters": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # validate cluster creation - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"][0]["ClusterIdentifier"] == "test_class123" - - # test clusters functions - test_class.clusters() - - # validate cluster deletion - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"] == [] - - -class TestClustersLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"clusters": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # validate cluster creation - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"][0]["ClusterIdentifier"] == "test_class123" - - # test clusters functions - test_class.clusters() - - # validate cluster not deleted - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"][0]["ClusterIdentifier"] == "test_class123" - - -class TestClustersAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {"redshift": {"cluster": ["test_class123"]}} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"clusters": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # validate cluster creation - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"][0]["ClusterIdentifier"] == "test_class123" - - # test clusters functions - test_class.clusters() - - # validate cluster not deleted - response = test_class.client_redshift.describe_clusters() - assert response["Clusters"][0]["ClusterIdentifier"] == "test_class123" - - -class TestSnapshotsMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"snapshots": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_redshift.create_cluster_snapshot( - SnapshotIdentifier="snapshot123", ClusterIdentifier="test_class123" - ) - - # validate snapshot creation - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"][0]["SnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot deletion - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"] == [] - - -class TestSnapshotsLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"snapshots": {"clean": True, "ttl": 7}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_redshift.create_cluster_snapshot( - SnapshotIdentifier="snapshot123", ClusterIdentifier="test_class123" - ) - - # validate snapshot creation - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"][0]["SnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot not deleted - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"][0]["SnapshotIdentifier"] == "snapshot123" - - -class TestSnapshotsAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_redshift(): - allowlist = {"redshift": {"snapshot": ["snapshot123"]}} - settings = { - "general": {"dry_run": False}, - "services": {"redshift": {"snapshots": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = redshift_cleanup.RedshiftCleanup( - logging, allowlist, settings, execution_log, "ap-southeast-2" - ) - yield test_class - - def test(self, test_class): - # create test cluster - test_class.client_redshift.create_cluster( - DBName="test-test_class", - ClusterIdentifier="test_class123", - ClusterType="single-node", - NodeType="ds2.xlarge", - MasterUsername="admin", - MasterUserPassword="Admin123", - ) - - # create test snapshot - test_class.client_redshift.create_cluster_snapshot( - SnapshotIdentifier="snapshot123", ClusterIdentifier="test_class123" - ) - - # validate snapshot creation - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"][0]["SnapshotIdentifier"] == "snapshot123" - - # test snapshot functions - test_class.snapshots() - - # validate snapshot not deleted - response = test_class.client_redshift.describe_cluster_snapshots() - assert response["Snapshots"][0]["SnapshotIdentifier"] == "snapshot123" diff --git a/app/test/test_s3.py b/app/test/test_s3.py deleted file mode 100644 index 67133d8d..00000000 --- a/app/test/test_s3.py +++ /dev/null @@ -1,103 +0,0 @@ -import datetime -import logging - -import moto -import pytest - -from .. import s3_cleanup - - -class TestBucketsMoreThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_s3(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"s3": {"buckets": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = s3_cleanup.S3Cleanup( - logging, allowlist, settings, execution_log - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_s3.create_bucket(Bucket="test") - - # validate bucket creation - response = test_class.client_s3.list_buckets() - assert response["Buckets"][0]["Name"] == "test" - - # test buckets functions - test_class.buckets() - - # validate bucket deletion - response = test_class.client_s3.list_buckets() - assert response["Buckets"] == [] - - -class TestBucketsLessThanTTL: - @pytest.fixture - def test_class(self): - with moto.mock_s3(): - allowlist = {} - settings = { - "general": {"dry_run": False}, - "services": {"s3": {"buckets": {"clean": True, "ttl": 5000}}}, - } - execution_log = {"AWS": {}} - - test_class = s3_cleanup.S3Cleanup( - logging, allowlist, settings, execution_log - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_s3.create_bucket(Bucket="test") - - # validate bucket creation - response = test_class.client_s3.list_buckets() - assert response["Buckets"][0]["Name"] == "test" - - # test buckets functions - test_class.buckets() - - # validate bucket deletion - response = test_class.client_s3.list_buckets() - assert response["Buckets"][0]["Name"] == "test" - - -class TestBucketsAllowlist: - @pytest.fixture - def test_class(self): - with moto.mock_s3(): - allowlist = {"s3": {"bucket": ["test"]}} - settings = { - "general": {"dry_run": False}, - "services": {"s3": {"buckets": {"clean": True, "ttl": -1}}}, - } - execution_log = {"AWS": {}} - - test_class = s3_cleanup.S3Cleanup( - logging, allowlist, settings, execution_log - ) - yield test_class - - def test(self, test_class): - # create test table - test_class.client_s3.create_bucket(Bucket="test") - - # validate bucket creation - response = test_class.client_s3.list_buckets() - assert response["Buckets"][0]["Name"] == "test" - - # test buckets functions - test_class.buckets() - - # validate bucket deletion - response = test_class.client_s3.list_buckets() - assert response["Buckets"][0]["Name"] == "test" diff --git a/web/package.json b/web/package.json index b4c6ab00..2c57e5c7 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "auto-cleanup-web", "description": "Auto Cleanup Web", - "version": "2.0.0", + "version": "2.3.0", "private": true, "dependencies": {}, "devDependencies": { diff --git a/web/src/css/style.css b/web/src/css/style.css index 91afc6f9..d742c5cf 100755 --- a/web/src/css/style.css +++ b/web/src/css/style.css @@ -20,6 +20,8 @@ td { vertical-align: middle !important; } +td.dt-body-nowrap { white-space: nowrap; } + .execution-log-modal { width: calc(100vw - 40px) !important; height: calc(100vh - 40px) !important; diff --git a/web/src/index.html b/web/src/index.html index 6d8849e7..53eb1de3 100755 --- a/web/src/index.html +++ b/web/src/index.html @@ -61,9 +61,10 @@ /> Allowlist - +
@@ -181,14 +182,14 @@

Allowlist

- + - + @@ -276,78 +277,49 @@

Execution Logs

class="modal-background" v-on:click="closeExecutionLogPopup()" > -
Service
{{ item.service }} {{ item.resource }}{{ item.id }}{{ item.id }} {{ item.expiration_readable }} {{ item.owner }}{{ item.comment }}{{ item.comment }} Temporary Permanent @@ -249,7 +250,7 @@

Execution Logs

class="button" > - +
@@ -359,30 +331,8 @@

Execution Logs

- - - - - - - - - - - -
Resource ID ActionAllowlist
{{ item[6] }}{{ item[1] }}{{ item[2] }}{{ item[3] }}{{ item[4] }}{{ item[5] }} - -
Execution Logs class="container has-text-centered" v-show="showExecutionLogLoadingGif" > - +
+ @@ -678,9 +681,11 @@

Execution Logs