diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9428b2b3db..3c9928c2ad9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -188,11 +188,11 @@ To run a single test in VSCode, do any one of: - Unix/macOS/POSIX shell: ``` - TEST_FILE=src/test/foo.test.ts npm run test + TEST_FILE=../core/src/test/foo.test.ts npm run test ``` - Powershell: ``` - $Env:TEST_FILE = "src/test/foo.test.ts"; npm run test + $Env:TEST_FILE = "../core/src/test/foo.test.ts"; npm run test ``` - To run all tests in a particular subdirectory, you can edit @@ -209,11 +209,11 @@ To run tests against a specific folder in VSCode, do any one of: - Run in your terminal - Unix/macOS/POSIX shell: ``` - TEST_DIR=src/test/foo npm run test + TEST_DIR=../core/src/test/foo npm run test ``` - Powershell: ``` - $Env:TEST_DIR = "src/test/foo"; npm run test + $Env:TEST_DIR = "../core/src/test/foo"; npm run test ``` ### Coverage report diff --git a/package-lock.json b/package-lock.json index 74176a2cc4e..8e9a3e5ef8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,8 @@ "plugins/*" ], "dependencies": { - "@types/node": "^18.19.55", + "@aws-toolkits/telemetry": "^1.0.242", + "@types/node": "^22.7.5", "vscode-nls": "^5.2.0", "vscode-nls-dev": "^4.0.4" }, @@ -63,59 +64,10 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.637.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-browser": { + "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -126,20 +78,33 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", + "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-js": { + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -149,100 +114,266 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/supports-web-crypto": { + "node_modules/@aws-crypto/sha256-js/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", - "license": "Apache-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==", "dependencies": { "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util": { + "node_modules/@aws-crypto/util": { "version": "5.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", + "node_modules/@aws-crypto/util/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", + "node_modules/@aws-crypto/util/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.667.0.tgz", + "integrity": "sha512-po7f4cdaw8zVl6X7U6gnQ5jx023mg5mGxrcXdQf+1n3xYK8mZnY3Sovv4ZPXbBwqdiK3HhL4kkLBabyQ5CMEFQ==", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.667.0", + "@aws-sdk/client-sts": "3.667.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/credential-provider-node": "3.667.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.667.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.667.0", + "@aws-sdk/util-user-agent-node": "3.667.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.667.0.tgz", + "integrity": "sha512-69nl3BXcAfn/zUdxpxC/5Bi4K46sMgTRFVKHkyiRFO8OQpNJDRzl6eGltESLqtf65rjWfswTDwfYrMd2+tnlDQ==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.667.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.667.0", + "@aws-sdk/util-user-agent-node": "3.667.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.667.0.tgz", + "integrity": "sha512-ThLLR0Zn15Rk8Y6rzzVtHREZU4NAsNj9oCiQcXj4/vlBl+J0MbiTCDUJTc559O+DIMekrjusLaPIKfTZmXXuhA==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/credential-provider-node": "3.667.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.667.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.667.0", + "@aws-sdk/util-user-agent-node": "3.667.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.667.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sts": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.667.0.tgz", + "integrity": "sha512-SnvkDDuOAwXOxzhGfvvxK8JFFVApVvXrM6+nVmSYwuHjWdI+HwNcsRC6rxZ8uHQEz2fR0a810ckUwFVfpvtIoA==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.667.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/credential-provider-node": "3.667.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.667.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.667.0", + "@aws-sdk/util-user-agent-node": "3.667.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -250,353 +381,552 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/core": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.667.0.tgz", + "integrity": "sha512-pMcDVI7Tmdsc8R3sDv0Omj/4iRParGY+uJtAfF669WnZfDfaBQaix2Mq7+Mu08vdjqO9K3gicFvjk9S1VLmOKA==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@aws-sdk/types": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.667.0.tgz", + "integrity": "sha512-zZbrkkaPc54WXm+QAnpuv0LPNfsts0HPPd+oCECGs7IQRaFsGj187cwvPg9RMWDFZqpm64MdBDoA8OQHsqzYCw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.667.0.tgz", + "integrity": "sha512-sjtybFfERZWiqTY7fswBxKQLvUkiCucOWyqh3IaPo/4nE1PXRnaZCVG0+kRBPrYIxWqiVwytvZzMJy8sVZcG0A==", "dependencies": { + "@aws-sdk/core": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.667.0.tgz", + "integrity": "sha512-NiEC2Sjut57ajbWEXLFtA8YWA06ulfuaSHOP4YxoQEsL3BjMOkKS1/5eVW2o6XkKVbwt0zbDYSTlIxU5klHpbQ==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/credential-provider-env": "3.667.0", + "@aws-sdk/credential-provider-http": "3.667.0", + "@aws-sdk/credential-provider-process": "3.667.0", + "@aws-sdk/credential-provider-sso": "3.667.0", + "@aws-sdk/credential-provider-web-identity": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.667.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.667.0.tgz", + "integrity": "sha512-+2oNexDvbQD9o5Xdtu1mGE25Nf2/C9KgMnkZzenbgCegw0P0YRdGrJklDF5Aag6lmb80a2vjoViuvm1ORzRAzw==", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@aws-sdk/credential-provider-env": "3.667.0", + "@aws-sdk/credential-provider-http": "3.667.0", + "@aws-sdk/credential-provider-ini": "3.667.0", + "@aws-sdk/credential-provider-process": "3.667.0", + "@aws-sdk/credential-provider-sso": "3.667.0", + "@aws-sdk/credential-provider-web-identity": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.667.0.tgz", + "integrity": "sha512-HZHnvop32fKgsNHkdhVaul7UzQ25sEc0j9yqA4bjhtbk0ECl42kj3f1pJ+ZU/YD9ut8lMJs/vVqiOdNThVdeBw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/core": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.667.0.tgz", + "integrity": "sha512-GylJquSQVWlziaEmrX38KzQTWcFL5NKht4OAj7rdo75MssC0qNVSGT+ReFrXZzKQ65eIuRVCMdsp83oNH4nzbQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.667.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/token-providers": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.667.0.tgz", + "integrity": "sha512-t8CFlZMD/1p/8Cli3rvRiTJpjr/8BO64gw166AHgFZYSN2h95L2l1tcW0jpsc3PprA32nLg1iQVKYt4WGM4ugw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.667.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.667.0.tgz", + "integrity": "sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-logger": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.667.0.tgz", + "integrity": "sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { - "version": "3.1.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.667.0.tgz", + "integrity": "sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.667.0.tgz", + "integrity": "sha512-NJoPMV+9hpN90iZ2SgOpFmY6MJW71gGyT28kt0C68B0tBadYpT/J6WW8J7gxwdLA7d2CBwHbFGphTPWXXl+jzw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.667.0.tgz", + "integrity": "sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg==", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/token-providers": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.667.0.tgz", + "integrity": "sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.667.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.667.0.tgz", + "integrity": "sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { - "version": "3.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.667.0.tgz", + "integrity": "sha512-y1pKlNzNpxzddM0QSnfIfIbi3Z9LTag1VDjYyZRbEGGSVip2J00qKsET+979nRezWMyJgw5GPBQR3Y+rN+jh0Q==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.667.0.tgz", + "integrity": "sha512-4OcWyWUAYRLwXMxqUqnDb/3LoassXvEJcwjiIKEa7p0JvtSa9VjCL6B8Vjw8C/N6YoqrlFEEvcN7SlwBEy74pA==", "dependencies": { + "@aws-sdk/middleware-user-agent": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/middleware-retry": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz", + "integrity": "sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { - "version": "3.1.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/service-error-classification": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz", + "integrity": "sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==", + "dependencies": { + "@smithy/types": "^3.5.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -604,9 +934,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" @@ -615,9 +946,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -625,29 +957,73 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-retry": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz", + "integrity": "sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==", + "dependencies": { + "@smithy/service-error-classification": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "dependencies": { + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda": { + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.637.0", "license": "Apache-2.0", "dependencies": { @@ -668,9 +1044,6 @@ "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", @@ -693,92 +1066,92 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/crc32": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "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", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "3.0.15", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -788,8 +1161,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -799,49 +1172,48 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -849,22 +1221,22 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-config-resolver": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -872,118 +1244,95 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@smithy/types": "^3.3.0" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "3.2.0", "license": "Apache-2.0", "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { + "version": "3.3.0", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^3.0.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -994,10 +1343,11 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { + "@smithy/service-error-classification": "^3.0.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -1005,174 +1355,240 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-lambda": { + "version": "3.637.0", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/eventstream-serde-browser": "^3.0.6", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.5", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/crc32": { + "version": "5.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { + "version": "3.1.2", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", + "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.6", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/eventstream-serde-universal": "^3.0.5", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.5", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@smithy/eventstream-serde-universal": "^3.0.5", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.5", "license": "Apache-2.0", "dependencies": { + "@smithy/eventstream-codec": "^3.1.2", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-config-provider": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1182,34 +1598,210 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-node": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { "version": "3.0.15", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { + "version": "3.1.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { + "version": "3.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { + "version": "3.3.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-hex-encoding": { @@ -1403,178 +1995,43 @@ "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "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", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "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/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { @@ -1787,63 +2244,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", @@ -1937,82 +2337,85 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "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", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "3.0.15", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -2022,173 +2425,35 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", + "@smithy/abort-controller": "^3.1.1", "@smithy/protocol-http": "^4.1.0", "@smithy/querystring-builder": "^3.0.3", "@smithy/types": "^3.3.0", @@ -2321,63 +2586,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", @@ -2520,82 +2728,85 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "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", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-retry": { + "version": "3.0.15", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/service-error-classification": "^3.0.3", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -2605,146 +2816,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -2904,63 +2977,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", @@ -4318,33 +4334,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", @@ -4356,17 +4345,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", @@ -4388,15 +4366,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/url-parser": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.37.0", "license": "Apache-2.0", @@ -4778,16 +4747,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", @@ -5906,50 +5865,130 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/core": { - "version": "2.4.0", - "license": "Apache-2.0", + "node_modules/@smithy/config-resolver": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.9.tgz", + "integrity": "sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", + "node_modules/@smithy/config-resolver/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", + "node_modules/@smithy/config-resolver/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.8.tgz", + "integrity": "sha512-x4qWk7p/a4dcf7Vxb2MODIf4OIcqNbK182WxRvZ/3oKPrf/6Fdic5sSElhO1UtXpWKBazWfqg0ZEK9xN1DsuHA==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -5958,15 +5997,16 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -5974,16 +6014,17 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz", + "integrity": "sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -5992,10 +6033,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6003,10 +6045,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6014,12 +6057,13 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6027,13 +6071,14 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "license": "Apache-2.0", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6041,10 +6086,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/property-provider": { - "version": "3.1.3", - "license": "Apache-2.0", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6052,10 +6098,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "license": "Apache-2.0", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6063,10 +6110,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -6075,10 +6123,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6086,20 +6135,22 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz", + "integrity": "sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.5.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/core/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6107,14 +6158,15 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/smithy-client": { - "version": "3.2.0", - "license": "Apache-2.0", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { @@ -6122,8 +6174,9 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -6132,17 +6185,19 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/url-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/core/node_modules/@smithy/util-base64": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", @@ -6152,16 +6207,10 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" @@ -6172,7 +6221,8 @@ }, "node_modules/@smithy/core/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -6181,10 +6231,11 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6192,11 +6243,12 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/util-retry": { - "version": "3.0.3", - "license": "Apache-2.0", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz", + "integrity": "sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6204,15 +6256,834 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/util-stream": { - "version": "3.1.3", - "license": "Apache-2.0", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.4.tgz", + "integrity": "sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.5.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-node": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.7.tgz", + "integrity": "sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz", + "integrity": "sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz", + "integrity": "sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA==", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.5.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.3.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/service-error-classification": "^2.1.5", + "@smithy/smithy-client": "^2.5.1", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.5.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "@smithy/util-uri-escape": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.1.5", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.4.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.0.tgz", + "integrity": "sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.5.1", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^2.5.1", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.12.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.23.tgz", + "integrity": "sha512-Y07qslyRtXDP/C5aWKqxTPBl4YxplEELG3xRrz2dnAQ6Lq/FgNrcKWmV561nNaZmFH+EzeGOX3ZRMbU8p1T6Nw==", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", + "dependencies": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -6220,259 +7091,285 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-uri-escape": { + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/fetch-http-handler": { - "version": "2.5.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "dependencies": { - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "dependencies": { + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.1", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "@smithy/middleware-serde": "^2.3.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-middleware": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/middleware-retry": { - "version": "2.3.1", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@smithy/node-config-provider": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/service-error-classification": "^2.1.5", - "@smithy/smithy-client": "^2.5.1", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "2.3.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.23.tgz", + "integrity": "sha512-9Y4WH7f0vnDGuHUa4lGX9e2p+sMwODibsceSV6rfkZOvMC+BY3StB2LdO1NHafpsyHJLpwAgChxQ38tFyd6vkg==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@smithy/middleware-stack": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "2.3.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "2.5.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/property-provider": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "3.3.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-uri-escape": "^2.2.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/querystring-parser": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/service-error-classification": { - "version": "2.1.5", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "dependencies": { - "@smithy/types": "^2.12.0" + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.4.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "dependencies": { + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -6480,101 +7377,112 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-uri-escape": { + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-base64": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/smithy-client": { - "version": "2.5.1", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dependencies": { - "@smithy/middleware-endpoint": "^2.5.1", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/types": { - "version": "2.12.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/url-parser": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "dependencies": { - "@smithy/querystring-parser": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-base64": { - "version": "2.3.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "license": "Apache-2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "license": "Apache-2.0", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz", + "integrity": "sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6582,12 +7490,13 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6595,10 +7504,11 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { - "version": "3.1.3", - "license": "Apache-2.0", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6606,10 +7516,11 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6617,8 +7528,9 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -6698,11 +7610,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "license": "Apache-2.0", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.6.tgz", + "integrity": "sha512-xs/KAwWOeCklq8aMlnpk25LgxEYHKOEodfjfKclDMLcBJEVEKzDLxZxBQyztcuPJ7F54213NJS8PxoiHNMdItQ==", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.5", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6710,10 +7623,11 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6721,8 +7635,9 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -7051,12 +7966,11 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", - "integrity": "sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==", - "license": "MIT", + "version": "22.7.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.8.tgz", + "integrity": "sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-fetch": { @@ -17374,10 +18288,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unescape-html": { "version": "1.1.0", @@ -18804,6 +19717,7 @@ "license": "Apache-2.0", "dependencies": { "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@aws-sdk/client-cloudformation": "^3.667.0", "@aws-sdk/client-cognito-identity": "^3.637.0", "@aws-sdk/client-lambda": "^3.637.0", "@aws-sdk/client-sso": "^3.342.0", diff --git a/package.json b/package.json index 335751d3ddc..6244eceba47 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,8 @@ "webpack-merge": "^5.10.0" }, "dependencies": { - "@types/node": "^18.19.55", + "@types/node": "^22.7.5", + "@aws-toolkits/telemetry": "^1.0.242", "vscode-nls": "^5.2.0", "vscode-nls-dev": "^4.0.4" } diff --git a/packages/core/package.json b/packages/core/package.json index 4ca9b19f487..79d975eb689 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,6 +7,22 @@ "npm": "^10.1.0", "vscode": "^1.83.0" }, + "activationEvents": [ + "onStartupFinished", + "onUri", + "onDebugResolve:aws-sam", + "onDebugInitialConfigurations", + "onLanguage:javascript", + "onLanguage:java", + "onLanguage:python", + "onLanguage:csharp", + "onLanguage:yaml", + "onFileSystem:s3", + "onFileSystem:s3-readonly", + "onView:appBuilder" + ], + "main": "./dist/src/extensionNode.js", + "browser": "./dist/src/extensionWebCore.js", "exports": { ".": "./dist/src/extension.js", "./node": "./dist/src/extensionNode.js", @@ -31,6 +47,3926 @@ "./notifications": "./dist/src/notifications/index.js" }, "contributes": { + "configuration": { + "type": "object", + "title": "%AWS.productName%", + "cloud9": { + "cn": { + "title": "%AWS.productName.cn%" + } + }, + "properties": { + "aws.profile": { + "type": "string", + "deprecationMessage": "The current profile is now stored internally by the Toolkit.", + "description": "%AWS.configuration.profileDescription%" + }, + "aws.ecs.openTerminalCommand": { + "type": "string", + "default": "/bin/sh", + "markdownDescription": "%AWS.configuration.description.ecs.openTerminalCommand%" + }, + "aws.iot.maxItemsPerPage": { + "type": "number", + "default": 100, + "minimum": 1, + "maximum": 250, + "markdownDescription": "%AWS.configuration.description.iot.maxItemsPerPage%" + }, + "aws.s3.maxItemsPerPage": { + "type": "number", + "default": 300, + "minimum": 3, + "maximum": 1000, + "markdownDescription": "%AWS.configuration.description.s3.maxItemsPerPage%" + }, + "aws.samcli.location": { + "type": "string", + "scope": "machine", + "default": "", + "markdownDescription": "%AWS.configuration.description.samcli.location%" + }, + "aws.samcli.lambdaTimeout": { + "type": "number", + "default": 90000, + "markdownDescription": "%AWS.configuration.description.samcli.lambdaTimeout%" + }, + "aws.samcli.legacyDeploy": { + "type": "boolean", + "default": false, + "markdownDescription": "%AWS.configuration.description.samcli.legacyDeploy%" + }, + "aws.telemetry": { + "type": "boolean", + "default": true, + "markdownDescription": "%AWS.configuration.description.telemetry%", + "cloud9": { + "cn": { + "markdownDescription": "%AWS.configuration.description.telemetry.cn%" + } + } + }, + "aws.stepfunctions.asl.format.enable": { + "type": "boolean", + "scope": "window", + "default": true, + "description": "%AWS.stepFunctions.asl.format.enable.desc%" + }, + "aws.stepfunctions.asl.maxItemsComputed": { + "type": "number", + "default": 5000, + "description": "%AWS.stepFunctions.asl.maxItemsComputed.desc%" + }, + "aws.ssmDocument.ssm.maxItemsComputed": { + "type": "number", + "default": 5000, + "description": "%AWS.ssmDocument.ssm.maxItemsComputed.desc%" + }, + "aws.cwl.limit": { + "type": "number", + "default": 10000, + "description": "%AWS.cwl.limit.desc%", + "maximum": 10000 + }, + "aws.samcli.manuallySelectedBuckets": { + "type": "object", + "description": "%AWS.samcli.deploy.bucket.recentlyUsed%", + "default": [] + }, + "aws.samcli.enableCodeLenses": { + "type": "boolean", + "description": "%AWS.configuration.enableCodeLenses%", + "default": false + }, + "aws.suppressPrompts": { + "type": "object", + "description": "%AWS.configuration.description.suppressPrompts%", + "default": {}, + "properties": { + "apprunnerNotifyPricing": { + "type": "boolean", + "default": false + }, + "apprunnerNotifyPause": { + "type": "boolean", + "default": false + }, + "ecsRunCommand": { + "type": "boolean", + "default": false + }, + "ecsRunCommandEnable": { + "type": "boolean", + "default": false + }, + "ecsRunCommandDisable": { + "type": "boolean", + "default": false + }, + "regionAddAutomatically": { + "type": "boolean", + "default": false + }, + "yamlExtPrompt": { + "type": "boolean", + "default": false + }, + "fileViewerEdit": { + "type": "boolean", + "default": false + }, + "createCredentialsProfile": { + "type": "boolean", + "default": false + }, + "samcliConfirmDevStack": { + "type": "boolean", + "default": false + }, + "remoteConnected": { + "type": "boolean", + "default": false + }, + "codeCatalystConnectionExpired": { + "type": "boolean", + "default": false + }, + "ssoCacheError": { + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "aws.experiments": { + "type": "object", + "markdownDescription": "%AWS.configuration.description.experiments%", + "default": { + "jsonResourceModification": false + }, + "properties": { + "jsonResourceModification": { + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "aws.resources.enabledResources": { + "type": "array", + "description": "%AWS.configuration.description.resources.enabledResources%", + "items": { + "type": "string" + } + }, + "aws.lambda.recentlyUploaded": { + "type": "object", + "description": "%AWS.configuration.description.lambda.recentlyUploaded%", + "default": [] + }, + "aws.accessAnalyzer.policyChecks.checkNoNewAccessFilePath": { + "type": "string", + "default": "", + "description": "File path or S3 path to a text document for CheckNoNewAccess custom check.", + "scope": "window" + }, + "aws.accessAnalyzer.policyChecks.checkAccessNotGrantedFilePath": { + "type": "string", + "default": "", + "description": "File path or S3 path to a text document for CheckAccessNotGranted custom check.", + "scope": "window" + }, + "aws.accessAnalyzer.policyChecks.cloudFormationParameterFilePath": { + "type": "string", + "default": "", + "description": "A JSON formatted file that specifies template parameter values, a stack policy, and tags. Only parameters are used from this file.", + "scope": "machine-overridable" + }, + "amazonQ.telemetry": { + "type": "boolean", + "default": true, + "markdownDescription": "%AWS.configuration.description.amazonq.telemetry%" + }, + "amazonQ.suppressPrompts": { + "type": "object", + "description": "%AWS.configuration.description.suppressPrompts%", + "default": {}, + "properties": { + "createCredentialsProfile": { + "type": "boolean", + "default": false + }, + "codeWhispererNewWelcomeMessage": { + "type": "boolean", + "default": false + }, + "codeWhispererConnectionExpired": { + "type": "boolean", + "default": false + }, + "amazonQWelcomePage": { + "type": "boolean", + "default": false + }, + "amazonQSessionConfigurationMessage": { + "type": "boolean", + "default": false + }, + "ssoCacheError": { + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "amazonQ.showInlineCodeSuggestionsWithCodeReferences": { + "type": "boolean", + "markdownDescription": "%AWS.configuration.description.amazonq%", + "default": true + }, + "amazonQ.importRecommendationForInlineCodeSuggestions": { + "type": "boolean", + "description": "%AWS.configuration.description.amazonq.importRecommendation%", + "default": true + }, + "amazonQ.shareContentWithAWS": { + "type": "boolean", + "markdownDescription": "%AWS.configuration.description.amazonq.shareContentWithAWS%", + "default": true, + "scope": "application" + }, + "amazonQ.workspaceIndex": { + "type": "boolean", + "markdownDescription": "%AWS.configuration.description.amazonq.workspaceIndex%", + "default": false, + "scope": "application" + }, + "amazonQ.workspaceIndexWorkerThreads": { + "type": "number", + "markdownDescription": "%AWS.configuration.description.amazonq.workspaceIndexWorkerThreads%", + "default": 0, + "scope": "application" + }, + "amazonQ.workspaceIndexUseGPU": { + "type": "boolean", + "markdownDescription": "%AWS.configuration.description.amazonq.workspaceIndexUseGPU%", + "default": false, + "scope": "application" + }, + "amazonQ.workspaceIndexMaxSize": { + "type": "number", + "markdownDescription": "%AWS.configuration.description.amazonq.workspaceIndexMaxSize%", + "default": 250, + "scope": "application" + } + } + }, + "debuggers": [ + { + "type": "aws-sam", + "when": "isCloud9 || !aws.isWebExtHost", + "label": "%AWS.configuration.description.awssam.debug.label%", + "configurationAttributes": { + "direct-invoke": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "AwsSamDebuggerConfiguration", + "additionalProperties": false, + "properties": { + "aws": { + "title": "AWS Connection", + "description": "%AWS.configuration.description.awssam.debug.aws%", + "properties": { + "credentials": { + "description": "%AWS.configuration.description.awssam.debug.credentials%", + "type": "string", + "cloud9": { + "cn": { + "description": "%AWS.configuration.description.awssam.debug.credentials.cn%" + } + } + }, + "region": { + "description": "%AWS.configuration.description.awssam.debug.region%", + "type": "string" + } + }, + "additionalProperties": false, + "type": "object" + }, + "invokeTarget": { + "oneOf": [ + { + "title": "Template Target Properties", + "description": "%AWS.configuration.description.awssam.debug.invokeTarget%", + "properties": { + "templatePath": { + "description": "%AWS.configuration.description.awssam.debug.templatePath%", + "type": "string" + }, + "logicalId": { + "description": "%AWS.configuration.description.awssam.debug.logicalId%", + "type": "string" + }, + "target": { + "description": "%AWS.configuration.description.awssam.debug.target%", + "type": "string", + "enum": [ + "template" + ] + } + }, + "additionalProperties": false, + "required": [ + "templatePath", + "logicalId", + "target" + ], + "type": "object" + }, + { + "title": "Code Target Properties", + "description": "%AWS.configuration.description.awssam.debug.invokeTarget%", + "properties": { + "lambdaHandler": { + "description": "%AWS.configuration.description.awssam.debug.lambdaHandler%", + "type": "string" + }, + "projectRoot": { + "description": "%AWS.configuration.description.awssam.debug.projectRoot%", + "type": "string" + }, + "target": { + "description": "%AWS.configuration.description.awssam.debug.target%", + "type": "string", + "enum": [ + "code" + ] + }, + "architecture": { + "description": "%AWS.configuration.description.awssam.debug.architecture%", + "type": "string", + "enum": [ + "x86_64", + "arm64" + ] + } + }, + "additionalProperties": false, + "required": [ + "lambdaHandler", + "projectRoot", + "target" + ], + "type": "object" + }, + { + "title": "API Target Properties", + "description": "%AWS.configuration.description.awssam.debug.invokeTarget%", + "properties": { + "templatePath": { + "description": "%AWS.configuration.description.awssam.debug.templatePath%", + "type": "string" + }, + "logicalId": { + "description": "%AWS.configuration.description.awssam.debug.logicalId%", + "type": "string" + }, + "target": { + "description": "%AWS.configuration.description.awssam.debug.target%", + "type": "string", + "enum": [ + "api" + ] + } + }, + "additionalProperties": false, + "required": [ + "templatePath", + "logicalId", + "target" + ], + "type": "object" + } + ] + }, + "lambda": { + "title": "Lambda Properties", + "description": "%AWS.configuration.description.awssam.debug.lambda%", + "properties": { + "environmentVariables": { + "description": "%AWS.configuration.description.awssam.debug.envvars%", + "additionalProperties": { + "type": [ + "string" + ] + }, + "type": "object" + }, + "payload": { + "description": "%AWS.configuration.description.awssam.debug.event%", + "properties": { + "json": { + "description": "%AWS.configuration.description.awssam.debug.event.json%", + "type": "object" + }, + "path": { + "description": "%AWS.configuration.description.awssam.debug.event.path%", + "type": "string" + } + }, + "additionalProperties": false, + "type": "object" + }, + "memoryMb": { + "description": "%AWS.configuration.description.awssam.debug.memoryMb%", + "type": "number" + }, + "runtime": { + "description": "%AWS.configuration.description.awssam.debug.runtime%", + "type": "string" + }, + "timeoutSec": { + "description": "%AWS.configuration.description.awssam.debug.timeout%", + "type": "number" + }, + "pathMappings": { + "type:": "array", + "items": { + "title": "Path Mapping", + "type": "object", + "properties": { + "localRoot": { + "type": "string" + }, + "remoteRoot": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "localRoot", + "remoteRoot" + ] + } + } + }, + "additionalProperties": false, + "type": "object" + }, + "sam": { + "title": "SAM CLI Properties", + "description": "%AWS.configuration.description.awssam.debug.sam%", + "properties": { + "buildArguments": { + "description": "%AWS.configuration.description.awssam.debug.buildArguments%", + "type": "array", + "items": { + "type": "string" + } + }, + "buildDir": { + "description": "%AWS.configuration.description.awssam.debug.buildDir%", + "type": "string" + }, + "containerBuild": { + "description": "%AWS.configuration.description.awssam.debug.containerBuild%", + "type": "boolean" + }, + "dockerNetwork": { + "description": "%AWS.configuration.description.awssam.debug.dockerNetwork%", + "type": "string" + }, + "localArguments": { + "description": "%AWS.configuration.description.awssam.debug.localArguments%", + "type": "array", + "items": { + "type": "string" + } + }, + "skipNewImageCheck": { + "description": "%AWS.configuration.description.awssam.debug.skipNewImageCheck%", + "type": "boolean" + }, + "template": { + "description": "%AWS.configuration.description.awssam.debug.template%", + "properties": { + "parameters": { + "description": "%AWS.configuration.description.awssam.debug.templateParameters%", + "additionalProperties": { + "type": [ + "string", + "number" + ] + }, + "type": "object" + } + }, + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false, + "type": "object" + }, + "api": { + "title": "API Gateway Properties", + "description": "%AWS.configuration.description.awssam.debug.api%", + "properties": { + "path": { + "description": "%AWS.configuration.description.awssam.debug.api.path%", + "type": "string" + }, + "httpMethod": { + "description": "%AWS.configuration.description.awssam.debug.api.httpMethod%", + "type": "string", + "enum": [ + "delete", + "get", + "head", + "options", + "patch", + "post", + "put" + ] + }, + "payload": { + "description": "%AWS.configuration.description.awssam.debug.event%", + "properties": { + "json": { + "description": "%AWS.configuration.description.awssam.debug.event.json%", + "type": "object" + }, + "path": { + "description": "%AWS.configuration.description.awssam.debug.event.path%", + "type": "string" + } + }, + "additionalProperties": false, + "type": "object" + }, + "headers": { + "description": "%AWS.configuration.description.awssam.debug.api.headers%", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "querystring": { + "description": "%AWS.configuration.description.awssam.debug.api.queryString%", + "type": "string" + }, + "stageVariables": { + "description": "%AWS.configuration.description.awssam.debug.api.stageVariables%", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "clientCertificateId": { + "description": "%AWS.configuration.description.awssam.debug.api.clientCertId%", + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "path", + "httpMethod" + ], + "type": "object" + } + }, + "required": [ + "invokeTarget" + ], + "type": "object" + } + }, + "configurationSnippets": [ + { + "label": "%AWS.configuration.description.awssam.debug.snippets.lambdaCode.label%", + "description": "%AWS.configuration.description.awssam.debug.snippets.lambdaCode.description%", + "body": { + "type": "aws-sam", + "request": "direct-invoke", + "name": "${3:Invoke Lambda}", + "invokeTarget": { + "target": "code", + "lambdaHandler": "${1:Function Handler}", + "projectRoot": "^\"\\${workspaceFolder}\"" + }, + "lambda": { + "runtime": "${2:Lambda Runtime}", + "payload": { + "json": {} + } + } + }, + "cloud9": { + "cn": { + "label": "%AWS.configuration.description.awssam.debug.snippets.lambdaCode.label.cn%", + "description": "%AWS.configuration.description.awssam.debug.snippets.lambdaCode.description.cn%" + } + } + }, + { + "label": "%AWS.configuration.description.awssam.debug.snippets.lambdaTemplate.label%", + "description": "%AWS.configuration.description.awssam.debug.snippets.lambdaTemplate.description%", + "body": { + "type": "aws-sam", + "request": "direct-invoke", + "name": "${3:Invoke Lambda}", + "invokeTarget": { + "target": "template", + "templatePath": "${1:Template Location}", + "logicalId": "${2:Function Logical ID}" + }, + "lambda": { + "payload": { + "json": {} + } + } + }, + "cloud9": { + "cn": { + "label": "%AWS.configuration.description.awssam.debug.snippets.lambdaTemplate.label.cn%", + "description": "%AWS.configuration.description.awssam.debug.snippets.lambdaTemplate.description.cn%" + } + } + }, + { + "label": "%AWS.configuration.description.awssam.debug.snippets.api.label%", + "description": "%AWS.configuration.description.awssam.debug.snippets.api.description%", + "body": { + "type": "aws-sam", + "request": "direct-invoke", + "name": "${5:Invoke Lambda with API Gateway}", + "invokeTarget": { + "target": "api", + "templatePath": "${1:Template Location}", + "logicalId": "${2:Function Logical ID}" + }, + "api": { + "path": "${3:Path}", + "httpMethod": "${4:Method}", + "payload": { + "json": {} + } + } + }, + "cloud9": { + "cn": { + "label": "%AWS.configuration.description.awssam.debug.snippets.api.label.cn%", + "description": "%AWS.configuration.description.awssam.debug.snippets.api.description.cn%" + } + } + } + ] + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "aws-explorer", + "title": "%AWS.title%", + "icon": "resources/aws-logo.svg", + "cloud9": { + "cn": { + "title": "%AWS.title.cn%", + "icon": "resources/aws-cn-logo.svg" + } + } + } + ] + }, + "viewsWelcome": [ + { + "view": "aws.appBuilderForFileExplorer", + "when": "!aws.isWebExtHost", + "contents": "[Open walkthrough](command:aws.toolkit.lambda.openWalkthrough)\n [Open Folder](command:vscode.openFolder)" + }, + { + "view": "aws.appBuilder", + "when": "!aws.isWebExtHost", + "contents": "[Open walkthrough](command:aws.toolkit.lambda.openWalkthrough)\n [Open Folder](command:vscode.openFolder)" + } + ], + "views": { + "explorer": [ + { + "id": "aws.appBuilderForFileExplorer", + "name": "%AWS.appBuilder.explorerTitle%", + "when": "(isCloud9 || !aws.isWebExtHost) && !aws.appBuilder.hide", + "contextualTitle": "Application Builder", + "widget": { + "type": "inspector" + } + } + ], + "aws-explorer": [ + { + "id": "aws.amazonq.codewhisperer", + "name": "%AWS.amazonq.codewhisperer.title%", + "when": "!isCloud9 && !aws.isSageMaker && !aws.toolkit.amazonq.dismissed && !aws.explorer.showAuthView" + }, + { + "id": "aws.explorer", + "name": "%AWS.lambda.explorerTitle%", + "when": "(isCloud9 || !aws.isWebExtHost) && !aws.explorer.showAuthView" + }, + { + "id": "aws.cdk", + "name": "%AWS.cdk.explorerTitle%", + "when": "!aws.explorer.showAuthView" + }, + { + "id": "aws.appBuilder", + "name": "%AWS.appBuilder.explorerTitle%", + "when": "(isCloud9 || !aws.isWebExtHost) && !aws.explorer.showAuthView" + }, + { + "id": "aws.codecatalyst", + "name": "%AWS.codecatalyst.explorerTitle%", + "when": "(!isCloud9 && !aws.isSageMaker || isCloud9CodeCatalyst) && !aws.explorer.showAuthView" + }, + { + "type": "webview", + "id": "aws.toolkit.AmazonCommonAuth", + "name": "%AWS.amazonq.login%", + "when": "!isCloud9 && !aws.isSageMaker && aws.explorer.showAuthView" + } + ] + }, + "submenus": [ + { + "id": "aws.toolkit.auth", + "label": "%AWS.submenu.auth.title%", + "icon": "$(ellipsis)", + "when": "isCloud9 || !aws.isWebExtHost" + }, + { + "id": "aws.codecatalyst.submenu", + "label": "%AWS.codecatalyst.submenu.title%", + "icon": "$(ellipsis)", + "when": "isCloud9 || !aws.isWebExtHost" + }, + { + "label": "%AWS.generic.feedback%", + "id": "aws.toolkit.submenu.feedback" + }, + { + "label": "%AWS.generic.help%", + "id": "aws.toolkit.submenu.help" + } + ], + "menus": { + "commandPalette": [ + { + "command": "aws.apig.copyUrl", + "when": "false" + }, + { + "command": "aws.launchDebugConfigForm", + "when": "false" + }, + { + "command": "aws.apig.invokeRemoteRestApi", + "when": "false" + }, + { + "command": "aws.deleteCloudFormation", + "when": "false" + }, + { + "command": "aws.downloadStateMachineDefinition", + "when": "false" + }, + { + "command": "aws.ecr.createRepository", + "when": "false" + }, + { + "command": "aws.executeStateMachine", + "when": "false" + }, + { + "command": "aws.copyArn", + "when": "false" + }, + { + "command": "aws.copyName", + "when": "false" + }, + { + "command": "aws.listCommands", + "when": "false" + }, + { + "command": "aws.codecatalyst.listCommands", + "when": "false" + }, + { + "command": "aws.codecatalyst.manageConnections", + "when": "false" + }, + { + "command": "aws.codecatalyst.openDevEnv", + "when": "!isCloud9" + }, + { + "command": "aws.codecatalyst.createDevEnv", + "when": "!isCloud9" + }, + { + "command": "aws.downloadSchemaItemCode", + "when": "false" + }, + { + "command": "aws.deleteLambda", + "when": "false" + }, + { + "command": "aws.downloadLambda", + "when": "false" + }, + { + "command": "aws.invokeLambda", + "when": "false" + }, + { + "command": "aws.copyLambdaUrl", + "when": "false" + }, + { + "command": "aws.viewSchemaItem", + "when": "false" + }, + { + "command": "aws.searchSchema", + "when": "false" + }, + { + "command": "aws.searchSchemaPerRegistry", + "when": "false" + }, + { + "command": "aws.refreshAwsExplorer", + "when": "false" + }, + { + "command": "aws.cdk.refresh", + "when": "false" + }, + { + "command": "aws.cdk.viewDocs", + "when": "false" + }, + { + "command": "aws.appBuilder.refresh", + "when": "false" + }, + { + "command": "aws.appBuilderForFileExplorer.refresh", + "when": "false" + }, + { + "command": "aws.appBuilder.viewDocs", + "when": "false" + }, + { + "command": "aws.ssmDocument.openLocalDocument", + "when": "false" + }, + { + "command": "aws.ssmDocument.openLocalDocumentJson", + "when": "false" + }, + { + "command": "aws.ssmDocument.openLocalDocumentYaml", + "when": "false" + }, + { + "command": "aws.ssmDocument.deleteDocument", + "when": "false" + }, + { + "command": "aws.ssmDocument.updateDocumentVersion", + "when": "false" + }, + { + "command": "aws.copyLogResource", + "when": "resourceScheme == aws-cwl" + }, + { + "command": "aws.saveCurrentLogDataContent", + "when": "resourceScheme == aws-cwl" + }, + { + "command": "aws.s3.editFile", + "when": "resourceScheme == s3-readonly" + }, + { + "command": "aws.cwl.viewLogStream", + "when": "false" + }, + { + "command": "aws.cwl.changeFilterPattern", + "when": "false" + }, + { + "command": "aws.cwl.changeTimeFilter", + "when": "false" + }, + { + "command": "aws.ecr.deleteRepository", + "when": "false" + }, + { + "command": "aws.ecr.copyTagUri", + "when": "false" + }, + { + "command": "aws.ecr.copyRepositoryUri", + "when": "false" + }, + { + "command": "aws.ecr.deleteTag", + "when": "false" + }, + { + "command": "aws.iot.createThing", + "when": "false" + }, + { + "command": "aws.iot.deleteThing", + "when": "false" + }, + { + "command": "aws.iot.createCert", + "when": "false" + }, + { + "command": "aws.iot.deleteCert", + "when": "false" + }, + { + "command": "aws.iot.attachCert", + "when": "false" + }, + { + "command": "aws.iot.attachPolicy", + "when": "false" + }, + { + "command": "aws.iot.activateCert", + "when": "false" + }, + { + "command": "aws.iot.deactivateCert", + "when": "false" + }, + { + "command": "aws.iot.revokeCert", + "when": "false" + }, + { + "command": "aws.iot.createPolicy", + "when": "false" + }, + { + "command": "aws.iot.deletePolicy", + "when": "false" + }, + { + "command": "aws.iot.createPolicyVersion", + "when": "false" + }, + { + "command": "aws.iot.deletePolicyVersion", + "when": "false" + }, + { + "command": "aws.iot.detachCert", + "when": "false" + }, + { + "command": "aws.iot.detachPolicy", + "when": "false" + }, + { + "command": "aws.iot.viewPolicyVersion", + "when": "false" + }, + { + "command": "aws.iot.setDefaultPolicy", + "when": "false" + }, + { + "command": "aws.iot.copyEndpoint", + "when": "false" + }, + { + "command": "aws.deploySamApplication", + "when": "config.aws.samcli.legacyDeploy" + }, + { + "command": "aws.redshift.editConnection", + "when": "false" + }, + { + "command": "aws.redshift.deleteConnection", + "when": "false" + }, + { + "command": "aws.samcli.sync", + "when": "!config.aws.samcli.legacyDeploy" + }, + { + "command": "aws.appBuilder.build", + "when": "!aws.isWebExtHost" + }, + { + "command": "aws.s3.copyPath", + "when": "false" + }, + { + "command": "aws.s3.createBucket", + "when": "false" + }, + { + "command": "aws.s3.createFolder", + "when": "false" + }, + { + "command": "aws.s3.deleteBucket", + "when": "false" + }, + { + "command": "aws.s3.deleteFile", + "when": "false" + }, + { + "command": "aws.s3.downloadFileAs", + "when": "false" + }, + { + "command": "aws.s3.openFile", + "when": "false" + }, + { + "command": "aws.s3.editFile", + "when": "false" + }, + { + "command": "aws.s3.uploadFileToParent", + "when": "false" + }, + { + "command": "aws.apprunner.startDeployment", + "when": "false" + }, + { + "command": "aws.apprunner.createService", + "when": "false" + }, + { + "command": "aws.apprunner.pauseService", + "when": "false" + }, + { + "command": "aws.apprunner.resumeService", + "when": "false" + }, + { + "command": "aws.apprunner.copyServiceUrl", + "when": "false" + }, + { + "command": "aws.apprunner.open", + "when": "false" + }, + { + "command": "aws.apprunner.deleteService", + "when": "false" + }, + { + "command": "aws.apprunner.createServiceFromEcr", + "when": "false" + }, + { + "command": "aws.resources.copyIdentifier", + "when": "false" + }, + { + "command": "aws.resources.openResourcePreview", + "when": "false" + }, + { + "command": "aws.resources.createResource", + "when": "false" + }, + { + "command": "aws.resources.deleteResource", + "when": "false" + }, + { + "command": "aws.resources.updateResource", + "when": "false" + }, + { + "command": "aws.resources.updateResourceInline", + "when": "false" + }, + { + "command": "aws.resources.saveResource", + "when": "false" + }, + { + "command": "aws.resources.closeResource", + "when": "false" + }, + { + "command": "aws.resources.viewDocs", + "when": "false" + }, + { + "command": "aws.ecs.runCommandInContainer", + "when": "false" + }, + { + "command": "aws.ecs.openTaskInTerminal", + "when": "false" + }, + { + "command": "aws.ecs.enableEcsExec", + "when": "false" + }, + { + "command": "aws.ecs.disableEcsExec", + "when": "false" + }, + { + "command": "aws.ecs.viewDocumentation", + "when": "false" + }, + { + "command": "aws.renderStateMachineGraph", + "when": "false" + }, + { + "command": "aws.toolkit.auth.addConnection", + "when": "false" + }, + { + "command": "aws.toolkit.auth.switchConnections", + "when": "false" + }, + { + "command": "aws.toolkit.auth.help", + "when": "false" + }, + { + "command": "aws.toolkit.auth.manageConnections" + }, + { + "command": "aws.ec2.openRemoteConnection", + "when": "aws.isDevMode" + }, + { + "command": "aws.ec2.openTerminal", + "when": "aws.isDevMode" + }, + { + "command": "aws.ec2.linkToLaunch", + "when": "aws.isDevMode" + }, + { + "command": "aws.ec2.startInstance", + "when": "aws.isDevMode" + }, + { + "command": "aws.ec2.stopInstance", + "when": "aws.isDevMode" + }, + { + "command": "aws.ec2.rebootInstance", + "when": "aws.isDevMode" + }, + { + "command": "aws.dev.openMenu", + "when": "aws.isDevMode || isCloud9" + }, + { + "command": "aws.openInApplicationComposer", + "when": "false" + }, + { + "command": "aws.toolkit.amazonq.learnMore", + "when": "false" + }, + { + "command": "aws.toolkit.amazonq.extensionpage", + "when": "false" + }, + { + "command": "aws.newThreatComposerFile", + "when": "false" + } + ], + "editor/title": [ + { + "command": "aws.previewStateMachine", + "when": "editorLangId == asl || editorLangId == asl-yaml", + "group": "navigation" + }, + { + "command": "aws.saveCurrentLogDataContent", + "when": "resourceScheme == aws-cwl", + "group": "navigation" + }, + { + "command": "aws.cwl.changeFilterPattern", + "when": "resourceScheme == aws-cwl", + "group": "navigation" + }, + { + "command": "aws.cwl.changeTimeFilter", + "when": "resourceScheme == aws-cwl", + "group": "navigation" + }, + { + "command": "aws.s3.editFile", + "when": "resourceScheme == s3-readonly", + "group": "navigation" + }, + { + "command": "aws.ssmDocument.publishDocument", + "when": "editorLangId =~ /^(ssm-yaml|ssm-json)$/", + "group": "navigation" + }, + { + "command": "aws.resources.updateResourceInline", + "when": "resourceScheme == awsResource && !isCloud9 && config.aws.experiments.jsonResourceModification", + "group": "navigation" + }, + { + "command": "aws.resources.closeResource", + "when": "resourcePath =~ /^.+(awsResource.json)$/", + "group": "navigation" + }, + { + "command": "aws.resources.saveResource", + "when": "resourcePath =~ /^.+(awsResource.json)$/", + "group": "navigation" + }, + { + "command": "aws.openInApplicationComposer", + "when": "(editorLangId == json && !(resourceFilename =~ /^.*\\.tc\\.json$/)) || editorLangId == yaml || resourceFilename =~ /^.*\\.(template)$/", + "group": "navigation" + } + ], + "editor/title/context": [ + { + "command": "aws.copyLogResource", + "when": "resourceScheme == aws-cwl", + "group": "1_cutcopypaste@1" + } + ], + "view/title": [ + { + "command": "aws.toolkit.submitFeedback", + "when": "view == aws.explorer && !aws.isWebExtHost", + "group": "navigation@6" + }, + { + "command": "aws.refreshAwsExplorer", + "when": "view == aws.explorer", + "group": "navigation@5" + }, + { + "command": "aws.cdk.refresh", + "when": "view == aws.cdk", + "group": "navigation@1" + }, + { + "command": "aws.appBuilder.refresh", + "when": "view == aws.appBuilder", + "group": "navigation@1" + }, + { + "command": "aws.appBuilderForFileExplorer.refresh", + "when": "view == aws.appBuilderForFileExplorer", + "group": "navigation@1" + }, + { + "command": "aws.toolkit.login", + "when": "view == aws.explorer", + "group": "1_account@1" + }, + { + "command": "aws.showRegion", + "when": "view == aws.explorer", + "group": "1_account@2" + }, + { + "command": "aws.listCommands", + "when": "view == aws.explorer && !isCloud9", + "group": "1_account@3" + }, + { + "command": "aws.lambda.createNewSamApp", + "when": "view == aws.explorer", + "group": "3_lambda@1" + }, + { + "command": "aws.launchConfigForm", + "when": "view == aws.explorer", + "group": "3_lambda@2" + }, + { + "command": "aws.deploySamApplication", + "when": "config.aws.samcli.legacyDeploy && view == aws.explorer", + "group": "3_lambda@3" + }, + { + "command": "aws.samcli.sync", + "when": "!config.aws.samcli.legacyDeploy && view == aws.explorer", + "group": "3_lambda@3" + }, + { + "submenu": "aws.toolkit.submenu.feedback", + "when": "view =~ /^aws\\./ && view != aws.AmazonQChatView && view != aws.amazonq.AmazonCommonAuth", + "group": "y_toolkitMeta@1" + }, + { + "submenu": "aws.toolkit.submenu.help", + "when": "view =~ /^aws\\./ && view != aws.AmazonQChatView && view != aws.amazonq.AmazonCommonAuth", + "group": "y_toolkitMeta@2" + }, + { + "command": "aws.codecatalyst.cloneRepo", + "when": "view == aws.codecatalyst && !isCloud9 && aws.codecatalyst.connected", + "group": "1_codeCatalyst@1" + }, + { + "command": "aws.codecatalyst.createDevEnv", + "when": "view == aws.codecatalyst && !isCloud9 && aws.codecatalyst.connected", + "group": "1_codeCatalyst@1" + }, + { + "command": "aws.codecatalyst.listCommands", + "when": "view == aws.codecatalyst && !isCloud9 && aws.codecatalyst.connected", + "group": "1_codeCatalyst@1" + }, + { + "command": "aws.codecatalyst.openDevEnv", + "when": "view == aws.codecatalyst && !isCloud9 && aws.codecatalyst.connected", + "group": "1_codeCatalyst@1" + }, + { + "command": "aws.codecatalyst.manageConnections", + "when": "view == aws.codecatalyst && !isCloud9 && !aws.codecatalyst.connected", + "group": "2_codeCatalyst@1" + }, + { + "command": "aws.codecatalyst.signout", + "when": "view == aws.codecatalyst && !isCloud9 && aws.codecatalyst.connected", + "group": "2_codeCatalyst@1" + } + ], + "explorer/context": [ + { + "command": "aws.deploySamApplication", + "when": "config.aws.samcli.legacyDeploy && isFileSystemResource && resourceFilename =~ /^template\\.(json|yml|yaml)$/", + "group": "z_aws@1" + }, + { + "command": "aws.samcli.sync", + "when": "!config.aws.samcli.legacyDeploy && isFileSystemResource && resourceFilename =~ /^(template\\.(json|yml|yaml))|(samconfig\\.toml)$/", + "group": "z_aws@1" + }, + { + "command": "aws.uploadLambda", + "when": "explorerResourceIsFolder || isFileSystemResource && resourceFilename =~ /^template\\.(json|yml|yaml)$/", + "group": "z_aws@3" + }, + { + "command": "aws.openInApplicationComposer", + "when": "isFileSystemResource && !(resourceFilename =~ /^.*\\.tc\\.json$/) && resourceFilename =~ /^.*\\.(json|yml|yaml|template)$/", + "group": "z_aws@1" + } + ], + "view/item/context": [ + { + "command": "aws.apig.invokeRemoteRestApi", + "when": "view == aws.explorer && viewItem =~ /^(awsApiGatewayNode)$/", + "group": "0@1" + }, + { + "command": "aws.ec2.openTerminal", + "group": "0@1", + "when": "viewItem =~ /^(awsEc2(Parent|Running)Node)$/" + }, + { + "command": "aws.ec2.openTerminal", + "group": "inline@1", + "when": "viewItem =~ /^(awsEc2(Parent|Running)Node)$/" + }, + { + "command": "aws.ec2.linkToLaunch", + "group": "0@1", + "when": "viewItem =~ /^(awsEc2ParentNode)$/" + }, + { + "command": "aws.ec2.linkToLaunch", + "group": "inline@1", + "when": "viewItem =~ /^(awsEc2ParentNode)$/" + }, + { + "command": "aws.ec2.openRemoteConnection", + "group": "0@1", + "when": "viewItem =~ /^(awsEc2(Parent|Running)Node)$/" + }, + { + "command": "aws.ec2.openRemoteConnection", + "group": "inline@1", + "when": "viewItem =~ /^(awsEc2(Parent|Running)Node)$/" + }, + { + "command": "aws.ec2.startInstance", + "group": "0@1", + "when": "viewItem == awsEc2StoppedNode" + }, + { + "command": "aws.ec2.startInstance", + "group": "inline@1", + "when": "viewItem == awsEc2StoppedNode" + }, + { + "command": "aws.ec2.stopInstance", + "group": "0@1", + "when": "viewItem == awsEc2RunningNode" + }, + { + "command": "aws.ec2.stopInstance", + "group": "inline@1", + "when": "viewItem == awsEc2RunningNode" + }, + { + "command": "aws.ec2.rebootInstance", + "group": "0@1", + "when": "viewItem == awsEc2RunningNode" + }, + { + "command": "aws.ec2.rebootInstance", + "group": "inline@1", + "when": "viewItem == awsEc2RunningNode" + }, + { + "command": "aws.ecr.createRepository", + "when": "view == aws.explorer && viewItem == awsEcrNode", + "group": "inline@1" + }, + { + "command": "aws.iot.createThing", + "when": "view == aws.explorer && viewItem == awsIotThingsNode", + "group": "inline@1" + }, + { + "command": "aws.iot.createCert", + "when": "view == aws.explorer && viewItem == awsIotCertsNode", + "group": "inline@1" + }, + { + "command": "aws.iot.createPolicy", + "when": "view == aws.explorer && viewItem == awsIotPoliciesNode", + "group": "inline@1" + }, + { + "command": "aws.iot.attachCert", + "when": "view == aws.explorer && viewItem == awsIotThingNode", + "group": "inline@1" + }, + { + "command": "aws.iot.attachPolicy", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.(Things|Policies)/", + "group": "inline@1" + }, + { + "command": "aws.redshift.editConnection", + "when": "view == aws.explorer && viewItem == awsRedshiftWarehouseNode", + "group": "0@1" + }, + { + "command": "aws.redshift.deleteConnection", + "when": "view == aws.explorer && viewItem == awsRedshiftWarehouseNode", + "group": "0@2" + }, + { + "command": "aws.s3.openFile", + "when": "view == aws.explorer && viewItem == awsS3FileNode && !isCloud9", + "group": "0@1" + }, + { + "command": "aws.s3.editFile", + "when": "view == aws.explorer && viewItem == awsS3FileNode && !isCloud9", + "group": "inline@1" + }, + { + "command": "aws.s3.downloadFileAs", + "when": "view == aws.explorer && viewItem == awsS3FileNode", + "group": "inline@2" + }, + { + "command": "aws.s3.createBucket", + "when": "view == aws.explorer && viewItem == awsS3Node", + "group": "inline@1" + }, + { + "command": "aws.s3.createFolder", + "when": "view == aws.explorer && viewItem =~ /^(awsS3BucketNode|awsS3FolderNode)$/", + "group": "inline@1" + }, + { + "command": "aws.ssmDocument.openLocalDocument", + "when": "view == aws.explorer && viewItem =~ /^(awsDocumentItemNode|awsDocumentItemNodeWriteable)$/", + "group": "inline@1" + }, + { + "command": "aws.s3.uploadFile", + "when": "view == aws.explorer && viewItem =~ /^(awsS3BucketNode|awsS3FolderNode)$/", + "group": "inline@2" + }, + { + "command": "aws.showRegion", + "when": "view == aws.explorer && viewItem == awsRegionNode", + "group": "0@1" + }, + { + "command": "aws.lambda.createNewSamApp", + "when": "view == aws.explorer && viewItem == awsLambdaNode || viewItem == awsRegionNode", + "group": "1@1" + }, + { + "command": "aws.launchConfigForm", + "when": "view == aws.explorer && viewItem == awsLambdaNode || viewItem == awsRegionNode || viewItem == awsCloudFormationRootNode", + "group": "1@1" + }, + { + "command": "aws.deploySamApplication", + "when": "config.aws.samcli.legacyDeploy && view == aws.explorer && viewItem =~ /^(awsLambdaNode|awsRegionNode|awsCloudFormationRootNode)$/", + "group": "1@2" + }, + { + "command": "aws.samcli.sync", + "when": "!config.aws.samcli.legacyDeploy && view == aws.explorer && viewItem =~ /^(awsLambdaNode|awsRegionNode|awsCloudFormationRootNode)$/", + "group": "1@2" + }, + { + "command": "aws.ec2.copyInstanceId", + "when": "view == aws.explorer && viewItem =~ /^(awsEc2(Running|Stopped|Pending)Node)$/", + "group": "2@0" + }, + { + "command": "aws.ecr.copyTagUri", + "when": "view == aws.explorer && viewItem == awsEcrTagNode", + "group": "2@1" + }, + { + "command": "aws.ecr.deleteTag", + "when": "view == aws.explorer && viewItem == awsEcrTagNode", + "group": "3@1" + }, + { + "command": "aws.ecr.copyRepositoryUri", + "when": "view == aws.explorer && viewItem == awsEcrRepositoryNode", + "group": "2@1" + }, + { + "command": "aws.ecr.createRepository", + "when": "view == aws.explorer && viewItem == awsEcrNode", + "group": "0@1" + }, + { + "command": "aws.ecr.deleteRepository", + "when": "view == aws.explorer && viewItem == awsEcrRepositoryNode", + "group": "3@1" + }, + { + "command": "aws.invokeLambda", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable|awsCloudFormationFunctionNode)$/ || viewItem == awsAppBuilderDeployedNode", + "group": "0@1" + }, + { + "command": "aws.downloadLambda", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable)$/ || viewItem == awsAppBuilderDeployedNode", + "group": "0@2" + }, + { + "command": "aws.uploadLambda", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable)$/ || viewItem == awsAppBuilderDeployedNode", + "group": "1@1" + }, + { + "command": "aws.deleteLambda", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable)$/ || viewItem == awsAppBuilderDeployedNode", + "group": "4@1" + }, + { + "command": "aws.copyLambdaUrl", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable)$/ || viewItem == awsAppBuilderDeployedNode", + "group": "2@0" + }, + { + "command": "aws.appBuilder.searchLogs", + "when": "viewItem == awsAppBuilderDeployedNode", + "group": "0@3" + }, + { + "command": "aws.deleteCloudFormation", + "when": "view == aws.explorer && viewItem == awsCloudFormationNode", + "group": "3@5" + }, + { + "command": "aws.searchSchema", + "when": "view == aws.explorer && viewItem == awsSchemasNode", + "group": "0@1" + }, + { + "command": "aws.searchSchemaPerRegistry", + "when": "view == aws.explorer && viewItem == awsRegistryItemNode", + "group": "0@1" + }, + { + "command": "aws.viewSchemaItem", + "when": "view == aws.explorer && viewItem == awsSchemaItemNode", + "group": "0@1" + }, + { + "command": "aws.stepfunctions.createStateMachineFromTemplate", + "when": "view == aws.explorer && viewItem == awsStepFunctionsNode", + "group": "0@1" + }, + { + "command": "aws.downloadStateMachineDefinition", + "when": "view == aws.explorer && viewItem == awsStateMachineNode", + "group": "0@1" + }, + { + "command": "aws.renderStateMachineGraph", + "when": "view == aws.explorer && viewItem == awsStateMachineNode", + "group": "0@2" + }, + { + "command": "aws.cdk.renderStateMachineGraph", + "when": "viewItem == awsCdkStateMachineNode", + "group": "inline@1" + }, + { + "command": "aws.cdk.renderStateMachineGraph", + "when": "viewItem == awsCdkStateMachineNode", + "group": "0@1" + }, + { + "command": "aws.executeStateMachine", + "when": "view == aws.explorer && viewItem == awsStateMachineNode", + "group": "0@3" + }, + { + "command": "aws.iot.createThing", + "when": "view == aws.explorer && viewItem == awsIotThingsNode", + "group": "0@1" + }, + { + "command": "aws.iot.createCert", + "when": "view == aws.explorer && viewItem == awsIotCertsNode", + "group": "0@1" + }, + { + "command": "aws.iot.createPolicy", + "when": "view == aws.explorer && viewItem == awsIotPoliciesNode", + "group": "0@1" + }, + { + "command": "aws.iot.createPolicyVersion", + "when": "view == aws.explorer && viewItem == awsIotPolicyNode.WithVersions", + "group": "0@1" + }, + { + "command": "aws.iot.viewPolicyVersion", + "when": "view == aws.explorer && viewItem =~ /^awsIotPolicyVersionNode./", + "group": "0@1" + }, + { + "command": "aws.iot.attachCert", + "when": "view == aws.explorer && viewItem == awsIotThingNode", + "group": "0@1" + }, + { + "command": "aws.iot.attachPolicy", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.(Things|Policies)/", + "group": "0@1" + }, + { + "command": "aws.s3.createBucket", + "when": "view == aws.explorer && viewItem == awsS3Node", + "group": "0@1" + }, + { + "command": "aws.s3.downloadFileAs", + "when": "view == aws.explorer && viewItem == awsS3FileNode", + "group": "0@1" + }, + { + "command": "aws.s3.uploadFile", + "when": "view == aws.explorer && viewItem =~ /^(awsS3BucketNode|awsS3FolderNode)$/", + "group": "0@1" + }, + { + "command": "aws.s3.uploadFileToParent", + "when": "view == aws.explorer && viewItem == awsS3FileNode", + "group": "1@1" + }, + { + "command": "aws.s3.createFolder", + "when": "view == aws.explorer && viewItem =~ /^(awsS3BucketNode|awsS3FolderNode)$/", + "group": "1@1" + }, + { + "command": "aws.iot.deactivateCert", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.(Things|Policies).ACTIVE$/", + "group": "1@1" + }, + { + "command": "aws.iot.activateCert", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.(Things|Policies).INACTIVE$/", + "group": "1@1" + }, + { + "command": "aws.iot.revokeCert", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.(Things|Policies).(ACTIVE|INACTIVE)$/", + "group": "1@2" + }, + { + "command": "aws.iot.setDefaultPolicy", + "when": "view == aws.explorer && viewItem == awsIotPolicyVersionNode.NONDEFAULT", + "group": "1@1" + }, + { + "command": "aws.iot.copyEndpoint", + "when": "view == aws.explorer && viewItem == awsIotNode", + "group": "2@1" + }, + { + "command": "aws.copyName", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable|awsCloudFormationFunctionNode|awsStateMachineNode|awsCloudFormationNode|awsS3BucketNode|awsS3FolderNode|awsS3FileNode|awsApiGatewayNode|awsIotThingNode)$|^(awsAppRunnerServiceNode|awsIotCertificateNode|awsIotPolicyNode|awsIotPolicyVersionNode|(awsEc2(Running|Pending|Stopped)Node))/", + "group": "2@1" + }, + { + "command": "aws.copyArn", + "when": "view == aws.explorer && viewItem =~ /^(awsRegionFunctionNode|awsRegionFunctionNodeDownloadable|awsCloudFormationFunctionNode|awsStateMachineNode|awsCloudFormationNode|awsCloudWatchLogNode|awsS3BucketNode|awsS3FolderNode|awsS3FileNode|awsApiGatewayNode|awsEcrRepositoryNode|awsIotThingNode)$|^(awsAppRunnerServiceNode|awsEcsServiceNode|awsIotCertificateNode|awsIotPolicyNode|awsIotPolicyVersionNode|awsMdeInstanceNode|(awsEc2(Running|Pending|Stopped)Node))/", + "group": "2@2" + }, + { + "command": "aws.cwl.searchLogGroup", + "group": "0@1", + "when": "view == aws.explorer && viewItem =~ /^awsCloudWatchLogNode|awsCloudWatchLogParentNode$/" + }, + { + "command": "aws.cwl.searchLogGroup", + "group": "inline@1", + "when": "view == aws.explorer && viewItem =~ /^awsCloudWatchLogNode|awsCloudWatchLogParentNode$/" + }, + { + "command": "aws.apig.copyUrl", + "when": "view == aws.explorer && viewItem =~ /^(awsApiGatewayNode)$/", + "group": "2@0" + }, + { + "command": "aws.s3.copyPath", + "when": "view == aws.explorer && viewItem =~ /^(awsS3FolderNode|awsS3FileNode)$/", + "group": "2@3" + }, + { + "command": "aws.s3.presignedURL", + "when": "view == aws.explorer && viewItem =~ /^(awsS3FileNode)$/", + "group": "2@4" + }, + { + "command": "aws.iot.detachCert", + "when": "view == aws.explorer && viewItem =~ /^(awsIotCertificateNode.Things)/", + "group": "3@1" + }, + { + "command": "aws.iot.detachPolicy", + "when": "view == aws.explorer && viewItem == awsIotPolicyNode.Certificates", + "group": "3@1" + }, + { + "command": "aws.iot.deleteThing", + "when": "view == aws.explorer && viewItem == awsIotThingNode", + "group": "3@1" + }, + { + "command": "aws.iot.deleteCert", + "when": "view == aws.explorer && viewItem =~ /^awsIotCertificateNode.Policies/", + "group": "3@1" + }, + { + "command": "aws.iot.deletePolicy", + "when": "view == aws.explorer && viewItem == awsIotPolicyNode.WithVersions", + "group": "3@1" + }, + { + "command": "aws.iot.deletePolicyVersion", + "when": "view == aws.explorer && viewItem == awsIotPolicyVersionNode.NONDEFAULT", + "group": "3@1" + }, + { + "command": "aws.s3.deleteBucket", + "when": "view == aws.explorer && viewItem == awsS3BucketNode", + "group": "3@1" + }, + { + "command": "aws.s3.deleteFile", + "when": "view == aws.explorer && viewItem == awsS3FileNode", + "group": "3@1" + }, + { + "command": "aws.downloadSchemaItemCode", + "when": "view == aws.explorer && viewItem == awsSchemaItemNode", + "group": "1@1" + }, + { + "command": "aws.cwl.viewLogStream", + "group": "0@1", + "when": "view == aws.explorer && viewItem == awsCloudWatchLogNode" + }, + { + "command": "aws.ssmDocument.openLocalDocumentYaml", + "group": "0@1", + "when": "view == aws.explorer && viewItem =~ /^(awsDocumentItemNode|awsDocumentItemNodeWriteable)$/" + }, + { + "command": "aws.ssmDocument.openLocalDocumentJson", + "group": "0@2", + "when": "view == aws.explorer && viewItem =~ /^(awsDocumentItemNode|awsDocumentItemNodeWriteable)$/" + }, + { + "command": "aws.ssmDocument.updateDocumentVersion", + "group": "2@1", + "when": "view == aws.explorer && viewItem == awsDocumentItemNodeWriteable" + }, + { + "command": "aws.ssmDocument.deleteDocument", + "group": "3@2", + "when": "view == aws.explorer && viewItem == awsDocumentItemNodeWriteable" + }, + { + "command": "aws.ecs.runCommandInContainer", + "group": "0@1", + "when": "view == aws.explorer && viewItem =~ /^(awsEcsContainerNodeExec)(.*)$/" + }, + { + "command": "aws.ecs.openTaskInTerminal", + "group": "0@2", + "when": "view == aws.explorer && viewItem =~ /^(awsEcsContainerNodeExec)(.*)$/ && !isCloud9" + }, + { + "command": "aws.ecs.enableEcsExec", + "group": "0@2", + "when": "view == aws.explorer && viewItem == awsEcsServiceNode.DISABLED" + }, + { + "command": "aws.ecs.disableEcsExec", + "group": "0@2", + "when": "view == aws.explorer && viewItem == awsEcsServiceNode.ENABLED" + }, + { + "command": "aws.ecs.viewDocumentation", + "group": "1@3", + "when": "view == aws.explorer && viewItem =~ /^(awsEcsClusterNode|awsEcsContainerNode)$|^awsEcsServiceNode/" + }, + { + "command": "aws.resources.configure", + "when": "view == aws.explorer && viewItem == resourcesRootNode", + "group": "1@1" + }, + { + "command": "aws.resources.configure", + "when": "view == aws.explorer && viewItem == resourcesRootNode", + "group": "inline@1" + }, + { + "command": "aws.resources.openResourcePreview", + "when": "view == aws.explorer && viewItem =~ /^(.*)(ResourceNode)$/", + "group": "1@1" + }, + { + "command": "aws.resources.copyIdentifier", + "when": "view == aws.explorer && viewItem =~ /^(.*)(ResourceNode)$/", + "group": "1@1" + }, + { + "command": "aws.resources.viewDocs", + "when": "view == aws.explorer && viewItem =~ /^(.*)(Documented)(.*)(ResourceTypeNode)$/", + "group": "1@1" + }, + { + "command": "aws.resources.createResource", + "when": "view == aws.explorer && viewItem =~ /^(.*)(Creatable)(.*)(ResourceTypeNode)$/ && !isCloud9 && config.aws.experiments.jsonResourceModification", + "group": "2@1" + }, + { + "command": "aws.resources.createResource", + "when": "view == aws.explorer && viewItem =~ /^(.*)(Creatable)(.*)(ResourceTypeNode)$/ && !isCloud9 && config.aws.experiments.jsonResourceModification", + "group": "inline@1" + }, + { + "command": "aws.resources.updateResource", + "when": "view == aws.explorer && viewItem =~ /^(.*)(Updatable)(.*)(ResourceNode)$/ && !isCloud9 && config.aws.experiments.jsonResourceModification", + "group": "2@1" + }, + { + "command": "aws.resources.deleteResource", + "when": "view == aws.explorer && viewItem =~ /^(.*)(Deletable)(.*)(ResourceNode)$/ && !isCloud9 && config.aws.experiments.jsonResourceModification", + "group": "2@2" + }, + { + "command": "aws.apprunner.createServiceFromEcr", + "group": "0@2", + "when": "view == aws.explorer && viewItem =~ /awsEcrTagNode|awsEcrRepositoryNode/" + }, + { + "command": "aws.apprunner.startDeployment", + "group": "0@1", + "when": "view == aws.explorer && viewItem == awsAppRunnerServiceNode.RUNNING" + }, + { + "command": "aws.apprunner.createService", + "group": "0@2", + "when": "view == aws.explorer && viewItem == awsAppRunnerNode" + }, + { + "command": "aws.apprunner.pauseService", + "group": "0@3", + "when": "view == aws.explorer && viewItem == awsAppRunnerServiceNode.RUNNING" + }, + { + "command": "aws.apprunner.resumeService", + "group": "0@3", + "when": "view == aws.explorer && viewItem == awsAppRunnerServiceNode.PAUSED" + }, + { + "command": "aws.apprunner.copyServiceUrl", + "group": "1@1", + "when": "view == aws.explorer && viewItem == awsAppRunnerServiceNode.RUNNING" + }, + { + "command": "aws.apprunner.open", + "group": "1@2", + "when": "view == aws.explorer && viewItem == awsAppRunnerServiceNode.RUNNING" + }, + { + "command": "aws.apprunner.deleteService", + "group": "3@1", + "when": "view == aws.explorer && viewItem =~ /awsAppRunnerServiceNode.[RUNNING|PAUSED|CREATE_FAILED]/" + }, + { + "command": "aws.cloudFormation.newTemplate", + "group": "0@1", + "when": "view == aws.explorer && viewItem == awsCloudFormationRootNode" + }, + { + "command": "aws.sam.newTemplate", + "group": "0@2", + "when": "view == aws.explorer && viewItem == awsCloudFormationRootNode" + }, + { + "command": "aws.appBuilder.viewDocs", + "when": "viewItem == awsAppBuilderRootNode", + "group": "0@2" + }, + { + "command": "aws.cdk.viewDocs", + "when": "viewItem == awsCdkRootNode", + "group": "0@2" + }, + { + "command": "aws.toolkit.auth.addConnection", + "when": "viewItem == awsAuthNode", + "group": "0@1" + }, + { + "command": "aws.toolkit.auth.switchConnections", + "when": "viewItem == awsAuthNode", + "group": "0@2" + }, + { + "command": "aws.toolkit.auth.signout", + "when": "viewItem == awsAuthNode && !isCloud9", + "group": "0@3" + }, + { + "command": "aws.toolkit.auth.help", + "when": "viewItem == awsAuthNode", + "group": "inline@1" + }, + { + "command": "aws.openInApplicationComposer", + "when": "viewItem == awsAppBuilderAppNode", + "group": "inline@2" + }, + { + "command": "aws.launchDebugConfigForm", + "when": "viewItem == awsAppBuilderResourceNode.function", + "group": "inline@1" + }, + { + "command": "aws.appBuilder.deploy", + "when": "viewItem == awsAppBuilderAppNode", + "group": "inline@4" + }, + { + "command": "aws.appBuilder.build", + "when": "viewItem == awsAppBuilderAppNode", + "group": "inline@3" + }, + { + "command": "aws.appBuilder.openTemplate", + "when": "viewItem == awsAppBuilderAppNode", + "group": "inline@1" + }, + { + "command": "aws.appBuilder.openHandler", + "when": "viewItem == awsAppBuilderResourceNode.function", + "group": "inline@1" + }, + { + "submenu": "aws.toolkit.auth", + "when": "viewItem == awsAuthNode", + "group": "inline@2" + }, + { + "submenu": "aws.codecatalyst.submenu", + "when": "viewItem =~ /^awsCodeCatalystNode/", + "group": "inline@1" + }, + { + "command": "aws.codecatalyst.manageConnections", + "when": "viewItem =~ /^awsCodeCatalystNode/", + "group": "0@1" + }, + { + "command": "aws.codecatalyst.signout", + "when": "viewItem =~ /^awsCodeCatalystNode/&& !isCloud9 && aws.codecatalyst.connected", + "group": "0@2" + }, + { + "command": "aws.appBuilder.build", + "when": "viewItem == awsAppBuilderAppNode", + "group": "0@1" + }, + { + "command": "aws.appBuilder.openHandler", + "when": "viewItem == awsAppBuilderResourceNode.function", + "group": "1@1" + }, + { + "command": "aws.launchConfigForm", + "when": "viewItem == awsAppBuilderAppNode", + "group": "1@2" + }, + { + "command": "aws.launchDebugConfigForm", + "when": "viewItem == awsAppBuilderResourceNode.function", + "group": "1@2" + }, + { + "command": "aws.appBuilder.deploy", + "when": "viewItem == awsAppBuilderAppNode", + "group": "2@1" + }, + { + "command": "aws.openInApplicationComposer", + "when": "viewItem == awsAppBuilderAppNode", + "group": "3@1" + }, + { + "command": "aws.invokeLambda", + "when": "viewItem == awsAppBuilderDeployedNode", + "group": "inline@1" + }, + { + "command": "aws.appBuilder.searchLogs", + "when": "viewItem == awsAppBuilderDeployedNode", + "group": "inline@2" + } + ], + "aws.toolkit.auth": [ + { + "command": "aws.toolkit.auth.manageConnections", + "group": "0@1" + }, + { + "command": "aws.toolkit.auth.switchConnections", + "group": "0@2" + }, + { + "command": "aws.toolkit.auth.signout", + "enablement": "!isCloud9", + "group": "0@3" + } + ], + "aws.toolkit.submenu.feedback": [ + { + "command": "aws.toolkit.submitFeedback", + "when": "!aws.isWebExtHost", + "group": "1_feedback@1" + }, + { + "command": "aws.toolkit.createIssueOnGitHub", + "group": "1_feedback@2" + } + ], + "aws.toolkit.submenu.help": [ + { + "command": "aws.quickStart", + "when": "isCloud9", + "group": "1_help@1" + }, + { + "command": "aws.toolkit.help", + "group": "1_help@2" + }, + { + "command": "aws.toolkit.github", + "group": "1_help@3" + }, + { + "command": "aws.toolkit.aboutExtension", + "group": "1_help@4" + }, + { + "command": "aws.toolkit.viewLogs", + "group": "1_help@5" + }, + { + "command": "aws.toolkit.lambda.openWalkthrough", + "group": "1_help@6" + } + ], + "file/newFile": [ + { + "command": "aws.newThreatComposerFile" + } + ] + }, + "commands": [ + { + "command": "aws.accessanalyzer.iamPolicyChecks", + "title": "%AWS.command.accessanalyzer.iamPolicyChecks%", + "category": "%AWS.title%" + }, + { + "command": "aws.launchConfigForm", + "title": "%AWS.command.launchConfigForm.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(play)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apig.copyUrl", + "title": "%AWS.command.apig.copyUrl%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apig.invokeRemoteRestApi", + "title": "%AWS.command.apig.invokeRemoteRestApi%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%", + "title": "%AWS.command.apig.invokeRemoteRestApi.cn%" + } + } + }, + { + "command": "aws.lambda.createNewSamApp", + "title": "%AWS.command.createNewSamApp%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.launchDebugConfigForm", + "title": "%AWS.command.launchConfigForm.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(play)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.login", + "title": "%AWS.command.login%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "title": "%AWS.command.login.cn%", + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.credentials.profile.create", + "title": "%AWS.command.credentials.profile.create%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.credentials.edit", + "title": "%AWS.command.credentials.edit%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.codecatalyst.openOrg", + "title": "%AWS.command.codecatalyst.openOrg%", + "category": "AWS", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.openProject", + "title": "%AWS.command.codecatalyst.openProject%", + "category": "AWS", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.openRepo", + "title": "%AWS.command.codecatalyst.openRepo%", + "category": "AWS", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.openDevEnv", + "title": "%AWS.command.codecatalyst.openDevEnv%", + "category": "AWS", + "enablement": "!isCloud9 && !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.listCommands", + "title": "%AWS.command.codecatalyst.listCommands%", + "category": "AWS", + "enablement": "!isCloud9 && !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.cloneRepo", + "title": "%AWS.command.codecatalyst.cloneRepo%", + "category": "AWS", + "enablement": "!isCloud9 && !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.createDevEnv", + "title": "%AWS.command.codecatalyst.createDevEnv%", + "category": "AWS", + "enablement": "!isCloud9 && !aws.isWebExtHost" + }, + { + "command": "aws.codecatalyst.signout", + "title": "%AWS.command.codecatalyst.signout%", + "category": "AWS", + "icon": "$(debug-disconnect)", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.toolkit.auth.addConnection", + "title": "%AWS.command.auth.addConnection%", + "category": "%AWS.title%" + }, + { + "command": "aws.toolkit.auth.manageConnections", + "title": "%AWS.command.auth.showConnectionsPage%", + "category": "%AWS.title%" + }, + { + "command": "aws.codecatalyst.manageConnections", + "title": "%AWS.command.auth.showConnectionsPage%", + "category": "%AWS.title%" + }, + { + "command": "aws.toolkit.auth.switchConnections", + "title": "%AWS.command.auth.switchConnections%", + "category": "%AWS.title%" + }, + { + "command": "aws.toolkit.auth.signout", + "title": "%AWS.command.auth.signout%", + "category": "%AWS.title%", + "enablement": "!isCloud9" + }, + { + "command": "aws.toolkit.auth.help", + "title": "%AWS.generic.viewDocs%", + "category": "%AWS.title%", + "icon": "$(question)" + }, + { + "command": "aws.toolkit.createIssueOnGitHub", + "title": "%AWS.command.createIssueOnGitHub%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.openTerminal", + "title": "%AWS.command.ec2.openTerminal%", + "icon": "$(terminal-view-icon)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.linkToLaunch", + "title": "%AWS.command.ec2.linkToLaunch%", + "icon": "$(add)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.openRemoteConnection", + "title": "%AWS.command.ec2.openRemoteConnection%", + "icon": "$(remote-explorer)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.startInstance", + "title": "%AWS.command.ec2.startInstance%", + "icon": "$(debug-start)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.stopInstance", + "title": "%AWS.command.ec2.stopInstance%", + "icon": "$(debug-stop)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.rebootInstance", + "title": "%AWS.command.ec2.rebootInstance%", + "icon": "$(debug-restart)", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ec2.copyInstanceId", + "title": "%AWS.command.ec2.copyInstanceId%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecr.copyTagUri", + "title": "%AWS.command.ecr.copyTagUri%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecr.deleteTag", + "title": "%AWS.command.ecr.deleteTag%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecr.copyRepositoryUri", + "title": "%AWS.command.ecr.copyRepositoryUri%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecr.createRepository", + "title": "%AWS.command.ecr.createRepository%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(add)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecr.deleteRepository", + "title": "%AWS.command.ecr.deleteRepository%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.showRegion", + "title": "%AWS.command.showRegion%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.createThing", + "title": "%AWS.command.iot.createThing%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(add)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.deleteThing", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.createCert", + "title": "%AWS.command.iot.createCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(add)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.deleteCert", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.attachCert", + "title": "%AWS.command.iot.attachCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(aws-generic-attach-file)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.attachPolicy", + "title": "%AWS.command.iot.attachPolicy%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(aws-generic-attach-file)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.activateCert", + "title": "%AWS.command.iot.activateCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.deactivateCert", + "title": "%AWS.command.iot.deactivateCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.revokeCert", + "title": "%AWS.command.iot.revokeCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.createPolicy", + "title": "%AWS.command.iot.createPolicy%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(add)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.deletePolicy", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.createPolicyVersion", + "title": "%AWS.command.iot.createPolicyVersion%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.deletePolicyVersion", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.detachCert", + "title": "%AWS.command.iot.detachCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.detachPolicy", + "title": "%AWS.command.iot.detachCert%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.viewPolicyVersion", + "title": "%AWS.command.iot.viewPolicyVersion%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.setDefaultPolicy", + "title": "%AWS.command.iot.setDefaultPolicy%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.iot.copyEndpoint", + "title": "%AWS.command.iot.copyEndpoint%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.redshift.editConnection", + "title": "Edit connection", + "category": "%AWS.title%" + }, + { + "command": "aws.redshift.deleteConnection", + "title": "Delete connection", + "category": "%AWS.title%" + }, + { + "command": "aws.s3.presignedURL", + "title": "%AWS.command.s3.presignedURL%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.s3.copyPath", + "title": "%AWS.command.s3.copyPath%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.downloadFileAs", + "title": "%AWS.command.s3.downloadFileAs%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(cloud-download)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.openFile", + "title": "%AWS.command.s3.openFile%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(open-preview)" + }, + { + "command": "aws.s3.editFile", + "title": "%AWS.command.s3.editFile%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(edit)" + }, + { + "command": "aws.s3.uploadFile", + "title": "%AWS.command.s3.uploadFile%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(cloud-upload)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.uploadFileToParent", + "title": "%AWS.command.s3.uploadFileToParent%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.createFolder", + "title": "%AWS.command.s3.createFolder%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(new-folder)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.createBucket", + "title": "%AWS.command.s3.createBucket%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(aws-s3-create-bucket)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.deleteBucket", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.s3.deleteFile", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.invokeLambda", + "title": "%AWS.command.invokeLambda%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(play)", + "cloud9": { + "cn": { + "title": "%AWS.command.invokeLambda.cn%", + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.downloadLambda", + "title": "%AWS.command.downloadLambda%", + "category": "%AWS.title%", + "enablement": "viewItem == awsRegionFunctionNodeDownloadable", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.uploadLambda", + "title": "%AWS.command.uploadLambda%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.deleteLambda", + "title": "%AWS.generic.promptDelete%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.copyLambdaUrl", + "title": "%AWS.generic.copyUrl%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.deploySamApplication", + "title": "%AWS.command.deploySamApplication%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.submitFeedback", + "title": "%AWS.command.submitFeedback%", + "enablement": "!aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(comment)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.refreshAwsExplorer", + "title": "%AWS.command.refreshAwsExplorer%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": { + "dark": "resources/icons/vscode/dark/refresh.svg", + "light": "resources/icons/vscode/light/refresh.svg" + } + }, + { + "command": "aws.samcli.detect", + "title": "%AWS.command.samcli.detect%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.deleteCloudFormation", + "title": "%AWS.command.deleteCloudFormation%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.downloadStateMachineDefinition", + "title": "%AWS.command.downloadStateMachineDefinition%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.executeStateMachine", + "title": "%AWS.command.executeStateMachine%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.renderStateMachineGraph", + "title": "%AWS.command.renderStateMachineGraph%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.copyArn", + "title": "%AWS.command.copyArn%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.copyName", + "title": "%AWS.command.copyName%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.listCommands", + "title": "%AWS.command.listCommands%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "title": "%AWS.command.listCommands.cn%", + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.viewSchemaItem", + "title": "%AWS.command.viewSchemaItem%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.searchSchema", + "title": "%AWS.command.searchSchema%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.searchSchemaPerRegistry", + "title": "%AWS.command.searchSchemaPerRegistry%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.downloadSchemaItemCode", + "title": "%AWS.command.downloadSchemaItemCode%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.viewLogs", + "title": "%AWS.command.viewLogs%", + "category": "%AWS.title%" + }, + { + "command": "aws.toolkit.help", + "title": "%AWS.command.help%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.github", + "title": "%AWS.command.github%", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toolkit.lambda.openWalkthrough", + "title": "%AWS.toolkit.lambda.walkthrough.quickpickTitle%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.quickStart", + "title": "%AWS.command.quickStart%", + "category": "%AWS.title%", + "enablement": "isCloud9", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cdk.refresh", + "title": "%AWS.command.refreshCdkExplorer%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": { + "dark": "resources/icons/vscode/dark/refresh.svg", + "light": "resources/icons/vscode/light/refresh.svg" + }, + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cdk.viewDocs", + "title": "%AWS.generic.viewDocs%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.appBuilder.refresh", + "title": "%AWS.command.refreshappBuilderExplorer%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": { + "dark": "resources/icons/vscode/dark/refresh.svg", + "light": "resources/icons/vscode/light/refresh.svg" + }, + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.appBuilderForFileExplorer.refresh", + "title": "%AWS.command.refreshappBuilderExplorer%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": { + "dark": "resources/icons/vscode/dark/refresh.svg", + "light": "resources/icons/vscode/light/refresh.svg" + }, + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.appBuilder.viewDocs", + "title": "%AWS.generic.viewDocs%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.stepfunctions.createStateMachineFromTemplate", + "title": "%AWS.command.stepFunctions.createStateMachineFromTemplate%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.stepfunctions.publishStateMachine", + "title": "%AWS.command.stepFunctions.publishStateMachine%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.previewStateMachine", + "title": "%AWS.command.stepFunctions.previewStateMachine%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(aws-stepfunctions-preview)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cdk.renderStateMachineGraph", + "title": "%AWS.command.cdk.previewStateMachine%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "AWS", + "icon": "$(aws-stepfunctions-preview)" + }, + { + "command": "aws.toolkit.aboutExtension", + "title": "%AWS.command.aboutToolkit%", + "category": "%AWS.title%" + }, + { + "command": "aws.cwl.viewLogStream", + "title": "%AWS.command.viewLogStream%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.createLocalDocument", + "title": "%AWS.command.ssmDocument.createLocalDocument%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.openLocalDocument", + "title": "%AWS.command.ssmDocument.openLocalDocument%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(cloud-download)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.openLocalDocumentJson", + "title": "%AWS.command.ssmDocument.openLocalDocumentJson%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.openLocalDocumentYaml", + "title": "%AWS.command.ssmDocument.openLocalDocumentYaml%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.deleteDocument", + "title": "%AWS.command.ssmDocument.deleteDocument%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.publishDocument", + "title": "%AWS.command.ssmDocument.publishDocument%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(cloud-upload)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ssmDocument.updateDocumentVersion", + "title": "%AWS.command.ssmDocument.updateDocumentVersion%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.copyLogResource", + "title": "%AWS.command.copyLogResource%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(files)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cwl.searchLogGroup", + "title": "%AWS.command.cloudWatchLogs.searchLogGroup%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(search-view-icon)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.saveCurrentLogDataContent", + "title": "%AWS.command.saveCurrentLogDataContent%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(save)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cwl.changeFilterPattern", + "title": "%AWS.command.cwl.changeFilterPattern%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(search-view-icon)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cwl.changeTimeFilter", + "title": "%AWS.command.cwl.changeTimeFilter%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(calendar)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.addSamDebugConfig", + "title": "%AWS.command.addSamDebugConfig%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.toggleSamCodeLenses", + "title": "%AWS.command.toggleSamCodeLenses%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecs.runCommandInContainer", + "title": "%AWS.ecs.runCommandInContainer%", + "category": "%AWS.title%", + "enablement": "viewItem == awsEcsContainerNodeExecEnabled", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecs.openTaskInTerminal", + "title": "%AWS.ecs.openTaskInTerminal%", + "category": "%AWS.title%", + "enablement": "viewItem == awsEcsContainerNodeExecEnabled", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecs.enableEcsExec", + "title": "%AWS.ecs.enableEcsExec%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecs.viewDocumentation", + "title": "%AWS.generic.viewDocs%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.copyIdentifier", + "title": "%AWS.command.resources.copyIdentifier%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.openResourcePreview", + "title": "%AWS.generic.preview%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(open-preview)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.createResource", + "title": "%AWS.generic.create%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(add)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.deleteResource", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.updateResource", + "title": "%AWS.generic.promptUpdate%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(pencil)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.updateResourceInline", + "title": "%AWS.generic.promptUpdate%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(pencil)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.saveResource", + "title": "%AWS.generic.save%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(save)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.closeResource", + "title": "%AWS.generic.close%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(close)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.viewDocs", + "title": "%AWS.generic.viewDocs%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(book)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.resources.configure", + "title": "%AWS.command.resources.configure%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(gear)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.createService", + "title": "%AWS.command.apprunner.createService%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.ecs.disableEcsExec", + "title": "%AWS.ecs.disableEcsExec%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.createServiceFromEcr", + "title": "%AWS.command.apprunner.createServiceFromEcr%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.pauseService", + "title": "%AWS.command.apprunner.pauseService%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.resumeService", + "title": "%AWS.command.apprunner.resumeService%", + "category": "AWS", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.copyServiceUrl", + "title": "%AWS.command.apprunner.copyServiceUrl%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.open", + "title": "%AWS.command.apprunner.open%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.deleteService", + "title": "%AWS.generic.promptDelete%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.apprunner.startDeployment", + "title": "%AWS.command.apprunner.startDeployment%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.cloudFormation.newTemplate", + "title": "%AWS.command.cloudFormation.newTemplate%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.sam.newTemplate", + "title": "%AWS.command.sam.newTemplate%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.samcli.sync", + "title": "%AWS.command.samcli.sync%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost" + }, + { + "command": "aws.appBuilder.build", + "title": "%AWS.command.appBuilder.build%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(package)" + }, + { + "command": "aws.appBuilder.searchLogs", + "title": "%AWS.command.appBuilder.searchLogs%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(search-view-icon)" + }, + { + "command": "aws.appBuilder.deploy", + "title": "%AWS.command.appBuilder.deploy%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(cloud-upload)" + }, + { + "command": "aws.appBuilder.openTemplate", + "title": "%AWS.command.appBuilder.openTemplate%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(code)" + }, + { + "command": "aws.appBuilder.openHandler", + "title": "%AWS.command.appBuilder.openHandler%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "category": "%AWS.title%", + "icon": "$(code)" + }, + { + "command": "aws.toolkit.amazonq.learnMore", + "title": "%AWS.amazonq.learnMore%", + "category": "%AWS.title%" + }, + { + "command": "aws.toolkit.amazonq.extensionpage", + "title": "Open Amazon Q Extension", + "category": "%AWS.title%" + }, + { + "command": "aws.dev.openMenu", + "title": "Open Developer Menu", + "category": "AWS (Developer)", + "enablement": "aws.isDevMode" + }, + { + "command": "aws.dev.viewLogs", + "title": "Watch Logs", + "category": "AWS (Developer)" + }, + { + "command": "aws.openInApplicationComposerDialog", + "title": "%AWS.command.applicationComposer.openDialog%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.openInApplicationComposer", + "title": "%AWS.command.applicationComposer.open%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": { + "dark": "resources/icons/aws/applicationcomposer/icon-dark.svg", + "light": "resources/icons/aws/applicationcomposer/icon.svg" + }, + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.createNewThreatComposer", + "title": "%AWS.command.threatComposer.createNew%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, + { + "command": "aws.newThreatComposerFile", + "title": "%AWS.command.threatComposer.newFile%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + } + ], + "jsonValidation": [ + { + "fileMatch": ".aws/templates.json", + "url": "./dist/src/templates/templates.json" + }, + { + "fileMatch": "*ecs-task-def.json", + "url": "https://ecs-intellisense.s3-us-west-2.amazonaws.com/task-definition/schema.json" + } + ], + "languages": [ + { + "id": "asl", + "extensions": [ + ".asl.json", + ".asl" + ], + "aliases": [ + "Amazon States Language" + ] + }, + { + "id": "asl-yaml", + "aliases": [ + "Amazon States Language (YAML)" + ], + "extensions": [ + ".asl.yaml", + ".asl.yml" + ] + }, + { + "id": "ssm-json", + "extensions": [ + ".ssm.json" + ], + "aliases": [ + "AWS Systems Manager Document (JSON)" + ] + }, + { + "id": "ssm-yaml", + "extensions": [ + ".ssm.yaml", + ".ssm.yml" + ], + "aliases": [ + "AWS Systems Manager Document (YAML)" + ] + } + ], + "keybindings": [ + { + "command": "aws.previewStateMachine", + "key": "ctrl+shift+v", + "mac": "cmd+shift+v", + "when": "editorTextFocus && editorLangId == asl || editorTextFocus && editorLangId == asl-yaml" + }, + { + "command": "aws.samcli.sync", + "key": "ctrl+shift+s", + "mac": "cmd+shift+s", + "when": "editorLangId == yaml || workspaceContains:**/template.yaml" + } + ], + "grammars": [ + { + "language": "asl", + "scopeName": "source.asl", + "path": "./syntaxes/ASL.tmLanguage" + }, + { + "language": "asl-yaml", + "scopeName": "source.asl.yaml", + "path": "./syntaxes/asl-yaml.tmLanguage.json" + }, + { + "language": "ssm-json", + "scopeName": "source.ssmjson", + "path": "./syntaxes/SSMJSON.tmLanguage" + }, + { + "language": "ssm-yaml", + "scopeName": "source.ssmyaml", + "path": "./syntaxes/SSMYAML.tmLanguage" + } + ], + "resourceLabelFormatters": [ + { + "scheme": "aws-cwl", + "formatting": { + "label": "${path}", + "separator": "/" + } + }, + { + "scheme": "s3*", + "formatting": { + "label": "[S3] ${path}", + "separator": "/" + } + } + ], + "walkthroughs": [ + { + "id": "aws.toolkit.lambda.walkthrough", + "title": "%AWS.toolkit.lambda.walkthrough.title%", + "description": "%AWS.toolkit.lambda.walkthrough.description%", + "when": "workspacePlatform != webworker", + "steps": [ + { + "id": "toolInstall", + "title": "%AWS.toolkit.lambda.walkthrough.toolInstall.title%", + "description": "%AWS.toolkit.lambda.walkthrough.toolInstall.description%", + "media": { + "image": "./resources/walkthrough/appBuilder/install.png", + "altText": "Showing GUI installer" + } + }, + { + "id": "chooseTemplate", + "title": "%AWS.toolkit.lambda.walkthrough.chooseTemplate.title%", + "description": "%AWS.toolkit.lambda.walkthrough.chooseTemplate.description%", + "media": { + "markdown": "./resources/walkthrough/appBuilder/AppPicker.md" + } + }, + { + "id": "step1", + "title": "%AWS.toolkit.lambda.walkthrough.step1.title%", + "description": "%AWS.toolkit.lambda.walkthrough.step1.description%", + "media": { + "markdown": "./resources/walkthrough/appBuilder/InnerLoop.md" + } + }, + { + "id": "step2", + "title": "%AWS.toolkit.lambda.walkthrough.step2.title%", + "description": "%AWS.toolkit.lambda.walkthrough.step2.description%", + "media": { + "markdown": "./resources/walkthrough/appBuilder/RemoteLoop.md" + } + } + ] + } + ], "icons": { "aws-amazonq-q-gradient": { "description": "AWS Contributed Icon", @@ -460,6 +4396,7 @@ "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@aws-sdk/client-cognito-identity": "^3.637.0", "@aws-sdk/client-lambda": "^3.637.0", + "@aws-sdk/client-cloudformation": "^3.667.0", "@aws-sdk/client-sso": "^3.342.0", "@aws-sdk/client-sso-oidc": "^3.574.0", "@aws-sdk/credential-provider-ini": "3.46.0", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 0f334478532..dd7b57a543b 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -79,9 +79,18 @@ "AWS.configuration.description.amazonq.workspaceIndexUseGPU": "Enable GPU to help index your local workspace files. Only applies to Linux and Windows.", "AWS.configuration.description.amazonq.workspaceIndexMaxSize": "The maximum size of local workspace files to be indexed in MB", "AWS.command.apig.copyUrl": "Copy URL", - "AWS.command.apig.invokeRemoteRestApi": "Invoke on AWS", + "AWS.command.apig.invokeRemoteRestApi": "Invoke in the cloud", "AWS.command.apig.invokeRemoteRestApi.cn": "Invoke on Amazon", + "AWS.appBuilder.explorerTitle": "Application Builder", + "AWS.appBuilder.explorerNode.noApps": "[This resource is not yet supported.]", + "AWS.appBuilder.explorerNode.unavailableDeployedResource": "[Failed to retrive deployed resource.]", + "AWS.command.appBuilder.openHandler": "Open Function Handler", "AWS.command.applicationComposer.open": "Open with Infrastructure Composer", + "AWS.command.appBuilder.openTemplate": "Open Template File", + "AWS.command.appBuilder.deploy": "Deploy SAM Application", + "AWS.command.appBuilder.build": "Build SAM Template", + "AWS.command.appBuilder.searchLogs": "Search Logs", + "AWS.command.refreshappBuilderExplorer": "Refresh Application Builder Explorer", "AWS.command.applicationComposer.openDialog": "Open Template with Infrastructure Composer...", "AWS.command.auth.addConnection": "Add New Connection", "AWS.command.auth.showConnectionsPage": "Add New Connection", @@ -118,7 +127,7 @@ "AWS.command.aboutToolkit": "About", "AWS.command.downloadLambda": "Download...", "AWS.command.uploadLambda": "Upload Lambda...", - "AWS.command.invokeLambda": "Invoke on AWS", + "AWS.command.invokeLambda": "Invoke in the cloud", "AWS.command.invokeLambda.cn": "Invoke on Amazon", "AWS.command.refreshAwsExplorer": "Refresh Explorer", "AWS.command.refreshCdkExplorer": "Refresh CDK Explorer", @@ -148,6 +157,8 @@ "AWS.command.renderStateMachineGraph": "Render graph", "AWS.command.copyArn": "Copy ARN", "AWS.command.copyName": "Copy Name", + "AWS.command.openAwsConsole": "Go to AWS management console", + "AWS.command.openAwsConsole.cn": "Go to Amazon management console", "AWS.command.listCommands": "Show AWS Commands...", "AWS.command.listCommands.cn": "Show Amazon Commands...", "AWS.command.downloadStateMachineDefinition": "Download Definition...", @@ -198,8 +209,8 @@ "AWS.command.ssmDocument.openLocalDocumentJson": "Download as JSON", "AWS.command.ssmDocument.openLocalDocumentYaml": "Download as YAML", "AWS.command.ssmDocument.publishDocument": "Publish a Systems Manager Document", - "AWS.command.launchConfigForm.title": "Edit SAM Debug Configuration", - "AWS.command.addSamDebugConfig": "Add SAM Debug Configuration", + "AWS.command.launchConfigForm.title": "Local Invoke and Debug Configuration", + "AWS.command.addSamDebugConfig": "Add Local Invoke and Debug Configuration", "AWS.command.toggleSamCodeLenses": "Toggle SAM hints in source files", "AWS.command.apprunner.createService": "Create Service", "AWS.command.apprunner.createServiceFromEcr": "Create App Runner Service", @@ -321,5 +332,15 @@ "AWS.amazonq.featureDev.placeholder.additionalImprovements": "Describe your task or issue in detail", "AWS.amazonq.featureDev.placeholder.feedback": "Provide feedback or comments", "AWS.amazonq.featureDev.placeholder.describe": "Describe your task or issue in detail", - "AWS.amazonq.featureDev.placeholder.sessionClosed": "Open a new chat tab to continue" + "AWS.toolkit.lambda.walkthrough.quickpickTitle": "Application Builder Walkthrough", + "AWS.toolkit.lambda.walkthrough.title": "Get started building your application", + "AWS.toolkit.lambda.walkthrough.description": "Your quick guide to build an application visually, iterate locally, and deploy to the cloud!", + "AWS.toolkit.lambda.walkthrough.toolInstall.title": "Complete installation", + "AWS.toolkit.lambda.walkthrough.toolInstall.description": "The AWS Command Line Interface (AWS CLI) is an open source tool that enables you to interact with AWS services using commands in your command-line shell. It is required to create and interact with AWS resources. \n\n[Install AWS CLI](command:aws.toolkit.installAWSCLI)\n\n Use the Serverless Application Model (SAM) CLI to locally build, invoke, and deploy your functions. Version 1.98+ is required. \n\n[Install SAM CLI](command:aws.toolkit.installSAMCLI)\n\n Use Docker to locally emulate a Lambda environment. Docker is optional. However, if you want to invoke locally, Docker is required so Lambda can locally emulate the execution environment. \n\n[Install Docker (optional)](command:aws.toolkit.installDocker)", + "AWS.toolkit.lambda.walkthrough.chooseTemplate.title": "Choose your application template", + "AWS.toolkit.lambda.walkthrough.chooseTemplate.description": "Select a starter application, visually compose an application from scratch, open an existing application, or browse more application examples. \n\nInfrastructure Composer allows you to visually compose modern applications in the cloud. It will define the necessary permissions between resources when you drag a connection between them. \n\n[Initialize your project](command:aws.toolkit.lambda.initializeWalkthroughProject)", + "AWS.toolkit.lambda.walkthrough.step1.title": "Iterate locally", + "AWS.toolkit.lambda.walkthrough.step1.description": "Locally test and debug your code.", + "AWS.toolkit.lambda.walkthrough.step2.title": "Deploy to the cloud", + "AWS.toolkit.lambda.walkthrough.step2.description": "Test your application in the cloud from within VS Code. \n\nNote: The AWS CLI and the SAM CLI require AWS Credentials to interact with the cloud. For information on setting up your credentials, see [Authentication and access credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html). \n\n[Configure credentials](command:aws.toolkit.lambda.walkthrough.credential)" } diff --git a/packages/core/resources/icons/aws/applicationcomposer/icon-dark.svg b/packages/core/resources/icons/aws/applicationcomposer/icon-dark.svg index 632d645338e..c631f327ae0 100644 --- a/packages/core/resources/icons/aws/applicationcomposer/icon-dark.svg +++ b/packages/core/resources/icons/aws/applicationcomposer/icon-dark.svg @@ -2,6 +2,6 @@ Icon-Service/16/AWS-Application-Composer_16_White - + diff --git a/packages/core/resources/icons/aws/applicationcomposer/icon.svg b/packages/core/resources/icons/aws/applicationcomposer/icon.svg index f2b405cfe57..65580136ce7 100644 --- a/packages/core/resources/icons/aws/applicationcomposer/icon.svg +++ b/packages/core/resources/icons/aws/applicationcomposer/icon.svg @@ -2,6 +2,6 @@ Icon-Service/16/AWS-Application-Composer_16 - + diff --git a/packages/core/resources/markdown/samReadme.md b/packages/core/resources/markdown/samReadme.md index e98229d9b5c..14022174844 100644 --- a/packages/core/resources/markdown/samReadme.md +++ b/packages/core/resources/markdown/samReadme.md @@ -13,9 +13,9 @@ ${LISTOFCONFIGURATIONS} You can debug the Lambda handlers locally by adding a breakpoint to the source file, then running the launch configuration. This works by using Docker on your local machine. -Invocation parameters, including payloads and request parameters, can be edited either by the `Edit SAM Debug Configuration` command (through the ${COMMANDPALETTE} or ${CODELENS}) or by editing the `launch.json` file. +Invocation parameters, including payloads and request parameters, can be edited either by the `Local Invoke and Debug Configuration` command (through the ${COMMANDPALETTE} or ${CODELENS}) or by editing the `launch.json` file. -${COMPANYNAME} Lambda functions not defined in the [`template.yaml`](./template.yaml) file can be invoked and debugged by creating a launch configuration through the ${CODELENS} over the function declaration, or with the `Add SAM Debug Configuration` command. +${COMPANYNAME} Lambda functions not defined in the [`template.yaml`](./template.yaml) file can be invoked and debugged by creating a launch configuration through the ${CODELENS} over the function declaration, or with the `Add Local Invoke and Debug Configuration` command. ## Deploying Serverless Applications diff --git a/packages/core/resources/walkthrough/appBuilder/AppPicker.md b/packages/core/resources/walkthrough/appBuilder/AppPicker.md new file mode 100644 index 00000000000..dbb78f0108d --- /dev/null +++ b/packages/core/resources/walkthrough/appBuilder/AppPicker.md @@ -0,0 +1,25 @@ + +
+ + + Rest API + + + + File processing + +
+
+ + + New template with visual builder + + + + Current workspace template + +
+
+ + See more application example... + diff --git a/packages/core/resources/walkthrough/appBuilder/AppPickerResource/API.png b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/API.png new file mode 100644 index 00000000000..3cda59fbf48 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/API.png differ diff --git a/packages/core/resources/walkthrough/appBuilder/AppPickerResource/AppComposer.png b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/AppComposer.png new file mode 100644 index 00000000000..51ceb392f05 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/AppComposer.png differ diff --git a/packages/core/resources/walkthrough/appBuilder/AppPickerResource/CustomTemplate.png b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/CustomTemplate.png new file mode 100644 index 00000000000..6ebe6fe27a6 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/CustomTemplate.png differ diff --git a/packages/core/resources/walkthrough/appBuilder/AppPickerResource/S3.png b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/S3.png new file mode 100644 index 00000000000..7ea7eebd23b Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/AppPickerResource/S3.png differ diff --git a/packages/core/resources/walkthrough/appBuilder/InnerLoop.md b/packages/core/resources/walkthrough/appBuilder/InnerLoop.md new file mode 100644 index 00000000000..97f54e9dbca --- /dev/null +++ b/packages/core/resources/walkthrough/appBuilder/InnerLoop.md @@ -0,0 +1,12 @@ +

