diff --git a/examples/aws-cloudwatch-evidently/poc/package-lock.json b/examples/aws-cloudwatch-evidently/poc/package-lock.json index 92afd702..46a95237 100644 --- a/examples/aws-cloudwatch-evidently/poc/package-lock.json +++ b/examples/aws-cloudwatch-evidently/poc/package-lock.json @@ -4,543 +4,556 @@ "requires": true, "packages": { "": { + "name": "poc", "dependencies": { "@aws-sdk/client-evidently": "^3.363.0", "aws-sdk": "^2.1046.0", "node-uuid": ">= 1.4.1" } }, - "node_modules/@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "dependencies": { - "@aws-crypto/util": "^3.0.0", + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.11.1" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.11.1" + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@aws-sdk/client-evidently": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-evidently/-/client-evidently-3.363.0.tgz", - "integrity": "sha512-ZlO5yBdGRH/2W3zNC8vSJYWhIVbHcUuVwSImCZ1Or6vJOBlNkuNgcXphmAwz744RPQi0yM0boQ6dk12yBzd9Jw==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz", - "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz", - "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "node_modules/@aws-sdk/client-evidently": { + "version": "3.986.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-evidently/-/client-evidently-3.986.0.tgz", + "integrity": "sha512-P6ahaoaq1rW80me8tdjZz9pQV/wRiRqM0U0QKSrxtffYAONzC8IXMR5v2gJ26heqAOq8FqmJ8Z3LUgn9xYjLjA==", + "deprecated": "The evidently client was removed from the SDK", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.986.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.5", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.975.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.975.3.tgz", + "integrity": "sha512-7ur3kCKuvPLqlsZ2XlvnNBVQ7KkpSu6Y6dOTwSPHLrFpTEfZM8isLBJc4cgv96WB7GifeVM436mpycwxBd2vEA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.974.2", + "@aws-sdk/xml-builder": "^3.972.36", + "@aws/lambda-invoke-store": "^0.3.0", + "@smithy/core": "^3.29.4", + "@smithy/signature-v4": "^5.6.5", + "@smithy/types": "^4.16.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz", - "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==", - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-sdk-sts": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.1", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.59.tgz", + "integrity": "sha512-Ny5e4Mfh3QPmiAc0AiUe+cbTXDlxkU3Rc+EpWOfyWeWEy6yp7Fa1KmfNeCc+1a8by9zQ9gtohmiQUkMPScF3ng==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz", - "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.61", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.61.tgz", + "integrity": "sha512-8jAjgStl5Ytq4+HF3X/9f+EmRinaRbGRRtQGktlPfBRVx73H+R1y48vIeXerQtYGFaUqkEp3fT6jP854rVO2yQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz", - "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "version": "3.973.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.4.tgz", + "integrity": "sha512-e6ZvVsj90aRALf1kHP+J4iqC1496ZpVgqI/+u0LJ5HL7q7ATauGy4gdDvRCP13L1pN/fMiZLah162PGIYkbUVQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-login": "^3.972.66", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.66", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.66.tgz", + "integrity": "sha512-g2fsqm87r/nKthLZ0VkkDBElkGg0PvSa8d97HQ6EilMbJTZ6hxa8FxkSZyJfgPfFdZn0TTmkOffQmTSUcAHIng==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz", - "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-ini": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "version": "3.972.70", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.70.tgz", + "integrity": "sha512-3xzvkGdykBunxqh8WudmUpSyLWvIhfI6aBQo1b5rb3mDO5mNLadK+0hiI0qBQBMVynJbfLO+Ajy9dztMwy9O8w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-ini": "^3.973.4", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz", - "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.59.tgz", + "integrity": "sha512-DlZF2/MhLlatDdlrIy3CUCpfdbLrKx+3SMjVo+WyHnPpwzkc/M3vwAHw4OVJf7DMvO+4vfRqSCMc/E9I1auN0g==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz", - "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==", + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.3.tgz", + "integrity": "sha512-hmdDHoy2G5Es2e8IgelNMYUuSQI6uCIAKZMJ2u2PdKDhxvbk1uWD/g4+R7R5c/tJfKEB1+KjjWiaoCr/S+ZTiQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.363.0", - "@aws-sdk/token-providers": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/token-providers": "3.1088.0", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz", - "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==", + "version": "3.972.65", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.65.tgz", + "integrity": "sha512-gHQb/Kt0chjk/JQDa/GJDqmAvEuVn8n7z10wK2h0LFM9TUDRkohgOO4aEF+s2sBLM0br7Cl5W6P7phgjrrJvLQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz", - "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", + "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz", - "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", + "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz", - "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", + "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz", - "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==", + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", + "integrity": "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@smithy/core": "^3.23.9", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-retry": "^4.2.11", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz", - "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { + "version": "3.996.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", + "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-endpoints": "^3.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz", - "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.33.tgz", + "integrity": "sha512-dVZOroI/r3/ENvqNGgjMPul+jjlz9GddfVusgTXlVjfZj5isibOxecLkGQbRPp8XOuX+RAfjXLFgPkD1JS5xrw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", + "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/config-resolver": "^4.4.10", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.41.tgz", + "integrity": "sha512-QMUytg+FQMGouc8gHS00KoYih3+N6cqmVI/pQGOIo7Nr7OpQaiXjSYOuL+vsPZ1tymY4LAQ8MYcHJmws5LRxng==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.974.2", + "@smithy/signature-v4": "^5.6.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz", - "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1088.0.tgz", + "integrity": "sha512-4ObatWt2qpJg5FBk4LOOKrTQYzaqeewAtdO3r9ZO8lH9YqLtpTzLyIdy0mJ+nVdfYOnqISkKNfmzP22bNDhwyw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.974.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.2.tgz", + "integrity": "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", - "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "version": "3.986.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.986.0.tgz", + "integrity": "sha512-Mqi79L38qi1gCG3adlVdbNrSxvcm1IPDLiJPA3OBypY5ewxUyWbaA3DD4goG+EwET6LSFgZJcRSIh6KBNpP5pA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "version": "3.965.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.8.tgz", + "integrity": "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz", - "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", + "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz", - "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.6.tgz", + "integrity": "sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/types": "^3.973.5", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -551,488 +564,547 @@ } } }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.36.tgz", + "integrity": "sha512-RdGmS1GLrtaTOLE1ElSluMldNrpk9Emq6uYs8SS8iHlu5xTAmM9rRkM91o48+rIRryBtyO9t+uLYCoMG6jVMVA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.1" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@smithy/abort-controller": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.1.tgz", - "integrity": "sha512-An6irzp9NCji2JtJHhrEFlDbxLwHd6c6Y9fq3ZeomyUR8BIXlGXVTxsemUSZVVgOq3166iYbYs/CrPAmgRSFLw==", - "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" - }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz", + "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==", + "license": "Apache-2.0", "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.1.tgz", - "integrity": "sha512-quj0xUiEVG/UHfY82EtthR/+S5/17p3IxXArC3NFSNqryMobWbG9oWgJy2s2cgUSVZLzxevjKKvxrilK7JEDaA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "@smithy/util-config-provider": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/credential-provider-imds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.1.tgz", - "integrity": "sha512-hkRJoxVCh4CEt1zYOBElE+G/MV6lyx3g68hSJpesM4pwMT/bzEVo5E5XzXY+6dVq8yszeatWKbFuqCCBQte8tg==", + "node_modules/@smithy/core": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.5.tgz", + "integrity": "sha512-i0dk2t5B+CwV/dcJdUHILYkOQF5lof8f44dFCfDWToGCxjT9YQ+CgHqTAvJxzc3+zqQwm2QtVoJ5IqiNar/CnQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/eventstream-codec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.1.tgz", - "integrity": "sha512-cpcTXQEOEs2wEvIyxW/iTHJ2m0RVqoEOTjjWEXD6SY8Gcs3FCFP6E8MXadC098tdH5ctMIUXc8POXyMpxzGnjw==", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.10.tgz", + "integrity": "sha512-MJenAe4OKRZUo1LdYYFDCsSHxaHvInIU/z52GsheO9vl1/VSySVCr0zkyKD6TFiGkSUaWGxvKZ/70OvgUZR5HQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.1.0", - "@smithy/util-hex-encoding": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.1.tgz", - "integrity": "sha512-/e2A8eOMk4FVZBQ0o6uF/ttLtFZcmsK5MIwDu1UE3crM4pCAIP19Ul8U9rdLlHhIu81X4AcJmSw55RDSpVRL/w==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.7.tgz", + "integrity": "sha512-3zpg8yqqyXzoK2TsRDdkqVOj2RDBFfLXwCczOZ5c7TWB4eiaebfSCsbMjDPYB3PJ9ihV62QaeadZ+wLadZtNGA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/querystring-builder": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-base64": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.1.tgz", - "integrity": "sha512-eCz08BySBcOjVObjbRAS/XMKUGY4ujnuS+GoWeEpzpCSKDnO8/YQ0rStRt4C0llRmhApizYc1tK9DiJwfvXcBg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.4.10.tgz", + "integrity": "sha512-y0CfGFpEVyGg6EfrBj0BWkgfaRiXk+dG4t3xYNPMbnkOBBy8Yv8THUDsmkHXe2PyzYIzC6uPlT97kZoX6KF9vg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "@smithy/util-buffer-from": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.1.tgz", - "integrity": "sha512-kib63GFlAzRn/wf8M0cRWrZA1cyOy5IvpTkLavCY782DPFMP0EaEeD6VrlNIOvD6ncf7uCJ68HqckhwK1qLT3g==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.1.tgz", - "integrity": "sha512-fHSTW70gANnzPYWNDcWkPXpp+QMbHhKozbQm/+Denkhp4gwSiPuAovWZRpJa9sXO+Q4dOnNzYN2max1vTCEroA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.1.tgz", - "integrity": "sha512-vWWigayk5i2cFp9xPX5vdzHyK+P0t/xZ3Ovp4Ss+c8JQ1Hlq2kpJZVWtTKsmdfND5rVo5lu0kD5wgAMUCcmuhw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.2.tgz", - "integrity": "sha512-F3CyXgjtDI4quGFkDmVNytt6KMwlzzeMxtopk6Edue4uKdKcMC1vUmoRS5xTbFzKDDp4XwpnEV7FshPaL3eCPw==", + "version": "4.4.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", + "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.3.tgz", - "integrity": "sha512-ZRsjG8adtxQ456FULPqPFmWtrW44Fq8IgdQvQB+rC2RSho3OUzS+TiEIwb5Zs6rf2IoewITKtfdtsUZcxXO0ng==", + "version": "4.4.42", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", + "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/service-error-classification": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.1.tgz", - "integrity": "sha512-bn5lWk8UUeXFCQfkrNErz5SbeNd+2hgYegHMLsOLPt4URDIsyREar6wMsdsR+8UCdgR5s8udG3Zalgc7puizIQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", + "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.1.tgz", - "integrity": "sha512-T6+gsAO1JYamOJqmORCrByDeQ/NB+ggjHb33UDOgdX4xIjXz/FB/3UqHgQu6PL1cSFrK+i4oteDIwqARDs/Szw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.1.tgz", - "integrity": "sha512-FRxifH/J2SgOaVLihIqBFuGhiHR/NfzbZYp5nYO7BGgT/gc/f9nAuuRJcEy/hwO3aI6ThyG5apH4tGec6A2sCw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.2.tgz", - "integrity": "sha512-PzPrGRSt3kNuruLCeR4ffJp57ZLVnIukMXVL3Ppr65ZoxiE+HBsOVAa/Z/T+4HzjCM6RaXnnmB8YKfsDjlb0iA==", + "version": "4.9.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.7.tgz", + "integrity": "sha512-wCU8HCLjAtAVqxxe0j2xff9LcEPw3yjBbg5IdQDIYFnxnPxbxcSLc7rgex7kqm9L/WYOnJEgaWQlfDkZleozMA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/querystring-builder": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.1.tgz", - "integrity": "sha512-3EG/61Ls1MrgEaafpltXBJHSqFPqmTzEX7QKO7lOEHuYGmGYzZ08t1SsTgd1vM74z0IihoZyGPynZ7WmXKvTeg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.0.tgz", - "integrity": "sha512-H5y/kZOqfJSqRkwtcAoVbqONmhdXwSgYNJ1Glk5Ry8qlhVVy5qUzD9EklaCH8/XLnoCsLO/F/Giee8MIvaBRkg==", + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.1.tgz", - "integrity": "sha512-J5Tzkw1PMtu01h6wl+tlN5vsyROmS6/z5lEfNlLo/L4ELHeVkQ4Q0PEIjDddPLfjVLCm8biQTESE5GCMixSRNQ==", - "dependencies": { - "@smithy/types": "^1.1.0", - "@smithy/util-uri-escape": "^1.0.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.1.tgz", - "integrity": "sha512-zauxdMc3cwxoLitI5DZqH7xN6Fk0mwRxrUMAETbav2j6Se2U0UGak/55rZcDg2yGzOURaLYi5iOm1gHr98P+Bw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.2.tgz", - "integrity": "sha512-Q5CCuzYL5FGo6Rr/O+lZxXHm2hrRgbmMn8MgyjqZUWZg20COg20DuNtIbho2iht6CoB7jOpmpBqhWizLlzUZgg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1" + }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.1.tgz", - "integrity": "sha512-EztziuIPoNronENGqh+MWVKJErA4rJpaPzJCPukzBeEoG2USka0/q4B5Mr/1zszOnrb49fPNh4u3u5LfiH7QzA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.1.tgz", - "integrity": "sha512-2D69je14ou1vBTnAQeysSK4QVMm0j3WHS3MDg/DnHnFFcXRCzVl/xAARO7POD8+fpi4tMFPs8Z4hzo1Zw40L0Q==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.6.tgz", + "integrity": "sha512-efP6DN3UTFrzIsGO42/xcabv8jU7+9nwEdphFUH7yL0k010ERyAWaO41KFQIDLcFZLZ8xzIQr4wplFxNzslSGQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^1.0.1", - "@smithy/is-array-buffer": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-hex-encoding": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "@smithy/util-uri-escape": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.3.tgz", - "integrity": "sha512-Wh1mNP/1yUZK0uYkgCQ6NMxpBT3Fmc45TMdUfOlH1xD2zGYL7U4yDHFOhEZdi/suyjaelFobXB2p9pPIw6LjRQ==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", + "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-stack": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-stream": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.0.tgz", - "integrity": "sha512-KzmvisMmuwD2jZXuC9e65JrgsZM97y5NpDU7g347oB+Q+xQLU6hQZ5zFNNbEfwwOJHoOvEVTna+dk1h/lW7alw==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.16.1.tgz", + "integrity": "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.1.tgz", - "integrity": "sha512-33vWEtE6HzmwjEcEb4I58XMLRAchwPS93YhfDyXAXr1jwDCzfXmMayQwwpyW847rpWj0XJimxqia8q0z+k/ybw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-base64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.1.tgz", - "integrity": "sha512-rJcpRi/yUi6TyCEkjdTH86/ExBuKlfctEXhG9/4gMJ3/cnPcHJJnr0mQ9evSEO+3DbpT/Nxq90bcTBdTIAmCig==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.1.tgz", - "integrity": "sha512-Pdp744fmF7E1NWoSb7256Anhm8eYoCubvosdMwXzOnHuPRVbDa15pKUz2027K3+jrfGpXo1r+MnDerajME1Osw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.1.tgz", - "integrity": "sha512-4PIHjDFwG07SNensAiVq/CJmubEVuwclWSYOTNtzBNTvxOeGLznvygkGYgPzS3erByT8C4S9JvnLYgtrsVV3nQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.1.tgz", - "integrity": "sha512-363N7Wq0ceUgE5lLe6kaR6GlJs2/m4r9V6bRMfIszb6P1FZbbRRM2FQYUWWPFSsRymm9mJL18b3fjiVsIvhDGg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.4.2.tgz", + "integrity": "sha512-4OC4Y7tCxfPZde7AHj4g5ythl6svtn3SvuPbWuXHyoWSVxfBhWHJJ5/YX4NQDsj+WjGmWIPYykS77LnpGuYqeQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.26.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.1.tgz", - "integrity": "sha512-4Qy38Oy5/q43MpTwCLV1P+7NeaOp4W2etQDxMjgEeRlOyGGNlgttn0syi4g2rVSukFVqQ6FbeRs5xbnFmS6kaQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.1.tgz", - "integrity": "sha512-/9ObwNch4Z/NJYfkO4AvqBWku60Ju+c2Ck32toPOLmWe/V6eI9FLn8C1abri+GxDRCkLIqvkaWU1lgZ3nWZIIw==", + "version": "4.3.41", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", + "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.1.tgz", - "integrity": "sha512-XQM3KvqRLgv7bwAzVkXTITkOmcOINoG9icJiGT8FA0zV35lY5UvyIsg5kHw01xigQS8ufa/33AwG3ZoXip+V5g==", + "version": "4.2.44", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", + "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^1.0.1", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.1.tgz", - "integrity": "sha512-FPTtMz/t02/rbfq5Pdll/TWUYP+GVFLCQNr+DgifrLzVRU0g8rdRjyFpDh8nPTdkDDusTTo9P1bepAYj68s0eA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.1.tgz", - "integrity": "sha512-u9akN3Zmbr0vZH4F+2iehG7cFg+3fvDfnvS/hhsXH4UHuhqiQ+ADefibnLzPoz1pooY7rvwaQ/TVHyJmZHdLdQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.3.tgz", - "integrity": "sha512-gYQnZDD8I2XJFspVwUISyukjPWVikTzKR0IdG8hCWYPTpeULFl1o6yzXlT5SL63TBkuEYl0R1/93cdNtMiNnoA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^1.0.2", - "tslib": "^2.5.0" + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.1.tgz", - "integrity": "sha512-4aBCIz35aZAnt2Rbq341KrnUzGhWv2/Zu8HouJqYLvSWCzlrvsNCGlXP4e70Kjzcw8hSuuCNtdUICwQ5qUWLxg==", + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-buffer-from": "^1.0.1", - "@smithy/util-hex-encoding": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.1.tgz", - "integrity": "sha512-IJUrRnXKEIc+PKnU1XzTsIENVR+60jUDPBP3iWX/EvuuT3Xfob47x1FGUe2c3yMXNuU6ax8VDk27hL5LKNoehQ==", + "node_modules/@smithy/util-utf8": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.4.2.tgz", + "integrity": "sha512-N5CpfaL+/LPQU9PFdOT55ayUo5T0QypG4Almzd1/efJvoDypuT1shkgJk1+hhg/02scYluW6Q2JGnSHIPwCEGQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/core": "^3.26.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/util-utf8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.1.tgz", - "integrity": "sha512-iX6XHpjh4DFEUIBSKp2tjy3pYnLQMsJ62zYi1BVAC0kobE6p8AVpiZnxsU3ZkgQatAsUaEspFHUZ7CL7oSqaPQ==", + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^1.0.1", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/available-typed-arrays": { @@ -1047,9 +1119,12 @@ } }, "node_modules/aws-sdk": { - "version": "2.1249.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1249.0.tgz", - "integrity": "sha512-kJXbCgdqvhmylwq2ncoTv6mx/0zIll3fsN5NQ08qDSOTZtZRYkm4I/IS1vQSeVCmsnkfO7WpyA5Uv1Gt4MJApg==", + "version": "2.1693.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1693.0.tgz", + "integrity": "sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ==", + "deprecated": "The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil", + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -1060,20 +1135,12 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" + "xml2js": "0.6.2" }, "engines": { "node": ">= 10.0.0" } }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1094,9 +1161,10 @@ ] }, "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" }, "node_modules/buffer": { "version": "4.9.2", @@ -1128,27 +1196,6 @@ "node": ">=0.4.x" } }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -1329,17 +1376,14 @@ "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/url": { "version": "0.10.3", @@ -1363,9 +1407,11 @@ } }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -1390,889 +1436,846 @@ } }, "node_modules/xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", "engines": { "node": ">=4.0" } } }, "dependencies": { - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "requires": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } } } }, "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "requires": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "tslib": "^2.6.2" } }, "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "tslib": "^2.6.2" } }, "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "requires": { "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } } } }, "@aws-sdk/client-evidently": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-evidently/-/client-evidently-3.363.0.tgz", - "integrity": "sha512-ZlO5yBdGRH/2W3zNC8vSJYWhIVbHcUuVwSImCZ1Or6vJOBlNkuNgcXphmAwz744RPQi0yM0boQ6dk12yBzd9Jw==", - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz", - "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==", - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso-oidc": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz", - "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==", - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz", - "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==", - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-sdk-sts": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.1", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "version": "3.986.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-evidently/-/client-evidently-3.986.0.tgz", + "integrity": "sha512-P6ahaoaq1rW80me8tdjZz9pQV/wRiRqM0U0QKSrxtffYAONzC8IXMR5v2gJ26heqAOq8FqmJ8Z3LUgn9xYjLjA==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.7", + "@aws-sdk/credential-provider-node": "^3.972.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.7", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.986.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.5", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-retry": "^4.4.30", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.29", + "@smithy/util-defaults-mode-node": "^4.2.32", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/core": { + "version": "3.975.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.975.3.tgz", + "integrity": "sha512-7ur3kCKuvPLqlsZ2XlvnNBVQ7KkpSu6Y6dOTwSPHLrFpTEfZM8isLBJc4cgv96WB7GifeVM436mpycwxBd2vEA==", + "requires": { + "@aws-sdk/types": "^3.974.2", + "@aws-sdk/xml-builder": "^3.972.36", + "@aws/lambda-invoke-store": "^0.3.0", + "@smithy/core": "^3.29.4", + "@smithy/signature-v4": "^5.6.5", + "@smithy/types": "^4.16.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-env": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz", - "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.59.tgz", + "integrity": "sha512-Ny5e4Mfh3QPmiAc0AiUe+cbTXDlxkU3Rc+EpWOfyWeWEy6yp7Fa1KmfNeCc+1a8by9zQ9gtohmiQUkMPScF3ng==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-http": { + "version": "3.972.61", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.61.tgz", + "integrity": "sha512-8jAjgStl5Ytq4+HF3X/9f+EmRinaRbGRRtQGktlPfBRVx73H+R1y48vIeXerQtYGFaUqkEp3fT6jP854rVO2yQ==", + "requires": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-ini": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz", - "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==", - "requires": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "version": "3.973.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.4.tgz", + "integrity": "sha512-e6ZvVsj90aRALf1kHP+J4iqC1496ZpVgqI/+u0LJ5HL7q7ATauGy4gdDvRCP13L1pN/fMiZLah162PGIYkbUVQ==", + "requires": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-login": "^3.972.66", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-login": { + "version": "3.972.66", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.66.tgz", + "integrity": "sha512-g2fsqm87r/nKthLZ0VkkDBElkGg0PvSa8d97HQ6EilMbJTZ6hxa8FxkSZyJfgPfFdZn0TTmkOffQmTSUcAHIng==", + "requires": { + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz", - "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==", - "requires": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-ini": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "version": "3.972.70", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.70.tgz", + "integrity": "sha512-3xzvkGdykBunxqh8WudmUpSyLWvIhfI6aBQo1b5rb3mDO5mNLadK+0hiI0qBQBMVynJbfLO+Ajy9dztMwy9O8w==", + "requires": { + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-ini": "^3.973.4", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-process": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz", - "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.59.tgz", + "integrity": "sha512-DlZF2/MhLlatDdlrIy3CUCpfdbLrKx+3SMjVo+WyHnPpwzkc/M3vwAHw4OVJf7DMvO+4vfRqSCMc/E9I1auN0g==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz", - "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==", + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.3.tgz", + "integrity": "sha512-hmdDHoy2G5Es2e8IgelNMYUuSQI6uCIAKZMJ2u2PdKDhxvbk1uWD/g4+R7R5c/tJfKEB1+KjjWiaoCr/S+ZTiQ==", "requires": { - "@aws-sdk/client-sso": "3.363.0", - "@aws-sdk/token-providers": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/token-providers": "3.1088.0", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz", - "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==", + "version": "3.972.65", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.65.tgz", + "integrity": "sha512-gHQb/Kt0chjk/JQDa/GJDqmAvEuVn8n7z10wK2h0LFM9TUDRkohgOO4aEF+s2sBLM0br7Cl5W6P7phgjrrJvLQ==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/middleware-host-header": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz", - "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", + "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" } }, "@aws-sdk/middleware-logger": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz", - "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", + "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" } }, "@aws-sdk/middleware-recursion-detection": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz", - "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", + "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==" + } } }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz", - "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==", + "@aws-sdk/middleware-user-agent": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", + "integrity": "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@smithy/core": "^3.23.9", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-retry": "^4.2.11", + "tslib": "^2.6.2" + }, + "dependencies": { + "@aws-sdk/util-endpoints": { + "version": "3.996.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", + "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-endpoints": "^3.3.2", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-sdk/nested-clients": { + "version": "3.997.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.33.tgz", + "integrity": "sha512-dVZOroI/r3/ENvqNGgjMPul+jjlz9GddfVusgTXlVjfZj5isibOxecLkGQbRPp8XOuX+RAfjXLFgPkD1JS5xrw==", "requires": { - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, - "@aws-sdk/middleware-signing": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz", - "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==", + "@aws-sdk/region-config-resolver": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", + "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.5", + "@smithy/config-resolver": "^4.4.10", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" } }, - "@aws-sdk/middleware-user-agent": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz", - "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==", + "@aws-sdk/signature-v4-multi-region": { + "version": "3.996.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.41.tgz", + "integrity": "sha512-QMUytg+FQMGouc8gHS00KoYih3+N6cqmVI/pQGOIo7Nr7OpQaiXjSYOuL+vsPZ1tymY4LAQ8MYcHJmws5LRxng==", "requires": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.974.2", + "@smithy/signature-v4": "^5.6.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/token-providers": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz", - "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1088.0.tgz", + "integrity": "sha512-4ObatWt2qpJg5FBk4LOOKrTQYzaqeewAtdO3r9ZO8lH9YqLtpTzLyIdy0mJ+nVdfYOnqISkKNfmzP22bNDhwyw==", "requires": { - "@aws-sdk/client-sso-oidc": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.974.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.2.tgz", + "integrity": "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==", "requires": { - "tslib": "^2.5.0" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@aws-sdk/util-endpoints": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", - "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "version": "3.986.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.986.0.tgz", + "integrity": "sha512-Mqi79L38qi1gCG3adlVdbNrSxvcm1IPDLiJPA3OBypY5ewxUyWbaA3DD4goG+EwET6LSFgZJcRSIh6KBNpP5pA==", "requires": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" } }, "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "version": "3.965.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.8.tgz", + "integrity": "sha512-uUbMs1cBZPafD0ohUj6EwNf0fPZ534NvBxHox4hjX+0Rxq5paSYUem7+hi833pYrzrcnBATKIYpR02MDXT5M9g==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz", - "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==", + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", + "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@aws-sdk/util-user-agent-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz", - "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==", + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.6.tgz", + "integrity": "sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ==", "requires": { - "@aws-sdk/types": "3.357.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/types": "^3.973.5", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" } }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "@aws-sdk/xml-builder": { + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.36.tgz", + "integrity": "sha512-RdGmS1GLrtaTOLE1ElSluMldNrpk9Emq6uYs8SS8iHlu5xTAmM9rRkM91o48+rIRryBtyO9t+uLYCoMG6jVMVA==", "requires": { - "tslib": "^2.3.1" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, - "@smithy/abort-controller": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.1.tgz", - "integrity": "sha512-An6irzp9NCji2JtJHhrEFlDbxLwHd6c6Y9fq3ZeomyUR8BIXlGXVTxsemUSZVVgOq3166iYbYs/CrPAmgRSFLw==", - "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" - } + "@aws/lambda-invoke-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz", + "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==" }, "@smithy/config-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.1.tgz", - "integrity": "sha512-quj0xUiEVG/UHfY82EtthR/+S5/17p3IxXArC3NFSNqryMobWbG9oWgJy2s2cgUSVZLzxevjKKvxrilK7JEDaA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", "requires": { - "@smithy/types": "^1.1.0", - "@smithy/util-config-provider": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" } }, - "@smithy/credential-provider-imds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.1.tgz", - "integrity": "sha512-hkRJoxVCh4CEt1zYOBElE+G/MV6lyx3g68hSJpesM4pwMT/bzEVo5E5XzXY+6dVq8yszeatWKbFuqCCBQte8tg==", + "@smithy/core": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.5.tgz", + "integrity": "sha512-i0dk2t5B+CwV/dcJdUHILYkOQF5lof8f44dFCfDWToGCxjT9YQ+CgHqTAvJxzc3+zqQwm2QtVoJ5IqiNar/CnQ==", "requires": { - "@smithy/node-config-provider": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, - "@smithy/eventstream-codec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.1.tgz", - "integrity": "sha512-cpcTXQEOEs2wEvIyxW/iTHJ2m0RVqoEOTjjWEXD6SY8Gcs3FCFP6E8MXadC098tdH5ctMIUXc8POXyMpxzGnjw==", + "@smithy/credential-provider-imds": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.10.tgz", + "integrity": "sha512-MJenAe4OKRZUo1LdYYFDCsSHxaHvInIU/z52GsheO9vl1/VSySVCr0zkyKD6TFiGkSUaWGxvKZ/70OvgUZR5HQ==", "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^1.1.0", - "@smithy/util-hex-encoding": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@smithy/fetch-http-handler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.1.tgz", - "integrity": "sha512-/e2A8eOMk4FVZBQ0o6uF/ttLtFZcmsK5MIwDu1UE3crM4pCAIP19Ul8U9rdLlHhIu81X4AcJmSw55RDSpVRL/w==", + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.7.tgz", + "integrity": "sha512-3zpg8yqqyXzoK2TsRDdkqVOj2RDBFfLXwCczOZ5c7TWB4eiaebfSCsbMjDPYB3PJ9ihV62QaeadZ+wLadZtNGA==", "requires": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/querystring-builder": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-base64": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@smithy/hash-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.1.tgz", - "integrity": "sha512-eCz08BySBcOjVObjbRAS/XMKUGY4ujnuS+GoWeEpzpCSKDnO8/YQ0rStRt4C0llRmhApizYc1tK9DiJwfvXcBg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.4.10.tgz", + "integrity": "sha512-y0CfGFpEVyGg6EfrBj0BWkgfaRiXk+dG4t3xYNPMbnkOBBy8Yv8THUDsmkHXe2PyzYIzC6uPlT97kZoX6KF9vg==", "requires": { - "@smithy/types": "^1.1.0", - "@smithy/util-buffer-from": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "tslib": "^2.6.2" } }, "@smithy/invalid-dependency": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.1.tgz", - "integrity": "sha512-kib63GFlAzRn/wf8M0cRWrZA1cyOy5IvpTkLavCY782DPFMP0EaEeD6VrlNIOvD6ncf7uCJ68HqckhwK1qLT3g==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/is-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.1.tgz", - "integrity": "sha512-fHSTW70gANnzPYWNDcWkPXpp+QMbHhKozbQm/+Denkhp4gwSiPuAovWZRpJa9sXO+Q4dOnNzYN2max1vTCEroA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/middleware-content-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.1.tgz", - "integrity": "sha512-vWWigayk5i2cFp9xPX5vdzHyK+P0t/xZ3Ovp4Ss+c8JQ1Hlq2kpJZVWtTKsmdfND5rVo5lu0kD5wgAMUCcmuhw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", "requires": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/middleware-endpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.2.tgz", - "integrity": "sha512-F3CyXgjtDI4quGFkDmVNytt6KMwlzzeMxtopk6Edue4uKdKcMC1vUmoRS5xTbFzKDDp4XwpnEV7FshPaL3eCPw==", + "version": "4.4.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", + "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", "requires": { - "@smithy/middleware-serde": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" } }, "@smithy/middleware-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.3.tgz", - "integrity": "sha512-ZRsjG8adtxQ456FULPqPFmWtrW44Fq8IgdQvQB+rC2RSho3OUzS+TiEIwb5Zs6rf2IoewITKtfdtsUZcxXO0ng==", + "version": "4.4.42", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", + "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", "requires": { - "@smithy/protocol-http": "^1.1.0", - "@smithy/service-error-classification": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" } }, "@smithy/middleware-serde": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.1.tgz", - "integrity": "sha512-bn5lWk8UUeXFCQfkrNErz5SbeNd+2hgYegHMLsOLPt4URDIsyREar6wMsdsR+8UCdgR5s8udG3Zalgc7puizIQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", + "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/middleware-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.1.tgz", - "integrity": "sha512-T6+gsAO1JYamOJqmORCrByDeQ/NB+ggjHb33UDOgdX4xIjXz/FB/3UqHgQu6PL1cSFrK+i4oteDIwqARDs/Szw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", "requires": { - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/node-config-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.1.tgz", - "integrity": "sha512-FRxifH/J2SgOaVLihIqBFuGhiHR/NfzbZYp5nYO7BGgT/gc/f9nAuuRJcEy/hwO3aI6ThyG5apH4tGec6A2sCw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", "requires": { - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/node-http-handler": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.2.tgz", - "integrity": "sha512-PzPrGRSt3kNuruLCeR4ffJp57ZLVnIukMXVL3Ppr65ZoxiE+HBsOVAa/Z/T+4HzjCM6RaXnnmB8YKfsDjlb0iA==", + "version": "4.9.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.7.tgz", + "integrity": "sha512-wCU8HCLjAtAVqxxe0j2xff9LcEPw3yjBbg5IdQDIYFnxnPxbxcSLc7rgex7kqm9L/WYOnJEgaWQlfDkZleozMA==", "requires": { - "@smithy/abort-controller": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/querystring-builder": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@smithy/property-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.1.tgz", - "integrity": "sha512-3EG/61Ls1MrgEaafpltXBJHSqFPqmTzEX7QKO7lOEHuYGmGYzZ08t1SsTgd1vM74z0IihoZyGPynZ7WmXKvTeg==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/protocol-http": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.0.tgz", - "integrity": "sha512-H5y/kZOqfJSqRkwtcAoVbqONmhdXwSgYNJ1Glk5Ry8qlhVVy5qUzD9EklaCH8/XLnoCsLO/F/Giee8MIvaBRkg==", + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.1.tgz", - "integrity": "sha512-J5Tzkw1PMtu01h6wl+tlN5vsyROmS6/z5lEfNlLo/L4ELHeVkQ4Q0PEIjDddPLfjVLCm8biQTESE5GCMixSRNQ==", - "requires": { - "@smithy/types": "^1.1.0", - "@smithy/util-uri-escape": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/querystring-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.1.tgz", - "integrity": "sha512-zauxdMc3cwxoLitI5DZqH7xN6Fk0mwRxrUMAETbav2j6Se2U0UGak/55rZcDg2yGzOURaLYi5iOm1gHr98P+Bw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/service-error-classification": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.2.tgz", - "integrity": "sha512-Q5CCuzYL5FGo6Rr/O+lZxXHm2hrRgbmMn8MgyjqZUWZg20COg20DuNtIbho2iht6CoB7jOpmpBqhWizLlzUZgg==" + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "requires": { + "@smithy/types": "^4.13.1" + } }, "@smithy/shared-ini-file-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.1.tgz", - "integrity": "sha512-EztziuIPoNronENGqh+MWVKJErA4rJpaPzJCPukzBeEoG2USka0/q4B5Mr/1zszOnrb49fPNh4u3u5LfiH7QzA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", "requires": { - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/signature-v4": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.1.tgz", - "integrity": "sha512-2D69je14ou1vBTnAQeysSK4QVMm0j3WHS3MDg/DnHnFFcXRCzVl/xAARO7POD8+fpi4tMFPs8Z4hzo1Zw40L0Q==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.6.tgz", + "integrity": "sha512-efP6DN3UTFrzIsGO42/xcabv8jU7+9nwEdphFUH7yL0k010ERyAWaO41KFQIDLcFZLZ8xzIQr4wplFxNzslSGQ==", "requires": { - "@smithy/eventstream-codec": "^1.0.1", - "@smithy/is-array-buffer": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-hex-encoding": "^1.0.1", - "@smithy/util-middleware": "^1.0.1", - "@smithy/util-uri-escape": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.29.5", + "@smithy/types": "^4.16.1", + "tslib": "^2.6.2" } }, "@smithy/smithy-client": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.3.tgz", - "integrity": "sha512-Wh1mNP/1yUZK0uYkgCQ6NMxpBT3Fmc45TMdUfOlH1xD2zGYL7U4yDHFOhEZdi/suyjaelFobXB2p9pPIw6LjRQ==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", + "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", "requires": { - "@smithy/middleware-stack": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-stream": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.23.11", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" } }, "@smithy/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.0.tgz", - "integrity": "sha512-KzmvisMmuwD2jZXuC9e65JrgsZM97y5NpDU7g347oB+Q+xQLU6hQZ5zFNNbEfwwOJHoOvEVTna+dk1h/lW7alw==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.16.1.tgz", + "integrity": "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/url-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.1.tgz", - "integrity": "sha512-33vWEtE6HzmwjEcEb4I58XMLRAchwPS93YhfDyXAXr1jwDCzfXmMayQwwpyW847rpWj0XJimxqia8q0z+k/ybw==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", "requires": { - "@smithy/querystring-parser": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/util-base64": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.1.tgz", - "integrity": "sha512-rJcpRi/yUi6TyCEkjdTH86/ExBuKlfctEXhG9/4gMJ3/cnPcHJJnr0mQ9evSEO+3DbpT/Nxq90bcTBdTIAmCig==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", "requires": { - "@smithy/util-buffer-from": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" } }, "@smithy/util-body-length-browser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.1.tgz", - "integrity": "sha512-Pdp744fmF7E1NWoSb7256Anhm8eYoCubvosdMwXzOnHuPRVbDa15pKUz2027K3+jrfGpXo1r+MnDerajME1Osw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/util-body-length-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.1.tgz", - "integrity": "sha512-4PIHjDFwG07SNensAiVq/CJmubEVuwclWSYOTNtzBNTvxOeGLznvygkGYgPzS3erByT8C4S9JvnLYgtrsVV3nQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/util-buffer-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.1.tgz", - "integrity": "sha512-363N7Wq0ceUgE5lLe6kaR6GlJs2/m4r9V6bRMfIszb6P1FZbbRRM2FQYUWWPFSsRymm9mJL18b3fjiVsIvhDGg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.4.2.tgz", + "integrity": "sha512-4OC4Y7tCxfPZde7AHj4g5ythl6svtn3SvuPbWuXHyoWSVxfBhWHJJ5/YX4NQDsj+WjGmWIPYykS77LnpGuYqeQ==", "requires": { - "@smithy/is-array-buffer": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/core": "^3.26.0", + "tslib": "^2.6.2" } }, "@smithy/util-config-provider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.1.tgz", - "integrity": "sha512-4Qy38Oy5/q43MpTwCLV1P+7NeaOp4W2etQDxMjgEeRlOyGGNlgttn0syi4g2rVSukFVqQ6FbeRs5xbnFmS6kaQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/util-defaults-mode-browser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.1.tgz", - "integrity": "sha512-/9ObwNch4Z/NJYfkO4AvqBWku60Ju+c2Ck32toPOLmWe/V6eI9FLn8C1abri+GxDRCkLIqvkaWU1lgZ3nWZIIw==", + "version": "4.3.41", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", + "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", "requires": { - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/util-defaults-mode-node": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.1.tgz", - "integrity": "sha512-XQM3KvqRLgv7bwAzVkXTITkOmcOINoG9icJiGT8FA0zV35lY5UvyIsg5kHw01xigQS8ufa/33AwG3ZoXip+V5g==", + "version": "4.2.44", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", + "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "requires": { + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-endpoints": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", "requires": { - "@smithy/config-resolver": "^1.0.1", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/util-hex-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.1.tgz", - "integrity": "sha512-FPTtMz/t02/rbfq5Pdll/TWUYP+GVFLCQNr+DgifrLzVRU0g8rdRjyFpDh8nPTdkDDusTTo9P1bepAYj68s0eA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", "requires": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "@smithy/util-middleware": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.1.tgz", - "integrity": "sha512-u9akN3Zmbr0vZH4F+2iehG7cFg+3fvDfnvS/hhsXH4UHuhqiQ+ADefibnLzPoz1pooY7rvwaQ/TVHyJmZHdLdQ==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", "requires": { - "tslib": "^2.5.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/util-retry": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.3.tgz", - "integrity": "sha512-gYQnZDD8I2XJFspVwUISyukjPWVikTzKR0IdG8hCWYPTpeULFl1o6yzXlT5SL63TBkuEYl0R1/93cdNtMiNnoA==", + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", "requires": { - "@smithy/service-error-classification": "^1.0.2", - "tslib": "^2.5.0" + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" } }, "@smithy/util-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.1.tgz", - "integrity": "sha512-4aBCIz35aZAnt2Rbq341KrnUzGhWv2/Zu8HouJqYLvSWCzlrvsNCGlXP4e70Kjzcw8hSuuCNtdUICwQ5qUWLxg==", + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", "requires": { - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-buffer-from": "^1.0.1", - "@smithy/util-hex-encoding": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" } }, - "@smithy/util-uri-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.1.tgz", - "integrity": "sha512-IJUrRnXKEIc+PKnU1XzTsIENVR+60jUDPBP3iWX/EvuuT3Xfob47x1FGUe2c3yMXNuU6ax8VDk27hL5LKNoehQ==", + "@smithy/util-utf8": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.4.2.tgz", + "integrity": "sha512-N5CpfaL+/LPQU9PFdOT55ayUo5T0QypG4Almzd1/efJvoDypuT1shkgJk1+hhg/02scYluW6Q2JGnSHIPwCEGQ==", "requires": { - "tslib": "^2.5.0" + "@smithy/core": "^3.26.0", + "tslib": "^2.6.2" } }, - "@smithy/util-utf8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.1.tgz", - "integrity": "sha512-iX6XHpjh4DFEUIBSKp2tjy3pYnLQMsJ62zYi1BVAC0kobE6p8AVpiZnxsU3ZkgQatAsUaEspFHUZ7CL7oSqaPQ==", + "@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", "requires": { - "@smithy/util-buffer-from": "^1.0.1", - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "available-typed-arrays": { @@ -2281,9 +2284,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sdk": { - "version": "2.1249.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1249.0.tgz", - "integrity": "sha512-kJXbCgdqvhmylwq2ncoTv6mx/0zIll3fsN5NQ08qDSOTZtZRYkm4I/IS1vQSeVCmsnkfO7WpyA5Uv1Gt4MJApg==", + "version": "2.1693.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1693.0.tgz", + "integrity": "sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -2294,14 +2297,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" - } + "xml2js": "0.6.2" } }, "base64-js": { @@ -2310,9 +2306,9 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==" }, "buffer": { "version": "4.9.2", @@ -2338,14 +2334,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "requires": { - "strnum": "^1.0.5" - } - }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -2472,15 +2460,10 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "url": { "version": "0.10.3", @@ -2504,9 +2487,9 @@ } }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" }, "which-typed-array": { "version": "1.1.9", @@ -2522,18 +2505,18 @@ } }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" } } } diff --git a/examples/klotho-analysis/klotho-go-example/.gitignore b/examples/klotho-analysis/klotho-go-example/.gitignore index 66fd13c9..03aed592 100644 --- a/examples/klotho-analysis/klotho-go-example/.gitignore +++ b/examples/klotho-analysis/klotho-go-example/.gitignore @@ -13,3 +13,6 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +# Klotho generates compiled IaC output here — exclude auto-generated code and its dependencies +_compiled/ diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.my-first-app.yaml b/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.my-first-app.yaml deleted file mode 100755 index 2b03ed9e..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.my-first-app.yaml +++ /dev/null @@ -1,3 +0,0 @@ -encryptionsalt: v1:0MYECxTNgvI=:v1:tlpGG93ZBPkdVn6p:LWIlvZE4jCfiDhTqf0nzloa+m9SFUw== -config: - cloudcc:namespace: "my-first-app" diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.yaml b/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.yaml deleted file mode 100755 index 6d38b7b5..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/Pulumi.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: my-first-app -runtime: nodejs -description: A CloudCompiled App diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/deploylib.ts b/examples/klotho-analysis/klotho-go-example/_compiled/deploylib.ts deleted file mode 100755 index bba74cdd..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/deploylib.ts +++ /dev/null @@ -1,1449 +0,0 @@ -import * as aws from '@pulumi/aws' -import { Region } from '@pulumi/aws' -import * as awsx from '@pulumi/awsx' - -import * as pulumi from '@pulumi/pulumi' -import * as sha256 from 'simple-sha256' -import * as fs from 'fs' -import * as requestRetry from 'requestretry' -import * as crypto from 'crypto' -import { setupElasticacheCluster } from './iac/elasticache' -import * as analytics from './iac/analytics' - -import { hash as h, sanitized, validate } from './iac/sanitization/sanitizer' -import { LoadBalancerPlugin } from './iac/load_balancing' -import { DefaultEksClusterOptions, Eks, EksExecUnit, HelmChart } from './iac/eks' -import { setupMemoryDbCluster } from './iac/memorydb' -import AwsSanitizer from './iac/sanitization/aws' - -export enum Resource { - exec_unit = 'exec_unit', - static_unit = 'static_unit', - gateway = 'gateway', - kv = 'persist_kv', - fs = 'persist_fs', - secret = 'persist_secret', - orm = 'persist_orm', - redis_node = 'persist_redis_node', - redis_cluster = 'persist_redis_cluster', - pubsub = 'pubsub', - internal = 'internal', - config = 'config', -} - -export interface ResourceKey { - Kind: string - Name: string -} - -interface ResourceInfo { - id: string - urn: string - kind: string - type: string - url: string -} - -export interface TopologyData { - topologyIconData: TopologyIconData[] - topologyEdgeData: TopologyEdgeData[] -} - -export interface TopologyIconData { - id: string - title: string - image: string - kind: string - type: string -} - -export interface TopologyEdgeData { - source: string - target: string -} - -export const kloConfig: pulumi.Config = new pulumi.Config('klo') - -export class CloudCCLib { - secrets = new Map() - - resourceIdToResource = new Map() - sharedPolicyStatements: aws.iam.PolicyStatement[] = [] - execUnitToFunctions = new Map() - execUnitToRole = new Map() - execUnitToPolicyStatements = new Map() - execUnitToImage = new Map>() - - gatewayToUrl = new Map>() - siteBuckets = new Map() - buckets = new Map() - - topologySpecOutputs: pulumi.Output[] = [] - connectionString = new Map>() - - klothoVPC: awsx.ec2.Vpc - publicSubnetIds: Promise[]> - privateSubnetIds: Promise[]> - sgs: pulumi.Output[] = [] - subnetGroup: aws.rds.SubnetGroup - - snsTopics = new Map() - - account: pulumi.Output - cluster: awsx.ecs.Cluster - privateDnsNamespace: aws.servicediscovery.PrivateDnsNamespace - - eks: Eks - - protect = kloConfig.getBoolean('protect') ?? false - execUnitToNlb = new Map() - execUnitToVpcLink = new Map() - - constructor( - private sharedRepo: awsx.ecr.Repository, - public readonly stage: string, - public readonly region: Region, - public readonly name: string, - private namespace: string, - private datadogEnabled: boolean, - public readonly topology: TopologyData, - private createVPC: boolean - ) { - this.account = pulumi.output(aws.getCallerIdentity({})) - // These are CloudCompiler specific components that are required for it's operation - this.generateResourceMap() - if (this.createVPC) { - this.getVpcSgSubnets() - } - this.addSharedPolicyStatement({ - Effect: 'Allow', - Action: ['cloudwatch:PutMetricData'], - Resource: '*', - Condition: { - StringEquals: { - 'cloudwatch:namespace': this.namespace, - }, - }, - }) - } - - getVpcSgSubnets() { - interface VPC { - id?: string - sgId?: string - publicSubnetIds?: string[] - privateSubnetIds?: string[] - } - - const klothoVPC = kloConfig.getObject('vpc') - if (klothoVPC == undefined) { - this.createVpcSgSubnets() - this.createVpcEndpoints() - return - } - if ( - klothoVPC.id == undefined || - klothoVPC.sgId == undefined || - klothoVPC.privateSubnetIds == undefined - ) { - throw new Error( - 'id, sgId, and privateSubnetIds[] must all be valid and specified in your pulumi config.' - ) - } - - this.klothoVPC = awsx.ec2.Vpc.fromExistingIds(this.name, { - vpcId: klothoVPC.id, - privateSubnetIds: klothoVPC.privateSubnetIds, - publicSubnetIds: klothoVPC.publicSubnetIds, - }) - - this.publicSubnetIds = this.klothoVPC.publicSubnetIds - this.privateSubnetIds = this.klothoVPC.privateSubnetIds - - const klothoSG = awsx.ec2.SecurityGroup.fromExistingId(this.name, klothoVPC.sgId) - this.sgs = new Array(klothoSG.id) - } - - createVpcSgSubnets() { - this.klothoVPC = new awsx.ec2.Vpc(this.name, { - cidrBlock: '10.0.0.0/16', - enableDnsHostnames: true, - enableDnsSupport: true, - numberOfAvailabilityZones: 2, - subnets: [{ type: 'public' }, { type: 'private' }], - }) - - this.publicSubnetIds = this.klothoVPC.publicSubnetIds - this.privateSubnetIds = this.klothoVPC.privateSubnetIds - - const sgName = sanitized(AwsSanitizer.EC2.vpc.securityGroup.nameValidation())`${h( - this.name - )}` - const klothoSG = new aws.ec2.SecurityGroup(sgName, { - name: sgName, - vpcId: this.klothoVPC.id, - egress: [ - { - cidrBlocks: ['0.0.0.0/0'], - description: 'Allows all outbound IPv4 traffic.', - fromPort: 0, - protocol: '-1', - toPort: 0, - }, - ], - ingress: [ - { - description: - 'Allows inbound traffic from network interfaces and instances that are assigned to the same security group.', - fromPort: 0, - protocol: '-1', - self: true, - toPort: 0, - }, - { - description: 'For EKS control plane', - cidrBlocks: ['0.0.0.0/0'], - fromPort: 9443, - protocol: 'TCP', - self: true, - toPort: 9443, - }, - ], - }) - this.sgs = new Array(klothoSG.id) - - pulumi.output(this.klothoVPC.privateSubnets).apply((ps) => { - const cidrBlocks: any = ps.map((subnet) => subnet.subnet.cidrBlock) - new aws.ec2.SecurityGroupRule(`${this.name}-private-ingress`, { - type: 'ingress', - cidrBlocks: cidrBlocks, - fromPort: 0, - protocol: '-1', - toPort: 0, - securityGroupId: klothoSG.id, - }) - }) - - pulumi.output(this.klothoVPC.publicSubnets).apply((ps) => { - const cidrBlocks: any = ps.map((subnet) => subnet.subnet.cidrBlock) - new aws.ec2.SecurityGroupRule(`${this.name}-public-ingress`, { - type: 'ingress', - cidrBlocks: cidrBlocks, - fromPort: 0, - protocol: '-1', - toPort: 0, - securityGroupId: klothoSG.id, - }) - }) - } - - // there is currently no way to handle an exception of a resource doesn't exist, so this - // actually only creates vpc endpoints. - getOrCreateVpcEndpoint( - name: string, - type: string, - awsServiceName: string, - subnetIds: pulumi.Output[], - routeTableIds: pulumi.Output[] - ) { - if (type == 'Interface') { - const endpoint = new aws.ec2.VpcEndpoint(name, { - vpcId: this.klothoVPC.id, - subnetIds: subnetIds, - securityGroupIds: this.sgs, - serviceName: awsServiceName, - vpcEndpointType: 'Interface', - privateDnsEnabled: true, - }) - } else if (type == 'Gateway') { - const endpoint = new aws.ec2.VpcEndpoint(name, { - vpcId: this.klothoVPC.id, - serviceName: awsServiceName, - routeTableIds: routeTableIds, - }) - } - } - - createVpcEndpoints() { - this.klothoVPC.privateSubnets.then((subnets) => { - const subnetIds: pulumi.Output[] = subnets.map((x) => x.id) - const routeTableIds = subnets.map((x) => x.routeTable!.id) - - for (const svc of ['lambda', 'sqs', 'sns', 'secretsmanager']) { - this.getOrCreateVpcEndpoint( - `${svc}VpcEndpoint`, - 'Interface', - `com.amazonaws.${this.region}.${svc}`, - subnetIds, - routeTableIds - ) - } - - for (const svc of ['dynamodb', 's3']) { - this.getOrCreateVpcEndpoint( - `${svc}VpcEndpoint`, - 'Gateway', - `com.amazonaws.${this.region}.${svc}`, - subnetIds, - routeTableIds - ) - } - }) - } - - generateResourceMap() { - this.topology.topologyIconData.forEach((r) => { - this.resourceIdToResource.set(r.id, r) - }) - } - - addSharedPolicyStatement(statement: aws.iam.PolicyStatement) { - this.sharedPolicyStatements.push(statement) - } - - addPolicyStatementForName(name: string, statement: aws.iam.PolicyStatement) { - if (this.execUnitToPolicyStatements.has(name)) { - let statements = this.execUnitToPolicyStatements.get(name) - statements!.push(statement) - } else { - this.execUnitToPolicyStatements.set(name, [statement]) - } - } - - // make sure this is called last so all resource generation has a chance to add to the policy statements - createPolicy() { - for (const [physicalName, role] of this.execUnitToRole.entries()) { - const combinedPolicyStatements = new Set([ - ...this.sharedPolicyStatements, - ]) - if (this.execUnitToPolicyStatements.has(physicalName)) { - this.execUnitToPolicyStatements - .get(physicalName)! - .forEach((item) => combinedPolicyStatements.add(item)) - } - if (combinedPolicyStatements.size > 0) { - const policyName = sanitized(AwsSanitizer.IAM.policy.nameValidation())`${h( - this.name - )}-${h(physicalName)}-exec` - const policy = new aws.iam.Policy( - policyName, - { - policy: { - Version: '2012-10-17', - Statement: Array.from(combinedPolicyStatements), - }, - }, - { parent: role } - ) - new aws.iam.RolePolicyAttachment( - policyName, - { - role: role, - policyArn: policy.arn, - }, - { parent: role } - ) - } - } - } - - createImage(execUnitName: string, dockerfilePath: string) { - const image = this.sharedRepo.buildAndPushImage({ - context: `./${execUnitName}`, - dockerfile: `./${execUnitName}/${dockerfilePath}`, - extraOptions: ['--platform', 'linux/amd64', '--quiet'], - }) - this.execUnitToImage.set(execUnitName, image) - } - - createDockerAppRunner(execUnitName, envVars: any) { - const instanceRole = this.createRoleForName(execUnitName) - - this.addPolicyStatementForName(execUnitName, { - Effect: 'Allow', - Action: ['apprunner:ListServices'], - Resource: ['*'], - }) - - const roleName = sanitized(AwsSanitizer.IAM.role.nameValidation())`${h(this.name)}-${h( - execUnitName - )}-ar-access-role` - const accessRole = new aws.iam.Role(roleName, { - assumeRolePolicy: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Service: 'build.apprunner.amazonaws.com', - }, - Action: 'sts:AssumeRole', - }, - ], - }, - }) - - const policy = new aws.iam.Policy( - sanitized(AwsSanitizer.IAM.policy.nameValidation())`${h(this.name)}-${h( - execUnitName - )}-ar-access-policy`, - { - description: 'Role to grant AppRunner service access to ECR', - policy: { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ecr:DescribeImages', - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - ], - Resource: ['*'], - }, - ], - }, - }, - { - parent: accessRole, - } - ) - - const attach = new aws.iam.RolePolicyAttachment( - `${execUnitName}-ar-access-attach`, - { - role: accessRole.name, - policyArn: policy.arn, - }, - { - parent: accessRole, - } - ) - - accessRole.arn.apply(async () => { - await new Promise((f) => setTimeout(f, 8000)) - }) - - const additionalEnvVars: { [key: string]: pulumi.Input } = - this.generateExecUnitEnvVars(execUnitName, envVars) - - const logGroupName = sanitized( - AwsSanitizer.CloudWatch.logGroup.nameValidation() - )`/aws/apprunner/${h(this.name)}-${h(execUnitName)}-apprunner` - let cloudwatchGroup = new aws.cloudwatch.LogGroup(`${this.name}-${execUnitName}-lg`, { - name: logGroupName, - retentionInDays: 1, - }) - - let isProxied = false - this.topology.topologyEdgeData.forEach((edge) => { - if (this.resourceIdToResource.get(edge.target)?.title == execUnitName) { - if (this.resourceIdToResource.get(edge.source)?.kind == Resource.exec_unit) { - isProxied = true - } - } - }) - - const serviceName = sanitized(AwsSanitizer.AppRunner.service.nameValidation())`${h( - this.name - )}-${h(execUnitName)}-apprunner` - const service = new aws.apprunner.Service(serviceName, { - serviceName: serviceName, - sourceConfiguration: { - autoDeploymentsEnabled: false, - authenticationConfiguration: { - accessRoleArn: accessRole.arn, - }, - imageRepository: { - imageConfiguration: { - port: isProxied ? '3001' : '3000', - runtimeEnvironmentVariables: additionalEnvVars, - }, - imageIdentifier: this.execUnitToImage.get(execUnitName)!, - imageRepositoryType: 'ECR', - }, - }, - tags: { - Name: serviceName, - App: this.name, - }, - instanceConfiguration: { - instanceRoleArn: instanceRole.arn, - }, - }) - - if (!isProxied) { - let resp = {} - resp[`${execUnitName}`] = pulumi.interpolate`https://${service.serviceUrl}` - return resp - } - } - - createDockerLambda( - execUnitName, - baseArgs: Partial, - network_placement: 'private' | 'public', - env_vars?: any[] - ) { - const image = this.execUnitToImage.get(execUnitName)! - - const subnetIds = - network_placement === 'public' ? this.publicSubnetIds : this.privateSubnetIds - - const lambdaRole = this.createRoleForName(execUnitName) - const lambdaName = sanitized(AwsSanitizer.Lambda.lambdaFunction.nameValidation())`${h( - this.name - )}-${h(execUnitName)}` - - const lambdaConfig: aws.lambda.FunctionArgs = { - ...baseArgs, - packageType: 'Image', - imageUri: image, - role: lambdaRole.arn, - name: lambdaName, - tags: { - env: 'production', - service: execUnitName, - }, - vpcConfig: this.createVPC - ? { - securityGroupIds: this.sgs, - subnetIds, - } - : undefined, - } - if (this.datadogEnabled) { - lambdaConfig.tracingConfig = { - mode: 'Active', - } - } - - let cloudwatchGroup = new aws.cloudwatch.LogGroup(`${execUnitName}-function-api-lg`, { - name: pulumi.interpolate`/aws/lambda/${lambdaConfig.name}`, - retentionInDays: 1, - }) - - const additionalEnvVars = this.generateExecUnitEnvVars(execUnitName, env_vars) - - if (lambdaConfig.environment != null) { - lambdaConfig.environment = pulumi.output(lambdaConfig.environment).apply((env) => ({ - variables: { ...env.variables, ...additionalEnvVars }, - })) - } else { - lambdaConfig.environment = { variables: additionalEnvVars } - } - let createdFunction = new aws.lambda.Function(execUnitName, lambdaConfig, { - dependsOn: [cloudwatchGroup], - }) - - this.topologySpecOutputs.push( - pulumi.all([createdFunction.id, createdFunction.urn]).apply(([id, urn]) => ({ - id: id, - urn: urn, - kind: '', // TODO - type: 'AWS Lambda', - url: `https://console.aws.amazon.com/lambda/home?region=${this.region}#/functions/${id}?tab=code`, - })) - ) - - this.execUnitToFunctions.set(execUnitName, createdFunction) - return createdFunction - } - - getEnvVarForDependency(v: any): [string, pulumi.Input] { - switch (v.Kind) { - case Resource.orm: - const connStr = this.connectionString.get(`${v.ResourceID}_${v.Kind}`)! - return [v.Name, connStr] - break - case Resource.redis_node: - // intentional fall-through: redis-node and redis_cluster get configured the same way - case Resource.redis_cluster: - if (v.Value === 'host') { - return [v.Name, this.connectionString.get(`${v.ResourceID}_${v.Kind}_host`)!] - } else if (v.Value === 'port') { - return [v.Name, this.connectionString.get(`${v.ResourceID}_${v.Kind}_port`)!] - } - break - case Resource.secret: - const secret: aws.secretsmanager.Secret = this.secrets.get(v.ResourceID)! - return [v.Name, secret.name] - case Resource.fs: - const bucket: aws.s3.Bucket = this.buckets.get(v.ResourceID)! - return [v.Name, bucket.bucket] - case Resource.internal: - if (v.ResourceID === 'InternalKlothoPayloads') { - const bucket: aws.s3.Bucket = this.buckets.get(v.ResourceID)! - return [v.Name, bucket.bucket] - } - break - case Resource.config: - if (v.Value == 'secret_name') { - const secret: aws.secretsmanager.Secret = this.secrets.get(v.ResourceID)! - return [v.Name, secret.name] - } - break - default: - throw new Error('unsupported kind') - } - return ['', ''] - } - - generateExecUnitEnvVars( - execUnitName: string, - env_vars?: any[] - ): { [key: string]: pulumi.Input } { - const additionalEnvVars: { [key: string]: pulumi.Input } = { - APP_NAME: this.name, - CLOUDCC_NAMESPACE: this.namespace, - EXECUNIT_NAME: execUnitName, - KLOTHO_S3_PREFIX: this.account.accountId, - } - - const execEdgeID = this.topology.topologyIconData.find( - (resource) => resource.kind == 'exec_unit' && resource.title == execUnitName - )!.id - - if (env_vars) { - for (const v of env_vars) { - if (v.Kind == '') { - additionalEnvVars[v.Name] = v.Value - } else { - const result = this.getEnvVarForDependency(v) - additionalEnvVars[result[0]] = result[1] - } - } - } - - additionalEnvVars.SNS_ARN_BASE = pulumi.interpolate`arn:aws:sns:${this.region}:${this.account.accountId}` - return additionalEnvVars - } - - configureExecUnitPolicies() { - const functionSet = new Set() - - this.topology.topologyIconData.forEach((resource) => { - if (resource.kind == Resource.gateway) { - this.topology.topologyEdgeData.forEach((edge) => { - if (edge.source == resource.id) { - functionSet.add(this.resourceIdToResource.get(edge.target).title) - } - }) - } - - if (resource.kind == Resource.exec_unit) { - this.topology.topologyEdgeData.forEach((edge) => { - if (edge.source == resource.id) { - const targetResource = this.resourceIdToResource.get(edge.target) - if (targetResource && targetResource.kind == Resource.exec_unit) { - if (this.execUnitToFunctions.has(targetResource.title)) { - this.addPolicyStatementForName(resource.title, { - Effect: 'Allow', - Action: ['lambda:InvokeFunction'], - Resource: [ - this.execUnitToFunctions.get(targetResource.title)!.arn, - ], - }) - } else if (['ecs', 'eks'].includes(targetResource.type)) { - this.addPolicyStatementForName(resource.title, { - Effect: 'Allow', - Action: ['servicediscovery:DiscoverInstances'], - Resource: ['*'], - }) - } - } - } - }) - } - }) - - for (const [name, func] of this.execUnitToFunctions) { - if (functionSet.has(name)) { - this.addPolicyStatementForName(name, { - Effect: 'Allow', - Action: ['lambda:InvokeFunction'], - Resource: [func.invokeArn], - }) - } - } - } - - createTopic( - path: string, - name: string, - event: string, - publishers: string[], - subscribers: string[] - ): aws.sns.Topic { - let topic = `${this.name}_${name}_${event}` - // validate rather than sanitize since the PubSub runtime depends on a specific topic format - validate(topic, AwsSanitizer.SNS.topic.nameValidation()) - if (topic.length > 256) { - const hash = crypto.createHash('sha256') - hash.update(topic) - topic = `${hash.digest('hex')}_${event}` - } - let sns = this.snsTopics.get(topic) - if (!sns) { - sns = new aws.sns.Topic(topic, { - name: topic, - }) - this.snsTopics.set(topic, sns) - } - - for (const pub of publishers) { - this.addPolicyStatementForName(pub, { - Effect: 'Allow', - Action: ['sns:Publish'], - Resource: [sns.arn], - }) - } - - for (const sub of subscribers) { - const func = this.execUnitToFunctions.get(sub)! - new aws.sns.TopicSubscription( - `${topic}: ${sub}-subscription`, - { - topic: sns.arn, - protocol: 'lambda', - endpoint: func.arn, - }, - { parent: sns } - ) - - new aws.lambda.Permission( - `${topic}-${sub}`, - { - action: 'lambda:InvokeFunction', - function: func.arn, - principal: 'sns.amazonaws.com', - sourceArn: sns.arn, - }, - { parent: func } - ) - } - - return sns - } - - setupKV(): aws.dynamodb.Table { - const tableName = sanitized(AwsSanitizer.DynamoDB.table.nameValidation())`${h(this.name)}` - const db = new aws.dynamodb.Table( - `KV_${tableName}`, - { - attributes: [ - { name: 'pk', type: 'S' }, - { name: 'sk', type: 'S' }, - ], - hashKey: 'pk', - rangeKey: 'sk', - billingMode: 'PAY_PER_REQUEST', - ttl: { - // 'expiration' will only be set on items if TTL is enabled via annotation. - // At IaC-level, blanket enable and it will be ignored if not present on the item(s). - attributeName: 'expiration', - enabled: true, - }, - name: tableName, - }, - { protect: this.protect } - ) - - this.topology.topologyIconData.forEach((resource) => { - if (resource.kind == Resource.kv) { - this.topology.topologyEdgeData.forEach((edge) => { - if (resource.id == edge.target) { - const name = this.resourceIdToResource.get(edge.source).title - this.addPolicyStatementForName(name, { - Effect: 'Allow', - Action: ['dynamodb:*'], - Resource: [ - db.arn, - pulumi.interpolate`${db.arn}/index/*`, - pulumi.interpolate`${db.arn}/stream/*`, - pulumi.interpolate`${db.arn}/backup/*`, - pulumi.interpolate`${db.arn}/export/*`, - ], - }) - } - }) - } - }) - return db - } - - createBuckets(bucketsToCreate, forceDestroy = false) { - bucketsToCreate.forEach((b) => { - const bucketName = this.account.accountId.apply( - (accountId) => - sanitized( - AwsSanitizer.S3.bucket.nameValidation() - )`${accountId}-${this.name}-${this.region}-${b.Name}` - ) - const bucket = new aws.s3.Bucket( - b.Name, - { - bucket: bucketName, - forceDestroy, - }, - { protect: this.protect } - ) - this.buckets.set(b.Name, bucket) - - this.topology.topologyIconData.forEach((resource) => { - if (resource.kind == Resource.fs) { - this.topology.topologyEdgeData.forEach((edge) => { - if (resource.id == edge.target) { - const name = this.resourceIdToResource.get(edge.source).title - this.addPolicyStatementForName(name, { - Effect: 'Allow', - Action: ['s3:*'], - Resource: [bucket.arn, pulumi.interpolate`${bucket.arn}/*`], - }) - } - }) - } - }) - - const nameSet = new Set() - this.topology.topologyEdgeData.forEach((edge) => { - const source = this.resourceIdToResource.get(edge.source) - const target = this.resourceIdToResource.get(edge.target) - if (source.kind == Resource.exec_unit && target.kind == Resource.exec_unit) { - nameSet.add(source.title) - nameSet.add(target.title) - } else if (source.kind == Resource.exec_unit && target.kind == Resource.pubsub) { - // pubsub publisher - nameSet.add(source.title) - } else if (source.kind == Resource.pubsub && target.kind == Resource.exec_unit) { - // pubsub subscriber - nameSet.add(target.title) - } - }) - nameSet.forEach((n) => { - this.addPolicyStatementForName(n, { - Effect: 'Allow', - Action: ['s3:*'], - Resource: [bucket.arn, pulumi.interpolate`${bucket.arn}/*`], - }) - }) - }) - } - - private createExecutionRole(execUnitPhysicalName: string) { - const roleName = sanitized(AwsSanitizer.IAM.role.nameValidation())`${h( - this.name - )}_${this.generateHashFromPhysicalName(execUnitPhysicalName)}_LambdaExec` - const lambdaExecRole = new aws.iam.Role(roleName, { - assumeRolePolicy: { - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Principal: { - Service: 'lambda.amazonaws.com', - }, - Effect: 'Allow', - Sid: '', - }, - { - Action: 'sts:AssumeRole', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - Effect: 'Allow', - }, - { - Action: 'sts:AssumeRole', - Principal: { - Service: 'tasks.apprunner.amazonaws.com', - }, - Effect: 'Allow', - }, - ], - }, - }) - // https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs - new aws.iam.RolePolicyAttachment(`${this.name}-${execUnitPhysicalName}-lambdabasic`, { - role: lambdaExecRole, - policyArn: aws.iam.ManagedPolicies.AWSLambdaVPCAccessExecutionRole, - }) - - return lambdaExecRole - } - - public installLambdaWarmer(execUnitNames) { - let region = this.region - const name = 'lambdaWarmer' - const lambdaNames = execUnitNames.map((n) => `${this.name}-${n}`) - - const warmerRole = this.createRoleForName(name) - const warmerFuncName = sanitized(AwsSanitizer.Lambda.lambdaFunction.nameValidation())`${h( - this.name - )}-lambdawarmer` - let warmerLambda = new aws.lambda.CallbackFunction(name, { - name: warmerFuncName, - memorySize: 128 /*MB*/, - timeout: 60, - runtime: 'nodejs14.x', - callback: async (e) => { - function getRandomInt(max) { - return Math.floor(Math.random() * max) - } - - for (const lambdaFuncName of lambdaNames) { - let invokeParams = { - FunctionName: lambdaFuncName, - InvocationType: 'Event', - Payload: JSON.stringify(['warmed up', getRandomInt(100) + '']), - } - let awsSdk = require('aws-sdk') - const lambda = new awsSdk.Lambda({ region: region }) - await lambda.invoke(invokeParams).promise() - } - }, - - role: warmerRole, - }) - - const functionArns: pulumi.Output[] = [] - execUnitNames.forEach((n) => { - if (this.execUnitToFunctions.has(n)) { - const fn = this.execUnitToFunctions.get(n)! - functionArns.push(fn.arn) - } - }) - - this.addPolicyStatementForName(name, { - Effect: 'Allow', - Action: ['lambda:*'], - Resource: [...functionArns], - }) - - const cloudwatchLogs = new aws.cloudwatch.LogGroup(`${name}-function-api-lg`, { - name: pulumi.interpolate`/aws/lambda/${warmerLambda.id}`, - retentionInDays: 1, - }) - - const warmUpLambda: aws.cloudwatch.EventRuleEventHandler = warmerLambda - const warmUpLambdaSchedule: aws.cloudwatch.EventRuleEventSubscription = - aws.cloudwatch.onSchedule('warmUpLambda', 'cron(0/5 * * * ? *)', warmUpLambda) - } - - public scheduleFunction(execUnitName, moduleName, functionName, cronExpression) { - const execGroupName = `${this.name}/${execUnitName}` - const key = sha256.sync(cronExpression).slice(0, 5) - const name = `${execGroupName}.${functionName}:${key}` - const scheduleRole = this.createRoleForName(name) - - const schedulerFuncName = sanitized( - AwsSanitizer.Lambda.lambdaFunction.nameValidation() - )`${h(this.name)}/${h(execUnitName)}_${h(functionName)}-${key}` - - let lambdaScheduler = new aws.lambda.CallbackFunction(name, { - name: schedulerFuncName, - memorySize: 128 /*MB*/, - timeout: 300, - runtime: 'nodejs14.x', - callback: async (e) => { - console.log( - `Running scheduled call for ${execGroupName}_${moduleName}_${functionName} ${cronExpression}` - ) - - const payloadToSend = { - __moduleName: moduleName, - __functionToCall: functionName, - __params: '', - __callType: 'rpc', - } - - let invokeParams = { - FunctionName: execGroupName, - InvocationType: 'Event', - Payload: JSON.stringify(payloadToSend), - } - let awsSdk = require('aws-sdk') - const lambda = new awsSdk.Lambda({ region: this.region }) - await lambda.invoke(invokeParams).promise() - }, - - role: scheduleRole, - }) - - if (this.execUnitToFunctions.has(execGroupName)) { - this.addPolicyStatementForName(name, { - Effect: 'Allow', - Action: ['lambda:*'], - Resource: [this.execUnitToFunctions.get(execGroupName)!.arn], - }) - } - let cloudwatchLogs = new aws.cloudwatch.LogGroup(`${name}-function-api-lg`, { - name: lambdaScheduler.id.apply( - (id) => - sanitized(AwsSanitizer.CloudWatch.logGroup.nameValidation())`/aws/lambda/${h( - id - )}` - ), - retentionInDays: 1, - }) - - const schedulerLambda: aws.cloudwatch.EventRuleEventHandler = lambdaScheduler - const warmUpLambdaSchedule: aws.cloudwatch.EventRuleEventSubscription = - aws.cloudwatch.onSchedule( - sanitized(AwsSanitizer.EventBridge.rule.nameValidation())`${h(execGroupName)}_${h( - functionName - )}_act`, - `cron(${cronExpression})`, - schedulerLambda - ) - } - - public addConnectionString(orm: string, connectionString: pulumi.Output) { - const clients: string[] = [] - this.topology.topologyIconData.forEach((resource) => { - if (resource.kind == Resource.orm) { - this.topology.topologyEdgeData.forEach((edge) => { - var id = resource.id - - if (edge.target == id && id == `${orm}_${Resource.orm}`) { - // stores our connection string in environment variables + print it to the console - this.connectionString.set(id, connectionString) - // store another copy of the connection string for helm environment variables - const envVar = `${resource.title}${resource.kind}` - .toUpperCase() - .replace(/[^a-z0-9]/gi, '') - this.connectionString.set(`${envVar}CONNECTION`, connectionString) - - clients.push(edge.source) - } - }) - } - }) - return clients - } - - public async uploadTopologyDiagramToPortal(deployId) { - pulumi.all(this.topologySpecOutputs).apply(async (t) => { - // image file generated by the visualization service - const diagramFileName = `${pulumi.getStack()}.png` - // json structure for the portal to build the interactive diagram - const diagramStructureFileName = `${pulumi.getStack()}.json` - - const diagram = fs.readFileSync(diagramFileName, { - encoding: 'base64', - }) - const diagramJson = fs.readFileSync(diagramStructureFileName) - - // Upload the diagram image - TODO: remove later - let data1 = { - data: diagram, - } - - const resp1 = await requestRetry({ - url: `https://app.klo.dev/v1/topology/diagram/${deployId}`, - method: 'POST', - json: true, - body: data1, - maxAttempts: 3, - retryDelay: 100, - }) - - if (resp1.statusCode == 201) { - console.log( - `Successfully uploaded ${diagramStructureFileName} for deploy: ${deployId}` - ) - } else { - console.error(`Failed to upload ${diagramStructureFileName}`) - } - - // Upload the diagram json structure - let data = { - data: diagramJson, - } - - const resp = await requestRetry({ - url: `https://app.klo.dev/v1/topology/diagram/${deployId}-v2`, - method: 'POST', - json: true, - body: data, - maxAttempts: 3, - retryDelay: 100, - }) - - if (resp.statusCode == 201) { - console.log(`Successfully uploaded ${diagramFileName} for deploy: ${deployId}`) - } else { - console.error(`Failed to upload ${diagramFileName}`) - } - }) - } - - public async uploadTopologySpecToPortal(deployId) { - let spec: ResourceInfo[] = [] - - pulumi.all(this.topologySpecOutputs).apply(async (t) => { - t.forEach((r) => { - spec.push({ ...r }) - }) - const data = { - data: spec, - } - const resp = await requestRetry({ - url: `https://app.klo.dev/v1/topology/spec/${deployId}`, - method: 'POST', - json: true, - body: data, - maxAttempts: 3, - retryDelay: 100, - }) - - if (resp.statusCode == 201) { - console.log(`Successfully uploaded spec for deploy: ${deployId}`) - } else { - console.error(`Failed to upload spec for deploy: ${deployId}`) - } - }) - } - - public async uploadAnalytics(message: string, sendOnDryRun: boolean, waitOnInfra: boolean) { - if (pulumi.runtime.isDryRun() != sendOnDryRun) { - return - } - - const user = await analytics.retrieveUser() - - if (waitOnInfra) { - pulumi.all(this.topologySpecOutputs).apply(async (t) => { - await analytics.sendAnalytics(user, message, this.name) - }) - } else { - await analytics.sendAnalytics(user, message, this.name) - } - } - - createRoleForName(name: string): aws.iam.Role { - const roleName = sanitized(AwsSanitizer.IAM.role.nameValidation())`${name}` - const role: aws.iam.Role = this.createExecutionRole(roleName) - this.execUnitToRole.set(roleName, role) - return role - } - - generateHashFromPhysicalName(execUnitName: string): string { - const nameHash: string = sha256.sync(execUnitName) - return nameHash.slice(0, 5) - } - - createEcsCluster() { - const providedClustername = kloConfig.get('cluster') - - if (providedClustername != undefined) { - // Since we use awsx clusters, we cannot just use the cluster retrieved from this get cluster call. - // instead, this serves as a way to validate a cluster with the provided name actually exists. - // Pulumi will error if a cluster with the provided name doesn't exist while the awsx's cluster create will - // simply ignore the provided name in that scenario. This get cluster serves as a way to prevent us from - // creating a new cluster despite the user providing one. - const cluster = aws.ecs.getCluster({ clusterName: providedClustername }) - } - - // set up service discovery - this.privateDnsNamespace = new aws.servicediscovery.PrivateDnsNamespace( - `${this.name}-privateDns`, - { - name: sanitized( - AwsSanitizer.ServiceDiscovery.privateDnsNamespace.nameValidation() - )`${h(this.name)}-privateDns`, - description: 'Used for service discovery', - vpc: this.klothoVPC.id, - } - ) - - this.cluster = new awsx.ecs.Cluster( - sanitized(AwsSanitizer.ECS.cluster.nameValidation())`${h(this.name)}-cluster`, - { - vpc: this.klothoVPC, - cluster: providedClustername, - securityGroups: [], // otherwise, awsx creates a default one with 0.0.0.0/0. See #314 - } - ) - } - - createEksResources = async ( - execUnits: EksExecUnit[], - charts?: HelmChart[], - lbPlugin?: LoadBalancerPlugin - ) => { - let clusterName = sanitized(AwsSanitizer.EKS.cluster.nameValidation())`${h( - this.name - )}-eks-cluster` - const providedClustername = kloConfig.get('eks-cluster') - const existingCluster = undefined - if (this.eks == undefined) { - if (providedClustername != undefined) { - const existingCluster: aws.eks.GetClusterResult = await aws.eks.getCluster({ - name: providedClustername!, - }) - clusterName = providedClustername - } - } - this.eks = new Eks( - clusterName, - DefaultEksClusterOptions, - this, - execUnits, - charts || [], - existingCluster, - lbPlugin - ) - } - - createEcsService( - execUnitName, - baseArgs: Partial, - network_placement: 'public' | 'private', - envVars: any, - lbPlugin?: LoadBalancerPlugin - ) { - if (this.cluster == undefined) { - this.createEcsCluster() - } - - const image = this.execUnitToImage.get(execUnitName)! - - const role = this.createRoleForName(execUnitName) - - this.addPolicyStatementForName(execUnitName, { - Effect: 'Allow', - Action: ['ssm:GetParameters', 'secretsmanager:GetSecretValue', 'kms:Decrypt', 'ecr:*'], - Resource: '*', - }) - let needsLoadBalancer = false - this.topology.topologyIconData.forEach((resource) => { - if (resource.kind === Resource.gateway) { - this.topology.topologyEdgeData.forEach((edge) => { - if (edge.source == resource.id && edge.target === `${execUnitName}_exec_unit`) { - // We know that this exec unit is exposed and must create the necessary resources - if (resource.type == 'apigateway') { - needsLoadBalancer = true - } - } - }) - } - }) - - let nlb - if (needsLoadBalancer) { - nlb = new awsx.lb.NetworkLoadBalancer( - sanitized(AwsSanitizer.ELB.loadBalancer.nameValidation())`${h(execUnitName)}-nlb`, - { - external: false, - vpc: this.klothoVPC, - subnets: this.privateSubnetIds, - } - ) - this.execUnitToNlb.set(execUnitName, nlb) - - const targetGroup: awsx.elasticloadbalancingv2.NetworkTargetGroup = - nlb.createTargetGroup( - sanitized(AwsSanitizer.ELB.targetGroup.nameValidation())`${h( - execUnitName - )})-tg`, - { - port: 3000, - } - ) - - const listener = targetGroup.createListener(`${execUnitName}-listener`, { - port: 80, - }) - - const vpcLink = new aws.apigateway.VpcLink(`${execUnitName}-vpc-link`, { - targetArn: nlb.loadBalancer.arn, - }) - - this.execUnitToVpcLink.set(execUnitName, vpcLink) - } - - const logGroupName = sanitized( - AwsSanitizer.CloudWatch.logGroup.nameValidation() - )`/aws/fargate/${h(this.name)}-${h(execUnitName)}-task` - - let cloudwatchGroup = new aws.cloudwatch.LogGroup(`${this.name}-${execUnitName}-lg`, { - name: `${logGroupName}`, - retentionInDays: 1, - }) - - let additionalEnvVars: { name: string; value: pulumi.Input }[] = [] - for (const [name, value] of Object.entries( - this.generateExecUnitEnvVars(execUnitName, envVars) - )) { - additionalEnvVars.push({ name, value }) - } - - const serviceName = sanitized(AwsSanitizer.ServiceDiscovery.service.nameValidation())`${h( - execUnitName - )}` - const discoveryService = new aws.servicediscovery.Service(serviceName, { - name: serviceName, - dnsConfig: { - namespaceId: this.privateDnsNamespace.id, - dnsRecords: [ - { - ttl: 10, - type: 'A', - }, - ], - routingPolicy: 'MULTIVALUE', - }, - healthCheckCustomConfig: { - failureThreshold: 1, - }, - }) - - const task = new awsx.ecs.FargateTaskDefinition(`${execUnitName}-task`, { - logGroup: cloudwatchGroup, - family: sanitized(AwsSanitizer.ECS.taskDefinition.familyValidation())`${h( - execUnitName - )}-family`, - executionRole: role, - taskRole: role, - container: { - ...baseArgs, - image: image, - portMappings: - nlb != undefined - ? nlb.listeners - : [ - { - containerPort: 3000, - protocol: 'tcp', - }, - ], - environment: [ - { name: 'AWS_XRAY_CONTEXT_MISSING', value: 'LOG_ERROR' }, - ...additionalEnvVars, - ], - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': `${logGroupName}`, - 'awslogs-region': `${this.region}`, - 'awslogs-stream-prefix': '/ecs', - }, - }, - }, - }) - - // This is done here for now because of a potential deletion race condition mentioned on the pulumi site - const attach = new aws.iam.RolePolicyAttachment(`${execUnitName}-fargateAttach`, { - role: role.name, - policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }) - - const subnets = - network_placement === 'public' ? this.publicSubnetIds : this.privateSubnetIds - - const service = new awsx.ecs.FargateService( - `${execUnitName}-service`, - { - name: sanitized(AwsSanitizer.ECS.service.nameValidation())`${h( - execUnitName - )}-service}`, - cluster: this.cluster, - taskDefinition: task, - desiredCount: 1, - subnets, - securityGroups: this.sgs, - serviceRegistries: { - registryArn: discoveryService.arn, - }, - }, - { - dependsOn: [attach], - } - ) - } - - public setupRedis = async ( - name: string, - type: 'elasticache' | 'memorydb', - args: Partial - ) => { - if (type === 'elasticache') { - const subnetGroup = new aws.elasticache.SubnetGroup( - sanitized( - AwsSanitizer.Elasticache.cacheSubnetGroup.cacheSubnetGroupNameValidation() - )`${h(this.name)}-${h(name)}-subnetgroup`, - { - subnetIds: this.privateSubnetIds, - tags: { - Name: 'Klotho DB subnet group', - }, - } - ) - args = args as aws.elasticache.ClusterArgs - setupElasticacheCluster( - name, - args, - this.topology, - this.protect, - this.connectionString, - subnetGroup.name, - this.sgs, - this.name - ) - } else if (type === 'memorydb') { - // Since not all zones are supported in us-east-1 and us-west-2 we will verify our subnets are valid for the subnet group - const supported_azs = [ - 'use1-az2', - 'use1-az4', - 'use1-az6', - 'usw2-az1', - 'usw2-az2', - 'usw2-az3', - ] - let subnets: string[] | Promise[]> = [] - if (['us-east-1', 'us-west-2'].includes(this.region)) { - for (const subnetId in this.privateSubnetIds) { - const subnet: aws.ec2.GetSubnetResult = await aws.ec2.getSubnet({ - id: subnetId, - }) - if (supported_azs.includes(subnet.availabilityZoneId)) { - subnets.push(subnetId) - } - } - if (subnets.length === 0) { - throw new Error( - 'Unable to find subnets in supported memorydb Availability Zones' - ) - } - } else { - subnets = this.privateSubnetIds - } - - const subnetGroup = new aws.memorydb.SubnetGroup( - sanitized(AwsSanitizer.MemoryDB.subnetGroup.subnetGroupNameValidation())`${ - this.name - }-${h(name)}-subnetgroup`, - { - subnetIds: subnets, - tags: { - Name: 'Klotho DB subnet group', - }, - } - ) - args = args as aws.memorydb.ClusterArgs - setupMemoryDbCluster( - name, - args, - this.topology, - this.protect, - this.connectionString, - subnetGroup.name, - this.sgs, - this.name - ) - } - } -} diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/iac/analytics.ts b/examples/klotho-analysis/klotho-go-example/_compiled/iac/analytics.ts deleted file mode 100755 index 04841bc3..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/iac/analytics.ts +++ /dev/null @@ -1,56 +0,0 @@ -import * as fs from 'fs' -import * as os from 'os' -import * as path from 'path' -import * as requestRetry from 'requestretry' - -const analyticsFile = '/.klotho/analytics.json' -const klothoServer = 'http://srv.klo.dev/analytics/track' - -export interface Analytics { - id: string - event: string - properties?: any -} - -export interface User { - id?: string - email?: string -} - -export const sendAnalytics = async (user: User, message: string, appName: string) => { - let id = '' - const properties = { _logLevel: 'info', app: appName } - if (user.id != undefined) { - id = user.id - } - if (user.email != undefined) { - id = user.email - } - - if (id != '') { - const data: Analytics = { - id: id, - event: message, - properties: properties, - } - - const resp = await requestRetry({ - url: klothoServer, - method: 'POST', - json: true, - body: data, - maxAttempts: 3, - retryDelay: 100, - }) - } -} - -export const retrieveUser = async (): Promise => { - const file = path.join(os.homedir(), analyticsFile) - if (fs.existsSync(file)) { - const data = await fs.promises.readFile(file, 'utf-8') - const user: User = JSON.parse(data) - return user - } - return {} -} diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/iac/api_gateway.ts b/examples/klotho-analysis/klotho-go-example/_compiled/iac/api_gateway.ts deleted file mode 100755 index e6e945b3..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/iac/api_gateway.ts +++ /dev/null @@ -1,583 +0,0 @@ -import * as aws from '@pulumi/aws' -import * as pulumi from '@pulumi/pulumi' -import { CloudCCLib } from '../deploylib' -import * as sha256 from 'simple-sha256' -import { LoadBalancerPlugin } from './load_balancing' -import { DeploymentArgs, StageArgs } from '@pulumi/aws/apigatewayv2' - -export interface Route { - verb: string - path: string - execUnitName: string -} - -export interface Gateway { - Name: string - Routes: Route[] - ApiType: 'REST' | 'HTTP' -} - -function sanitizeName(g: Gateway) { - return g.Name.replace(/[^a-zA-Z0-9_-]+/g, '-') -} - -export class ApiGateway { - private readonly vpcLink?: aws.apigatewayv2.VpcLink - public readonly invokeUrls: pulumi.Output[] = [] - private readonly execUnitToIntegration = new Map() - - constructor( - private readonly lib: CloudCCLib, - private readonly lbPlugin: LoadBalancerPlugin, - gateways: Gateway[] - ) { - if (lib.klothoVPC != undefined) { - this.vpcLink = this.createVpcLink( - lib.sgs, - pulumi - .all([lib.publicSubnetIds || [], lib.privateSubnetIds || []]) - .apply(([publicIds, privateIds]) => { - return [...publicIds, ...privateIds] - }) - ) - } - - gateways.forEach((gateway) => { - switch (gateway.ApiType) { - case 'REST': - this.createRestGateway(gateway) - break - case 'HTTP': - this.createHttpGateway(gateway) - break - } - }) - } - - get appName() { - return this.lib.name - } - - get accountId() { - return this.lib.account.accountId - } - - createVpcLink( - securityGroupIds: pulumi.Output[], - subnetIds: pulumi.Output - ): aws.apigatewayv2.VpcLink { - return new aws.apigatewayv2.VpcLink(`${this.appName}`, { - securityGroupIds, - subnetIds, - }) - } - - createLambdaPermission(gwName: string, api: aws.apigatewayv2.Api, r: Route) { - const verb = r.verb.toUpperCase() - const path = this.convertPath(r.path) - const resourceId = pulumi.interpolate`${api.id}/*/${verb == 'ANY' ? '*' : verb}${ - path == '' ? '/' : path - }` - const lambda = this.lib.execUnitToFunctions.get(r.execUnitName)! - return new aws.lambda.Permission( - `${gwName}-${verb}-${path}`, - { - statementId: `${gwName}-http-${verb}-${r.path.replace(/[^a-zA-Z0-9]+/g, '-')}`, - action: 'lambda:InvokeFunction', - function: lambda, - principal: 'apigateway.amazonaws.com', - sourceArn: pulumi.interpolate`arn:aws:execute-api:${this.lib.region}:${this.accountId}:${resourceId}`, - }, - { - dependsOn: [api], - parent: lambda, - } - ) - } - - integrationName(r: Route) { - const execUnit = this.lib.resourceIdToResource.get(`${r.execUnitName}_exec_unit`) - const verb = r.verb.toUpperCase() - const path = this.convertPath(r.path) - return `${verb}-${path}-${execUnit.type}` - } - - createHTTPIntegration(api: aws.apigatewayv2.Api, r: Route): aws.apigatewayv2.Integration { - const execUnit = this.lib.resourceIdToResource.get(`${r.execUnitName}_exec_unit`) - const integrationName = this.integrationName(r) - switch (execUnit.type) { - case 'ecs': - const ecsNlb = this.lib.execUnitToNlb.get(r.execUnitName)! - return new aws.apigatewayv2.Integration( - integrationName, - { - apiId: api.id, - integrationType: 'HTTP_PROXY', - integrationMethod: 'ANY', - integrationUri: ecsNlb.loadBalancer.arn, - connectionType: 'VPC_LINK', - connectionId: '${stageVariables.vpcLinkId}', - }, - { - parent: api, - } - ) - case 'eks': - const eksListener = this.lbPlugin.getExecUnitListener(r.execUnitName)! - return new aws.apigatewayv2.Integration( - integrationName, - { - apiId: api.id, - integrationType: 'HTTP_PROXY', - integrationMethod: 'ANY', - integrationUri: eksListener.arn, - connectionType: 'VPC_LINK', - connectionId: '${stageVariables.vpcLinkId}', - }, - { - parent: api, - } - ) - case 'lambda': - const lambda = this.lib.execUnitToFunctions.get(r.execUnitName)! - return new aws.apigatewayv2.Integration( - integrationName, - { - apiId: api.id, - integrationType: 'AWS_PROXY', - integrationMethod: 'POST', - integrationUri: lambda.arn, - payloadFormatVersion: '2.0', - }, - { - parent: api, - } - ) - default: - throw new Error(`Unsupported execution unit type: ${execUnit.type}`) - } - } - - createRoute( - api: aws.apigatewayv2.Api, - routeKey: string, - integration: aws.apigatewayv2.Integration - ): aws.apigatewayv2.Route { - return new aws.apigatewayv2.Route( - routeKey, - { - apiId: api.id, - routeKey, - target: pulumi.interpolate`integrations/${integration.id}`, - }, - { - parent: integration, - } - ) - } - - createDeployment( - gwName: string, - api: aws.apigatewayv2.Api, - integrationNames: string[], - routes: aws.apigatewayv2.Route[], - dependsOn: pulumi.Resource[] = [] - ) { - const triggers: DeploymentArgs['triggers'] = { - integrationNames: sha256.sync(integrationNames.sort().join(',')), - } - if (this.vpcLink != undefined) { - triggers.link = this.vpcLink.arn - } - return new aws.apigatewayv2.Deployment( - `${gwName}-deploy`, - { - apiId: api.id, - triggers, - }, - { - dependsOn: [...routes, ...dependsOn], - parent: api, - } - ) - } - - createStage( - gwName: string, - api: aws.apigatewayv2.Api, - deployment: aws.apigatewayv2.Deployment - ) { - const dependsOn: pulumi.Resource[] = [] - const stageVariables: StageArgs['stageVariables'] = {} - if (this.vpcLink != undefined) { - stageVariables.vpcLinkId = this.vpcLink.id - dependsOn.push(this.vpcLink) - } - return new aws.apigatewayv2.Stage( - `${gwName}-stage`, - { - apiId: api.id, - name: '$default', - deploymentId: deployment.id, - stageVariables, - }, - { - dependsOn, - parent: api, - } - ) - } - - createWebSocketGateway(gateway: Gateway) { - const gwName = sanitizeName(gateway) - const units = new Set() - gateway.Routes.forEach((gw) => units.add(gw.execUnitName)) - if (units.size > 1) { - throw new Error(`only one exec unit is supported for websocket API Gateway ${gwName}`) - } - - const api: aws.apigatewayv2.Api = new aws.apigatewayv2.Api(gwName, { - name: `${this.appName}-${gwName}`, - protocolType: 'WEBSOCKET', - // routeSelectionExpression currently not used, the gateway only uses - // the builtin routes, $default, $connect, and $disconnect - routeSelectionExpression: `$request.body.action`, - }) - const apiRoutes: aws.apigatewayv2.Route[] = [] - const lambdaPermissions: aws.lambda.Permission[] = [] - const integrationNames: string[] = [] - - for (const route of gateway.Routes) { - const integration = this.createHTTPIntegration(api, route) - - this.execUnitToIntegration.set(route.execUnitName, integration) - apiRoutes.push(this.createRoute(api, '$default', integration)) - apiRoutes.push(this.createRoute(api, '$connect', integration)) - apiRoutes.push(this.createRoute(api, '$disconnect', integration)) - - const execUnit = this.lib.resourceIdToResource.get(`${route.execUnitName}_exec_unit`) - if (execUnit.type == 'lambda') { - lambdaPermissions.push(this.createLambdaPermission(gwName, api, route)) - } - - const integrationName = this.integrationName(route) - integrationNames.push(integrationName) - } - - const deployment: aws.apigatewayv2.Deployment = this.createDeployment( - gwName, - api, - integrationNames, - apiRoutes, - lambdaPermissions - ) - const stage: aws.apigatewayv2.Stage = this.createStage(gwName, api, deployment) - this.invokeUrls.push(stage.invokeUrl) - } - - createHttpGateway(gateway: Gateway) { - const gwName = sanitizeName(gateway) - const api: aws.apigatewayv2.Api = new aws.apigatewayv2.Api(`${this.appName}-${gwName}`, { - name: `${this.appName}-${gwName}`, - protocolType: 'HTTP', - routeSelectionExpression: '$request.method $request.path', - tags: { - 'Klotho:app': this.appName, - }, - }) - - const apiRoutes: aws.apigatewayv2.Route[] = [] - const lambdaPermissions: aws.lambda.Permission[] = [] - const integrationNames: string[] = [] - - for (const r of gateway.Routes) { - const integration = this.createHTTPIntegration(api, r) - - // routeKey match against api.routeSelectionExpression - let routeKey = `${r.verb.toUpperCase()} ${this.convertPath(r.path)}` - if (routeKey == 'ANY /') { - // For catch-all, use idiomatic $default instead - routeKey = '$default' - } - const route = this.createRoute(api, routeKey, integration) - apiRoutes.push(route) - - const execUnit = this.lib.resourceIdToResource.get(`${r.execUnitName}_exec_unit`) - if (execUnit.type == 'lambda') { - lambdaPermissions.push(this.createLambdaPermission(gwName, api, r)) - } - - const integrationName = this.integrationName(r) - integrationNames.push(integrationName) - } - - const deploy = this.createDeployment( - gwName, - api, - integrationNames, - apiRoutes, - lambdaPermissions - ) - - const stage = this.createStage(gwName, api, deploy) - - this.lib.gatewayToUrl.set(gateway.Name, stage.invokeUrl) - this.invokeUrls.push(stage.invokeUrl) - } - - /** - * Converts an express style path (or path segment) to API Gateway compatible. - */ - convertPath(path: string): string { - return path - .replace(/:([^/]+)/g, '{$1}') // convert express params :arg to AWS gateway {arg} - .replace(/[*]\}/g, '+}') // convert express greedy flag {arg*} to AWS gateway {arg+} - .replace(/\/\//g, '/') // collapse double '//' to single '/' - } - - createRestGateway(gateway: Gateway): void { - const gwName = sanitizeName(gateway) - const restAPI: aws.apigateway.RestApi = new aws.apigateway.RestApi(gwName, { - binaryMediaTypes: ['application/octet-stream', 'image/*'], - }) - const resourceMap = new Map() - const methods: aws.apigateway.Method[] = [] - const integrations: aws.apigateway.Integration[] = [] - const integrationNames: string[] = [] - const permissions: aws.lambda.Permission[] = [] - // create the resources and methods needed for the provided routes - for (const r of gateway.Routes) { - const execUnit = this.lib.resourceIdToResource.get(`${r.execUnitName}_exec_unit`) - const pathSegments = r.path.split('/').filter(Boolean) - let methodPathLastPart = pathSegments[pathSegments.length - 1] ?? '/' // get the last part of the path - let routeAndHash = `${methodPathLastPart.replace(':', '').replace('*', '')}-${sha256 - .sync(r.path) - .slice(0, 5)}` - // create the resources first - // parent resource starts off null since we don't create the root resource - let parentResource: aws.apigateway.Resource | null = null - const methodRequestParams = {} - const integrationRequestParams = {} - let currPathSegments = '' - for (let segment of pathSegments) { - // Handle path parameters defined in express as : - if (segment.includes(':')) { - const pathParam = `request.path.${segment.replace(':', '').replace('*', '')}` - methodRequestParams[`method.${pathParam}`] = true - integrationRequestParams[`integration.${pathParam}`] = `method.${pathParam}` - } - - segment = this.convertPath(segment) - - currPathSegments += `${segment}/` - if (resourceMap.has(currPathSegments)) { - parentResource = resourceMap.get(currPathSegments)! - } else { - const resource = new aws.apigateway.Resource( - gwName + currPathSegments, - { - restApi: restAPI.id, - parentId: - parentResource == null ? restAPI.rootResourceId : parentResource.id, - pathPart: segment, - }, - { - parent: restAPI, - } - ) - resourceMap.set(currPathSegments, resource) - parentResource = resource - } - } - - //create the methods - // We use the combination of the aws method property operationName alongside pulumi properties - // replaceOnChanges and deleteBeforeReplace in order to correctly trigger swapping integrations - // when infra is changed, for example from lambda to fargate. All three properties are required - // to trigger a replace action of the method, which is required to correctly swap integrations - // while preventing resource collisions on the method. - const method = new aws.apigateway.Method( - `${r.verb.toUpperCase()}-${routeAndHash}`, - { - restApi: restAPI.id, - resourceId: parentResource?.id ?? restAPI.rootResourceId, - httpMethod: r.verb.toUpperCase(), - authorization: 'NONE', - operationName: `${execUnit.type}-${r.verb.toUpperCase()}-${routeAndHash}`, - requestParameters: - Object.keys(methodRequestParams).length == 0 - ? undefined - : methodRequestParams, - }, - { - parent: parentResource ?? restAPI, - replaceOnChanges: ['*'], - deleteBeforeReplace: true, - } - ) - methods.push(method) - - const integrationName = `${execUnit.type}-${r.verb.toUpperCase()}-${routeAndHash}` - integrationNames.push(integrationName) - if (execUnit.type == 'ecs') { - const nlb = this.lib.execUnitToNlb.get(r.execUnitName)! - const vpcLink = this.lib.execUnitToVpcLink.get(r.execUnitName)! - integrations.push( - new aws.apigateway.Integration( - integrationName, - { - restApi: restAPI.id, - resourceId: - parentResource == null ? restAPI.rootResourceId : parentResource.id, - httpMethod: method.httpMethod, - integrationHttpMethod: method.httpMethod, - type: 'HTTP_PROXY', - connectionType: 'VPC_LINK', - connectionId: vpcLink.id, - uri: pulumi.interpolate`http://${ - nlb.loadBalancer.dnsName - }${this.convertPath(r.path)}`, - requestParameters: - Object.keys(integrationRequestParams).length == 0 - ? undefined - : integrationRequestParams, - }, - { - parent: method, - } - ) - ) - } else if (execUnit.type == 'eks') { - const nlb = this.lbPlugin.getExecUnitLoadBalancer(r.execUnitName)! - const vpcLink = this.lib.execUnitToVpcLink.get(r.execUnitName)! - integrations.push( - new aws.apigateway.Integration( - integrationName, - { - restApi: restAPI.id, - resourceId: - parentResource == null ? restAPI.rootResourceId : parentResource.id, - httpMethod: method.httpMethod, - integrationHttpMethod: method.httpMethod, - type: 'HTTP_PROXY', - connectionType: 'VPC_LINK', - connectionId: vpcLink.id, - uri: pulumi.interpolate`http://${nlb.dnsName}${this.convertPath( - r.path - )}`, - requestParameters: - Object.keys(integrationRequestParams).length == 0 - ? undefined - : integrationRequestParams, - }, - { - parent: method, - } - ) - ) - } else if (execUnit.type == 'lambda') { - const lambda = this.lib.execUnitToFunctions.get(r.execUnitName)! - const integration = new aws.apigateway.Integration( - integrationName, - { - restApi: restAPI.id, - resourceId: - parentResource == null ? restAPI.rootResourceId : parentResource.id, - httpMethod: method.httpMethod, - integrationHttpMethod: 'POST', - type: 'AWS_PROXY', - uri: lambda.invokeArn, - }, - { - parent: method, - } - ) - integrations.push(integration) - - permissions.push( - new aws.lambda.Permission( - `${r.execUnitName}-${r.verb}-${r.path}-permission`, - { - statementId: `${gwName}-rest-${r.verb}-${r.path.replace( - /[^a-zA-Z0-9]/g, - '-' - )}`, - action: 'lambda:InvokeFunction', - function: lambda.name, - principal: 'apigateway.amazonaws.com', - sourceArn: pulumi.interpolate`arn:aws:execute-api:${this.lib.region}:${ - this.accountId - }:${restAPI.id}/*/${ - r.verb.toUpperCase() === 'ANY' ? '*' : r.verb.toUpperCase() - }${parentResource == null ? '/' : parentResource.path}`, - }, - { - dependsOn: [restAPI], - parent: lambda, - } - ) - ) - } - } - - // Create the deployment and stage - const deployment = new aws.apigateway.Deployment( - `${gwName}-deployment`, - { - restApi: restAPI, - triggers: { - routes: sha256.sync( - gateway.Routes.map((r) => `${r.execUnitName}:${r.path}:${r.verb}`) - .sort() - .join() - ), - integrations: sha256.sync( - integrationNames - .map((i) => i) - .sort() - .join() - ), - connections: pulumi.all(integrations.map((i) => i.connectionId)).apply((is) => - sha256.sync( - is - .filter((i) => i) - .sort() - .join() - ) - ), - }, - }, - { - dependsOn: [...methods, ...integrations, ...permissions], - parent: restAPI, - } - ) - - const stage = new aws.apigateway.Stage( - `${gwName}-stage`, - { - deployment: deployment.id, - restApi: restAPI.id, - // TODO update this to '$default' so the stage isn't part of the invoke URL - // https://github.com/klothoplatform/klotho/issues/235 - stageName: this.lib.stage, - }, - { - parent: deployment, - } - ) - - this.lib.topologySpecOutputs.push( - pulumi.all([restAPI.id, restAPI.urn]).apply(([id, urn]) => ({ - id: id, - urn: urn, - kind: '', // TODO - type: 'AWS API Gateway', - url: `https://console.aws.amazon.com/apigateway/home?region=${this.lib.region}#/apis/${id}/resources/`, - })) - ) - - this.lib.gatewayToUrl.set(gateway.Name, stage.invokeUrl) - this.invokeUrls.push(stage.invokeUrl) - } -} diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/iac/cockroachdb.ts b/examples/klotho-analysis/klotho-go-example/_compiled/iac/cockroachdb.ts deleted file mode 100755 index 86efcfcf..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/iac/cockroachdb.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { local } from '@pulumi/command' -import * as pulumi from '@pulumi/pulumi' -import * as aws from '@pulumi/aws' -import { Resource, TopologyData } from '../deploylib' - -const config = new pulumi.Config() - -export interface Options { - topology: TopologyData - app: string - region: string - id: string - spendLimit?: number -} - -export class CockroachDB extends pulumi.ComponentResource { - public readonly connectionString: pulumi.Output - - constructor(name: string, args: Options, opts?: pulumi.ComponentResourceOptions) { - super('klotho:cockroachdb:ServerlessDB', name, args, opts) - - const cluster = this.clusterName(args) - const spendLimit = args.spendLimit ? `--spend-limit ${args.spendLimit}` : '' - - const clusterRes = new local.Command( - `${cluster}-cluster`, - { - create: `ccloud cluster create serverless --cloud 'AWS' --quiet ${spendLimit} ${cluster} ${args.region}`, - update: - spendLimit.length > 0 - ? `ccloud cluster update --quiet ${spendLimit} ${cluster}` - : 'echo no-op', - delete: `ccloud cluster delete --quiet ${cluster}`, - }, - { parent: this } - ) - - const username = config.require(`${args.id}_username`) - const password = config.requireSecret(`${args.id}_password`) - - const user = new local.Command( - `${args.id}-user`, - { - create: pulumi.interpolate`ccloud cluster user create --quiet ${cluster} ${username} -p '${password}'`, - update: 'echo no-op', - }, - { dependsOn: [clusterRes], parent: clusterRes } - ) - - const connectionString = new local.Command( - `${args.id}-conn`, - { - create: `ccloud cluster sql --quiet --connection-url --cert-path 'root.crt' ${cluster}`, - }, - { dependsOn: [clusterRes, user], parent: clusterRes } - ) - - const copyCerts: local.Command[] = [] - const resourceId = `${args.id}_${Resource.orm}` - for (const edge of args.topology.topologyEdgeData) { - if (edge.target != resourceId) { - continue - } - const source = args.topology.topologyIconData.find((elem) => elem.id == edge.source)! - - copyCerts.push( - new local.Command( - `${args.id}-cert-${source.title}`, - { - create: `cp root.crt ${source.title}/`, - }, - { dependsOn: [connectionString], parent: connectionString } - ) - ) - } - - this.connectionString = pulumi - .all([connectionString.stdout, password, ...copyCerts.map((c) => c.stdout)]) - .apply(([s, p]) => s.replace('postgresql://', `postgresql://${username}:${p}@`)) - - this.registerOutputs({ - connectionString: this.connectionString, - }) - } - - private clusterName(opts: Options): string { - let cluster = `${opts.app}-${opts.id}`.toLowerCase() - if (cluster.length >= 20) { - const oldCluster = cluster - cluster = '' - if (opts.app.length > 6) { - cluster += opts.app.substring(0, 3) + opts.app.substring(opts.app.length - 3) - } else { - cluster += opts.app - } - cluster += '-' - if (opts.id.length > 12) { - cluster += opts.id.substring(0, 6) + opts.id.substring(opts.id.length - 6) - } else { - cluster += opts.id - } - cluster = cluster.toLowerCase() - - console.info( - `Abbreviating cluster name '${oldCluster}' to '${cluster}' due to exceeding length limits (${oldCluster.length} >= 20)` - ) - } - return cluster - } -} diff --git a/examples/klotho-analysis/klotho-go-example/_compiled/iac/eks.ts b/examples/klotho-analysis/klotho-go-example/_compiled/iac/eks.ts deleted file mode 100755 index c609641e..00000000 --- a/examples/klotho-analysis/klotho-go-example/_compiled/iac/eks.ts +++ /dev/null @@ -1,1268 +0,0 @@ -import * as aws from '@pulumi/aws' -import * as awsx from '@pulumi/awsx' -import * as eks from '@pulumi/eks' -import * as pulumi from '@pulumi/pulumi' -import { ClusterArgs, FargateProfileArgs } from '@pulumi/aws/eks' -import * as pulumi_k8s from '@pulumi/kubernetes' -import * as k8s from './kubernetes' -import * as https from 'https' -import { getIssuerCAThumbprint } from '@pulumi/eks/cert-thumprint' -import { cloud_map_controller, alb_controller, external_dns } from './k8s/add_ons/' -import { local } from '@pulumi/command' -import { CloudCCLib, Resource } from '../deploylib' -import * as uuid from 'uuid' -import { - createPodAutoScalerResourceMetric, - autoScaleDeployment, -} from './k8s/horizontal-pod-autoscaling' -import { installMetricsServer } from './k8s/add_ons/metrics_server' -import { applyChart, Value } from './k8s/helm_chart' -import { LoadBalancerPlugin } from './load_balancing' - -export interface EksExecUnitArgs { - nodeType: 'fargate' | 'node' - replicas: number - nodeConstraints?: { - diskSize?: number - instanceType?: string - } - limits?: { - cpu?: number - memory?: number // Differs from ephemeral-storage resource request (stable in k8s 1.25) - } - autoscalingConfig?: { - cpuUtilization?: number - memoryUtilization?: number // Differs from ephemeral-storage resource request (stable in k8s 1.25) - maxReplicas?: number - } - stickinessTimeout?: number -} - -export interface HelmOptions { - directory?: string - install?: boolean - values_file?: string -} - -export interface EksExecUnit { - name: string - network_placement?: string - params: EksExecUnitArgs - helmOptions?: HelmOptions - envVars?: any -} - -export interface HelmChart { - Name: string - Directory: string - Values: Value[] | null -} - -interface FargateProfileSelector { - namespace: string - labels?: { [key: string]: string } -} - -// ExecEnvVar sets the environment variables using an exec-based auth plugin. -interface ExecEnvVar { - /** - * Name of the auth exec environment variable. - */ - name: pulumi.Input - - /** - * Value of the auth exec environment variable. - */ - value: pulumi.Input -} - -/** - * KubeconfigOptions represents the AWS credentials to scope a given kubeconfig - * when using a non-default credential chain. - * - * The options can be used independently, or additively. - * - * A scoped kubeconfig is necessary for certain auth scenarios. For example: - * 1. Assume a role on the default account caller, - * 2. Use an AWS creds profile instead of the default account caller, - * 3. Use an AWS creds creds profile instead of the default account caller, - * and then assume a given role on the profile. This scenario is also - * possible by only using a profile, iff the profile includes a role to - * assume in its settings. - * - * See for more details: - * - https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html - * - https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html - * - https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html - */ -export interface KubeconfigOptions { - /** - * Role ARN to assume instead of the default AWS credential provider chain. - * - * The role is passed to kubeconfig as an authentication exec argument. - */ - roleArn?: pulumi.Input - /** - * AWS credential profile name to always use instead of the - * default AWS credential provider chain. - * - * The profile is passed to kubeconfig as an authentication environment - * setting. - */ - profileName?: pulumi.Input -} - -export enum plugins { - AWS_LOAD_BALANCER_CONTROLLER, - CERT_MANAGER, - CLOUD_MAP_CONTROLLER, - VPC_CNI, - EXTERNAL_DNS, - METRICS_SERVER, -} - -interface EksClusterOptions { - initializePluginsOnFargate?: boolean - installPlugins?: plugins[] - enableFargateLogging?: Boolean - adminRoleArn?: string - autoApply?: boolean - createNodeGroup?: boolean -} - -export const DefaultEksClusterOptions: EksClusterOptions = { - initializePluginsOnFargate: true, - installPlugins: [ - plugins.VPC_CNI, - plugins.METRICS_SERVER, - plugins.CERT_MANAGER, - plugins.AWS_LOAD_BALANCER_CONTROLLER, - plugins.CLOUD_MAP_CONTROLLER, - ], - enableFargateLogging: true, - autoApply: true, - createNodeGroup: true, -} - -interface NodeGroupSpecs { - diskSize?: number - instanceType?: string -} - -const KUBE_SYSTEM_NAMESPACE = 'kube-system' -const CLOUD_MAP_NAMESPACE = 'cloud-map-mcs-system' -// This is temporary until we expand EKS functionality -export const EXEC_UNIT_NAMESPACE = 'default' - -export class Eks { - private oidcProvider: aws.iam.OpenIdConnectProvider - - private namespaces: Map = new Map< - string, - pulumi_k8s.core.v1.Namespace - >() - - // Service Accounts are serviceAccountName_namespace -> IAM Role *https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html* - public readonly serviceAccounts: Map = new Map() - - // We want to keep track of installed plugins to allow for dependencies between them (ex. alb controller needs cert-manager, etc) - public readonly installedPlugins: Map = - new Map() - - // Service Accounts are serviceAccountName_namespace -> IAM Role *https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html* - public readonly execUnitToTargetGroupArn: Map> = new Map< - string, - pulumi.Output - >() - - private pluginFargateProfile: aws.eks.FargateProfile - private execUnitFargateProfile: aws.eks.FargateProfile - - private privateNodeGroups: Map = new Map() - private publicNodeGroups: Map = new Map() - - private clusterSet: pulumi_k8s.yaml.ConfigFile - - private cluster: aws.eks.Cluster - private kubeconfig: pulumi.Output - private k8sAdminRole: aws.iam.Role - private provider: pulumi_k8s.Provider - private serverSideApplyProvider: pulumi_k8s.Provider - private readonly lib: CloudCCLib - - public readonly clusterName: string - public readonly region: string - public readonly options: EksClusterOptions - - constructor( - clusterName: string, - options: EksClusterOptions = DefaultEksClusterOptions, - lib: CloudCCLib, - execUnits: EksExecUnit[], - charts: HelmChart[], - existingCluster?: aws.eks.GetClusterResult, - private readonly lbPlugin?: LoadBalancerPlugin - ) { - this.lib = lib - this.options = options - const config = new pulumi.Config('aws') - this.region = config.get('region')! - const vpc = lib.klothoVPC - const securityGroupIds = lib.sgs - - this.clusterName = clusterName - - let clusterSubnetIds: pulumi.Input[]> = lib.privateSubnetIds - if (execUnits.filter((unit) => unit.network_placement === 'public').length > 0) { - clusterSubnetIds = pulumi - .all([lib.publicSubnetIds || [], lib.privateSubnetIds || []]) - .apply(([publicIds, privateIds]) => { - return [...publicIds, ...privateIds] - }) - } - - if (!existingCluster) { - this.k8sAdminRole = createAdminRole(clusterName) - const args: ClusterArgs = { - vpcConfig: { - subnetIds: clusterSubnetIds, - securityGroupIds, - }, - roleArn: this.k8sAdminRole.arn, - } - this.cluster = new aws.eks.Cluster(clusterName, args) - } else { - this.cluster = aws.eks.Cluster.get(clusterName, existingCluster.id) - } - - pulumi.output(vpc.privateSubnets).apply((ps) => { - const cidrBlocks: any = ps.map((subnet) => subnet.subnet.cidrBlock) - new aws.ec2.SecurityGroupRule(`${clusterName}-ingress`, { - type: 'ingress', - cidrBlocks: cidrBlocks, - fromPort: 0, - protocol: '-1', - toPort: 0, - securityGroupId: this.cluster.vpcConfig.clusterSecurityGroupId, - }) - }) - - this.kubeconfig = this.generateKubeconfig().apply(JSON.stringify) - this.provider = new pulumi_k8s.Provider(`${clusterName}-eks-provider`, { - kubeconfig: this.kubeconfig, - }) - this.serverSideApplyProvider = new pulumi_k8s.Provider( - `${clusterName}-eks-server-provider`, - { - kubeconfig: this.kubeconfig, - enableServerSideApply: true, - } - ) - - this.oidcProvider = this.setupOidc() - - if (options.initializePluginsOnFargate) { - const podExecutionRole = this.createPodExecutionRole(`${clusterName}-plugin`) - const selectors = [ - { - namespace: KUBE_SYSTEM_NAMESPACE, - }, - ] - this.pluginFargateProfile = this.createFargateProfile( - `${clusterName}-plugin-profile`, - podExecutionRole, - vpc, - selectors - ) - this.patchCoreDNSDeployment() - } - - this.createNodeGroups(execUnits) - - if (options.enableFargateLogging) { - this.enableFargateLogging() - } - - const p = options.installPlugins ? options.installPlugins : [] - for (const plugin of p) { - let dependsOn: (pulumi.Resource | pulumi.Output)[] = - options.initializePluginsOnFargate ? [this.pluginFargateProfile] : [] - const certManagerInstall: pulumi_k8s.helm.v3.Release = this.installedPlugins.get( - plugins.CERT_MANAGER - ) as pulumi_k8s.helm.v3.Release - switch (plugin) { - case plugins.VPC_CNI: - const vpcCni = new eks.VpcCni(`${clusterName}-vpc-cni-plugin`, this.kubeconfig) - this.installedPlugins.set(plugins.VPC_CNI, vpcCni) - break - case plugins.METRICS_SERVER: - const metricsServer = installMetricsServer(clusterName, this.provider) - this.installedPlugins.set(plugins.METRICS_SERVER, metricsServer) - break - case plugins.CERT_MANAGER: - const certManager = new pulumi_k8s.helm.v3.Release( - `${clusterName}-cert-manager`, - { - name: 'cert-manager', - chart: 'cert-manager', - repositoryOpts: { repo: 'https://charts.jetstack.io' }, - values: { - installCRDs: true, - webhook: { - timeoutSeconds: 30, - }, - }, - namespace: EXEC_UNIT_NAMESPACE, - version: 'v1.10.0', - }, - { provider: this.provider, deleteBeforeReplace: true } - ) - this.installedPlugins.set(plugins.CERT_MANAGER, certManager) - break - case plugins.AWS_LOAD_BALANCER_CONTROLLER: - const lbSaName = `${clusterName}-alb-controller` - const lbServiceAccount = this.createServiceAccount( - lbSaName, - KUBE_SYSTEM_NAMESPACE - ) - alb_controller.attachPermissionsToRole( - this.serviceAccounts.get(`${lbSaName}_${KUBE_SYSTEM_NAMESPACE}`)! - ) - certManagerInstall ? dependsOn.push(certManagerInstall) : null - const albController = alb_controller.installLoadBalancerController( - clusterName, - KUBE_SYSTEM_NAMESPACE, - lbServiceAccount, - vpc, - this.provider, - this.region, - this.options.initializePluginsOnFargate || false, - dependsOn - ) - this.installedPlugins.set(plugins.AWS_LOAD_BALANCER_CONTROLLER, albController) - break - case plugins.CLOUD_MAP_CONTROLLER: - const chart: pulumi_k8s.helm.v3.Chart = this.installedPlugins.get( - plugins.AWS_LOAD_BALANCER_CONTROLLER - ) as pulumi_k8s.helm.v3.Chart - certManagerInstall ? dependsOn.push(certManagerInstall) : null - const cloudMapController = cloud_map_controller.installCloudMapController( - clusterName, - this.provider, - dependsOn - ) - this.installedPlugins.set(plugins.CLOUD_MAP_CONTROLLER, cloudMapController) - const cloudMapSaName = 'cloud-map-mcs-controller-manager' - this.patchServiceAccount(cloudMapSaName, CLOUD_MAP_NAMESPACE, [ - cloudMapController, - ]) - const cloudMapRole: aws.iam.Role = this.serviceAccounts.get( - `${cloudMapSaName}_${CLOUD_MAP_NAMESPACE}` - )! - new aws.iam.RolePolicyAttachment('cloudmap-policy-attachment', { - policyArn: 'arn:aws:iam::aws:policy/AWSCloudMapFullAccess', - role: cloudMapRole, - }) - this.clusterSet = cloud_map_controller.createClusterSet( - clusterName, - this.provider, - [cloudMapController, chart.ready, ...dependsOn] - ) - break - case plugins.EXTERNAL_DNS: - const dnsSaName = `${clusterName}-external-dns` - const dnsServiceAccount = this.createServiceAccount( - dnsSaName, - KUBE_SYSTEM_NAMESPACE - ) - external_dns.attachPermissionsToRole( - this.serviceAccounts.get(`${dnsSaName}_${KUBE_SYSTEM_NAMESPACE}`)! - ) - const externalDns = external_dns.installExternalDNS( - KUBE_SYSTEM_NAMESPACE, - this.provider, - dnsServiceAccount, - dependsOn - ) - this.installedPlugins.set(plugins.EXTERNAL_DNS, externalDns) - break - } - } - - const podExecutionRole = this.createPodExecutionRole(`${clusterName}-default`) - const selectors = [ - { - namespace: 'default', - labels: { - 'klotho-fargate-enabled': 'true', - }, - }, - ] - this.execUnitFargateProfile = this.createFargateProfile( - `${clusterName}-execunit-profile`, - podExecutionRole, - vpc, - selectors - ) - - for (const unit of execUnits) { - this.setupExecUnit(lib, unit) - } - for (const chart of charts) { - this.setupKlothoHelmChart(lib, chart.Name, chart.Values || []) - } - } - - private determineNodeGroupSpecs(execUnits: EksExecUnit[]): Map { - let nodeGroupSpecs: Map = new Map() - const defaultDiskSize = 20 - const defaultInstanceType = 't3.medium' - let diskSizeMin = defaultDiskSize - - if (execUnits.length == 0) { - return nodeGroupSpecs - } - - for (const unit of execUnits) { - if ( - unit.params.nodeType === 'fargate' || - unit.params.nodeConstraints?.instanceType !== undefined - ) { - continue - } - if (unit.params.nodeConstraints?.diskSize !== undefined) { - diskSizeMin = - diskSizeMin < unit.params.nodeConstraints.diskSize - ? unit.params.nodeConstraints.diskSize - : diskSizeMin - } - } - - for (const unit of execUnits) { - if (unit.params.nodeType === 'fargate') { - continue - } - if (unit.params.nodeConstraints) { - const instanceType = unit.params.nodeConstraints.instanceType - const diskSize = unit.params.nodeConstraints.diskSize - - if (instanceType) { - const key = instanceType - const currentDiskSize = nodeGroupSpecs.get(key)?.diskSize - - if (!currentDiskSize && diskSize) { - nodeGroupSpecs.set(key, { - ...nodeGroupSpecs[key], - diskSize: diskSize > diskSizeMin ? diskSize : diskSizeMin, - instanceType, - }) - } else if (currentDiskSize && diskSize) { - nodeGroupSpecs.set(key, { - ...nodeGroupSpecs[key], - diskSize: diskSize > currentDiskSize ? diskSize : currentDiskSize, - instanceType, - }) - } else if (!currentDiskSize && !diskSize) { - nodeGroupSpecs.set(key, { - ...nodeGroupSpecs.get(key), - diskSize: diskSizeMin, - instanceType, - }) - } - } - } - } - // if there are no node group specs, create our default node group as t3.medium - nodeGroupSpecs.size === 0 - ? nodeGroupSpecs.set(defaultInstanceType, { - diskSize: diskSizeMin, - instanceType: defaultInstanceType, - }) - : null - - return nodeGroupSpecs - } - - private createNodeGroups(execUnits: EksExecUnit[]) { - const privateNodeGroupSpecs = this.determineNodeGroupSpecs( - execUnits.filter((unit) => unit.network_placement !== 'public') - ) - const publicNodeGroupSpecs = this.determineNodeGroupSpecs( - execUnits.filter((unit) => unit.network_placement === 'public') - ) - if (privateNodeGroupSpecs.size == 0 && publicNodeGroupSpecs.size == 0) { - privateNodeGroupSpecs.set('t3.medium', { diskSize: 20, instanceType: 't3.medium' }) - } - - privateNodeGroupSpecs.forEach((specs, name) => { - const nodeGroup = this.createNodeGroup( - `private-${name}`.replace('.', '-'), - this.lib.privateSubnetIds, - specs, - { network_placement: 'private' } - ) - this.privateNodeGroups.set(name, nodeGroup) - }) - - publicNodeGroupSpecs.forEach((specs, name) => { - const nodeGroup = this.createNodeGroup( - `public-${name}`.replace('.', '-'), - this.lib.publicSubnetIds, - specs, - { network_placement: 'public' } - ) - this.publicNodeGroups.set(name, nodeGroup) - }) - } - - private createNodeGroup( - nodeGroupName: string, - subnetIds: Promise[]> | string[], - specs: NodeGroupSpecs, - labels?: pulumi.Input<{ - [key: string]: pulumi.Input - }> - ): aws.eks.NodeGroup { - const nodeRole = this.createNodeIamRole(nodeGroupName) - return new aws.eks.NodeGroup(`${nodeGroupName}-NodeGroup`, { - clusterName: this.cluster.name, - nodeRoleArn: nodeRole.arn, - subnetIds, - scalingConfig: { - desiredSize: 2, - maxSize: 2, - minSize: 1, - }, - updateConfig: { - maxUnavailable: 1, - }, - diskSize: specs.diskSize!, - instanceTypes: [specs.instanceType!], - labels, - }) - } - - public setupKlothoHelmChart(lib: CloudCCLib, name: string, values: Value[]) { - const chart: pulumi_k8s.helm.v3.Chart = this.installedPlugins.get( - plugins.AWS_LOAD_BALANCER_CONTROLLER - ) as pulumi_k8s.helm.v3.Chart - if (chart == undefined) { - throw new Error('Cannot create ServiceExport without Cloud Map Controller installed') - } - - let sleep - if (this.options.initializePluginsOnFargate) { - sleep = new local.Command( - 'sleepForCerts', - { - create: 'sleep 60', - update: 'sleep 60', - triggers: [uuid.v4()], - }, - { dependsOn: chart.ready } - ) - } else { - sleep = new local.Command( - 'sleepForCerts', - { - create: 'sleep 10', - update: 'sleep 10', - triggers: [uuid.v4()], - }, - { dependsOn: chart.ready } - ) - } - - applyChart(lib, { - eks: this, - lbPlugin: this.lbPlugin, - chartName: name, - values, - dependsOn: [ - this.execUnitFargateProfile, - chart.ready, - this.installedPlugins.get(plugins.CLOUD_MAP_CONTROLLER)!, - sleep, - ], - provider: this.provider, - }) - } - - private setupExecUnit(lib: CloudCCLib, unit: EksExecUnit) { - const execUnit = unit.name - const image = this.lib.execUnitToImage.get(unit.name)! - const args = unit.params - let dependencyParent - let serviceName - let role - const execUnitEdgeId = `${execUnit}_exec_unit` - let needsProxy = false - let needsGatewayLink = false - let needsLoadBalancer = false - - lib.topology.topologyIconData.forEach((resource) => { - if (resource.kind === Resource.gateway) { - lib.topology.topologyEdgeData.forEach((edge) => { - if (edge.source == resource.id && edge.target === execUnitEdgeId) { - // We know that this exec unit is exposed and must create the necessary resources - needsGatewayLink = true - if (resource.type == 'apigateway') { - needsLoadBalancer = true - } - } - }) - } - if (resource.kind === Resource.exec_unit) { - lib.topology.topologyEdgeData.forEach((edge) => { - if (edge.source == resource.id && edge.target === execUnitEdgeId) { - // We know that this exec unit is proxied to from another exec unit and must create the necessary resources - needsProxy = true - } - }) - } - }) - const protocol = needsLoadBalancer ? 'TCP' : 'HTTP' - - let additionalEnvVars: { name: string; value: pulumi.Input }[] = [] - for (const [name, value] of Object.entries( - lib.generateExecUnitEnvVars(execUnit, unit.envVars) - )) { - additionalEnvVars.push({ name, value }) - } - let nodeSelector: { [key: string]: pulumi.Output | string } = {} - - if (unit.params.nodeType !== 'fargate') { - nodeSelector['network_placement'] = unit.network_placement! - if (args.nodeConstraints?.instanceType) { - if (unit.network_placement === 'public') { - nodeSelector['eks.amazonaws.com/nodegroup'] = this.publicNodeGroups.get( - `${args.nodeConstraints.instanceType}` - )!.nodeGroupName - } else { - nodeSelector['eks.amazonaws.com/nodegroup'] = this.privateNodeGroups.get( - `${args.nodeConstraints.instanceType}` - )!.nodeGroupName - } - } - } - - if (image) { - role = this.createServiceAccountRole(execUnit, EXEC_UNIT_NAMESPACE) - lib.execUnitToRole.set(execUnit, role) - } - - if (!unit.helmOptions?.install) { - const sa = this.createServiceAccount(execUnit, EXEC_UNIT_NAMESPACE, role) - const deployment = this.createDeployment( - execUnit, - image, - args, - additionalEnvVars, - sa, - nodeSelector - ) - if (args.autoscalingConfig) { - const cpuUtil = args.autoscalingConfig.cpuUtilization - const memUtil = args.autoscalingConfig.memoryUtilization - const maxReplicas = args.autoscalingConfig.maxReplicas || args.replicas * 2 - const metrics: pulumi_k8s.types.input.autoscaling.v2.MetricSpec[] = [] - if (cpuUtil) { - metrics.push(createPodAutoScalerResourceMetric('cpu', 'Utilization', cpuUtil)) - } - if (memUtil) { - metrics.push( - createPodAutoScalerResourceMetric('memory', 'Utilization', memUtil) - ) - } - autoScaleDeployment({ - deploymentName: execUnit, - minReplicas: args.replicas, - maxReplicas, - metrics, - provider: this.provider, - dependsOn: [deployment], - }) - } - const service = this.createService(execUnit, lib.klothoVPC, args, deployment) - serviceName = service.metadata.name - dependencyParent = service - } - - if (image) { - if (needsGatewayLink) { - if (!this.lbPlugin) { - throw new Error( - 'EKS Plugin needs the LoadBalancer Plugin to connect expose with execution units.' - ) - } - if (needsLoadBalancer) { - const lb = this.lbPlugin!.createLoadBalancer(lib.name, execUnit, { - subnets: lib.privateSubnetIds, - loadBalancerType: 'network', - }) - const targetGroup = this.lbPlugin!.createTargetGroup(lib.name, execUnit, { - port: 3000, - protocol, - vpcId: lib.klothoVPC.id, - targetType: 'ip', - }) - - this.lbPlugin!.createListener(lib.name, execUnit, { - port: 80, - protocol, - loadBalancerArn: lb.arn, - defaultActions: [ - { - type: 'forward', - targetGroupArn: targetGroup.arn, - }, - ], - }) - - const vpcLink = new aws.apigateway.VpcLink(`${execUnit}-vpc-link`, { - targetArn: lb.arn, - }) - lib.execUnitToVpcLink.set(execUnit, vpcLink) - } else { - this.lbPlugin!.createTargetGroup(lib.name, execUnit, { - port: 3000, - protocol, - vpcId: lib.klothoVPC.id, - targetType: 'ip', - }) - - pulumi.output(this.lib.klothoVPC.publicSubnets).apply((ps) => { - const cidrBlocks: any = ps.map((subnet) => subnet.subnet.cidrBlock) - new aws.ec2.SecurityGroupRule( - `${this.lib.name}-${this.clusterName}-public-ingress`, - { - type: 'ingress', - cidrBlocks: cidrBlocks, - fromPort: 0, - protocol: '-1', - toPort: 0, - securityGroupId: this.cluster.vpcConfig.clusterSecurityGroupId, - } - ) - }) - } - - if ( - this.installedPlugins.get(plugins.AWS_LOAD_BALANCER_CONTROLLER) && - !unit.helmOptions?.install - ) { - const targetGroup = this.lbPlugin!.execUnitToTargetGroup.get(execUnit)! - this.createTargetBinding(execUnit, serviceName, targetGroup.arn, [ - targetGroup, - dependencyParent, - ]) - } - } - - if (needsProxy && !unit.helmOptions?.install) { - if (this.installedPlugins.get(plugins.CLOUD_MAP_CONTROLLER)) { - this.createServiceExport(execUnit, [dependencyParent]) - } - } - } - } - - public getExecUnitRole = (execUnit: string): aws.iam.Role | undefined => { - return this.serviceAccounts.get(`${execUnit}_${EXEC_UNIT_NAMESPACE}`) - } - - private generateKubeconfig(): { [key: string]: any } { - const config = new pulumi.Config('aws') - const profile = config.get('profile') - - let args = [ - 'eks', - 'get-token', - '--cluster-name', - this.cluster.name, - '--region', - this.region, - ] - if (profile) { - args.push('--profile', profile) - } - return pulumi - .all([args, this.cluster.endpoint, this.cluster.certificateAuthorities[0].data]) - .apply(([tokenArgs, clusterEndpoint, certData]) => { - return { - apiVersion: 'v1', - clusters: [ - { - cluster: { - server: clusterEndpoint, - 'certificate-authority-data': certData, - }, - name: 'kubernetes', - }, - ], - contexts: [ - { - context: { - cluster: 'kubernetes', - user: 'aws', - }, - name: 'aws', - }, - ], - 'current-context': 'aws', - kind: 'Config', - users: [ - { - name: 'aws', - user: { - exec: { - apiVersion: 'client.authentication.k8s.io/v1beta1', - command: 'aws', - args: tokenArgs, - }, - }, - }, - ], - } - }) - } - - private patchCoreDNSDeployment(): pulumi_k8s.apps.v1.DeploymentPatch { - return new pulumi_k8s.apps.v1.DeploymentPatch( - 'coreDNSDeploymentPatch', - { - metadata: { - annotations: { - 'pulumi.com/patchForce': 'true', - }, - name: 'coredns', - namespace: KUBE_SYSTEM_NAMESPACE, - }, - spec: { - template: { - metadata: { - annotations: { - 'eks.amazonaws.com/compute-type': '', - }, - }, - }, - }, - }, - { provider: this.serverSideApplyProvider, dependsOn: this.pluginFargateProfile } - ) - } - - private setupOidc() { - // Retrieve the OIDC provider URL's intermediate root CA fingerprint. - const eksOidcProviderUrl = pulumi.interpolate`https://oidc.eks.${this.region}.amazonaws.com` - const agent = new https.Agent({ - // Cached sessions can result in the certificate not being - // available since its already been "accepted." Disable caching. - maxCachedSessions: 0, - }) - const fingerprint = getIssuerCAThumbprint(eksOidcProviderUrl, agent) - - // Create the OIDC provider for the cluster. - return new aws.iam.OpenIdConnectProvider(`oidcProvider`, { - clientIdLists: ['sts.amazonaws.com'], - url: this.cluster.identities[0].oidcs[0].issuer, - thumbprintLists: [fingerprint], - }) - } - - private createServiceAccountRole(name: string, namespace: string): aws.iam.Role { - const saKey = `${name}_${namespace}` - if (this.serviceAccounts.get(saKey)) { - throw new Error('Service Account already exists: ' + saKey) - } - const assumeRolePolicyDoc = pulumi - .all([this.oidcProvider.arn, this.oidcProvider.url]) - .apply(([oidc_arn, oidc_url]) => { - return { - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Federated: oidc_arn, - }, - Action: 'sts:AssumeRoleWithWebIdentity', - Condition: { - StringEquals: { - [`${oidc_url}:sub`]: `system:serviceaccount:${namespace}:${name}`, - }, - }, - }, - ], - } - }) - const role = new aws.iam.Role(`${name}-role`, { - assumeRolePolicy: assumeRolePolicyDoc.apply(JSON.stringify), - }) - this.serviceAccounts.set(saKey, role) - return role - } - - private patchServiceAccount( - name: string, - namespace: string, - dependsOn?: pulumi.Resource[] - ): pulumi_k8s.core.v1.ServiceAccount { - const role = this.createServiceAccountRole(name, namespace) - const sa = new pulumi_k8s.core.v1.ServiceAccountPatch( - name, - { - metadata: { - name, - annotations: { - 'pulumi.com/patchForce': 'true', - test: 'test', - 'eks.amazonaws.com/role-arn': role.arn, - }, - }, - }, - { dependsOn, provider: this.serverSideApplyProvider } - ) - return sa - } - - private createServiceAccount( - name: string, - namespace: string, - role?: aws.iam.Role, - dependsOn?: pulumi.Resource[] - ): pulumi_k8s.core.v1.ServiceAccount { - if (!role) { - role = this.createServiceAccountRole(name, namespace) - } - const sa = new pulumi_k8s.core.v1.ServiceAccount( - name, - { - automountServiceAccountToken: true, - metadata: { - name, - namespace, - annotations: { - 'eks.amazonaws.com/role-arn': role.arn, - }, - }, - }, - { provider: this.provider, dependsOn } - ) - return sa - } - - private createNamespace( - name: string, - labels?: { [key: string]: any } - ): pulumi_k8s.core.v1.Namespace { - if (this.namespaces.get(name)) { - throw new Error(`Namespace ${name} already exists`) - } - const namespace = new pulumi_k8s.core.v1.Namespace( - `${name}-ns`, - { - metadata: { - name, - labels, - }, - }, - { provider: this.provider } - ) - this.namespaces.set(name, namespace) - return namespace - } - - // Fargate Functions - private createFargateProfile( - profileName: string, - podExecutionRole: aws.iam.Role, - vpc: awsx.ec2.Vpc, - selectors: FargateProfileSelector[], - dependsOn? - ): aws.eks.FargateProfile { - const args: FargateProfileArgs = { - clusterName: this.cluster.name, - podExecutionRoleArn: podExecutionRole.arn, - selectors, - subnetIds: pulumi.output(vpc.privateSubnetIds), - } - const profile: aws.eks.FargateProfile = new aws.eks.FargateProfile(profileName, args, { - dependsOn, - customTimeouts: { create: '30m', update: '30m', delete: '30m' }, - }) - return profile - } - - private enableFargateLogging() { - const ns = 'aws-observability' - const labels = { 'aws-observability': 'enabled' } - this.createNamespace(ns, labels) - - const configMap = new pulumi_k8s.core.v1.ConfigMap( - 'aws-observability-configmap', - { - metadata: { - name: 'aws-logging', - namespace: ns, - }, - data: { - 'output.conf': `[OUTPUT] - Name cloudwatch_logs - Match * - region ${this.region} - log_group_name fluent-bit-cloudwatch - log_stream_prefix from-fluent-bit- - auto_create_group true - log_key log`, - - 'parsers.conf': `[PARSER] - Name crio - Format Regex - Regex ^(?