Build your code

+Compile your code and install dependencies with SAM CLI so you can invoke it locally. +clicking build icon in AppBuilder sidebar on project node +

Select function to invoke

+Find the function you want to invoke in Application Builder and use the icon to open the invoke and debug view. +clicking invoke function icon in AppBuilder sidebar on Lambda function node +

Invoke your function

+Configure a payload to use for invoking your function. +clicking invoke function button in local invoke webview +

View your execution results

+The VS Code panel will display the results of your invocation. +View your execution results in the output panel diff --git a/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-1.jpg b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-1.jpg new file mode 100644 index 00000000000..b1236191118 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-1.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-2.jpg b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-2.jpg new file mode 100644 index 00000000000..d7c0295e5ce Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-2.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-3.jpg b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-3.jpg new file mode 100644 index 00000000000..471cf590830 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-3.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-4.jpg b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-4.jpg new file mode 100644 index 00000000000..c0df6db61b0 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/InnerLoopResource/walkthrough-local-4.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/RemoteLoop.md b/packages/core/resources/walkthrough/appBuilder/RemoteLoop.md new file mode 100644 index 00000000000..f811771127b --- /dev/null +++ b/packages/core/resources/walkthrough/appBuilder/RemoteLoop.md @@ -0,0 +1,12 @@ +

Deploy your application

+Use SAM CLI to deploy your application template to the cloud. +Click Deploy SAM Application button in Appbuilder Sidebar on project node +

Select deployed function to invoke

+Find the function you want to invoke in Application Builder and use the icon to open the remote invocation view. +click Invoke in the cloud button in AppBuilder Sidebar on cloud function resource node +

Invoke your function with a payload

+Configure a payload to use for invoking your function. +add a payload and click invoke button in remote invoke panel +

View your execution result in the output panel

+The VS Code panel will display the results of your invocation. +View your execution result in the output panel diff --git a/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-1.jpg b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-1.jpg new file mode 100644 index 00000000000..c036fc93eaf Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-1.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-2.jpg b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-2.jpg new file mode 100644 index 00000000000..e542edc38f4 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-2.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-3.jpg b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-3.jpg new file mode 100644 index 00000000000..891cfdc4aa0 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-3.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-4.jpg b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-4.jpg new file mode 100644 index 00000000000..738a7d0b91f Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/RemoteLoopResource/walkthrough-remote-4.jpg differ diff --git a/packages/core/resources/walkthrough/appBuilder/install.png b/packages/core/resources/walkthrough/appBuilder/install.png new file mode 100644 index 00000000000..cdbae8b83a6 Binary files /dev/null and b/packages/core/resources/walkthrough/appBuilder/install.png differ diff --git a/packages/core/resources/walkthrough/setup-connect.md b/packages/core/resources/walkthrough/setup-connect.md index 44a1584838a..e78f612f4f7 100644 --- a/packages/core/resources/walkthrough/setup-connect.md +++ b/packages/core/resources/walkthrough/setup-connect.md @@ -12,7 +12,7 @@ Choose the most appropriate method based on your requirements. ## Connect to AWS through the Toolkit for VS Code -1. [Click here](command:aws.login) to open the configuration wizard to connect to AWS. +1. [Click here](command:aws.toolkit.login) to open the configuration wizard to connect to AWS. > This command can also be accessed through the [Command Palette](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/toolkit-navigation.html#command-locations) by choosing **AWS: >Connect to AWS**\. > diff --git a/packages/core/resources/walkthrough/setup-region.md b/packages/core/resources/walkthrough/setup-region.md index 292eb1ad220..50a9101e6bb 100644 --- a/packages/core/resources/walkthrough/setup-region.md +++ b/packages/core/resources/walkthrough/setup-region.md @@ -4,7 +4,7 @@ When you set up your credentials, the AWS Toolkit for Visual Studio Code automat ## Add a Region to the AWS Explorer -1. [Click here](command:aws.showRegion) to select a Region to add or remove. +1. [Click here](command:aws.toolkit.showRegion) to select a Region to add or remove. > This command can also be accessed through the [Command Palette](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/toolkit-navigation.html#command-locations) by choosing **AWS: Show or Hide Regions**\. > diff --git a/packages/core/src/applicationcomposer/commands/openTemplateInComposer.ts b/packages/core/src/applicationcomposer/commands/openTemplateInComposer.ts index ed50e4ee2da..351673754c2 100644 --- a/packages/core/src/applicationcomposer/commands/openTemplateInComposer.ts +++ b/packages/core/src/applicationcomposer/commands/openTemplateInComposer.ts @@ -8,11 +8,13 @@ import { ApplicationComposerManager } from '../webviewManager' import vscode from 'vscode' import { telemetry } from '../../shared/telemetry/telemetry' import { ToolkitError } from '../../shared/errors' +import { isTreeNode, TreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import { SamAppLocation } from '../../awsService/appBuilder/explorer/samProject' import { getAmazonqApi } from '../../amazonq/extApi' export const openTemplateInComposerCommand = Commands.declare( 'aws.openInApplicationComposer', - (manager: ApplicationComposerManager) => async (arg?: vscode.TextEditor | vscode.Uri) => { + (manager: ApplicationComposerManager) => async (arg?: vscode.TextEditor | vscode.Uri | TreeNode) => { let result: vscode.WebviewPanel | undefined await telemetry.appcomposer_openTemplate.run(async (span) => { const amazonqApi = await getAmazonqApi() @@ -26,8 +28,14 @@ export const openTemplateInComposerCommand = Commands.declare( span.record({ hasChatAuth, }) - arg ??= vscode.window.activeTextEditor - const input = arg instanceof vscode.Uri ? arg : arg?.document + let input = undefined + if (arg instanceof vscode.Uri) { + input = arg + } else if (isTreeNode(arg)) { + input = ((arg as TreeNode).resource as SamAppLocation).samTemplateUri + } else { + input = vscode.window.activeTextEditor?.document + } if (!input) { throw new ToolkitError('No active text editor or document found') diff --git a/packages/core/src/auth/utils.ts b/packages/core/src/auth/utils.ts index ece410203b9..6b180b434ed 100644 --- a/packages/core/src/auth/utils.ts +++ b/packages/core/src/auth/utils.ts @@ -52,6 +52,8 @@ import { ExtStartUpSources } from '../shared/telemetry' import { CommonAuthWebview } from '../login/webview/vue/backend' import { AuthSource } from '../login/webview/util' import { setContext } from '../shared/vscode/setContext' +import { showMessageWithUrl } from '../shared/utilities/messages' +import { credentialHelpUrl } from '../shared/constants' // iam-only excludes Builder ID and IAM Identity Center from the list of valid connections // TODO: Understand if "iam" should include these from the list at all @@ -101,6 +103,46 @@ export async function promptAndUseConnection(...[auth, type]: Parameters { return telemetry.function_call.run( async () => { diff --git a/packages/core/src/awsService/apigateway/activation.ts b/packages/core/src/awsService/apigateway/activation.ts index 2bf2f44ea4c..78add0d3e67 100644 --- a/packages/core/src/awsService/apigateway/activation.ts +++ b/packages/core/src/awsService/apigateway/activation.ts @@ -9,6 +9,8 @@ import { invokeRemoteRestApi } from './vue/invokeRemoteRestApi' import { copyUrlCommand } from './commands/copyUrl' import { ExtContext } from '../../shared/extensions' import { Commands } from '../../shared/vscode/commands2' +import { TreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import { getSourceNode } from '../../shared/utilities/treeNodeUtils' /** * Activate API Gateway functionality for the extension. @@ -20,14 +22,16 @@ export async function activate(activateArguments: { const extensionContext = activateArguments.extContext.extensionContext const regionProvider = activateArguments.extContext.regionProvider extensionContext.subscriptions.push( - Commands.register('aws.apig.copyUrl', async (node: RestApiNode) => await copyUrlCommand(node, regionProvider)), - Commands.register( - 'aws.apig.invokeRemoteRestApi', - async (node: RestApiNode) => - await invokeRemoteRestApi(activateArguments.extContext, { - apiNode: node, - outputChannel: activateArguments.outputChannel, - }) - ) + Commands.register('aws.apig.copyUrl', async (node: RestApiNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await copyUrlCommand(sourceNode, regionProvider) + }), + Commands.register('aws.apig.invokeRemoteRestApi', async (node: RestApiNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await invokeRemoteRestApi(activateArguments.extContext, { + apiNode: sourceNode, + outputChannel: activateArguments.outputChannel, + }) + }) ) } diff --git a/packages/core/src/awsService/appBuilder/activation.ts b/packages/core/src/awsService/appBuilder/activation.ts new file mode 100644 index 00000000000..9f30282573c --- /dev/null +++ b/packages/core/src/awsService/appBuilder/activation.ts @@ -0,0 +1,205 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import globals from '../../shared/extensionGlobals' +import { ExtContext } from '../../shared/extensions' +import { Commands, VsCodeCommandArg } from '../../shared/vscode/commands2' +import { ToolView } from '../../awsexplorer/toolView' +import { telemetry } from '../../shared/telemetry/telemetry' +import { activateViewsShared, registerToolView } from '../../awsexplorer/activationShared' +import { setContext } from '../../shared/vscode/setContext' +import { fs } from '../../shared/fs/fs' +import { AppBuilderRootNode } from './explorer/nodes/rootNode' +import { initWalkthroughProjectCommand, walkthroughContextString, getOrInstallCliWrapper } from './walkthrough' +import { getLogger } from '../../shared/logger' +import path from 'path' +import { TreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import { runBuild } from '../../shared/sam/build' +import { runOpenHandler, runOpenTemplate } from './utils' +import { ResourceNode } from './explorer/nodes/resourceNode' +import { getSyncWizard, runSync } from '../../shared/sam/sync' +import { getDeployWizard, runDeploy } from '../../shared/sam/deploy' +import { DeployTypeWizard } from './wizards/deployTypeWizard' + +export const templateToOpenAppComposer = 'aws.toolkit.appComposer.templateToOpenOnStart' + +/** + * Activates the AWS Explorer UI and related functionality. + * + * IMPORTANT: Views that should work in all vscode environments (node or web) + * should be setup in {@link activateViewsShared}. + */ +export async function activate(context: ExtContext): Promise { + // recover context variables from global state when activate + const walkthroughSelected = globals.globalState.get(walkthroughContextString) + if (walkthroughSelected !== undefined) { + await setContext(walkthroughContextString, walkthroughSelected) + } + + await registerAppBuilderCommands(context) + + const appBuilderNode: ToolView[] = [ + { + nodes: [AppBuilderRootNode.instance], + view: 'aws.appBuilder', + refreshCommands: [AppBuilderRootNode.instance.refreshAppBuilderExplorer], + }, + { + nodes: [AppBuilderRootNode.instance], + view: 'aws.appBuilderForFileExplorer', + refreshCommands: [AppBuilderRootNode.instance.refreshAppBuilderForFileExplorer], + }, + ] + + const watcher = vscode.workspace.createFileSystemWatcher('**/{template.yaml,template.yml,samconfig.toml}') + watcher.onDidChange(async (uri) => runRefreshAppBuilder(uri, 'changed')) + watcher.onDidCreate(async (uri) => runRefreshAppBuilder(uri, 'created')) + watcher.onDidDelete(async (uri) => runRefreshAppBuilder(uri, 'deleted')) + + for (const viewNode of appBuilderNode) { + registerToolView(viewNode, context.extensionContext) + } + + await openApplicationComposerAfterReload() +} + +async function runRefreshAppBuilder(uri: vscode.Uri, event: string) { + getLogger().debug(`${uri.fsPath} ${event}, refreshing appBuilder`) + await vscode.commands.executeCommand('aws.appBuilderForFileExplorer.refresh') + await vscode.commands.executeCommand('aws.appBuilder.refresh') +} + +/** + * To support open template in AppComposer after extension reload. + * This typically happens when user create project from walkthrough + * and added a new folder to an empty workspace. + * + * Checkes templateToOpenAppComposer in global and opens template + * Directly return if templateToOpenAppComposer is undefined + */ +export async function openApplicationComposerAfterReload(): Promise { + const templatesToOpen = globals.globalState.get<[string]>(templateToOpenAppComposer) + // undefined + if (!templatesToOpen) { + return + } + + for (const template of templatesToOpen) { + const templateUri = vscode.Uri.file(template) + const templateFolder = vscode.Uri.file(path.dirname(template)) + const basename = path.basename(template) + // ignore templates that doesn't belong to current workspace, ignore if not template + if ( + !vscode.workspace.getWorkspaceFolder(templateFolder) || + (basename !== 'template.yaml' && basename !== 'template.yml') + ) { + continue + } + + await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup') + await vscode.commands.executeCommand('aws.openInApplicationComposer', templateUri) + + if (await fs.exists(vscode.Uri.joinPath(templateFolder, 'README.md'))) { + await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup') + await vscode.commands.executeCommand( + 'markdown.showPreview', + vscode.Uri.joinPath(templateFolder, 'README.md') + ) + } + } + // set to undefined + await globals.globalState.update(templateToOpenAppComposer, undefined) +} + +async function setWalkthrough(walkthroughSelected: string = 'S3'): Promise { + await setContext(walkthroughContextString, walkthroughSelected) + await globals.globalState.update(walkthroughContextString, walkthroughSelected) +} + +/** + * + * @param context VScode Context + */ +async function registerAppBuilderCommands(context: ExtContext): Promise { + const source = 'AppBuilderWalkthrough' + context.extensionContext.subscriptions.push( + Commands.register('aws.toolkit.installSAMCLI', async () => { + await getOrInstallCliWrapper('sam-cli', source) + }), + Commands.register('aws.toolkit.installAWSCLI', async () => { + await getOrInstallCliWrapper('aws-cli', source) + }), + Commands.register('aws.toolkit.installDocker', async () => { + await getOrInstallCliWrapper('docker', source) + }), + Commands.register('aws.toolkit.lambda.setWalkthroughToAPI', async () => { + await setWalkthrough('API') + }), + Commands.register('aws.toolkit.lambda.setWalkthroughToS3', async () => { + await setWalkthrough('S3') + }), + Commands.register('aws.toolkit.lambda.setWalkthroughToVisual', async () => { + await setWalkthrough('Visual') + }), + Commands.register('aws.toolkit.lambda.setWalkthroughToCustomTemplate', async () => { + await setWalkthrough('CustomTemplate') + }), + Commands.register('aws.toolkit.lambda.initializeWalkthroughProject', async (): Promise => { + await telemetry.appBuilder_selectWalkthroughTemplate.run(async () => await initWalkthroughProjectCommand()) + await globals.globalState.update('aws.toolkit.lambda.walkthroughCompleted', true) + }), + Commands.register('aws.toolkit.lambda.walkthrough.credential', async (): Promise => { + await vscode.commands.executeCommand('aws.toolkit.auth.manageConnections', source) + }), + Commands.register( + { id: `aws.toolkit.lambda.openWalkthrough`, compositeKey: { 1: 'source' } }, + async (_: VsCodeCommandArg, source?: string) => { + telemetry.appBuilder_startWalkthrough.emit({ source: source }) + await vscode.commands.executeCommand( + 'workbench.action.openWalkthrough', + 'amazonwebservices.aws-toolkit-vscode#aws.toolkit.lambda.walkthrough' + ) + } + ), + Commands.register( + { + id: 'aws.appBuilder.build', + autoconnect: false, + }, + async (arg?: TreeNode | undefined) => await telemetry.sam_build.run(async () => await runBuild(arg)) + ), + Commands.register({ id: 'aws.appBuilder.openTemplate', autoconnect: false }, async (arg: TreeNode) => + telemetry.appBuilder_openTemplate.run(async (span) => { + if (arg) { + span.record({ source: 'AppBuilderOpenTemplate' }) + } else { + span.record({ source: 'commandPalette' }) + } + await runOpenTemplate(arg) + }) + ), + Commands.register({ id: 'aws.appBuilder.openHandler', autoconnect: false }, async (arg: ResourceNode) => + telemetry.lambda_goToHandler.run(async (span) => { + span.record({ source: 'AppBuilderOpenHandler' }) + await runOpenHandler(arg) + }) + ), + Commands.register({ id: 'aws.appBuilder.deploy', autoconnect: true }, async (arg) => { + const wizard = new DeployTypeWizard( + await getSyncWizard('infra', arg, undefined, false), + await getDeployWizard(arg, false) + ) + const choices = await wizard.run() + if (choices) { + if (choices.choice === 'deploy' && choices.deployParam) { + await runDeploy(arg, choices.deployParam) + } else if (choices.choice === 'sync' && choices.syncParam) { + await runSync('infra', arg, undefined, choices.syncParam) + } + } + }) + ) +} diff --git a/packages/core/src/awsService/appBuilder/explorer/detectSamProjects.ts b/packages/core/src/awsService/appBuilder/explorer/detectSamProjects.ts new file mode 100644 index 00000000000..cb179d94f0d --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/detectSamProjects.ts @@ -0,0 +1,61 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { SamAppLocation } from './samProject' +import { getLogger } from '../../../shared/logger/logger' +import { getProjectRootUri } from '../../../shared/sam/utils' + +export async function detectSamProjects(): Promise { + const workspaceFolders = vscode.workspace.workspaceFolders + + if (!workspaceFolders) { + return [] + } + + const results = new Map() + const projects = (await Promise.all(workspaceFolders.map(detectSamProjectsFromWorkspaceFolder))).reduce( + (a, b) => a.concat(b), + [] + ) + + projects.forEach((p) => results.set(p.samTemplateUri.toString(), p)) + + return Array.from(results.values()) +} + +async function detectSamProjectsFromWorkspaceFolder( + workspaceFolder: vscode.WorkspaceFolder +): Promise { + const result: SamAppLocation[] = [] + const samTemplateFiles = await getFiles(workspaceFolder, '**/template.{yml,yaml}', '**/.aws-sam/**') + for (const samTemplateFile of samTemplateFiles) { + const project = { + samTemplateUri: samTemplateFile, + workspaceFolder: workspaceFolder, + projectRoot: getProjectRootUri(samTemplateFile), + } + result.push(project) + } + return result +} + +export async function getFiles( + workspaceFolder: vscode.WorkspaceFolder, + pattern: string, + buildArtifactFolderPattern?: string +): Promise { + try { + const globPattern = new vscode.RelativePattern(workspaceFolder, pattern) + const excludePattern = buildArtifactFolderPattern + ? new vscode.RelativePattern(workspaceFolder, buildArtifactFolderPattern) + : undefined + + return await vscode.workspace.findFiles(globPattern, excludePattern) + } catch (error) { + getLogger().error(`Failed to get files with pattern ${pattern}:`, error) + return [] + } +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/appNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/appNode.ts new file mode 100644 index 00000000000..497e5aa22ad --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/appNode.ts @@ -0,0 +1,104 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as nls from 'vscode-nls' +const localize = nls.loadMessageBundle() + +import * as vscode from 'vscode' +import { getLogger } from '../../../../shared/logger' +import { ResourceTreeEntity, SamAppLocation, getApp, getStackName } from '../samProject' +import { ResourceNode, generateResourceNodes } from './resourceNode' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { createPlaceholderItem } from '../../../../shared/treeview/utils' +import { getIcon } from '../../../../shared/icons' +import { getSamCliContext } from '../../../../shared/sam/cli/samCliContext' +import { SamCliListResourcesParameters } from '../../../../shared/sam/cli/samCliListResources' +import { getDeployedResources, StackResource } from '../../../../lambda/commands/listSamResources' +import * as path from 'path' +import fs from '../../../../shared/fs/fs' +import { generateStackNode } from './deployedStack' + +export class AppNode implements TreeNode { + public readonly id = this.location.samTemplateUri.toString() + public readonly resource = this.location + public readonly label = path.join( + this.location.workspaceFolder.name, + path.relative(this.location.workspaceFolder.uri.fsPath, path.dirname(this.location.samTemplateUri.fsPath)) + ) + private stackName: string = '' + public constructor(private readonly location: SamAppLocation) {} + + public async getChildren(): Promise<(ResourceNode | TreeNode)[]> { + const resources = [] + try { + const successfulApp = await getApp(this.location) + const templateResources: ResourceTreeEntity[] = successfulApp.resourceTree + const { stackName, region } = await getStackName(this.location.projectRoot) + this.stackName = stackName + + const listStackResourcesArguments: SamCliListResourcesParameters = { + stackName: this.stackName, + templateFile: this.location.samTemplateUri.fsPath, + region: region, + projectRoot: this.location.projectRoot, + } + + const deployedResources: StackResource[] | undefined = this.stackName + ? await getDeployedResources({ + listResourcesParams: listStackResourcesArguments, + invoker: getSamCliContext().invoker, + }) + : undefined + // Skip generating stack node if stack does not exist in region or other errors + if (deployedResources && deployedResources.length > 0) { + resources.push(...(await generateStackNode(this.stackName, region))) + } + resources.push( + ...generateResourceNodes(this.location, templateResources, this.stackName, region, deployedResources) + ) + + // indicate that App exists, but it is empty + if (resources.length === 0) { + if (await fs.exists(this.location.samTemplateUri)) { + return [ + createPlaceholderItem( + localize( + 'AWS.appBuilder.explorerNode.app.noResource', + '[No resource found in IaC template]' + ) + ), + ] + } + return [ + createPlaceholderItem( + localize('AWS.appBuilder.explorerNode.app.noTemplate', '[No IaC templates found in Workspaces]') + ), + ] + } + return resources + } catch (error) { + getLogger().error(`Could not load the construct tree located at '${this.id}': %O`, error as Error) + return [ + createPlaceholderItem( + localize( + 'AWS.appBuilder.explorerNode.app.noResourceTree', + '[Unable to load Resource tree for this App. Update IaC template]' + ) + ), + ] + } + } + + public getTreeItem() { + const item = new vscode.TreeItem(this.label, vscode.TreeItemCollapsibleState.Collapsed) + + item.contextValue = 'awsAppBuilderAppNode' + item.iconPath = getIcon('vscode-folder') + item.resourceUri = this.location.samTemplateUri + item.tooltip = this.location.samTemplateUri.path + + return item + } +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts new file mode 100644 index 00000000000..70ac56bb1f6 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts @@ -0,0 +1,183 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getIcon } from '../../../../shared/icons' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { createPlaceholderItem } from '../../../../shared/treeview/utils' +import * as nls from 'vscode-nls' + +import { getLogger } from '../../../../shared/logger/logger' +import { FunctionConfiguration, LambdaClient, GetFunctionCommand } from '@aws-sdk/client-lambda' +import { DefaultLambdaClient } from '../../../../shared/clients/lambdaClient' +import globals from '../../../../shared/extensionGlobals' +import { defaultPartition } from '../../../../shared/regions/regionProvider' +import { Lambda, APIGateway } from 'aws-sdk' +import { LambdaNode } from '../../../../lambda/explorer/lambdaNodes' +import { LambdaFunctionNode } from '../../../../lambda/explorer/lambdaFunctionNode' +import { DefaultS3Client, DefaultBucket } from '../../../../shared/clients/s3Client' +import { S3Node } from '../../../../awsService/s3/explorer/s3Nodes' +import { S3BucketNode } from '../../../../awsService/s3/explorer/s3BucketNode' +import { ApiGatewayNode } from '../../../../awsService/apigateway/explorer/apiGatewayNodes' +import { RestApiNode } from '../../../../awsService/apigateway/explorer/apiNodes' +import { + SERVERLESS_FUNCTION_TYPE, + SERVERLESS_API_TYPE, + s3BucketType, +} from '../../../../shared/cloudformation/cloudformation' +import { ToolkitError } from '../../../../shared' +import { getIAMConnection } from '../../../../auth/utils' + +const localize = nls.loadMessageBundle() +export interface DeployedResource { + stackName: string + regionCode: string + explorerNode: any + arn: string + contextValue: string +} + +export const DeployedResourceContextValues: Record = { + [SERVERLESS_FUNCTION_TYPE]: 'awsRegionFunctionNodeDownloadable', + [SERVERLESS_API_TYPE]: 'awsApiGatewayNode', + [s3BucketType]: 'awsS3BucketNode', +} + +export class DeployedResourceNode implements TreeNode { + public readonly id: string + public readonly contextValue: string + + public constructor(public readonly resource: DeployedResource) { + if (this.resource.arn) { + this.id = this.resource.arn + this.contextValue = this.resource.contextValue + } else { + getLogger().warn('Cannot create DeployedResourceNode, the ARN does not exist.') + this.id = '' + this.contextValue = '' + } + } + + public async getChildren(): Promise { + return [] + } + + public getTreeItem() { + const item = new vscode.TreeItem(this.id) + + item.contextValue = this.contextValue + item.iconPath = getIcon('vscode-cloud') + item.collapsibleState = vscode.TreeItemCollapsibleState.None + item.tooltip = this.resource.arn + return item + } +} + +export async function generateDeployedNode( + deployedResource: any, + regionCode: string, + stackName: string, + resourceTreeEntity: any +): Promise { + let newDeployedResource: any + const partitionId = globals.regionProvider.getPartitionId(regionCode) ?? defaultPartition + try { + switch (resourceTreeEntity.Type) { + case SERVERLESS_FUNCTION_TYPE: { + const defaultClient = new DefaultLambdaClient(regionCode) + const lambdaNode = new LambdaNode(regionCode, defaultClient) + let configuration: Lambda.FunctionConfiguration + let v3configuration + let logGroupName + try { + configuration = (await defaultClient.getFunction(deployedResource.PhysicalResourceId)) + .Configuration as Lambda.FunctionConfiguration + newDeployedResource = new LambdaFunctionNode(lambdaNode, regionCode, configuration) + } catch (error: any) { + getLogger().error('Error getting Lambda configuration') + throw ToolkitError.chain(error, 'Error getting Lambda configuration', { + code: 'lambdaClientError', + }) + } + const connection = await getIAMConnection({ prompt: false }) + if (!connection || connection.type !== 'iam') { + return [ + createPlaceholderItem( + localize( + 'AWS.appBuilder.explorerNode.unavailableDeployedResource', + '[Failed to retrive deployed resource.]' + ) + ), + ] + } + const cred = await connection.getCredentials() + const v3Client = new LambdaClient({ region: regionCode, credentials: cred }) + + const v3command = new GetFunctionCommand({ FunctionName: deployedResource.PhysicalResourceId }) + try { + v3configuration = (await v3Client.send(v3command)).Configuration as FunctionConfiguration + logGroupName = v3configuration.LoggingConfig?.LogGroup + } catch { + getLogger().error('Error getting Lambda V3 configuration') + } + newDeployedResource.configuration = { + ...newDeployedResource.configuration, + logGroupName: logGroupName, + } as any + break + } + case s3BucketType: { + const s3Client = new DefaultS3Client(regionCode) + const s3Node = new S3Node(s3Client) + const s3Bucket = new DefaultBucket({ + partitionId: partitionId, + region: regionCode, + name: deployedResource.PhysicalResourceId, + }) + newDeployedResource = new S3BucketNode(s3Bucket, s3Node, s3Client) + break + } + case SERVERLESS_API_TYPE: { + const apiParentNode = new ApiGatewayNode(partitionId, regionCode) + const apiNodes = await apiParentNode.getChildren() + const apiNode = apiNodes.find((node) => node.id === deployedResource.PhysicalResourceId) + newDeployedResource = new RestApiNode( + apiParentNode, + partitionId, + regionCode, + apiNode as APIGateway.RestApi + ) + break + } + default: + newDeployedResource = new DeployedResourceNode(deployedResource) + getLogger().info('Details are missing or are incomplete for:', deployedResource) + return [ + createPlaceholderItem( + localize('AWS.appBuilder.explorerNode.noApps', '[This resource is not yet supported.]') + ), + ] + } + } catch (error: any) { + void vscode.window.showErrorMessage(error.messages) + return [ + createPlaceholderItem( + localize( + 'AWS.appBuilder.explorerNode.unavailableDeployedResource', + '[Failed to retrive deployed resource.]' + ) + ), + ] + } + newDeployedResource.contextValue = DeployedResourceContextValues[resourceTreeEntity.Type] + const finalDeployedResource = { + stackName, + regionCode, + explorerNode: newDeployedResource, + arn: newDeployedResource.arn, + contextValue: newDeployedResource.contextValue, + } + return [new DeployedResourceNode(finalDeployedResource)] +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedStack.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedStack.ts new file mode 100644 index 00000000000..76c8f5ea76b --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedStack.ts @@ -0,0 +1,66 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { getIcon } from '../../../../shared/icons' +import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation' +import { ToolkitError } from '../../../../shared' +import { getIAMConnection } from '../../../../auth/utils' + +export class StackNameNode implements TreeNode { + public readonly id = this.stackName + public readonly resource = this + public arn: string | undefined + public readonly link = `command:aws.explorer.cloudformation.showStack?${encodeURIComponent(JSON.stringify({ stackName: this.stackName, region: this.regionCode }))}` + + public constructor( + public stackName: string, + public regionCode: string + ) { + this.stackName = stackName + this.regionCode = regionCode + } + + public async getChildren(): Promise { + // This stack name node is a leaf node that does not have any children. + return [] + } + public get value(): string { + return `Stack: ${this.stackName} (${this.regionCode})` + } + + public getTreeItem() { + const item = new vscode.TreeItem(this.value) + + item.contextValue = 'awsAppBuilderStackNode' + item.iconPath = getIcon('vscode-cloud') + return item + } +} + +export async function generateStackNode(stackName?: string, regionCode?: string): Promise { + const connection = await getIAMConnection({ prompt: false }) + if (!connection || connection.type !== 'iam') { + return [] + } + const cred = await connection.getCredentials() + const client = new CloudFormationClient({ region: regionCode, credentials: cred }) + try { + const command = new DescribeStacksCommand({ StackName: stackName }) + const response = await client.send(command) + if (response.Stacks && response.Stacks[0]) { + const stackArn = response.Stacks[0].StackId + if (stackName === undefined || regionCode === undefined) { + return [] + } + const stackNode = new StackNameNode(stackName || '', regionCode || '') + stackNode.arn = stackArn + return [stackNode] + } + } catch (error) { + throw new ToolkitError(`Failed to generate stack node ${stackName} in region ${regionCode}: ${error}`) + } + return [] +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts new file mode 100644 index 00000000000..481ecdf7009 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts @@ -0,0 +1,46 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getIcon } from '../../../../shared/icons' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' + +export class PropertyNode implements TreeNode { + public readonly id = this.key + public readonly resource = this.value + + public constructor( + private readonly key: string, + private readonly value: unknown + ) {} + + public async getChildren(): Promise { + if (this.value instanceof Array || this.value instanceof Object) { + return generatePropertyNodes(this.value) + } else { + return [] + } + } + + public getTreeItem() { + const item = new vscode.TreeItem(`${this.key}: ${this.value}`) + + item.contextValue = 'awsAppBuilderPropertyNode' + item.iconPath = getIcon('vscode-gear') + + if (this.value instanceof Array || this.value instanceof Object) { + item.label = this.key + item.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed + } + + return item + } +} + +export function generatePropertyNodes(properties: { [key: string]: any }): TreeNode[] { + return Object.entries(properties) + .filter(([key, _]) => key !== 'Id' && key !== 'Type' && key !== 'Events') + .map(([key, value]) => new PropertyNode(key, value)) +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts new file mode 100644 index 00000000000..bda7b69ac4f --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts @@ -0,0 +1,147 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { IconPath, getIcon } from '../../../../shared/icons' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { ResourceTreeEntity, SamAppLocation } from '../samProject' +import { + SERVERLESS_FUNCTION_TYPE, + s3BucketType, + appRunnerType, + ecrRepositoryType, +} from '../../../../shared/cloudformation/cloudformation' +import { generatePropertyNodes } from './propertyNode' +import { generateDeployedNode } from './deployedNode' +import { StackResource } from '../../../../lambda/commands/listSamResources' +import { DeployedResourceNode } from './deployedNode' + +enum ResourceTypeId { + Function = 'function', + Api = 'api', + Other = '', +} + +export class ResourceNode implements TreeNode { + public readonly id = this.resourceTreeEntity.Id + private readonly type = this.resourceTreeEntity.Type + public readonly resourceLogicalId = this.deployedResource?.LogicalResourceId + + public constructor( + private readonly location: SamAppLocation, + private readonly resourceTreeEntity: ResourceTreeEntity, + private readonly stackName?: string, + private readonly region?: string, + private readonly deployedResource?: StackResource, + // TODO: cleanup or rename functionArn parameter as type can be differ from Lambda; value never set in generateResourceNodes() + private readonly functionArn?: string + ) {} + + public get resource() { + return { + resource: this.resourceTreeEntity, + location: this.location.samTemplateUri, + workspaceFolder: this.location.workspaceFolder, + region: this.region, + stackName: this.stackName, + deployedResource: this.deployedResource, + functionArn: this.functionArn, + } + } + + public async getChildren() { + let deployedNodes: DeployedResourceNode[] = [] + let propertyNodes: TreeNode[] = [] + + if (this.deployedResource && this.region && this.stackName) { + deployedNodes = await generateDeployedNode( + this.deployedResource, + this.region, + this.stackName, + this.resourceTreeEntity + ) + } + if (this.resourceTreeEntity.Type === SERVERLESS_FUNCTION_TYPE) { + propertyNodes = generatePropertyNodes(this.resourceTreeEntity) + } + + return [...propertyNodes, ...deployedNodes] + } + + public getTreeItem(): vscode.TreeItem { + // Determine the initial TreeItem collapsible state based on the type + const collapsibleState = this.deployedResource + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + + // Create the TreeItem with the determined collapsible state + const item = new vscode.TreeItem(this.resourceTreeEntity.Id, collapsibleState) + + // Set the tooltip to the URI of the SAM template + item.tooltip = this.location.samTemplateUri.toString() + + item.iconPath = this.getIconPath() + + // Set the resource URI to the SAM template URI + item.resourceUri = this.location.samTemplateUri + + // Define the context value for the item + item.contextValue = `awsAppBuilderResourceNode.${this.getResourceId()}` + + return item + } + + // Additional resources and corresponding icons will be added in the future. + // When adding support for new resources, ensure that each new resource + // has an appropriate mapping in place. + private getIconPath(): IconPath | undefined { + switch (this.type) { + case SERVERLESS_FUNCTION_TYPE: + return getIcon('aws-lambda-function') + case s3BucketType: + return getIcon('aws-s3-bucket') + case appRunnerType: + return getIcon('aws-apprunner-service') + case ecrRepositoryType: + return getIcon('aws-ecr-registry') + default: + return getIcon('vscode-info') + } + } + + private getResourceId(): ResourceTypeId { + switch (this.type) { + case SERVERLESS_FUNCTION_TYPE: + return ResourceTypeId.Function + case 'Api': + return ResourceTypeId.Api + default: + return ResourceTypeId.Other + } + } +} + +export function generateResourceNodes( + app: SamAppLocation, + resources: NonNullable, + stackName?: string, + region?: string, + deployedResources?: StackResource[] +): ResourceNode[] { + if (!deployedResources) { + return resources.map((resource) => new ResourceNode(app, resource, stackName, region)) + } + + return resources.map((resource) => { + if (resource.Type) { + const deployedResource = deployedResources.find( + (deployedResource) => resource.Id === deployedResource.LogicalResourceId + ) + return new ResourceNode(app, resource, stackName, region, deployedResource) + } else { + return new ResourceNode(app, resource, stackName, region) + } + }) +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/rootNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/rootNode.ts new file mode 100644 index 00000000000..ce0406fd874 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/rootNode.ts @@ -0,0 +1,110 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { debugNewSamAppDocUrl } from '../../../../shared/constants' +import { telemetry } from '../../../../shared/telemetry/telemetry' +import { ResourceTreeDataProvider, TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { createPlaceholderItem } from '../../../../shared/treeview/utils' +import { localize, openUrl } from '../../../../shared/utilities/vsCodeUtils' +import { Commands } from '../../../../shared/vscode/commands2' +import { AppNode } from './appNode' +import { detectSamProjects } from '../detectSamProjects' +import globals from '../../../../shared/extensionGlobals' +import { WalkthroughNode } from './walkthroughNode' + +export async function getAppNodes(): Promise { + // no active workspace, show buttons in welcomeview + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + return [] + } + + const appsFound = await detectSamProjects() + + if (appsFound.length === 0) { + return [ + createPlaceholderItem( + localize('AWS.appBuilder.explorerNode.noApps', '[No IaC templates found in Workspaces]') + ), + ] + } + + const nodesToReturn: TreeNode[] = appsFound + .map((appLocation) => new AppNode(appLocation)) + .sort((a, b) => a.label.localeCompare(b.label) ?? 0) + + return nodesToReturn +} + +export class AppBuilderRootNode implements TreeNode { + public readonly id = 'appBuilder' + public readonly resource = this + private readonly onDidChangeChildrenEmitter = new vscode.EventEmitter() + public readonly onDidChangeChildren = this.onDidChangeChildrenEmitter.event + private readonly _refreshAppBuilderExplorer + private readonly _refreshAppBuilderForFileExplorer + + constructor() { + Commands.register('aws.appBuilder.viewDocs', () => { + void openUrl(debugNewSamAppDocUrl.toolkit) + telemetry.aws_help.emit({ name: 'appBuilder' }) + }) + this._refreshAppBuilderExplorer = (provider?: ResourceTreeDataProvider) => + Commands.register('aws.appBuilder.refresh', () => { + this.refresh() + if (provider) { + provider.refresh() + } + }) + + this._refreshAppBuilderForFileExplorer = (provider?: ResourceTreeDataProvider) => + Commands.register('aws.appBuilderForFileExplorer.refresh', () => { + this.refresh() + if (provider) { + provider.refresh() + } + }) + } + + public get refreshAppBuilderExplorer() { + return this._refreshAppBuilderExplorer + } + + public get refreshAppBuilderForFileExplorer() { + return this._refreshAppBuilderForFileExplorer + } + + public async getChildren() { + const nodesToReturn = await getAppNodes() + if (nodesToReturn.length === 0) { + return [] + } + + const walkthroughCompleted = globals.globalState.get('aws.toolkit.lambda.walkthroughCompleted') + // show walkthrough node if walkthrough not completed yet + if (!walkthroughCompleted) { + nodesToReturn.unshift(new WalkthroughNode()) + } + return nodesToReturn + } + + public refresh(): void { + this.onDidChangeChildrenEmitter.fire() + } + + public getTreeItem() { + const item = new vscode.TreeItem('APPLICATION BUILDER') + item.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed + item.contextValue = 'awsAppBuilderRootNode' + + return item + } + + static #instance: AppBuilderRootNode + + static get instance(): AppBuilderRootNode { + return (this.#instance ??= new AppBuilderRootNode()) + } +} diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/walkthroughNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/walkthroughNode.ts new file mode 100644 index 00000000000..8f3432075df --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/walkthroughNode.ts @@ -0,0 +1,37 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +import { localize } from '../../../../shared/utilities/vsCodeUtils' + +/** + * Create Open Walkthrough Node in App builder sidebar + * + */ +export class WalkthroughNode implements TreeNode { + public readonly id = 'walkthrough' + public readonly resource: WalkthroughNode = this + + // Constructor left empty intentionally for future extensibility + public constructor() {} + + /** + * Generates the TreeItem for the Walkthrough Node. + * This item will appear in the sidebar with a label and command to open the walkthrough. + */ + public getTreeItem() { + const itemLabel = localize('AWS.appBuilder.openWalkthroughTitle', 'Walkthrough of Application Builder') + + const item = new vscode.TreeItem(itemLabel) + item.contextValue = 'awsWalkthroughNode' + item.command = { + title: localize('AWS.appBuilder.openWalkthroughTitle', 'Walkthrough of Application Builder'), + command: 'aws.toolkit.lambda.openWalkthrough', + } + + return item + } +} diff --git a/packages/core/src/awsService/appBuilder/explorer/openTemplate.ts b/packages/core/src/awsService/appBuilder/explorer/openTemplate.ts new file mode 100644 index 00000000000..686340719e3 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/openTemplate.ts @@ -0,0 +1,20 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CloudFormationTemplateRegistry } from '../../../shared/fs/templateRegistry' +import { createTemplatePrompter, TemplateItem } from '../../../shared/sam/sync' +import { createExitPrompter } from '../../../shared/ui/common/exitPrompter' +import { Wizard } from '../../../shared/wizards/wizard' + +export interface OpenTemplateParams { + readonly template: TemplateItem +} + +export class OpenTemplateWizard extends Wizard { + public constructor(state: Partial, registry: CloudFormationTemplateRegistry) { + super({ initState: state, exitPrompterProvider: createExitPrompter }) + this.form.template.bindPrompter(() => createTemplatePrompter(registry)) + } +} diff --git a/packages/core/src/awsService/appBuilder/explorer/samProject.ts b/packages/core/src/awsService/appBuilder/explorer/samProject.ts new file mode 100644 index 00000000000..fdb4b8e2117 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/explorer/samProject.ts @@ -0,0 +1,103 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as CloudFormation from '../../../shared/cloudformation/cloudformation' +import { SamConfig, SamConfigErrorCode } from '../../../shared/sam/config' +import { getLogger } from '../../../shared/logger/logger' +import { ToolkitError } from '../../../shared/errors' +import { showViewLogsMessage } from '../../../shared/utilities/messages' + +export interface SamApp { + location: SamAppLocation + resourceTree: ResourceTreeEntity[] +} + +export interface SamAppLocation { + samTemplateUri: vscode.Uri + workspaceFolder: vscode.WorkspaceFolder + projectRoot: vscode.Uri +} + +export interface ResourceTreeEntity { + Id: string + Type: string + Runtime?: string + CodeUri?: string + Handler?: string + Events?: ResourceTreeEntity[] + Path?: string + Method?: string +} + +export async function getStackName(projectRoot: vscode.Uri): Promise { + try { + const samConfig = await SamConfig.fromProjectRoot(projectRoot) + const stackName = await samConfig.getCommandParam('global', 'stack_name') + const region = await samConfig.getCommandParam('global', 'region') + + return { stackName, region } + } catch (error: any) { + switch (error.code) { + case SamConfigErrorCode.samNoConfigFound: + getLogger().info('No stack name or region information available in samconfig.toml', error) + break + case SamConfigErrorCode.samConfigParseError: + getLogger().error(`Error getting stack name or region information: ${error.message}`, error) + void showViewLogsMessage('Encountered an issue reading samconfig.toml') + break + default: + getLogger().warn(`Error getting stack name or region information: ${error.message}`, error) + } + return {} + } +} + +export async function getApp(location: SamAppLocation): Promise { + const samTemplate = await CloudFormation.tryLoad(location.samTemplateUri) + if (!samTemplate.template) { + throw new ToolkitError(`Template at ${location.samTemplateUri.fsPath} is not valid`) + } + const templateResources = getResourceEntity(samTemplate.template) + + const resourceTree = [...templateResources] + + return { location, resourceTree } +} + +function getResourceEntity(template: any): ResourceTreeEntity[] { + const resourceTree: ResourceTreeEntity[] = [] + + for (const [logicalId, resource] of Object.entries(template?.Resources ?? []) as [string, any][]) { + const resourceEntity: ResourceTreeEntity = { + Id: logicalId, + Type: resource.Type, + Runtime: resource.Properties?.Runtime ?? template?.Globals?.Function?.Runtime, + Handler: resource.Properties?.Handler ?? template?.Globals?.Function?.Handler, + Events: resource.Properties?.Events ? getEvents(resource.Properties.Events) : undefined, + CodeUri: resource.Properties?.CodeUri ?? template?.Globals?.Function?.CodeUri, + } + resourceTree.push(resourceEntity) + } + + return resourceTree +} + +function getEvents(events: Record): ResourceTreeEntity[] { + const eventResources: ResourceTreeEntity[] = [] + + for (const [eventsLogicalId, event] of Object.entries(events)) { + const eventProperties = event.Properties + const eventResource: ResourceTreeEntity = { + Id: eventsLogicalId, + Type: event.Type, + Path: eventProperties.Path, + Method: eventProperties.Method, + } + eventResources.push(eventResource) + } + + return eventResources +} diff --git a/packages/core/src/awsService/appBuilder/utils.ts b/packages/core/src/awsService/appBuilder/utils.ts new file mode 100644 index 00000000000..de3dee8770d --- /dev/null +++ b/packages/core/src/awsService/appBuilder/utils.ts @@ -0,0 +1,198 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { TreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import * as nls from 'vscode-nls' +import { ResourceNode } from './explorer/nodes/resourceNode' +import type { SamAppLocation } from './explorer/samProject' +import { ToolkitError } from '../../shared/errors' +import globals from '../../shared/extensionGlobals' +import { OpenTemplateParams, OpenTemplateWizard } from './explorer/openTemplate' +import { DataQuickPickItem, createQuickPick } from '../../shared/ui/pickerPrompter' +import { createCommonButtons } from '../../shared/ui/buttons' +import { samDeployUrl } from '../../shared/constants' +import path from 'path' +import fs from '../../shared/fs/fs' +import { getLogger } from '../../shared/logger/logger' +import { RuntimeFamily, getFamily } from '../../lambda/models/samLambdaRuntime' +import { showMessage } from '../../shared/utilities/messages' +const localize = nls.loadMessageBundle() + +export async function runOpenTemplate(arg?: TreeNode) { + const templateUri = arg ? (arg.resource as SamAppLocation).samTemplateUri : await promptUserForTemplate() + if (!templateUri || !(await fs.exists(templateUri))) { + throw new ToolkitError('No template provided', { code: 'NoTemplateProvided' }) + } + const document = await vscode.workspace.openTextDocument(templateUri) + await vscode.window.showTextDocument(document) +} + +/** + * Find and open the lambda handler with given ResoruceNode + * If not found, a NoHandlerFound error will be raised + * @param arg ResourceNode + */ +export async function runOpenHandler(arg: ResourceNode): Promise { + const folderUri = path.dirname(arg.resource.location.fsPath) + if (!arg.resource.resource.CodeUri) { + throw new ToolkitError('No CodeUri provided in template, cannot open handler', { code: 'NoCodeUriProvided' }) + } + + if (!arg.resource.resource.Handler) { + throw new ToolkitError('No Handler provided in template, cannot open handler', { code: 'NoHandlerProvided' }) + } + + if (!arg.resource.resource.Runtime) { + throw new ToolkitError('No Runtime provided in template, cannot open handler', { code: 'NoRuntimeProvided' }) + } + + const handlerFile = await getLambdaHandlerFile( + vscode.Uri.file(folderUri), + arg.resource.resource.CodeUri, + arg.resource.resource.Handler, + arg.resource.resource.Runtime + ) + if (!handlerFile) { + throw new ToolkitError(`No handler file found with name "${arg.resource.resource.Handler}"`, { + code: 'NoHandlerFound', + }) + } + await vscode.workspace.openTextDocument(handlerFile).then(async (doc) => await vscode.window.showTextDocument(doc)) +} + +// create a set to store all supported runtime in the following function +const supportedRuntimeForHandler = new Set([ + RuntimeFamily.Ruby, + RuntimeFamily.Python, + RuntimeFamily.NodeJS, + RuntimeFamily.DotNet, + RuntimeFamily.Java, +]) + +/** + * Get the actual Lambda handler file, in vscode.Uri format, from the template + * file and handler name. If not found, return undefined. + * + * @param folderUri The root folder for sam project + * @param codeUri codeUri prop in sam template + * @param handler handler prop in sam template + * @param runtime runtime prop in sam template + * @returns + */ +export async function getLambdaHandlerFile( + folderUri: vscode.Uri, + codeUri: string, + handler: string, + runtime: string +): Promise { + const family = getFamily(runtime) + if (!supportedRuntimeForHandler.has(family)) { + throw new ToolkitError(`Runtime ${runtime} is not supported for open handler button`, { + code: 'RuntimeNotSupported', + }) + } + + const handlerParts = handler.split('.') + // sample: app.lambda_handler -> app.rb + if (family === RuntimeFamily.Ruby) { + // Ruby supports namespace/class handlers as well, but the path is + // guaranteed to be slash-delimited so we can assume the first part is + // the path + return vscode.Uri.joinPath(folderUri, codeUri, handlerParts.slice(0, handlerParts.length - 1).join('/') + '.rb') + } + + // sample:app.lambda_handler -> app.py + if (family === RuntimeFamily.Python) { + // Otherwise (currently Node.js and Python) handle dot-delimited paths + return vscode.Uri.joinPath(folderUri, codeUri, handlerParts.slice(0, handlerParts.length - 1).join('/') + '.py') + } + + // sample: app.handler -> app.mjs/app.js + // More likely to be mjs if NODEJS version>=18, now searching for both + if (family === RuntimeFamily.NodeJS) { + const handlerName = handlerParts.slice(0, handlerParts.length - 1).join('/') + const handlerPath = path.dirname(handlerName) + const handlerFile = path.basename(handlerName) + const pattern = new vscode.RelativePattern( + vscode.Uri.joinPath(folderUri, codeUri, handlerPath), + `${handlerFile}.{js,mjs}` + ) + return searchHandlerFile(folderUri, pattern) + } + // search directly under Code uri for Dotnet and java + // sample: ImageResize::ImageResize.Function::FunctionHandler -> Function.cs + if (family === RuntimeFamily.DotNet) { + const handlerName = path.basename(handler.split('::')[1].replaceAll('.', '/')) + const pattern = new vscode.RelativePattern(vscode.Uri.joinPath(folderUri, codeUri), `${handlerName}.cs`) + return searchHandlerFile(folderUri, pattern) + } + + // sample: resizer.App::handleRequest -> App.java + if (family === RuntimeFamily.Java) { + const handlerName = handler.split('::')[0].replaceAll('.', '/') + const pattern = new vscode.RelativePattern(vscode.Uri.joinPath(folderUri, codeUri), `**/${handlerName}.java`) + return searchHandlerFile(folderUri, pattern) + } +} + +/** + Searches for a handler file in the given pattern and returns the first match. + If no match is found, returns undefined. +*/ +export async function searchHandlerFile( + folderUri: vscode.Uri, + pattern: vscode.RelativePattern +): Promise { + const handlerFile = await vscode.workspace.findFiles(pattern, new vscode.RelativePattern(folderUri, '.aws-sam')) + if (handlerFile.length === 0) { + return undefined + } + if (handlerFile.length > 1) { + getLogger().warn(`Multiple handler files found with name "${path.basename(handlerFile[0].fsPath)}"`) + void showMessage('warn', `Multiple handler files found with name "${path.basename(handlerFile[0].fsPath)}"`) + } + if (await fs.exists(handlerFile[0])) { + return handlerFile[0] + } + return undefined +} + +async function promptUserForTemplate() { + const registry = await globals.templateRegistry + const openTemplateParams: Partial = {} + + const param = await new OpenTemplateWizard(openTemplateParams, registry).run() + return param?.template.uri +} + +export async function deployTypePrompt() { + const items: DataQuickPickItem[] = [ + { + label: 'Sync', + data: 'sync', + detail: 'Speed up your development and testing experience in the AWS Cloud. With the --watch parameter, sync will build, deploy and watch for local changes', + description: 'Development environments', + }, + { + label: 'Deploy', + data: 'deploy', + detail: 'Deploys your template through CloudFormation', + description: 'Production environments', + }, + ] + + const selected = await createQuickPick(items, { + title: localize('AWS.appBuilder.deployType.title', 'Select deployment command'), + placeholder: 'Press enter to proceed with highlighted option', + buttons: createCommonButtons(samDeployUrl), + }).prompt() + + if (!selected) { + getLogger().info('Operation cancelled.') + return + } + return selected +} diff --git a/packages/core/src/awsService/appBuilder/walkthrough.ts b/packages/core/src/awsService/appBuilder/walkthrough.ts new file mode 100644 index 00000000000..04f43d61878 --- /dev/null +++ b/packages/core/src/awsService/appBuilder/walkthrough.ts @@ -0,0 +1,349 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as semver from 'semver' +import * as vscode from 'vscode' +import globals from '../../shared/extensionGlobals' +import { getLogger } from '../../shared/logger' + +import { Wizard } from '../../shared/wizards/wizard' +import { createQuickPick } from '../../shared/ui/pickerPrompter' +import { createCommonButtons } from '../../shared/ui/buttons' +import * as nls from 'vscode-nls' +import { ToolkitError } from '../../shared/errors' +import { createSingleFileDialog } from '../../shared/ui/common/openDialog' +import { fs } from '../../shared/fs/fs' +import path from 'path' +import { telemetry } from '../../shared/telemetry' + +import { minSamCliVersionForAppBuilderSupport } from '../../shared/sam/cli/samCliValidator' +import { SamCliInfoInvocation } from '../../shared/sam/cli/samCliInfo' +import { openUrl } from '../../shared/utilities/vsCodeUtils' +import { getOrInstallCli, awsClis, AwsClis } from '../../shared/utilities/cliUtils' +import { getPattern } from '../../shared/utilities/downloadPatterns' +import { addFolderToWorkspace } from '../../shared/utilities/workspaceUtils' + +const localize = nls.loadMessageBundle() +const serverlessLandUrl = 'https://serverlessland.com/' +export const walkthroughContextString = 'aws.toolkit.lambda.walkthroughSelected' +export const templateToOpenAppComposer = 'aws.toolkit.appComposer.templateToOpenOnStart' +const defaultTemplateName = 'template.yaml' +const serverlessLandOwner = 'aws-samples' +const serverlessLandRepo = 'serverless-patterns' + +type WalkthroughOptions = 'CustomTemplate' | 'Visual' | 'S3' | 'API' +type TutorialRuntimeOptions = 'python' | 'node' | 'java' | 'dotnet' | 'skipped' + +interface IServerlessLandProject { + asset: string + handler?: string +} + +export const appMap = new Map([ + ['APIdotnet', { asset: 'apigw-rest-api-lambda-dotnet.zip', handler: 'src/HelloWorld/Function.cs' }], + ['APInode', { asset: 'apigw-rest-api-lambda-node.zip', handler: 'hello_world/app.mjs' }], + ['APIpython', { asset: 'apigw-rest-api-lambda-python.zip', handler: 'hello_world/app.py' }], + [ + 'APIjava', + { + asset: 'apigw-rest-api-lambda-java.zip', + handler: 'HelloWorldFunction/src/main/java/helloworld/App.java', + }, + ], + ['S3dotnet', { asset: 's3-lambda-resizing-dotnet.zip', handler: 'ImageResize/Function.cs' }], + ['S3node', { asset: 's3-lambda-resizing-node.zip', handler: 'src/app.js' }], + ['S3python', { asset: 's3-lambda-resizing-python.zip', handler: 'src/app.py' }], + [ + 'S3java', + { + asset: 's3-lambda-resizing-java.zip', + handler: 'ResizerFunction/src/main/java/resizer/App.java', + }, + ], +]) + +export class RuntimeLocationWizard extends Wizard<{ + runtime: TutorialRuntimeOptions + dir: string + realDir: vscode.Uri +}> { + public constructor(skipRuntime: boolean, labelValue: string, existingTemplates?: vscode.Uri[]) { + super() + const form = this.form + + // step1: choose runtime + const items: { label: string; data: TutorialRuntimeOptions }[] = [ + { label: 'Python', data: 'python' }, + { label: 'Node JS', data: 'node' }, + { label: 'Java', data: 'java' }, + { label: 'Dot Net', data: 'dotnet' }, + ] + form.runtime.bindPrompter( + () => { + return createQuickPick(items, { + title: localize('AWS.toolkit.lambda.walkthroughSelectRuntime', 'Select a runtime'), + buttons: createCommonButtons(serverlessLandUrl), + }) + }, + { showWhen: () => !skipRuntime } + ) + + // step2: choose location for project + const wsFolders = vscode.workspace.workspaceFolders + const items2 = [ + { + label: localize('AWS.toolkit.lambda.walkthroughOpenExplorer', 'Open file explorer'), + data: 'file-selector', + }, + ] + + // if at least one open workspace, add all opened workspace as options + if (wsFolders && labelValue !== 'Open existing Project') { + for (const wsFolder of wsFolders) { + items2.push({ label: wsFolder.uri.fsPath, data: wsFolder.uri.fsPath }) + } + } + + if (wsFolders && existingTemplates && labelValue === 'Open existing Project') { + existingTemplates.map((file) => { + items2.push({ label: file.fsPath, data: path.dirname(file.fsPath) }) + }) + } + + form.dir.bindPrompter(() => { + return createQuickPick(items2, { + title: + labelValue === 'Open existing Project' + ? localize('AWS.toolkit.lambda.walkthroughOpenExistProject', 'Select an existing template file') + : localize('AWS.toolkit.lambda.walkthroughProjectLocation', 'Select a location for project'), + buttons: createCommonButtons(labelValue === 'Open existing Project' ? undefined : serverlessLandUrl), + }) + }) + + const options: vscode.OpenDialogOptions = { + canSelectMany: false, + openLabel: labelValue, + canSelectFiles: false, + canSelectFolders: true, + } + if (wsFolders) { + options.defaultUri = wsFolders[0]?.uri + } + + form.realDir.bindPrompter((state) => createSingleFileDialog(options), { + showWhen: (state) => state.dir !== undefined && state.dir === 'file-selector', + setDefault: (state) => (state.dir ? vscode.Uri.file(state.dir) : undefined), + }) + } +} + +export async function getTutorial( + runtime: TutorialRuntimeOptions, + project: WalkthroughOptions, + outputDir: vscode.Uri, + source?: string +): Promise { + const appSelected = appMap.get(project + runtime) + telemetry.record({ action: project + runtime, source: source ?? 'AppBuilderWalkthrough' }) + if (!appSelected) { + throw new ToolkitError(`Tried to get template '${project}+${runtime}', but it hasn't been registered.`) + } + + try { + await getPattern(serverlessLandOwner, serverlessLandRepo, appSelected.asset, outputDir, true) + } catch (error) { + throw new ToolkitError(`Error occurred while fetching the pattern from serverlessland: ${error}`) + } +} + +/** + * Takes projectUri and runtime then generate matching project + * @param walkthroughSelected the selected walkthrough + * @param projectUri The choosen project uri to generate proejct + * @param runtime The runtime choosen + */ +export async function genWalkthroughProject( + walkthroughSelected: WalkthroughOptions, + projectUri: vscode.Uri, + runtime: TutorialRuntimeOptions | undefined +): Promise { + // create project here + // TODO update with file fetching from serverless land + if (walkthroughSelected === 'CustomTemplate') { + // customer already have a project, no need to generate + return + } + + // check if template.yaml already exists + const templateUri = vscode.Uri.joinPath(projectUri, defaultTemplateName) + if (await fs.exists(templateUri)) { + // ask if want to overwrite + const choice = await vscode.window.showInformationMessage( + localize( + 'AWS.toolkit.lambda.walkthroughCreateProjectPrompt', + '{0} already exist in the selected directory, overwrite?', + defaultTemplateName + ), + 'Yes', + 'No' + ) + if (choice !== 'Yes') { + throw new ToolkitError(`${defaultTemplateName} already exist`) + } + } + + // if Yes, or template not found, continue to generate + if (walkthroughSelected === 'Visual') { + // create an empty template.yaml, open it in appcomposer later + await fs.writeFile(templateUri, Buffer.from('')) + return + } + // start fetching project + if (runtime && runtime !== 'skipped') { + await getTutorial(runtime, walkthroughSelected, projectUri, 'AppBuilderWalkthrough') + } +} + +/** + * check if the selected project Uri exist in current workspace. If not, add Project folder to Workspace + * @param projectUri uri for the selected project + */ +export async function openProjectInWorkspace(projectUri: vscode.Uri): Promise { + let templateUri: vscode.Uri | undefined = vscode.Uri.joinPath(projectUri, defaultTemplateName) + if (!(await fs.exists(templateUri))) { + // no template.yaml, trying yml + templateUri = vscode.Uri.joinPath(projectUri, 'template.yml') + if (!(await fs.exists(templateUri))) { + templateUri = undefined + } + } + + // Open template file, and after update workspace folder + if (templateUri) { + await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup') + await vscode.window.showTextDocument(await vscode.workspace.openTextDocument(templateUri)) + // set global key to template to be opened, appComposer will open them upon reload + await globals.globalState.update(templateToOpenAppComposer, [templateUri.fsPath]) + } + + // if extension is reloaded here, this function will never return (killed) + await addFolderToWorkspace({ uri: projectUri, name: path.basename(projectUri.fsPath) }, true) + + // Open template file + if (templateUri) { + // extension not reloaded, set to false + await globals.globalState.update(templateToOpenAppComposer, undefined) + await vscode.commands.executeCommand('aws.openInApplicationComposer', templateUri) + } + + // Open Readme if exist + if (await fs.exists(vscode.Uri.joinPath(projectUri, 'README.md'))) { + await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup') + await vscode.commands.executeCommand('markdown.showPreview', vscode.Uri.joinPath(projectUri, 'README.md')) + } +} + +/** + * Used in Toolkit Appbuilder Walkthrough. + * 1: Customer select a template + * 2: Create project / Or don't create if customer choose use my own template + * 3: Add project to workspace, Open template.yaml, open template.yaml in AppComposer + */ +export async function initWalkthroughProjectCommand() { + const walkthroughSelected = globals.globalState.get(walkthroughContextString) + let runtimeSelected: TutorialRuntimeOptions | undefined = undefined + try { + if (!walkthroughSelected || !(typeof walkthroughSelected === 'string')) { + getLogger().info('exit on no walkthrough selected') + void vscode.window.showErrorMessage( + localize('AWS.toolkit.lambda.walkthroughNotSelected', 'Please select a template first') + ) + return + } + let labelValue = 'Create Project' + if (walkthroughSelected === 'CustomTemplate') { + labelValue = 'Open existing Project' + } + // if these two, skip runtime choice + const skipRuntimeChoice = walkthroughSelected === 'Visual' || walkthroughSelected === 'CustomTemplate' + const templates: vscode.Uri[] = + walkthroughSelected === 'CustomTemplate' + ? await vscode.workspace.findFiles('**/{template.yaml,template.yml}', '**/.aws-sam/*') + : [] + const result = await new RuntimeLocationWizard(skipRuntimeChoice, labelValue, templates).run() + if (!result) { + getLogger().info('User canceled the runtime selection process via quickpick') + return + } + + if (!result.realDir || !fs.exists(result.realDir)) { + // exit for non-vaild uri + getLogger().info('exit on customer fileselector cancellation') + return + } + + runtimeSelected = result.runtime + + // generate project + await genWalkthroughProject(walkthroughSelected, result.realDir, runtimeSelected) + // open a workspace if no workspace yet + await openProjectInWorkspace(result.realDir) + } finally { + telemetry.record({ action: `${walkthroughSelected}:${runtimeSelected}`, source: 'AppBuilderWalkthrough' }) + } +} + +export async function getOrUpdateOrInstallSAMCli(source: string) { + try { + // find sam + const samPath = await getOrInstallCli('sam-cli', true, true) + // check version + const samCliVersion = (await new SamCliInfoInvocation(samPath).execute()).version + + if (semver.lt(samCliVersion, minSamCliVersionForAppBuilderSupport)) { + // sam found but version too low + const updateInstruction = localize( + 'AWS.toolkit.updateSAMInstruction', + 'View AWS SAM CLI update instructions' + ) + const selection = await vscode.window.showInformationMessage( + localize( + 'AWS.toolkit.samOutdatedPrompt', + 'AWS SAM CLI version {0} or greater is required ({1} currently installed).', + minSamCliVersionForAppBuilderSupport, + samCliVersion + ), + updateInstruction + ) + if (selection === updateInstruction) { + void openUrl(vscode.Uri.parse(awsClis['sam-cli'].manualInstallLink)) + } + } + } catch (err) { + throw ToolkitError.chain(err, 'Failed to install or detect SAM') + } finally { + telemetry.record({ source: source, toolId: 'sam-cli' }) + } +} + +/** + * wraps getOrinstallCli and send telemetry + * @param toolId to install/check + * @param source to be added in telemetry + */ +export async function getOrInstallCliWrapper(toolId: AwsClis, source: string) { + await telemetry.appBuilder_installTool.run(async (span) => { + span.record({ source: source, toolId: toolId }) + if (toolId === 'sam-cli') { + await getOrUpdateOrInstallSAMCli(source) + return + } + try { + await getOrInstallCli(toolId, true, true) + } finally { + telemetry.record({ source: source, toolId: toolId }) + } + }) +} diff --git a/packages/core/src/awsService/appBuilder/wizards/deployTypeWizard.ts b/packages/core/src/awsService/appBuilder/wizards/deployTypeWizard.ts new file mode 100644 index 00000000000..fbaec4657ca --- /dev/null +++ b/packages/core/src/awsService/appBuilder/wizards/deployTypeWizard.ts @@ -0,0 +1,54 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { samDeployUrl } from '../../../shared/constants' +import { createCommonButtons } from '../../../shared/ui/buttons' +import { DataQuickPickItem, createQuickPick } from '../../../shared/ui/pickerPrompter' +import * as nls from 'vscode-nls' +import { Wizard } from '../../../shared/wizards/wizard' +import { DeployParams, DeployWizard } from '../../../shared/sam/deploy' +import { SyncParams, SyncWizard } from '../../../shared/sam/sync' +import { WizardPrompter } from '../../../shared/ui/wizardPrompter' +import { createExitPrompter } from '../../../shared/ui/common/exitPrompter' +const localize = nls.loadMessageBundle() + +export class DeployTypeWizard extends Wizard<{ + choice: string + syncParam: SyncParams + deployParam: DeployParams +}> { + public constructor(syncWizard: SyncWizard, deployWizard: DeployWizard) { + super({ exitPrompterProvider: createExitPrompter }) + const form = this.form + + const items: DataQuickPickItem[] = [ + { + label: 'Sync', + data: 'sync', + detail: 'Speed up your development and testing experience in the AWS Cloud. With the --watch parameter, sync will build, deploy and watch for local changes', + description: 'Development environments', + }, + { + label: 'Deploy', + data: 'deploy', + detail: 'Deploys your template through CloudFormation', + description: 'Production environments', + }, + ] + form.choice.bindPrompter(() => { + return createQuickPick(items, { + title: localize('AWS.appBuilder.deployType.title', 'Select deployment command'), + placeholder: 'Press enter to proceed with highlighted option', + buttons: createCommonButtons(samDeployUrl), + }) + }) + form.deployParam.bindPrompter((state) => new WizardPrompter(deployWizard), { + showWhen: (state) => state.choice === 'deploy', + }) + form.syncParam.bindPrompter((state) => new WizardPrompter(syncWizard), { + showWhen: (state) => state.choice === 'sync', + }) + } +} diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index a186a8ba983..5c3f4ac91c8 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -19,6 +19,10 @@ import { searchLogGroup } from './commands/searchLogGroup' import { changeLogSearchParams } from './changeLogSearch' import { CloudWatchLogsNode } from './explorer/cloudWatchLogsNode' import { loadAndOpenInitialLogStreamFile, LogStreamCodeLensProvider } from './document/logStreamsCodeLensProvider' +import { DeployedResourceNode } from '../appBuilder/explorer/nodes/deployedNode' +import { isTreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import { getLogger } from '../../shared/logger/logger' +import { ToolkitError } from '../../shared' export async function activate(context: vscode.ExtensionContext, configuration: Settings): Promise { const registry = LogDataRegistry.instance @@ -89,6 +93,26 @@ export async function activate(context: vscode.ExtensionContext, configuration: Commands.register('aws.cwl.changeFilterPattern', async () => changeLogSearchParams(registry, 'filterPattern')), - Commands.register('aws.cwl.changeTimeFilter', async () => changeLogSearchParams(registry, 'timeFilter')) + Commands.register('aws.cwl.changeTimeFilter', async () => changeLogSearchParams(registry, 'timeFilter')), + + Commands.register('aws.appBuilder.searchLogs', async (node: DeployedResourceNode) => { + try { + const logGroupInfo = isTreeNode(node) + ? { + regionName: node.resource.regionCode, + groupName: getFunctionLogGroupName(node.resource.explorerNode.configuration), + } + : undefined + const source: string = logGroupInfo ? 'AppBuilderSearchLogs' : 'CommandPaletteSearchLogs' + await searchLogGroup(registry, source, logGroupInfo) + } catch (err) { + getLogger().error('Failed to search logs: %s', err) + throw ToolkitError.chain(err, 'Failed to search logs') + } + }) ) } +function getFunctionLogGroupName(configuration: any) { + const logGroupPrefix = '/aws/lambda/' + return configuration.logGroupName || logGroupPrefix + configuration.FunctionName +} diff --git a/packages/core/src/awsService/s3/activation.ts b/packages/core/src/awsService/s3/activation.ts index fcaee4f3905..2b8a164800a 100644 --- a/packages/core/src/awsService/s3/activation.ts +++ b/packages/core/src/awsService/s3/activation.ts @@ -25,6 +25,8 @@ import { Commands } from '../../shared/vscode/commands2' import * as nls from 'vscode-nls' import { DefaultS3Client } from '../../shared/clients/s3Client' +import { TreeNode } from '../../shared/treeview/resourceTreeDataProvider' +import { getSourceNode } from '../../shared/utilities/treeNodeUtils' const localize = nls.loadMessageBundle() /** @@ -58,7 +60,7 @@ export async function activate(ctx: ExtContext): Promise { }), Commands.register( { id: 'aws.s3.uploadFile', autoconnect: true }, - async (node?: S3BucketNode | S3FolderNode) => { + async (node?: S3BucketNode | S3FolderNode | TreeNode) => { if (!node) { const awsContext = ctx.awsContext const regionCode = awsContext.getCredentialDefaultRegion() @@ -66,7 +68,8 @@ export async function activate(ctx: ExtContext): Promise { const document = vscode.window.activeTextEditor?.document.uri await uploadFileCommand(s3Client, document) } else { - await uploadFileCommand(node.s3, node) + const sourceNode = getSourceNode(node) + await uploadFileCommand(sourceNode.s3, sourceNode) } } ), @@ -76,11 +79,13 @@ export async function activate(ctx: ExtContext): Promise { Commands.register('aws.s3.createBucket', async (node: S3Node) => { await createBucketCommand(node) }), - Commands.register('aws.s3.createFolder', async (node: S3BucketNode | S3FolderNode) => { - await createFolderCommand(node) + Commands.register('aws.s3.createFolder', async (node: S3BucketNode | S3FolderNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await createFolderCommand(sourceNode) }), - Commands.register('aws.s3.deleteBucket', async (node: S3BucketNode) => { - await deleteBucketCommand(node) + Commands.register('aws.s3.deleteBucket', async (node: S3BucketNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await deleteBucketCommand(sourceNode) }), Commands.register('aws.s3.deleteFile', async (node: S3FileNode) => { await deleteFileCommand(node) diff --git a/packages/core/src/awsexplorer/activation.ts b/packages/core/src/awsexplorer/activation.ts index a93baef6034..5ea7295bf98 100644 --- a/packages/core/src/awsexplorer/activation.ts +++ b/packages/core/src/awsexplorer/activation.ts @@ -32,6 +32,10 @@ import { activateViewsShared, registerToolView } from './activationShared' import { isExtensionInstalled } from '../shared/utilities' import { CommonAuthViewProvider } from '../login/webview' import { setContext } from '../shared' +import { TreeNode } from '../shared/treeview/resourceTreeDataProvider' +import { getSourceNode } from '../shared/utilities/treeNodeUtils' +import { openAwsCFNConsoleCommand, openAwsConsoleCommand } from '../shared/awsConsole' +import { StackNameNode } from '../awsService/appBuilder/explorer/nodes/deployedStack' /** * Activates the AWS Explorer UI and related functionality. @@ -121,6 +125,7 @@ export async function activate(args: { refreshCommands: [refreshAmazonQ, refreshAmazonQRootNode], }) } + const viewNodes: ToolView[] = [ ...amazonQViewNode, ...codecatalystViewNode, @@ -196,8 +201,21 @@ async function registerAwsExplorerCommands( isPreviewAndRender: true, }) ), - Commands.register('aws.copyArn', async (node: AWSResourceNode) => await copyTextCommand(node, 'ARN')), - Commands.register('aws.copyName', async (node: AWSResourceNode) => await copyTextCommand(node, 'name')), + Commands.register('aws.copyArn', async (node: AWSResourceNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await copyTextCommand(sourceNode, 'ARN') + }), + Commands.register('aws.copyName', async (node: AWSResourceNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await copyTextCommand(sourceNode, 'name') + }), + Commands.register('aws.openAwsConsole', async (node: AWSResourceNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await openAwsConsoleCommand(sourceNode) + }), + Commands.register('aws.openAwsCFNConsole', async (node: StackNameNode) => { + await openAwsCFNConsoleCommand(node) + }), Commands.register('aws.refreshAwsExplorerNode', async (element: AWSTreeNodeBase | undefined) => { awsExplorer.refresh(element) }), diff --git a/packages/core/src/extensionNode.ts b/packages/core/src/extensionNode.ts index f5e580300e8..345e03788ba 100644 --- a/packages/core/src/extensionNode.ts +++ b/packages/core/src/extensionNode.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode' import * as nls from 'vscode-nls' import * as codecatalyst from './codecatalyst/activation' +import { activate as activateAppBuilder } from './awsService/appBuilder/activation' import { activate as activateAwsExplorer } from './awsexplorer/activation' import { activate as activateCloudWatchLogs } from './awsService/cloudWatchLogs/activation' import { CredentialsProviderManager } from './auth/providers/credentialsProviderManager' @@ -208,6 +209,8 @@ export async function activate(context: vscode.ExtensionContext) { await activateRedshift(extContext) + await activateAppBuilder(extContext) + await activateIamPolicyChecks(extContext) context.subscriptions.push( diff --git a/packages/core/src/lambda/activation.ts b/packages/core/src/lambda/activation.ts index 911f3f9be44..4a21b2e9611 100644 --- a/packages/core/src/lambda/activation.ts +++ b/packages/core/src/lambda/activation.ts @@ -11,25 +11,36 @@ import { downloadLambdaCommand } from './commands/downloadLambda' import { tryRemoveFolder } from '../shared/filesystemUtilities' import { ExtContext } from '../shared/extensions' import { invokeRemoteLambda } from './vue/remoteInvoke/invokeLambda' -import { registerSamInvokeVueCommand } from './vue/configEditor/samInvokeBackend' +import { registerSamDebugInvokeVueCommand, registerSamInvokeVueCommand } from './vue/configEditor/samInvokeBackend' import { Commands } from '../shared/vscode/commands2' import { DefaultLambdaClient } from '../shared/clients/lambdaClient' import { copyLambdaUrl } from './commands/copyLambdaUrl' +import { ResourceNode } from '../awsService/appBuilder/explorer/nodes/resourceNode' +import { isTreeNode, TreeNode } from '../shared/treeview/resourceTreeDataProvider' +import { getSourceNode } from '../shared/utilities/treeNodeUtils' /** * Activates Lambda components. */ export async function activate(context: ExtContext): Promise { context.extensionContext.subscriptions.push( - Commands.register('aws.deleteLambda', async (node: LambdaFunctionNode) => { - await deleteLambda(node.configuration, new DefaultLambdaClient(node.regionCode)) - await vscode.commands.executeCommand('aws.refreshAwsExplorerNode', node.parent) + Commands.register('aws.deleteLambda', async (node: LambdaFunctionNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await deleteLambda(sourceNode.configuration, new DefaultLambdaClient(sourceNode.regionCode)) + await vscode.commands.executeCommand('aws.refreshAwsExplorerNode', sourceNode.parent) + }), + Commands.register('aws.invokeLambda', async (node: LambdaFunctionNode | TreeNode) => { + let source: string = 'AwsExplorerRemoteInvoke' + if (isTreeNode(node)) { + node = getSourceNode(node) + source = 'AppBuilderRemoteInvoke' + } + await invokeRemoteLambda(context, { + outputChannel: context.outputChannel, + functionNode: node, + source: source, + }) }), - Commands.register( - 'aws.invokeLambda', - async (node: LambdaFunctionNode) => - await invokeRemoteLambda(context, { outputChannel: context.outputChannel, functionNode: node }) - ), // Capture debug finished events, and delete the temporary directory if it exists vscode.debug.onDidTerminateDebugSession(async (session) => { if ( @@ -39,7 +50,10 @@ export async function activate(context: ExtContext): Promise { await tryRemoveFolder(session.configuration.baseBuildDir) } }), - Commands.register('aws.downloadLambda', async (node: LambdaFunctionNode) => await downloadLambdaCommand(node)), + Commands.register('aws.downloadLambda', async (node: LambdaFunctionNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await downloadLambdaCommand(sourceNode) + }), Commands.register({ id: 'aws.uploadLambda', autoconnect: true }, async (arg?: unknown) => { if (arg instanceof LambdaFunctionNode) { await uploadLambdaCommand({ @@ -53,10 +67,15 @@ export async function activate(context: ExtContext): Promise { await uploadLambdaCommand() } }), - Commands.register( - 'aws.copyLambdaUrl', - async (node: LambdaFunctionNode) => await copyLambdaUrl(node, new DefaultLambdaClient(node.regionCode)) - ), - registerSamInvokeVueCommand(context) + Commands.register('aws.copyLambdaUrl', async (node: LambdaFunctionNode | TreeNode) => { + const sourceNode = getSourceNode(node) + await copyLambdaUrl(sourceNode, new DefaultLambdaClient(sourceNode.regionCode)) + }), + + registerSamInvokeVueCommand(context), + + Commands.register('aws.launchDebugConfigForm', async (node: ResourceNode) => + registerSamDebugInvokeVueCommand(context, { resource: node }) + ) ) } diff --git a/packages/core/src/lambda/commands/deploySamApplication.ts b/packages/core/src/lambda/commands/deploySamApplication.ts deleted file mode 100644 index 4231b2b614e..00000000000 --- a/packages/core/src/lambda/commands/deploySamApplication.ts +++ /dev/null @@ -1,326 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as path from 'path' -import * as vscode from 'vscode' -import * as nls from 'vscode-nls' - -import { asEnvironmentVariables } from '../../auth/credentials/utils' -import { AwsContext } from '../../shared/awsContext' -import globals from '../../shared/extensionGlobals' - -import { makeTemporaryToolkitFolder, tryRemoveFolder } from '../../shared/filesystemUtilities' -import { checklogs } from '../../shared/localizedText' -import { getLogger } from '../../shared/logger' -import { SamCliBuildInvocation } from '../../shared/sam/cli/samCliBuild' -import { SamCliSettings } from '../../shared/sam/cli/samCliSettings' -import { getSamCliContext, SamCliContext, getSamCliVersion } from '../../shared/sam/cli/samCliContext' -import { runSamCliDeploy } from '../../shared/sam/cli/samCliDeploy' -import { SamCliProcessInvoker } from '../../shared/sam/cli/samCliInvokerUtils' -import { runSamCliPackage } from '../../shared/sam/cli/samCliPackage' -import { throwAndNotifyIfInvalid } from '../../shared/sam/cli/samCliValidationUtils' -import { Result } from '../../shared/telemetry/telemetry' -import { addCodiconToString } from '../../shared/utilities/textUtilities' -import { SamDeployWizardResponse } from '../wizards/samDeployWizard' -import { telemetry } from '../../shared/telemetry/telemetry' - -const localize = nls.loadMessageBundle() - -interface DeploySamApplicationParameters { - sourceTemplatePath: string - deployRootFolder: string - environmentVariables: NodeJS.ProcessEnv - region: string - packageBucketName: string - ecrRepo?: string - destinationStackName: string - parameterOverrides: Map -} - -export interface WindowFunctions { - showInformationMessage: typeof vscode.window.showInformationMessage - showErrorMessage: typeof vscode.window.showErrorMessage - setStatusBarMessage(text: string, hideWhenDone: Thenable): vscode.Disposable -} - -export async function deploySamApplication( - { - samCliContext = getSamCliContext(), - samDeployWizard, - }: { - samCliContext?: SamCliContext - samDeployWizard: () => Promise - }, - { - awsContext, - settings, - window = getDefaultWindowFunctions(), - refreshFn = () => { - // no need to await, doesn't need to block further execution (true -> no telemetry) - void vscode.commands.executeCommand('aws.refreshAwsExplorer', true) - }, - }: { - awsContext: Pick - settings: SamCliSettings - window?: WindowFunctions - refreshFn?: () => void - } -): Promise { - let deployResult: Result = 'Succeeded' - let samVersion: string | undefined - let deployFolder: string | undefined - try { - const credentials = await awsContext.getCredentials() - if (!credentials) { - throw new Error('No AWS profile selected') - } - - throwAndNotifyIfInvalid(await samCliContext.validator.detectValidSamCli()) - - const deployWizardResponse = await samDeployWizard() - - if (!deployWizardResponse) { - return - } - - deployFolder = await makeTemporaryToolkitFolder('samDeploy') - samVersion = await getSamCliVersion(samCliContext) - - const deployParameters: DeploySamApplicationParameters = { - deployRootFolder: deployFolder, - destinationStackName: deployWizardResponse.stackName, - packageBucketName: deployWizardResponse.s3Bucket, - ecrRepo: deployWizardResponse.ecrRepo?.repositoryUri, - parameterOverrides: deployWizardResponse.parameterOverrides, - environmentVariables: asEnvironmentVariables(credentials), - region: deployWizardResponse.region, - sourceTemplatePath: deployWizardResponse.template.fsPath, - } - - const deployApplicationPromise = deploy({ - deployParameters, - invoker: samCliContext.invoker, - window, - }) - - window.setStatusBarMessage( - addCodiconToString( - 'cloud-upload', - localize( - 'AWS.samcli.deploy.statusbar.message', - 'Deploying SAM Application to {0}...', - deployWizardResponse.stackName - ) - ), - deployApplicationPromise - ) - - await deployApplicationPromise - refreshFn() - - // successful deploy: retain S3 bucket for quick future access - const profile = awsContext.getCredentialProfileName() - if (profile) { - await settings.updateSavedBuckets(profile, deployWizardResponse.region, deployWizardResponse.s3Bucket) - } else { - getLogger().warn('Profile not provided; cannot write recent buckets.') - } - } catch (err) { - deployResult = 'Failed' - outputDeployError(err as Error) - void vscode.window.showErrorMessage( - localize('AWS.samcli.deploy.workflow.error', 'Failed to deploy SAM application.') - ) - } finally { - await tryRemoveFolder(deployFolder) - telemetry.sam_deploy.emit({ result: deployResult, version: samVersion }) - } -} - -function getBuildRootFolder(deployRootFolder: string): string { - return path.join(deployRootFolder, 'build') -} - -function getBuildTemplatePath(deployRootFolder: string): string { - // Assumption: sam build will always produce a template.yaml file. - // If that is not the case, revisit this logic. - return path.join(getBuildRootFolder(deployRootFolder), 'template.yaml') -} - -function getPackageTemplatePath(deployRootFolder: string): string { - return path.join(deployRootFolder, 'template.yaml') -} - -async function buildOperation(params: { - deployParameters: DeploySamApplicationParameters - invoker: SamCliProcessInvoker -}): Promise { - try { - getLogger().info(localize('AWS.samcli.deploy.workflow.init', 'Building SAM Application...')) - - const buildDestination = getBuildRootFolder(params.deployParameters.deployRootFolder) - - const build = new SamCliBuildInvocation({ - buildDir: buildDestination, - baseDir: undefined, - templatePath: params.deployParameters.sourceTemplatePath, - invoker: params.invoker, - }) - - await build.execute() - - return true - } catch (err) { - getLogger().warn( - localize( - 'AWS.samcli.build.failedBuild', - '"sam build" failed: {0}', - params.deployParameters.sourceTemplatePath - ) - ) - return false - } -} - -async function packageOperation( - params: { - deployParameters: DeploySamApplicationParameters - invoker: SamCliProcessInvoker - }, - buildSuccessful: boolean -): Promise { - if (!buildSuccessful) { - void vscode.window.showInformationMessage( - localize( - 'AWS.samcli.deploy.workflow.packaging.noBuild', - 'Attempting to package source template directory directly since "sam build" failed' - ) - ) - } - - getLogger().info( - localize( - 'AWS.samcli.deploy.workflow.packaging', - 'Packaging SAM Application to S3 Bucket: {0}', - params.deployParameters.packageBucketName - ) - ) - - // HACK: Attempt to package the initial template if the build fails. - const buildTemplatePath = buildSuccessful - ? getBuildTemplatePath(params.deployParameters.deployRootFolder) - : params.deployParameters.sourceTemplatePath - const packageTemplatePath = getPackageTemplatePath(params.deployParameters.deployRootFolder) - - await runSamCliPackage( - { - sourceTemplateFile: buildTemplatePath, - destinationTemplateFile: packageTemplatePath, - environmentVariables: params.deployParameters.environmentVariables, - region: params.deployParameters.region, - s3Bucket: params.deployParameters.packageBucketName, - ecrRepo: params.deployParameters.ecrRepo, - }, - params.invoker - ) -} - -async function deployOperation(params: { - deployParameters: DeploySamApplicationParameters - invoker: SamCliProcessInvoker -}): Promise { - try { - getLogger().info( - localize( - 'AWS.samcli.deploy.workflow.stackName.initiated', - 'Deploying SAM Application to CloudFormation Stack: {0}', - params.deployParameters.destinationStackName - ) - ) - - const packageTemplatePath = getPackageTemplatePath(params.deployParameters.deployRootFolder) - - await runSamCliDeploy( - { - parameterOverrides: params.deployParameters.parameterOverrides, - environmentVariables: params.deployParameters.environmentVariables, - templateFile: packageTemplatePath, - region: params.deployParameters.region, - stackName: params.deployParameters.destinationStackName, - s3Bucket: params.deployParameters.packageBucketName, - ecrRepo: params.deployParameters.ecrRepo, - }, - params.invoker - ) - } catch (err) { - // Handle sam deploy Errors to supplement the error message prior to writing it out - const error = err as Error - - getLogger().error(error) - - const errorMessage = enhanceAwsCloudFormationInstructions(String(err), params.deployParameters) - globals.outputChannel.appendLine(errorMessage) - - throw new Error('Deploy failed') - } -} - -async function deploy(params: { - deployParameters: DeploySamApplicationParameters - invoker: SamCliProcessInvoker - window: WindowFunctions -}): Promise { - globals.outputChannel.show(true) - getLogger().info(localize('AWS.samcli.deploy.workflow.start', 'Starting SAM Application deployment...')) - - const buildSuccessful = await buildOperation(params) - await packageOperation(params, buildSuccessful) - await deployOperation(params) - - getLogger().info( - localize( - 'AWS.samcli.deploy.workflow.success', - 'Deployed SAM Application to CloudFormation Stack: {0}', - params.deployParameters.destinationStackName - ) - ) - - void params.window.showInformationMessage( - localize('AWS.samcli.deploy.workflow.success.general', 'SAM Application deployment succeeded.') - ) -} - -function enhanceAwsCloudFormationInstructions( - message: string, - deployParameters: DeploySamApplicationParameters -): string { - // detect error message from https://github.com/aws/aws-cli/blob/4ff0cbacbac69a21d4dd701921fe0759cf7852ed/awscli/customizations/cloudformation/exceptions.py#L42 - // and append region to assist in troubleshooting the error - // (command uses CLI configured value--users that don't know this and omit region won't see error) - if ( - message.includes( - `aws cloudformation describe-stack-events --stack-name ${deployParameters.destinationStackName}` - ) - ) { - message += ` --region ${deployParameters.region}` - } - - return message -} - -function outputDeployError(error: Error) { - getLogger().error(error) - - globals.outputChannel.show(true) - getLogger().error('AWS.samcli.deploy.general.error', 'Error deploying a SAM Application. {0}', checklogs()) -} - -function getDefaultWindowFunctions(): WindowFunctions { - return { - setStatusBarMessage: vscode.window.setStatusBarMessage, - showErrorMessage: vscode.window.showErrorMessage, - showInformationMessage: vscode.window.showInformationMessage, - } -} diff --git a/packages/core/src/lambda/commands/listSamResources.ts b/packages/core/src/lambda/commands/listSamResources.ts new file mode 100644 index 00000000000..5a0d1678c9b --- /dev/null +++ b/packages/core/src/lambda/commands/listSamResources.ts @@ -0,0 +1,43 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../shared/logger' +import { runSamCliListResource } from '../../shared/sam/cli/samCliListResources' + +export interface StackResource { + LogicalResourceId: string + PhysicalResourceId: string +} + +/* +This function return exclusively the deployed resources +Newly added but yet-to-be deployed resources are not included in this result +*/ +export async function getDeployedResources(params: any) { + try { + const samCliListResourceOutput = await runSamCliListResource(params.listResourcesParams, params.invoker).then( + (output) => parseSamListResourceOutput(output) + ) + // Filter out resources that are not deployed + return samCliListResourceOutput.filter((resource) => resource.PhysicalResourceId !== '-') + } catch (err) { + const error = err as Error + getLogger().error(error) + } +} + +function parseSamListResourceOutput(output: any): StackResource[] { + try { + if ((Array.isArray(output) && output.length === 0) || '[]' === output) { + // Handle if the output is instance or stringify version of an empty array to avoid parsing error + return [] + } + return JSON.parse(output) as StackResource[] + } catch (error: any) { + void vscode.window.showErrorMessage(`Failed to parse SAM CLI output: ${error.message}`) + return [] + } +} diff --git a/packages/core/src/lambda/models/samLambdaRuntime.ts b/packages/core/src/lambda/models/samLambdaRuntime.ts index 754d910a24e..5b97ef06e2a 100644 --- a/packages/core/src/lambda/models/samLambdaRuntime.ts +++ b/packages/core/src/lambda/models/samLambdaRuntime.ts @@ -22,6 +22,7 @@ export enum RuntimeFamily { DotNet, Go, Java, + Ruby, } export type RuntimePackageType = 'Image' | 'Zip' @@ -57,8 +58,15 @@ export const pythonRuntimes: ImmutableSet = ImmutableSet([ 'python3.7', ]) export const goRuntimes: ImmutableSet = ImmutableSet(['go1.x']) -export const javaRuntimes: ImmutableSet = ImmutableSet(['java17', 'java11', 'java8', 'java8.al2']) -export const dotNetRuntimes: ImmutableSet = ImmutableSet(['dotnet6']) +export const javaRuntimes: ImmutableSet = ImmutableSet([ + 'java17', + 'java11', + 'java8', + 'java8.al2', + 'java21', +]) +export const dotNetRuntimes: ImmutableSet = ImmutableSet(['dotnet6', 'dotnet8']) +export const rubyRuntimes: ImmutableSet = ImmutableSet(['ruby3.2', 'ruby3.3']) /** * Deprecated runtimes can be found at https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html @@ -77,6 +85,8 @@ export const deprecatedRuntimes: ImmutableSet = ImmutableSet([ 'nodejs8.10', 'nodejs10.x', 'nodejs12.x', + 'ruby2.5', + 'ruby2.7', ]) const defaultRuntimes = ImmutableMap([ [RuntimeFamily.NodeJS, 'nodejs20.x'], @@ -84,6 +94,7 @@ const defaultRuntimes = ImmutableMap([ [RuntimeFamily.DotNet, 'dotnet6'], [RuntimeFamily.Go, 'go1.x'], [RuntimeFamily.Java, 'java17'], + [RuntimeFamily.Ruby, 'ruby3.3'], ]) export const samZipLambdaRuntimes: ImmutableSet = ImmutableSet.union([ @@ -157,6 +168,8 @@ export function getFamily(runtime: string): RuntimeFamily { return RuntimeFamily.Go } else if (javaRuntimes.has(runtime)) { return RuntimeFamily.Java + } else if (rubyRuntimes.has(runtime)) { + return RuntimeFamily.Ruby } return RuntimeFamily.Unknown } @@ -206,6 +219,10 @@ export function getRuntimeFamily(langId: string): RuntimeFamily { return RuntimeFamily.Python case 'go': return RuntimeFamily.Go + case 'java': + return RuntimeFamily.Java + case 'ruby': + return RuntimeFamily.Ruby default: return RuntimeFamily.Unknown } diff --git a/packages/core/src/lambda/vue/configEditor/samInvoke.css b/packages/core/src/lambda/vue/configEditor/samInvoke.css index d248e071a90..9ca2c8ef452 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvoke.css +++ b/packages/core/src/lambda/vue/configEditor/samInvoke.css @@ -1,7 +1,3 @@ -form { - padding: 15px; -} - .section-header { margin: 0px; margin-bottom: 10px; @@ -10,7 +6,9 @@ form { } textarea { - max-width: 100%; + color: var(--vscode-settings-textInputForeground); + background: var(--vscode-settings-textInputBackground); + border: 1px solid var(--vscode-settings-textInputBorder); } .config-item { @@ -47,7 +45,133 @@ textarea { margin-bottom: 16px; } +.header-buttons { + display: flex; + align-items: center; + margin-bottom: 20px; +} + #target-type-selector { margin-bottom: 15px; margin-left: 8px; } + +.form-row { + display: grid; + grid-template-columns: 150px 1fr; + margin-bottom: 10px; +} + +.form-control { + min-width: 170%; /* Set a minimum width */ + width: 100%; /* Allow the width to adjust based on content */ + display: inline-block; + flex-grow: 1; + margin-right: 0.5rem; +} + +.payload-options-button { + display: grid; + align-items: center; + border: none; + padding: 5px 10px; + cursor: pointer; + font-size: 0.9em; + margin-bottom: 10px; +} + +.payload-options-buttons { + display: flex; + align-items: center; + margin-top: 10px; + margin-bottom: 10px; +} + +.Icontainer { + margin-inline: auto; + margin-top: 5rem; +} + +.container { + width: 574px; + height: 824px; + top: 18px; + gap: 20px; + margin: auto; + left: 688px; + background-color: var(--vscode-editor-background); +} + +.container em { + display: block; + text-align: justify; +} + +.button-theme-primary { + color: var(--vscode-button-foreground); + background: var(--vscode-button-background); + border: 1px solid var(--vscode-button-border); + padding: 8px 12px; +} +.button-theme-primary:hover:not(:disabled) { + background: var(--vscode-button-hoverBackground); + cursor: pointer; +} +.button-theme-secondary { + color: var(--vscode-button-secondaryForeground); + background: var(--vscode-button-secondaryBackground); + border: 1px solid var(--vscode-button-border); + padding: 8px 12px; +} +.button-theme-secondary:hover:not(:disabled) { + background: var(--vscode-button-secondaryHoverBackground); + cursor: pointer; +} + +.formfield { + display: flex; + align-items: center; + margin-bottom: 0.5rem; +} + +.payload-options-buttons { + display: flex; + align-items: center; + margin-top: 10px; + margin-bottom: 10px; +} + +.radio-selector { + width: 15px; + height: 15px; + border-radius: 50%; +} + +.label-selector { + padding-left: 7px; + font-weight: 500; + font-size: 13px; + line-height: 15.51px; + text-align: center; +} + +.form-row-select { + width: 387px; + height: 28px; + border: 1px; + border-radius: 5px; + gap: 4px; + padding: 2px 8px; +} + +.form-row-event-select { + width: 244px; + height: 28px; + margin-bottom: 15px; + margin-left: 8px; +} + +.runtime-description { + font-size: 12px; + margin-top: 5px; +} diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts index 7ae941d72e1..9e3eed9980b 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts +++ b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts @@ -36,9 +36,22 @@ import { VueWebview } from '../../../webviews/main' import { Commands } from '../../../shared/vscode/commands2' import { telemetry } from '../../../shared/telemetry/telemetry' import { fs } from '../../../shared' +import { ToolkitError } from '../../../shared' +import { ResourceNode } from '../../../awsService/appBuilder/explorer/nodes/resourceNode' const localize = nls.loadMessageBundle() +export interface ResourceData { + logicalId: string + region: string + arn: string + location: string + handler: string + runtime: string + stackName: string + source: string +} + export type AwsSamDebuggerConfigurationLoose = AwsSamDebuggerConfiguration & { invokeTarget: Omit< AwsSamDebuggerConfiguration['invokeTarget'], @@ -55,7 +68,7 @@ interface SampleQuickPickItem extends vscode.QuickPickItem { filename: string } -interface LaunchConfigPickItem extends vscode.QuickPickItem { +export interface LaunchConfigPickItem extends vscode.QuickPickItem { index: number config?: AwsSamDebuggerConfiguration } @@ -66,7 +79,8 @@ export class SamInvokeWebview extends VueWebview { public constructor( private readonly extContext: ExtContext, // TODO(sijaden): get rid of `ExtContext` - private readonly config?: AwsSamDebuggerConfiguration + private readonly config?: AwsSamDebuggerConfiguration, + private readonly data?: ResourceData ) { super(SamInvokeWebview.sourcePath) } @@ -79,11 +93,11 @@ export class SamInvokeWebview extends VueWebview { return this.config } - /** - * Open a quick pick containing the names of launch configs in the `launch.json` array. - * Filter out non-supported launch configs. - */ - public async loadSamLaunchConfig(): Promise { + public getResourceData() { + return this.data + } + + public async getSamLaunchConfigs(): Promise { // TODO: Find a better way to infer this. Might need another arg from the frontend (depends on the context in which the launch config is made?) const workspaceFolder = vscode.workspace.workspaceFolders?.length ? vscode.workspace.workspaceFolders[0] @@ -94,7 +108,17 @@ export class SamInvokeWebview extends VueWebview { } const uri = workspaceFolder.uri const launchConfig = new LaunchConfiguration(uri) - const pickerItems = await getLaunchConfigQuickPickItems(launchConfig, uri) + const pickerItems = await this.getLaunchConfigQuickPickItems(launchConfig, uri) + return pickerItems + } + + /** + * Open a quick pick containing the names of launch configs in the `launch.json` array. + * Filter out non-supported launch configs. + */ + public async loadSamLaunchConfig(): Promise { + const pickerItems: LaunchConfigPickItem[] = (await this.getSamLaunchConfigs()) || [] + if (pickerItems.length === 0) { pickerItems.push({ index: -1, @@ -151,9 +175,14 @@ export class SamInvokeWebview extends VueWebview { return sample } catch (err) { getLogger().error('Error getting manifest data..: %O', err as Error) + throw ToolkitError.chain(err, 'getting manifest data') } } + protected getTemplateRegistry() { + return globals.templateRegistry + } + /** * Get all templates in the registry. * Call back into the webview with the registry contents. @@ -161,7 +190,7 @@ export class SamInvokeWebview extends VueWebview { public async getTemplate() { const items: (vscode.QuickPickItem & { templatePath: string })[] = [] const noTemplate = 'NOTEMPLATEFOUND' - for (const template of (await globals.templateRegistry).items) { + for (const template of (await this.getTemplateRegistry()).items) { const resources = template.item.Resources if (resources) { for (const resource of Object.keys(resources)) { @@ -213,6 +242,41 @@ export class SamInvokeWebview extends VueWebview { } } + // This method serves as a wrapper around the backend function `openLaunchJsonFile`. + // The frontend cannot directly import and invoke backend functions like `openLaunchJsonFile` + // because doing so would break the webview environment by introducing server-side logic + // into client-side code. Instead, this method acts as an interface or bridge, allowing + // the frontend to request the backend to open the launch configuration file without + // directly coupling the frontend to backend-specific implementations. + public async openLaunchConfig() { + await openLaunchJsonFile() + } + + public async promptFile() { + const fileLocations = await vscode.window.showOpenDialog({ + openLabel: 'Open', + }) + + if (!fileLocations || fileLocations.length === 0) { + return undefined + } + + try { + const fileContent = await fs.readFileBytes(fileLocations[0].fsPath) + return { + sample: fileContent, + selectedFilePath: fileLocations[0].fsPath, + selectedFile: this.getFileName(fileLocations[0].fsPath), + } + } catch (e) { + getLogger().error('readFileSync: Failed to read file at path %O', fileLocations[0].fsPath, e) + throw ToolkitError.chain(e, 'Failed to read selected file') + } + } + + public getFileName(filePath: string): string { + return path.basename(filePath) + } /** * Open a quick pick containing the names of launch configs in the `launch.json` array, plus a "Create New Entry" entry. * On selecting a name, overwrite the existing entry in the `launch.json` array and resave the file. @@ -220,7 +284,7 @@ export class SamInvokeWebview extends VueWebview { * @param config Config to save */ public async saveLaunchConfig(config: AwsSamDebuggerConfiguration): Promise { - const uri = await getUriFromLaunchConfig(config) + const uri = await this.getUriFromLaunchConfig(config) if (!uri) { // TODO Localize void vscode.window.showErrorMessage( @@ -228,13 +292,14 @@ export class SamInvokeWebview extends VueWebview { ) return } + const launchConfig = new LaunchConfiguration(uri) - const launchConfigItems = await getLaunchConfigQuickPickItems(launchConfig, uri) + const launchConfigItems = await this.getLaunchConfigQuickPickItems(launchConfig, uri) const pickerItems = [ { label: addCodiconToString( 'add', - localize('AWS.command.addSamDebugConfiguration', 'Add Debug Configuration') + localize('AWS.command.addSamDebugConfiguration', 'Add Local Invoke and Debug Configuration') ), index: -1, alwaysShow: true, @@ -267,7 +332,7 @@ export class SamInvokeWebview extends VueWebview { const response = await input.promptUser({ inputBox: ib }) if (response) { await launchConfig.addDebugConfiguration(finalizeConfig(config, response)) - await openLaunchJsonFile() + await this.openLaunchConfig() } } else { // use existing label @@ -275,7 +340,7 @@ export class SamInvokeWebview extends VueWebview { finalizeConfig(config, pickerResponse.label), pickerResponse.index ) - await openLaunchJsonFile() + await this.openLaunchConfig() } } @@ -284,12 +349,12 @@ export class SamInvokeWebview extends VueWebview { * TODO: Post validation failures back to webview? * @param config Config to invoke */ - public async invokeLaunchConfig(config: AwsSamDebuggerConfiguration): Promise { + public async invokeLaunchConfig(config: AwsSamDebuggerConfiguration, source?: string): Promise { const finalConfig = finalizeConfig( resolveWorkspaceFolderVariable(undefined, config), 'Editor-Created Debug Config' ) - const targetUri = await getUriFromLaunchConfig(finalConfig) + const targetUri = await this.getUriFromLaunchConfig(finalConfig) const folder = targetUri ? vscode.workspace.getWorkspaceFolder(targetUri) : undefined // Cloud9 currently can't resolve the `aws-sam` debug config provider. @@ -298,12 +363,65 @@ export class SamInvokeWebview extends VueWebview { // (Cloud9 also doesn't currently have variable resolution support anyways) if (isCloud9()) { const provider = new SamDebugConfigProvider(this.extContext) - await provider.resolveDebugConfiguration(folder, finalConfig) + await provider.resolveDebugConfiguration(folder, finalConfig, undefined, source) } else { // startDebugging on VS Code goes through the whole resolution chain await vscode.debug.startDebugging(folder, finalConfig) } } + public async getLaunchConfigQuickPickItems( + launchConfig: LaunchConfiguration, + uri: vscode.Uri + ): Promise { + const existingConfigs = launchConfig.getDebugConfigurations() + const samValidator = new DefaultAwsSamDebugConfigurationValidator(vscode.workspace.getWorkspaceFolder(uri)) + const registry = await globals.templateRegistry + const mapped = existingConfigs.map((val, index) => { + return { + config: val as AwsSamDebuggerConfiguration, + index: index, + label: val.name, + } + }) + // XXX: can't use filter() with async predicate. + const filtered: LaunchConfigPickItem[] = [] + for (const c of mapped) { + const valid = await samValidator.validate(c.config, registry, true) + if (valid?.isValid) { + filtered.push(c) + } + } + return filtered + } + + public async getUriFromLaunchConfig(config: AwsSamDebuggerConfiguration): Promise { + let targetPath: string + if (isTemplateTargetProperties(config.invokeTarget)) { + targetPath = config.invokeTarget.templatePath + } else if (isCodeTargetProperties(config.invokeTarget)) { + targetPath = config.invokeTarget.projectRoot + } else { + // error + return undefined + } + if (path.isAbsolute(targetPath)) { + return vscode.Uri.file(targetPath) + } + // TODO: rework this logic (and config variables in general) + // we have too many places where we try to resolve these paths when it realistically can be + // in a single place. Much less bug-prone when it's centralized. + // the following line is a quick-fix for a very narrow edge-case + targetPath = targetPath.replace('${workspaceFolder}/', '') + const workspaceFolders = vscode.workspace.workspaceFolders || [] + for (const workspaceFolder of workspaceFolders) { + const absolutePath = tryGetAbsolutePath(workspaceFolder, targetPath) + if (await fs.exists(absolutePath)) { + return vscode.Uri.file(absolutePath) + } + } + + return undefined + } } const WebviewPanel = VueWebview.compilePanel(SamInvokeWebview) @@ -313,7 +431,7 @@ export function registerSamInvokeVueCommand(context: ExtContext): vscode.Disposa const webview = new WebviewPanel(context.extensionContext, context, launchConfig) await telemetry.sam_openConfigUi.run(async (span) => { await webview.show({ - title: localize('AWS.command.launchConfigForm.title', 'Edit SAM Debug Configuration'), + title: localize('AWS.command.launchConfigForm.title', 'Local Invoke and Debug Configuration'), // TODO: make this only open `Beside` when executed via CodeLens viewColumn: vscode.ViewColumn.Beside, }) @@ -321,58 +439,28 @@ export function registerSamInvokeVueCommand(context: ExtContext): vscode.Disposa }) } -async function getUriFromLaunchConfig(config: AwsSamDebuggerConfiguration): Promise { - let targetPath: string - if (isTemplateTargetProperties(config.invokeTarget)) { - targetPath = config.invokeTarget.templatePath - } else if (isCodeTargetProperties(config.invokeTarget)) { - targetPath = config.invokeTarget.projectRoot - } else { - // error - return undefined - } - if (path.isAbsolute(targetPath)) { - return vscode.Uri.file(targetPath) - } - // TODO: rework this logic (and config variables in general) - // we have too many places where we try to resolve these paths when it realistically can be - // in a single place. Much less bug-prone when it's centralized. - // the following line is a quick-fix for a very narrow edge-case - targetPath = targetPath.replace('${workspaceFolder}/', '') - const workspaceFolders = vscode.workspace.workspaceFolders || [] - for (const workspaceFolder of workspaceFolders) { - const absolutePath = tryGetAbsolutePath(workspaceFolder, targetPath) - if (await fs.exists(absolutePath)) { - return vscode.Uri.file(absolutePath) - } - } - - return undefined -} - -async function getLaunchConfigQuickPickItems( - launchConfig: LaunchConfiguration, - uri: vscode.Uri -): Promise { - const existingConfigs = launchConfig.getDebugConfigurations() - const samValidator = new DefaultAwsSamDebugConfigurationValidator(vscode.workspace.getWorkspaceFolder(uri)) - const registry = await globals.templateRegistry - const mapped = existingConfigs.map((val, index) => { - return { - config: val as AwsSamDebuggerConfiguration, - index: index, - label: val.name, - } +export async function registerSamDebugInvokeVueCommand(context: ExtContext, params: { resource: ResourceNode }) { + const launchConfig: AwsSamDebuggerConfiguration | undefined = undefined + const resource = params?.resource.resource + const source = 'AppBuilderLocalInvoke' + const webview = new WebviewPanel(context.extensionContext, context, launchConfig, { + logicalId: resource.resource.Id ?? '', + region: resource.region ?? '', + location: resource.location.fsPath, + handler: resource.resource.Handler!, + runtime: resource.resource.Runtime!, + arn: resource.functionArn ?? '', + stackName: resource.stackName ?? '', + source: source, + }) + await telemetry.sam_openConfigUi.run(async (span) => { + telemetry.record({ source: 'AppBuilderDebugger' }), + await webview.show({ + title: localize('AWS.command.launchConfigForm.title', 'Local Invoke and Debug Configuration'), + // TODO: make this only open `Beside` when executed via CodeLens + viewColumn: vscode.ViewColumn.Beside, + }) }) - // XXX: can't use filter() with async predicate. - const filtered: LaunchConfigPickItem[] = [] - for (const c of mapped) { - const valid = await samValidator.validate(c.config, registry, true) - if (valid?.isValid) { - filtered.push(c) - } - } - return filtered } export function finalizeConfig(config: AwsSamDebuggerConfiguration, name: string): AwsSamDebuggerConfiguration { diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue b/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue index 8d958ff8206..468d7393ac6 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue +++ b/packages/core/src/lambda/vue/configEditor/samInvokeComponent.vue @@ -4,277 +4,388 @@ diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeFrontend.ts b/packages/core/src/lambda/vue/configEditor/samInvokeFrontend.ts index 4bae01fd7dd..95f0fa9a14f 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeFrontend.ts +++ b/packages/core/src/lambda/vue/configEditor/samInvokeFrontend.ts @@ -8,7 +8,12 @@ import { defineComponent } from 'vue' import { AwsSamDebuggerConfiguration } from '../../../shared/sam/debugger/awsSamDebugConfiguration' -import { AwsSamDebuggerConfigurationLoose, SamInvokeWebview } from './samInvokeBackend' +import { + AwsSamDebuggerConfigurationLoose, + LaunchConfigPickItem, + ResourceData, + SamInvokeWebview, +} from './samInvokeBackend' import settingsPanel from '../../../webviews/components/settingsPanel.vue' import { WebviewClientFactory } from '../../../webviews/client' import saveData from '../../../webviews/mixins/saveData' @@ -34,6 +39,15 @@ interface SamInvokeVueData { parameters: VueDataLaunchPropertyObject containerBuild: boolean skipNewImageCheck: boolean + selectedConfig: LaunchConfigPickItem + payloadOption: string + selectedFile: string + selectedFilePath: string + selectedTestEvent: string + TestEvents: string[] + showNameInput: boolean + newTestEventName: string + resourceData: ResourceData | undefined } function newLaunchConfig(existingConfig?: AwsSamDebuggerConfiguration): AwsSamDebuggerConfigurationLoose { @@ -105,6 +119,11 @@ function initData() { parameters: { value: '', errorMsg: '' }, headers: { value: '', errorMsg: '' }, stageVariables: { value: '', errorMsg: '' }, + selectedConfig: { index: 0, config: undefined, label: 'new-config' }, + selectedTestEvent: '', + TestEvents: [], + showNameInput: false, + newTestEventName: '', } } @@ -114,30 +133,7 @@ export default defineComponent({ settingsPanel, }, created() { - client.init().then( - (config) => this.parseConfig(config), - (e) => { - console.error('client.init failed: %s', (e as Error).message) - } - ) - - client.getRuntimes().then( - (runtimes) => { - this.runtimes = runtimes - }, - (e) => { - console.error('client.getRuntimes failed: %s', (e as Error).message) - } - ) - - client.getCompanyName().then( - (o) => { - this.company = o - }, - (e) => { - console.error('client.getCompanyName failed: %s', (e as Error).message) - } - ) + this.setUpWebView() }, mixins: [saveData], data(): SamInvokeVueData { @@ -152,6 +148,10 @@ export default defineComponent({ ], runtimes: [], httpMethods: ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'PATCH'], + payloadOption: 'sampleEvents', + selectedFile: '', + selectedFilePath: '', + resourceData: undefined, } }, methods: { @@ -161,12 +161,18 @@ export default defineComponent({ this.headers.errorMsg = '' this.stageVariables.errorMsg = '' }, - launch() { + async launch() { const config = this.formatConfig() - config && - client.invokeLaunchConfig(config).catch((e) => { - console.error('invokeLaunchConfig failed: %s', (e as Error).message) - }) + + if (!config) { + return // Exit early if config is not available + } + + const source = this.resourceData?.source + + client.invokeLaunchConfig(config, source).catch((e: Error) => { + console.error(`invokeLaunchConfig failed: ${e.message}`) + }) }, save() { const config = this.formatConfig() @@ -183,16 +189,34 @@ export default defineComponent({ } ) }, - parseConfig(config?: AwsSamDebuggerConfiguration) { + async parseConfig(config?: AwsSamDebuggerConfiguration) { if (!config) { return } const company = this.company this.clearForm() this.launchConfig = newLaunchConfig(config) + if (config.lambda?.payload) { this.payload.value = JSON.stringify(config.lambda.payload.json, undefined, 4) } + + const localArgs = config.sam?.localArguments + + if (!localArgs && this.payload.value) { + this.payloadOption = 'sampleEvents' + this.selectedFile = '' + } + + if (localArgs?.includes('-e') || localArgs?.includes('--event')) { + const index = localArgs.findIndex((arg) => arg === '-e' || arg === '--event') + + if (index !== -1 && localArgs[index + 1]) { + this.payloadOption = 'localFile' + this.selectedFile = await client.getFileName(localArgs[index + 1]) + } + } + if (config.lambda?.environmentVariables) { this.environmentVariables.value = JSON.stringify(config.lambda?.environmentVariables) } @@ -259,6 +283,95 @@ export default defineComponent({ } } }, + async openLaunchJson() { + await client.openLaunchConfig() + }, + onFileChange(event: Event) { + const input = event.target as HTMLInputElement + if (input.files && input.files.length > 0) { + const file = input.files[0] + this.selectedFile = file.name + + // Use Blob.text() to read the file as text + file.text() + .then((text) => { + this.payload.value = text + }) + .catch((error) => { + console.error('Error reading file:', error) + }) + } + }, + async promptForFileLocation() { + const resp = await client.promptFile() + + if (resp) { + this.selectedFile = resp.selectedFile + this.launchConfig.sam = this.launchConfig.sam || {} + this.launchConfig.sam.localArguments = this.launchConfig.sam.localArguments || [] + + // Ensure only one '-e ' or '--event ' exists + const eventArgIndex = this.launchConfig.sam.localArguments.findIndex( + (arg) => arg === '-e' || arg === '--event' + ) + + if (eventArgIndex !== -1 && this.launchConfig.sam.localArguments[eventArgIndex + 1]) { + // Replace the existing file path for either '-e' or '--event' + this.launchConfig.sam.localArguments[eventArgIndex + 1] = resp.selectedFilePath + } else { + // Add '-e ' if not already present + this.launchConfig.sam.localArguments.push('-e', resp.selectedFilePath) + } + } + }, + showNameField() { + this.showNameInput = true + }, + setUpWebView() { + client.init().then( + (config) => this.parseConfig(config), + (e) => { + console.error('client.init failed: %s', (e as Error).message) + } + ) + + if (this.launchConfig.invokeTarget.templatePath === '') { + client.getResourceData().then( + (data) => { + this.resourceData = data + if (this.launchConfig && this.resourceData) { + this.launchConfig.invokeTarget.logicalId = this.resourceData.logicalId + this.launchConfig.invokeTarget.templatePath = this.resourceData.location + this.launchConfig.invokeTarget.lambdaHandler = this.resourceData.handler + if (this.launchConfig.lambda) { + this.launchConfig.lambda.runtime = this.resourceData.runtime + } + } + }, + (e) => { + console.error('client.getResourceData failed: %s', (e as Error).message) + } + ) + } + + client.getRuntimes().then( + (runtimes) => { + this.runtimes = runtimes + }, + (e) => { + console.error('client.getRuntimes failed: %s', (e as Error).message) + } + ) + + client.getCompanyName().then( + (o) => { + this.company = o + }, + (e) => { + console.error('client.getCompanyName failed: %s', (e as Error).message) + } + ) + }, formatConfig() { this.resetJsonErrors() @@ -279,6 +392,27 @@ export default defineComponent({ // propagate those through to the `postMessage` command, causing an error. We can stop // this by recursively accessing all primitive fields (which is what this line does) const launchConfig: AwsSamDebuggerConfigurationLoose = JSON.parse(JSON.stringify(this.launchConfig)) + const localArgs = launchConfig.sam?.localArguments + + const removeEventArg = () => { + if (localArgs) { + const eventArgIndex = localArgs?.findIndex((arg) => arg === '-e' || arg === '--event') + if (eventArgIndex !== -1) { + // Remove the event argument and its value + localArgs?.splice(eventArgIndex, 2) + } + } + } + + if (localArgs) { + if (this.payload && this.payloadOption !== 'localFile') { + removeEventArg() + } else if (this.payloadOption === 'localFile' && this.selectedFile) { + payloadJson = undefined + } else { + removeEventArg() + } + } return { ...launchConfig, @@ -314,7 +448,9 @@ export default defineComponent({ }, clearForm() { const init = initData() - Object.keys(init).forEach((k) => (this.$data[k as keyof typeof init] = init[k as keyof typeof init] as any)) + Object.keys(init).forEach((k) => { + ;(this as any)[k] = init[k as keyof typeof init] + }) }, }, }) diff --git a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts index b75dd9477ba..36ea36a55c5 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts +++ b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts @@ -8,6 +8,7 @@ import { readFileSync } from 'fs' // eslint-disable-line no-restricted-imports import * as _ from 'lodash' import * as vscode from 'vscode' import { DefaultLambdaClient, LambdaClient } from '../../../shared/clients/lambdaClient' +import * as picker from '../../../shared/ui/picker' import { ExtContext } from '../../../shared/extensions' import { getLogger } from '../../../shared/logger' @@ -18,17 +19,35 @@ import { getSampleLambdaPayloads, SampleRequest } from '../../utils' import * as nls from 'vscode-nls' import { VueWebview } from '../../../webviews/main' -import { telemetry } from '../../../shared/telemetry/telemetry' -import { Result } from '../../../shared/telemetry/telemetry' +import { telemetry, Result } from '../../../shared/telemetry/telemetry' import { decodeBase64 } from '../../../shared' +import { + runSamCliRemoteTestEvents, + SamCliRemoteTestEventsParameters, + TestEventsOperation, +} from '../../../shared/sam/cli/samCliRemoteTestEvent' +import { getSamCliContext } from '../../../shared/sam/cli/samCliContext' +import { ToolkitError } from '../../../shared' +import { basename } from 'path' const localize = nls.loadMessageBundle() +type Event = { + name: string + region: string + arn: string + event?: string +} + export interface InitialData { FunctionName: string FunctionArn: string FunctionRegion: string InputSamples: SampleRequest[] + TestEvents?: string[] + Source?: string + StackName?: string + LogicalId?: string } export interface RemoteInvokeData { @@ -36,6 +55,15 @@ export interface RemoteInvokeData { selectedSampleRequest: string sampleText: string selectedFile: string + selectedFilePath: string + selectedTestEvent: string + payload: string + showNameInput: boolean + newTestEventName: string + selectedFunction: string +} +interface SampleQuickPickItem extends vscode.QuickPickItem { + filename: string } export class RemoteInvokeWebview extends VueWebview { @@ -54,7 +82,7 @@ export class RemoteInvokeWebview extends VueWebview { return this.data } - public async invokeLambda(input: string): Promise { + public async invokeLambda(input: string, source?: string): Promise { let result: Result = 'Succeeded' this.channel.show() @@ -79,17 +107,10 @@ export class RemoteInvokeWebview extends VueWebview { this.channel.appendLine('') result = 'Failed' } finally { - telemetry.lambda_invokeRemote.emit({ result, passive: false }) + telemetry.lambda_invokeRemote.emit({ result, passive: false, source: source }) } } - public async getSample(requestName: string) { - const sampleUrl = `${sampleRequestPath}${requestName}` - const sample = (await new HttpResourceFetcher(sampleUrl, { showUrl: true }).get()) ?? '' - - return sample - } - public async promptFile() { const fileLocations = await vscode.window.showOpenDialog({ openLabel: 'Open', @@ -101,14 +122,109 @@ export class RemoteInvokeWebview extends VueWebview { try { const fileContent = readFileSync(fileLocations[0].fsPath, { encoding: 'utf8' }) - return { sample: fileContent, - selectedFile: fileLocations[0].path, + selectedFilePath: fileLocations[0].fsPath, + selectedFile: this.getFileName(fileLocations[0].fsPath), } } catch (e) { getLogger().error('readFileSync: Failed to read file at path %O', fileLocations[0].fsPath, e) - void vscode.window.showErrorMessage((e as Error).message) + throw ToolkitError.chain(e, 'Failed to read selected file') + } + } + + public async loadFile(fileLocations: string) { + return await this.readFile(fileLocations) + } + + private async readFile(filePath: string) { + if (!filePath) { + return undefined + } + const fileLocation = vscode.Uri.file(filePath) + try { + const fileContent = readFileSync(fileLocation.fsPath, { encoding: 'utf8' }) + + return { + sample: fileContent, + selectedFilePath: fileLocation.fsPath, + selectedFile: this.getFileName(fileLocation.fsPath), + } + } catch (e) { + getLogger().error('readFileSync: Failed to read file at path %O', fileLocation.fsPath, e) + throw ToolkitError.chain(e, 'Failed to read selected file') + } + } + + private getFileName(filePath: string): string { + return basename(filePath) + } + + public async listRemoteTestEvents(functionArn: string, region: string): Promise { + const params: SamCliRemoteTestEventsParameters = { + functionArn: functionArn, + operation: TestEventsOperation.List, + region: region, + } + const result = await this.remoteTestEvents(params) + return result.split('\n') + } + + public async createRemoteTestEvents(putEvent: Event) { + const params: SamCliRemoteTestEventsParameters = { + functionArn: putEvent.arn, + operation: TestEventsOperation.Put, + name: putEvent.name, + eventSample: putEvent.event, + region: putEvent.region, + } + return await this.remoteTestEvents(params) + } + public async getRemoteTestEvents(getEvents: Event) { + const params: SamCliRemoteTestEventsParameters = { + name: getEvents.name, + operation: TestEventsOperation.Get, + functionArn: getEvents.arn, + region: getEvents.region, + } + return await this.remoteTestEvents(params) + } + + private async remoteTestEvents(params: SamCliRemoteTestEventsParameters) { + return await runSamCliRemoteTestEvents(params, getSamCliContext().invoker) + } + + public async getSamplePayload(): Promise { + try { + const inputs: SampleQuickPickItem[] = (await getSampleLambdaPayloads()).map((entry) => { + return { label: entry.name ?? '', filename: entry.filename ?? '' } + }) + + const qp = picker.createQuickPick({ + items: inputs, + options: { + title: localize( + 'AWS.lambda.form.pickSampleInput', + 'Enter keywords to filter the list of sample events' + ), + }, + }) + + const choices = await picker.promptUser({ + picker: qp, + }) + const pickerResponse = picker.verifySinglePickerOutput(choices) + + if (!pickerResponse) { + return + } + const sampleUrl = `${sampleRequestPath}${pickerResponse.filename}` + const sample = (await new HttpResourceFetcher(sampleUrl, { showUrl: true }).get()) ?? '' + + return sample + } catch (err) { + getLogger().error('Error getting manifest data..: %O', err as Error) + throw ToolkitError.chain(err, 'getting manifest data') } } } @@ -126,17 +242,23 @@ export async function invokeRemoteLambda( */ outputChannel: vscode.OutputChannel functionNode: LambdaFunctionNode + source?: string } ) { const inputs = await getSampleLambdaPayloads() - const client = new DefaultLambdaClient(params.functionNode.regionCode) - + const resource: any = params.functionNode + const source: string = params.source || 'AwsExplorerRemoteInvoke' + const client = new DefaultLambdaClient(resource.regionCode) const wv = new Panel(context.extensionContext, context.outputChannel, client, { - FunctionName: params.functionNode.configuration.FunctionName ?? '', - FunctionArn: params.functionNode.configuration.FunctionArn ?? '', - FunctionRegion: params.functionNode.regionCode, + FunctionName: resource.configuration.FunctionName ?? '', + FunctionArn: resource.configuration.FunctionArn ?? '', + FunctionRegion: resource.regionCode, InputSamples: inputs, + TestEvents: [], + Source: source, }) - await wv.show({ title: localize('AWS.invokeLambda.title', 'Invoke Lambda {0}', params.functionNode.functionName) }) + await wv.show({ + title: localize('AWS.invokeLambda.title', 'Invoke Lambda {0}', resource.configuration.FunctionName), + }) } diff --git a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.css b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.css new file mode 100644 index 00000000000..99f124e6b0c --- /dev/null +++ b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.css @@ -0,0 +1,132 @@ +.Icontainer { + margin-inline: auto; + margin-top: 5rem; +} + +h1 { + text-align: left; + margin-bottom: 20px; +} + +div { + width: 521px; +} + +.form-row { + display: grid; + grid-template-columns: 150px 1fr; + margin-bottom: 10px; +} +.form-row-select { + width: 387px; + height: 28px; + border: 1px; + border-radius: 5px; + gap: 4px; + padding: 2px 8px; +} + +.dynamic-span { + white-space: nowrap; + text-overflow: initial; + overflow: scroll; + width: 381px; + height: 28px; + font-weight: 500; + font-size: 13px; + line-height: 15.51px; +} + +.form-row-event-select { + width: 244px; + height: 28px; + margin-bottom: 15px; + margin-left: 8px; +} + +.payload-options { + display: grid; + grid-template-columns: 150px 1fr; + align-items: center; + margin-bottom: 10px; +} + +label { + margin-right: 10px; +} + +span, +select, +.payload-options { + display: block; +} + +textarea { + color: var(--vscode-settings-textInputForeground); + background: var(--vscode-settings-textInputBackground); + border: 1px solid var(--vscode-settings-textInputBorder); +} + +.payload-options-button { + display: grid; + align-items: center; + border: none; + padding: 5px 10px; + cursor: pointer; + font-size: 0.9em; + margin-bottom: 10px; +} + +.button-theme-primary { + color: var(--vscode-button-foreground); + background: var(--vscode-button-background); + border: 1px solid var(--vscode-button-border); + padding: 8px 12px; +} +.button-theme-primary:hover:not(:disabled) { + background: var(--vscode-button-hoverBackground); + cursor: pointer; +} +.button-theme-secondary { + color: var(--vscode-button-secondaryForeground); + background: var(--vscode-button-secondaryBackground); + border: 1px solid var(--vscode-button-border); + padding: 8px 12px; +} +.button-theme-secondary:hover:not(:disabled) { + background: var(--vscode-button-secondaryHoverBackground); + cursor: pointer; +} + +.payload-options-buttons { + display: flex; + align-items: center; + margin-top: 10px; + margin-bottom: 10px; +} + +.radio-selector { + width: 15px; + height: 15px; + border-radius: 50%; +} + +.label-selector { + padding-left: 7px; + font-weight: 500; + font-size: 13px; + line-height: 15.51px; + text-align: center; +} + +.form-row-select { + display: grid; + grid-template-columns: 150px 1fr; + margin-bottom: 10px; +} + +.formfield { + display: flex; + align-items: center; + margin-bottom: 0.5rem; +} diff --git a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue index a6e0d70d0f3..9e06ef590ba 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue +++ b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue @@ -1,75 +1,128 @@ /*! * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -