diff --git a/.eslintrc.js b/.eslintrc.js index f31c7299181..c3c7cb602fc 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -180,6 +180,10 @@ module.exports = { message: 'Avoid fs-extra, use shared/fs/fs.ts. Notify the Toolkit team if your required functionality is not available.', }, + { + name: 'fs', + message: 'Avoid node:fs and use shared/fs/fs.ts when possible.', + }, ], }, ], diff --git a/.github/workflows/jscpd.json b/.github/workflows/jscpd.json new file mode 100644 index 00000000000..87dd9ce943e --- /dev/null +++ b/.github/workflows/jscpd.json @@ -0,0 +1,7 @@ +{ + "pattern": "packages/**/*.ts", + "ignore": ["**node_modules**", "**dist**"], + "gitignore": true, + "threshold": 1.34, + "minLines": 15 +} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index f39a9a4b314..ae255b30c76 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x] + node-version: [18.x] vscode-version: [stable] env: NODE_OPTIONS: '--max-old-space-size=8192' @@ -55,6 +55,24 @@ jobs: - run: npm run testCompile - run: npm run lint + jscpd: + needs: lint-commits + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + env: + NODE_OPTIONS: '--max-old-space-size=8192' + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - run: npm install jscpd + - name: Run jscpd + run: npx jscpd --config "$GITHUB_WORKSPACE/.github/workflows/jscpd.json" + macos: needs: lint-commits name: test macOS @@ -62,7 +80,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x] + node-version: [18.x] vscode-version: [minimum, stable, insiders] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} @@ -80,17 +98,6 @@ jobs: uses: coactions/setup-xvfb@v1 with: run: npm test - - name: Code coverage (Core) - env: - # Unset NODE_OPTIONS because of https://github.com/codecov/uploader/issues/475 - NODE_OPTIONS: '' - if: ${{ github.repository == 'aws/aws-toolkit-vscode' && github.ref == 'master' }} - uses: codecov/codecov-action@v4 - with: - flags: macos-core-unittests - verbose: true - file: ./coverage/core/lcov.info - token: ${{ secrets.CODECOV_TOKEN }} - name: Code coverage (Toolkit) env: # Unset NODE_OPTIONS because of https://github.com/codecov/uploader/issues/475 @@ -113,17 +120,6 @@ jobs: verbose: true file: ./coverage/amazonq/lcov.info token: ${{ secrets.CODECOV_TOKEN }} - - name: Code coverage (CodeWhisperer) - env: - # Unset NODE_OPTIONS because of https://github.com/codecov/uploader/issues/475 - NODE_OPTIONS: '' - if: ${{ github.repository == 'aws/aws-toolkit-vscode' && github.ref == 'master' }} - uses: codecov/codecov-action@v4 - with: - flags: codewhisperer - verbose: true - file: ./coverage/core/lcov.info - token: ${{ secrets.CODECOV_TOKEN }} web: needs: lint-commits @@ -132,7 +128,7 @@ jobs: strategy: fail-fast: true matrix: - node-version: [16.x] + node-version: [18.x] vscode-version: [stable, insiders] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} @@ -158,7 +154,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [16.x] + node-version: [18.x] vscode-version: [stable, insiders] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} diff --git a/.github/workflows/notification.yml b/.github/workflows/notification.yml index 109bbabdfb3..ea37b04e0d5 100644 --- a/.github/workflows/notification.yml +++ b/.github/workflows/notification.yml @@ -37,7 +37,7 @@ jobs: if: github.event_name == 'pull_request_target' with: node-version: '20' - - name: Check for tests + - name: Comment about contribution guidelines uses: actions/github-script@v7 if: github.event_name == 'pull_request_target' with: diff --git a/.github/workflows/notify.js b/.github/workflows/notify.js index 9eab77d6318..835acddf706 100644 --- a/.github/workflows/notify.js +++ b/.github/workflows/notify.js @@ -6,9 +6,10 @@ const { hasPath, dedupComment } = require('./utils') const testFilesMessage = - 'This pull request modifies code in src/ but no tests were added/updated. Confirm whether tests should be added or ensure the PR description explains why tests are not required.' + '- This pull request modifies code in `src/*` but no tests were added/updated.\n - Confirm whether tests should be added or ensure the PR description explains why tests are not required.\n' -const changelogMessage = `This pull request implements a feature or fix, so it must include a changelog entry. See [CONTRIBUTING.md#changelog](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#changelog) for instructions.` +const changelogMessage = + '- This pull request implements a `feat` or `fix`, so it must include a changelog entry (unless the fix is for an *unreleased* feature). Review the [changelog guidelines](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#changelog).\n - Note: beta or "experiment" features that have active users *should* announce fixes in the changelog.\n - If this is not a feature or fix, use an appropriate type from the [title guidelines](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#pull-request-title). For example, telemetry-only changes should use the `telemetry` type.\n' /** * Remind partner teams that tests are required. We don't need to remind them if: @@ -44,12 +45,16 @@ module.exports = async ({ github, context }) => { issue_number: pullRequestId, }) + let msg = '' if (shouldAddTestFileMessage) { - await dedupComment({ github, comments, owner, repo, pullRequestId, message: testFilesMessage }) + msg += testFilesMessage } - if (shouldAddChangelogMessage) { - await dedupComment({ github, comments, owner, repo, pullRequestId, message: changelogMessage }) + msg += changelogMessage + } + + if (shouldAddTestFileMessage || shouldAddChangelogMessage) { + await dedupComment({ github, comments, owner, repo, pullRequestId, message: msg }) } } @@ -69,7 +74,12 @@ function requiresChangelogMessage(filenames, title) { * Require the test files message if there are changes to source files but aren't any * changes to the test files */ -function requiresTestFilesMessage(filenames) { +function requiresTestFilesMessage(filenames, title) { + if (/^\s*[mM]erge/.test(title)) { + console.log('"Merge" pull request') + return + } + // Check if src directory changed if (!hasPath(filenames, 'src/')) { console.log('Did not find src files in the code changes') diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c0e946609f9..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,16 +209,16 @@ 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 -You can find the coverage report at `./coverage/amazonq/lcov-report/index.html` and `./coverage/core/lcov-report/index.html` after running the tests. Tests ran from the workspace launch config won't generate a coverage report automatically because it can break file watching. +You can find the coverage report at `./coverage/amazonq/lcov-report/index.html` and `./coverage/toolkit/lcov-report/index.html` after running the tests. Tests ran from the workspace launch config won't generate a coverage report automatically because it can break file watching. ### CodeCatalyst Blueprints @@ -345,14 +345,16 @@ The `aws.dev.forceDevMode` setting enables or disables Toolkit "dev mode". Witho - Example: `getLogger().error('topic: widget failed: %O', { foo: 'bar', baz: 42 })` - Log messages are written to the extension Output channel, which you can view in vscode by visiting the "Output" panel and selecting `AWS Toolkit Logs` or `Amazon Q Logs`. - Use the `aws.dev.logfile` setting to set the logfile path to a fixed location, so you can follow - and filter logs using shell tools like `tail` and `grep`. For example in settings.json, - ``` - "aws.dev.logfile": "~/awstoolkit.log", - ``` - then you can tail the logfile in your terminal: - ``` - tail -F ~/awstoolkit.log - ``` + and filter logs using shell tools like `tail` and `grep`. + - Note: this always logs at **debug log-level** (though you can temporarily override that from the `AWS Toolkit Logs` UI). + - Example `settings.json`: + ``` + "aws.dev.logfile": "~/awstoolkit.log", + ``` + then you can tail the logfile in your terminal: + ``` + tail -F ~/awstoolkit.log + ``` - Use the `AWS (Developer): Watch Logs` command to watch and filter Toolkit logs (including telemetry) in VSCode. - Only available if you enabled "dev mode" (`aws.dev.forceDevMode` setting, see above). diff --git a/buildspec/linuxE2ETests.yml b/buildspec/linuxE2ETests.yml index 2413908988f..e5e984e220b 100644 --- a/buildspec/linuxE2ETests.yml +++ b/buildspec/linuxE2ETests.yml @@ -41,7 +41,7 @@ phases: - VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}" - CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') - CI_BUILD_ID="${CODEBUILD_BUILD_ID}" - - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/core/lcov.info --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info + - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info finally: - rm -rf ~/.aws/sso/cache || true reports: diff --git a/buildspec/linuxIntegrationTests.yml b/buildspec/linuxIntegrationTests.yml index 31153176e9c..49481c5f8f0 100644 --- a/buildspec/linuxIntegrationTests.yml +++ b/buildspec/linuxIntegrationTests.yml @@ -21,7 +21,7 @@ phases: install: run-as: root runtime-versions: - nodejs: 16 + nodejs: 18 dotnet: 6.0 java: latest @@ -75,7 +75,7 @@ phases: - VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}" - CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') - CI_BUILD_ID="${CODEBUILD_BUILD_ID}" - - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/core/lcov.info --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info + - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info post_build: commands: # Destroy .netrc to avoid leaking $GITHUB_READONLY_TOKEN. diff --git a/buildspec/linuxTests.yml b/buildspec/linuxTests.yml index 41f84d2b237..d8fff088c2f 100644 --- a/buildspec/linuxTests.yml +++ b/buildspec/linuxTests.yml @@ -18,7 +18,7 @@ phases: install: run-as: root runtime-versions: - nodejs: 16 + nodejs: 18 commands: - bash buildspec/shared/linux-install.sh @@ -48,7 +48,7 @@ phases: - VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}" - CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g') # Encode `#` in the URL because otherwise the url is clipped in the Codecov.io site - CI_BUILD_ID="${CODEBUILD_BUILD_ID}" - - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/core/lcov.info --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info + - test -n "${CODECOV_TOKEN}" && [ "$TARGET_BRANCH" = "master" ] && ./codecov --token=${CODECOV_TOKEN} --branch=${CODEBUILD_RESOLVED_SOURCE_VERSION} --repository=${CODEBUILD_SOURCE_REPO_URL} --file=./coverage/amazonq/lcov.info --file=./coverage/toolkit/lcov.info reports: unit-test: diff --git a/buildspec/packageTestVsix.yml b/buildspec/packageTestVsix.yml index e10fbebbf90..73f15c0ba10 100644 --- a/buildspec/packageTestVsix.yml +++ b/buildspec/packageTestVsix.yml @@ -13,7 +13,7 @@ phases: install: run-as: root runtime-versions: - nodejs: 16 + nodejs: 18 commands: - bash buildspec/shared/linux-install.sh diff --git a/buildspec/shared/common.sh b/buildspec/shared/common.sh index f2c08626fd5..704f97799d8 100644 --- a/buildspec/shared/common.sh +++ b/buildspec/shared/common.sh @@ -9,7 +9,7 @@ # - "Webview is disposed": only happens on vscode "minimum" (1.68.0) # - "HTTPError: Response code …": caused by github rate-limiting. # - "npm WARN deprecated querystring": transitive dep of aws sdk v2 (check `npm ls querystring`), so that's blocked until we migrate to v3. -_ignore_pat='Timed-out waiting for browser login flow\|HTTPError: Response code 403\|HTTPError: Response code 404\|npm WARN deprecated querystring' +_ignore_pat='Timed-out waiting for browser login flow\|HTTPError: Response code 403\|HTTPError: Response code 404\|npm WARN deprecated querystring\|npm WARN deprecated' if [ "$VSCODE_TEST_VERSION" = 'minimum' ]; then _ignore_pat="$_ignore_pat"'\|Webview is disposed' fi diff --git a/buildspec/shared/linux-pre_build.sh b/buildspec/shared/linux-pre_build.sh index 25e9f0c879f..102103ff30c 100644 --- a/buildspec/shared/linux-pre_build.sh +++ b/buildspec/shared/linux-pre_build.sh @@ -22,5 +22,5 @@ if [ "$TOOLKITS_CODEARTIFACT_DOMAIN" ] && [ "$TOOLKITS_CODEARTIFACT_REPO" ] && [ fi # TODO: move this to the "install" phase? -export NODE_OPTIONS=--max-old-space-size=8192 +export NODE_OPTIONS='--max-old-space-size=8192' npm 2>&1 ci | run_and_report 2 'npm WARN deprecated' 'Deprecated dependencies must be updated.' diff --git a/buildspec/windowsTests.yml b/buildspec/windowsTests.yml index 820c9fa608a..4b19dec5eb2 100644 --- a/buildspec/windowsTests.yml +++ b/buildspec/windowsTests.yml @@ -5,7 +5,7 @@ env: phases: install: runtime-versions: - nodejs: 16 + nodejs: 18 commands: - | if(-Not($Env:CODECOV_TOKEN -eq $null)) { diff --git a/docs/TESTPLAN.md b/docs/TESTPLAN.md index 0323ce3165f..56a299c9a5b 100644 --- a/docs/TESTPLAN.md +++ b/docs/TESTPLAN.md @@ -42,6 +42,11 @@ The test suite has the following categories of tests: - Live in `src/testE2E` - These tests are heavier than Integration tests. - Some E2E tests have a more complicated architecture, described in [TEST_E2E](./TEST_E2E.md) +- Performance Tests: **slow** tests + - Live in `src/testInteg/perf`. + - A subset of integration tests focused on catching performance regressions. + - Use a combination of operation counting and system usage statistics such as cpu usage, memory usage, and duration. + - Each test is often repeated 10 or more times for less variant system usage statistics, then median of runs is used. ## Test files diff --git a/docs/build.md b/docs/build.md index 8c6de3a9e84..ffa9e1a8a81 100644 --- a/docs/build.md +++ b/docs/build.md @@ -1,11 +1,23 @@ # Build -The AmazonQ features rely on the `codewhisperer-streaming` service, who's client -is generated from the service's smithy models and placed in -`src.gen/@amzn/codewhisperer-streaming` (For more -information about this client and how it is generated, please see this +The AmazonQ features rely on the `codewhisperer-streaming` service, to support both Sigv4 and Bearer token modes of this service, +two clients are generated from the service's smithy models and placed in +`src.gen/@amzn/amazon-q-developer-streaming-client` and `src.gen/@amzn/codewhisperer-streaming` respectively (For more +information about these clients and how they are generated, please see this [quip document](https://quip-amazon.com/2dAWAvTIYXXr/Build-instructions-for-AWS-CodeWhisperer-Streaming-Typescript-client)). +## @amzn/amazon-q-developer-streaming client + +This client is a standalone npm project in typescript, and it is added to +the project as a workspace in the project's root `package.json` with the line `"workspaces": [ ..., "src.gen/@amzn/amazon-q-developer-streaming" ]`. +The client may be manually built using `npm run build -w @amzn/amazon-q-developer-streaming"`. +The `generateClients` run script ensures that this dependency is +built before the toolkit project itself. Workspaces are automatically ready to +be imported in the root toolkit project by their declared package.json name, +(`@amzn/amazon-q-developer-streaming` in this case). + +## @amzn/codewhisperer-streaming client + This client is a standalone npm project in typescript, and it is added to the project as a workspace in the project's root `package.json` with the line `"workspaces": [ ..., "src.gen/@amzn/codewhisperer-streaming" ]`. The client may be manually built using `npm run build -w @amzn/codewhisperer-streaming"`. diff --git a/docs/marketplace/vscode/infraComposer.webp b/docs/marketplace/vscode/infraComposer.webp new file mode 100644 index 00000000000..ff417f35537 Binary files /dev/null and b/docs/marketplace/vscode/infraComposer.webp differ diff --git a/docs/telemetry-perf.md b/docs/telemetry-perf.md new file mode 100644 index 00000000000..892ba8f6a57 --- /dev/null +++ b/docs/telemetry-perf.md @@ -0,0 +1,613 @@ +# Telemetry Performance Metrics + +Visual representations of performance telemetry metrics + +## Amazon Q Inline + +### codewhispererFirstCompletionLatency + +How long it took to receive the first suggestion after we started calling the getRecommendations API + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + + sdk->>rHandler: Return client + note over rHandler, backend: codewhispererFirstCompletionLatency + rect rgb(230, 230, 230, 0.5) + loop Get paginated recommendations + rHandler->>backend: calls + end + backend->>rHandler: first response received + end + rHandler->>User: show results + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results +``` + +### codewhispererEndToEndLatency + +How long it took from when we started calling the getRecommendations API to when the first suggestion was shown + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + + sdk->>rHandler: Return client + note over User, backend: codewhispererEndToEndLatency + rect rgb(230, 230, 230, 0.5) + loop Get paginated recommendations + rHandler->>backend: calls + end + backend->>rHandler: first response received + rHandler->>User: show results + end + + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results +``` + +### codewhispererAllCompletionsLatency + +How long it took to complete all paginated calls + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + + sdk->>rHandler: Return client + note over User, backend: codewhispererAllCompletionsLatency + rect rgb(230, 230, 230, 0.5) + loop Get paginated recommendations + rHandler->>backend: calls + end + backend->>rHandler: first response received + rHandler->>User: show results + backend->>rHandler: all the other responses + end + + + rHandler->>User: add to already shown results +``` + +### codewhispererPostprocessingLatency + +How long it took to display the first suggestion after it received the first response from the API + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + + sdk->>rHandler: Return client + loop Get paginated recommendations + rHandler->>backend: calls + end + note over User, backend: codewhispererPostprocessingLatency + rect rgb(230, 230, 230, 0.5) + backend->>rHandler: first response received + rHandler->>User: show results + end + + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results +``` + +### codewhispererCredentialFetchingLatency + +How long it took to get the bearer token + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + note over sdk, token: codewhispererCredentialFetchingLatency + rect rgb(230, 230, 230, 0.5) + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + end + sdk->>rHandler: Return client + loop Get paginated recommendations + rHandler->>backend: calls + end + + backend->>rHandler: first response received + rHandler->>User: show results + + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results +``` + +### codewhispererPreprocessingLatency + +How long it took to create the client and get ready to start sending getRecommendation API calls + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + User->>invoke: Finished typing + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + + note over rHandler, token: codewhispererPreprocessingLatency + rect rgb(230, 230, 230, 0.5) + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + sdk->>rHandler: Return client + end + loop Get paginated recommendations + rHandler->>backend: calls + end + + backend->>rHandler: first response received + rHandler->>User: show results + + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results +``` + +### codewhisperer_perceivedLatency duration + +How long it took from when the user stopped pressing a key to when they were shown a response + +```mermaid + sequenceDiagram + participant User + participant invoke as Inline invoked + participant rService as Recommendation Service + participant rHandler as Recommendation Handler + participant backend as CWSPR backend + participant sdk as Create CWSPR SDK + participant token as Toolkit auth + + User->>invoke: Finished typing + note over User, token: codewhisperer_perceivedLatency duration + rect rgb(230, 230, 230, 0.5) + invoke->>rService: calls + rService->>rHandler: calls + rHandler->>sdk: calls + sdk->>token: Start getting bearer token + token->>sdk: Finished getting bearer token + sdk->>rHandler: Return client + + loop Get paginated recommendations + rHandler->>backend: calls + end + + backend->>rHandler: first response received + rHandler->>User: show results + + backend->>rHandler: all the other responses + rHandler->>User: add to already shown results + end +``` + +## Amazon Q Chat + +### amazonq_chatRoundTrip + +Measures sequential response times in Q chat, from user input to message display. Tracks time intervals between key events: editor receiving the message, feature processing, and final message rendering + +```mermaid + sequenceDiagram + participant User + participant chat as Chat UI + participant vscode as VSCode + participant event as Event Recorder + participant partner as Partner team code + participant telemetry + + User->>chat: Write chat message and press enter + chat->>vscode: send message with timestamp + vscode->>event: record chatMessageSent/editorReceivedMessage timestamps + vscode->>partner: forward chat message + partner->>event: record featureReceivedMessage timestamp + partner->>partner: call backend/get response + partner->>vscode: forward response contents + vscode->>chat: display message + chat->>vscode: send stop-chat-message-telemetry event + vscode->>event: record messageDisplayed timestamp + event->>vscode: get the telemetry timestamps + vscode->>telemetry: emit amazonq_chatRoundTrip with telemetry timestamps +``` + +### cwsprChatTimeToFirstChunk + +The time between when the conversation stream is created and when we got back the first usable result + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + note over backend, generateResponse: cwsprChatTimeToFirstChunk + rect rgb(230, 230, 230, 0.5) + backend->>backend: generate first chunk + backend->>generateResponse: chunk received + end + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end +``` + +### cwsprChatTimeBetweenChunks + +An array of time when successive pieces of data are received from the server + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + + loop for each subsequent chunk + note over backend, generateResponse: cwsprChatTimeBetweenChunks + rect rgb(230, 230, 230, 0.5) + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>generateResponse: record timestamp + end + + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end +``` + +### cwsprChatFullResponseLatency + +The time between when the conversation id was created and the final response from the server was received + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + + note over backend, chat: cwsprChatFullResponseLatency + rect rgb(230, 230, 230, 0.5) + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end + backend->>generateResponse: final chunk received + end + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk +``` + +### cwsprChatTimeToFirstUsableChunk + +The time between the initial server request, including creating the conversation stream, and the first usable result + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + note over backend, generateResponse: cwsprChatTimeToFirstUsableChunk + rect rgb(230, 230, 230, 0.5) + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + backend->>backend: generate first chunk + backend->>generateResponse: chunk received + end + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end +``` + +### cwsprChatFullServerResponseLatency + +The time between the initial server request, including creating the conversation stream, and the final response from the server + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + note over backend, chat: cwsprChatFullServerResponseLatency + rect rgb(230, 230, 230, 0.5) + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end + backend->>generateResponse: final chunk received + end + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk +``` + +### cwsprChatTimeToFirstDisplay + +The time between the user pressing enter and when the first piece of data is displayed to the user + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + note over backend, user: cwsprChatTimeToFirstDisplay + rect rgb(230, 230, 230, 0.5) + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + backend->>backend: generate first chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + end +``` + +### cwsprChatTimeBetweenDisplays + +An array of time when successive pieces of server responses are displayed to the user + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + + note over backend, chat: cwsprChatTimeBetweenDisplays + rect rgb(230, 230, 230, 0.5) + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>generateResponse: chunk received + generateResponse->>vscode: send chunk to display + vscode->>chat: display chunk + chat->>vscode: record display timestamp + end + end +``` + +### cwsprChatFullDisplayLatency + +The time between the user pressing enter and the entire response being rendered + +```mermaid + sequenceDiagram + participant user as User + participant chat as Chat UI + participant vscode as VSCode extension host + participant generateResponse as Generate response + participant backend as Q service backend + + note over backend, user: cwsprChatFullDisplayLatency + rect rgb(230, 230, 230, 0.5) + user->>chat: Presses enter with message + chat->>vscode: Tell VSCode to generate a response + vscode->>generateResponse: start generating + generateResponse->>backend: start stream + backend->>backend: create conversation id + backend->>generateResponse: get conversation id + generateResponse->>backend: start stream + backend->>backend: create conversation id + loop for each subsequent chunk + backend->>backend: generate next chunk + backend->>vscode: send chunk to display + vscode->>chat: display chunk + end + end + +``` + +## Crash Monitoring + +We make an attempt to gather information regarding when the IDE crashes, then report it to telemetry. This is the diagram of the steps that take place. + +### Sequence Diagram + +> Keep in mind that the entire sequence below is duplicated for each instance of our extension. +> They all work together to "crash check" on behalf of the other crashed extension instance. + +`Crash Service`: The high level "service" that starts the heartbeats and crash checks + +`Heartbeat`: Sends heartbeats which signal that the extension is still running and has not crashed + +`Crash Checker`: Observes the heartbeats, reporting a telemetry event if a crash is detected + +`File System State`: The user's file system where we store the heartbeat files from each extension instance + +```mermaid +%%{init: {'theme':'default'}}%% +sequenceDiagram + autonumber + + participant VSC as VS Code + participant Service as Crash Service + participant Checker as Crash Checker + participant Heartbeat as Heartbeat + participant State as File System State + participant Telemetry as Telemetry + + rect rgb(121, 210, 121) + alt Extension Startup + VSC ->> Service: activate() - Start Service + + Service ->> Heartbeat: Start Heartbeats + Heartbeat ->> State: Send Initial Heartbeat
(in a folder add a unique file w/ timestamp) + rect rgb(64, 191, 64) + par every N minutes + Heartbeat ->> State: Send Heartbeat
(overwrite the unique file w/ new timestamp) + end + end + + Service ->> Checker: Start Crash Checking + rect rgb(64, 191, 64) + par every N*2 minutes + Checker ->> Checker: If computer went to sleep, skip this iteration (gives time for a heartbeat) + Checker ->> State: Request all heartbeat timestamps (readdir all heartbeat files) + State ->> Checker: Receive all heartbeat timestamps + loop for each crashed extension (it's timestamp >= N*2 minutes) + Checker ->> State: Delete heartbeat file + Checker ->> Telemetry: Send metric representing a crash: session_end + end + end + end + end + end + + rect rgb(255, 128, 128) + alt Graceful Shutdown + VSC ->> Service: deactivate() - Stop Service + Service ->> Checker: Stop + Service ->> Heartbeat: Stop + Heartbeat ->> State: Delete timestamp file
(This is missed when a crash happens) + end + end + +``` diff --git a/package-lock.json b/package-lock.json index cc42d933cd4..f5afc020fa2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,15 +15,18 @@ "plugins/*" ], "dependencies": { + "@aws-toolkits/telemetry": "^1.0.242", + "@types/node": "^22.7.5", "vscode-nls": "^5.2.0", "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.267", + "@aws-toolkits/telemetry": "^1.0.274", "@playwright/browser-chromium": "^1.43.1", + "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", "@types/vscode-webview": "^1.57.1", - "@types/webpack-env": "^1.18.1", + "@types/webpack-env": "^1.18.5", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.14.1", "@vscode/codicons": "^0.0.33", @@ -38,14 +41,14 @@ "eslint-plugin-security-node": "^1.1.4", "eslint-plugin-unicorn": "^54.0.0", "husky": "^9.0.7", - "prettier": "^3.3.2", + "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", "ts-node": "^10.9.1", "typescript": "^5.0.4", - "webpack": "^5.83.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^4.15.2", "webpack-merge": "^5.10.0" } }, @@ -57,875 +60,1121 @@ "node": ">=0.10.0" } }, + "node_modules/@amzn/amazon-q-developer-streaming-client": { + "resolved": "src.gen/@amzn/amazon-q-developer-streaming-client", + "link": true + }, "node_modules/@amzn/codewhisperer-streaming": { "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/crc32": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "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-cognito-identity/node_modules/@aws-crypto/sha256-browser/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": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-crypto/crc32/node_modules/@aws-sdk/types": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz", + "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-crypto/crc32/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-crypto/util": { + "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.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", + "node_modules/@aws-crypto/sha256-browser/node_modules/@aws-sdk/types": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz", + "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==", "license": "Apache-2.0", "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", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "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", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", "dependencies": { - "@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-cognito-identity/node_modules/@smithy/config-resolver": { - "version": "3.0.5", + "node_modules/@aws-crypto/sha256-js/node_modules/@aws-sdk/types": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz", + "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==", "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", + "@smithy/types": "^3.5.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", + "node_modules/@aws-crypto/sha256-js/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "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-cognito-identity/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", "dependencies": { - "@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-cognito-identity/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@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-cognito-identity/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-crypto/util/node_modules/@aws-sdk/types": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz", + "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.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/invalid-dependency": { - "version": "3.0.3", + "node_modules/@aws-crypto/util/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "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/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.682.0.tgz", + "integrity": "sha512-RJVzgm9Q15yWnU4mFiHEO1M7k8d5ARgDhGkKSz5sE10dzG5vKockqkhgvwBgmwiAgkfnSkI/Bzx3/baBMm9BVQ==", "dependencies": { - "tslib": "^2.6.2" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/client-sts": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.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", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "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/client-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.682.0.tgz", + "integrity": "sha512-PYH9RFUMYLFl66HSBq4tIx6fHViMLkhJHTYJoJONpBs+Td+NwVJ895AdLtDsBIhMS0YseCbPpuyjUCJgsUrwUw==", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.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/middleware-endpoint": { - "version": "3.1.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.682.0.tgz", + "integrity": "sha512-ZPZ7Y/r/w3nx/xpPzGSqSQsB090Xk5aZZOH+WBhTDn/pBEuim09BYXCLzvvxb7R7NnuoQdrTJiwimdJAhHl7ZQ==", "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-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.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.682.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/client-sts": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.682.0.tgz", + "integrity": "sha512-xKuo4HksZ+F8m9DOfx/ZuWNhaPuqZFPwwy0xqcBT6sWH7OAuBjv/fnpOTzyQhpVTWddlf+ECtMAMrxjxuOExGQ==", "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-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.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/middleware-serde": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/core": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.679.0.tgz", + "integrity": "sha512-CS6PWGX8l4v/xyvX8RtXnBisdCa5+URzKd0L6GvHChype9qKUVxO/Gg6N/y43Hvg7MNWJt9FBPNWIxUB+byJwg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.679.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/middleware-stack": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.679.0.tgz", + "integrity": "sha512-EdlTYbzMm3G7VUNAMxr9S1nC1qUNqhKlAxFU8E7cKsAe8Bp29CD5HAs3POc56AVo9GC4yRIS+/mtlZSmrckzUA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.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/node-config-provider": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.679.0.tgz", + "integrity": "sha512-ZoKLubW5DqqV1/2a3TSn+9sSKg0T8SsYMt1JeirnuLJF0mCoYFUaWMyvxxKuxPoqvUsaycxKru4GkpJ10ltNBw==", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.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/node-http-handler": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.682.0.tgz", + "integrity": "sha512-6eqWeHdK6EegAxqDdiCi215nT3QZPwukgWAYuVxNfJ/5m0/P7fAzF+D5kKVgByUvGJEbq/FEL8Fw7OBe64AA+g==", "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/core": "3.679.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.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.682.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/credential-provider-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.682.0.tgz", + "integrity": "sha512-HSmDqZcBVZrTctHCT9m++vdlDfJ1ARI218qmZa+TZzzOFNpKWy6QyHMEra45GB9GnkkMmV6unoDSPMuN0AqcMg==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-ini": "3.682.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.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/protocol-http": { - "version": "4.1.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.679.0.tgz", + "integrity": "sha512-u/p4TV8kQ0zJWDdZD4+vdQFTMhkDEJFws040Gm113VHa/Xo1SYOjbpvqeuFoz6VmM0bLvoOWjxB9MxnSQbwKpQ==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.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/querystring-builder": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.682.0.tgz", + "integrity": "sha512-h7IH1VsWgV6YAJSWWV6y8uaRjGqLY3iBpGZlXuTH/c236NMLaNv+WqCBLeBxkFGUb2WeQ+FUPEJDCD69rgLIkg==", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@aws-sdk/client-sso": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/token-providers": "3.679.0", + "@aws-sdk/types": "3.679.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/querystring-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.679.0.tgz", + "integrity": "sha512-a74tLccVznXCaBefWPSysUcLXYJiSkeUmQGtalNgJ1vGkE36W5l/8czFiiowdWdKWz7+x6xf0w+Kjkjlj42Ung==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.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.679.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/middleware-host-header": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.679.0.tgz", + "integrity": "sha512-y176HuQ8JRY3hGX8rQzHDSbCl9P5Ny9l16z4xmaiLo+Qfte7ee4Yr3yaAKd7GFoJ3/Mhud2XZ37fR015MfYl2w==", "dependencies": { - "@smithy/types": "^3.3.0" + "@aws-sdk/types": "3.679.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/shared-ini-file-loader": { - "version": "3.1.4", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-logger": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.679.0.tgz", + "integrity": "sha512-0vet8InEj7nvIvGKk+ch7bEF5SyZ7Us9U7YTEgXPrBNStKeRUsgwRm0ijPWWd0a3oz2okaEwXsFl7G/vI0XiEA==", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.679.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/smithy-client": { - "version": "3.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.679.0.tgz", + "integrity": "sha512-sQoAZFsQiW/LL3DfKMYwBoGjYDEnMbA9WslWN8xneCmBAwKo6IcSksvYs23PP8XMIoBGe2I2J9BSr654XWygTQ==", "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.679.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/types": { - "version": "3.3.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.682.0.tgz", + "integrity": "sha512-7TyvYR9HdGH1/Nq0eeApUTM4izB6rExiw87khVYuJwZHr6FmvIL1FsOVFro/4WlXa0lg4LiYOm/8H8dHv+fXTg==", "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.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/url-parser": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.679.0.tgz", + "integrity": "sha512-Ybx54P8Tg6KKq5ck7uwdjiKif7n/8g1x+V0V9uTjBjRWqaIgiqzXwKWoPj6NCNkE7tJNtqI4JrNxp/3S3HvmRw==", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.679.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/util-base64": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/token-providers": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.679.0.tgz", + "integrity": "sha512-1/+Zso/x2jqgutKixYFQEGli0FELTgah6bm7aB+m2FAWH4Hz7+iMUsazg6nSWm714sG9G3h5u42Dmpvi9X6/hA==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "3.679.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.679.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/@aws-sdk/types": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.679.0.tgz", + "integrity": "sha512-NwVq8YvInxQdJ47+zz4fH3BRRLC6lL+WLkvr242PVBbUOLRyK/lkwHlfiKUoeVIMyK5NF+up6TRg71t/8Bny6Q==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.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-body-length-browser": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.679.0.tgz", + "integrity": "sha512-YL6s4Y/1zC45OvddvgE139fjeWSKKPgLlnfrvhVL7alNyY9n7beR4uhoDpNrt5mI6sn9qiBF17790o+xLAXjjg==", "dependencies": { + "@aws-sdk/types": "3.679.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/util-body-length-node": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.679.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.679.0.tgz", + "integrity": "sha512-CusSm2bTBG1kFypcsqU8COhnYc6zltobsqs3nRrvYqYaOqtMnuE46K4XTWpnzKgwDejgZGOE+WYyprtAxrPvmQ==", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.682.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.682.0.tgz", + "integrity": "sha512-so5s+j0gPoTS0HM4HPL+G0ajk0T6cQAg8JXzRgvyiQAxqie+zGCZAV3VuVeMNWMVbzsgZl0pYZaatPFTLG/AxA==", "dependencies": { + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "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/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", "dependencies": { + "@smithy/types": "^3.6.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/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": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.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": ">= 10.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/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/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": ">=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/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", "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/middleware-retry": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "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/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.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/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", "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", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "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", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "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/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^3.6.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": { - "version": "3.0.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda": { - "version": "3.637.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", "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", + "@smithy/types": "^3.6.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/@aws-crypto/crc32": { - "version": "5.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.6.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", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/service-error-classification": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", "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" + "@smithy/types": "^3.6.0" + }, + "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", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", "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", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/util": { - "version": "5.2.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "license": "Apache-2.0", + "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/util-buffer-from": "^2.2.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/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/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/abort-controller": { - "version": "3.1.1", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/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/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "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-cloudformation/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "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", + "@smithy/types": "^3.6.0", "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", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-retry": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", "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", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", - "license": "Apache-2.0", - "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.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/eventstream-serde-config-resolver": { - "version": "3.0.3", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.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/eventstream-serde-node": { - "version": "3.0.5", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-cloudformation/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/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/eventstream-serde-universal": { - "version": "3.0.5", - "license": "Apache-2.0", + "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/eventstream-codec": "^3.1.2", - "@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/fetch-http-handler": { - "version": "3.2.4", + "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/querystring-builder": "^3.0.3", + "@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-lambda/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.609.0", "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-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/abort-controller": { + "version": "3.1.1", "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/invalid-dependency": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cognito-identity/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": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -935,19 +1184,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/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-lambda/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -963,7 +1200,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { "version": "3.0.15", "license": "Apache-2.0", "dependencies": { @@ -981,7 +1218,7 @@ "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/middleware-serde": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -992,7 +1229,7 @@ "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/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1003,7 +1240,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1016,7 +1253,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1030,7 +1267,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -1041,7 +1278,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -1052,7 +1289,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1064,7 +1301,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1075,7 +1312,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1085,7 +1322,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1096,7 +1333,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -1111,7 +1348,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -1121,7 +1358,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1130,7 +1367,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1142,7 +1379,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "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": { @@ -1153,64 +1390,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/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-lambda/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-lambda/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-lambda/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-lambda/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-lambda/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1220,7 +1400,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1231,7 +1411,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1243,7 +1423,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -1260,7 +1440,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "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": { @@ -1271,7 +1451,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1281,7 +1461,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1292,7 +1472,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "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": { @@ -1303,13 +1483,16 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso": { + "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", @@ -1321,6 +1504,9 @@ "@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", @@ -1343,243 +1529,59 @@ "@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-sso-oidc": { - "version": "3.637.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.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" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-lambda/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-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-lambda/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-sso-oidc/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-lambda/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-sso-oidc/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-sso-oidc/node_modules/@aws-crypto/util": { - "version": "5.2.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": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -1595,7 +1597,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { "version": "3.0.15", "license": "Apache-2.0", "dependencies": { @@ -1613,7 +1615,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-serde": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1624,7 +1626,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1635,7 +1637,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1648,7 +1650,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1662,7 +1664,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -1673,7 +1675,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -1684,7 +1686,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1696,7 +1698,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1707,7 +1709,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1717,7 +1719,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -1728,7 +1730,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -1743,7 +1745,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -1753,7 +1755,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1762,7 +1764,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1774,7 +1776,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "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": { @@ -1785,64 +1787,7 @@ "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": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1852,7 +1797,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1863,7 +1808,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -1875,7 +1820,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -1892,7 +1837,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1903,7 +1848,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1913,7 +1858,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1924,7 +1869,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -1935,120 +1880,127 @@ "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", - "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/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.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-sso/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-sso/node_modules/@aws-crypto/util": { - "version": "5.2.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/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/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-sso": { + "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/core": "3.635.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-sso/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@aws-sdk/client-sso-oidc": { + "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/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" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.609.0", "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-oidc/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "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/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", "dependencies": { @@ -2059,39 +2011,7 @@ "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": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2101,19 +2021,7 @@ "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": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -2129,7 +2037,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-retry": { "version": "3.0.15", "license": "Apache-2.0", "dependencies": { @@ -2147,7 +2055,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-serde": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2158,7 +2066,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2169,7 +2077,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2182,7 +2090,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2196,7 +2104,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -2207,7 +2115,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -2218,7 +2126,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2230,7 +2138,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2241,7 +2149,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/service-error-classification": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2251,7 +2159,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2262,7 +2170,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -2277,7 +2185,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -2287,7 +2195,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2296,7 +2204,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2308,7 +2216,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2319,14 +2227,7 @@ "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": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2336,253 +2237,228 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { + "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/util-defaults-mode-browser": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", + "@smithy/service-error-classification": "^3.0.3", "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream": { + "version": "3.1.3", "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/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": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream/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/util-middleware": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sso-oidc/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-sso/node_modules/@smithy/util-retry": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@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-sso/node_modules/@smithy/util-stream": { - "version": "3.1.3", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "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", + "@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/util-stream/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.609.0", "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-sso/node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso/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/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.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": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { "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": { - "version": "3.637.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.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/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/shared-ini-file-loader": "^3.1.4", "@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-sts/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "3.0.15", "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" + "@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/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", "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-sso/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", "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-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-sts/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", + "@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-sts/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "version": "3.1.3", "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-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -2592,148 +2468,133 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/config-resolver": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { + "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-sts/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { + "version": "3.0.3", "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" + "@smithy/types": "^3.3.0" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "version": "3.0.3", "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" + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-sso/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" }, @@ -2741,37 +2602,119 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { + "version": "3.1.3", "license": "Apache-2.0", "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" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@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-sts/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-sso/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/@aws-sdk/client-sso/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/@aws-sdk/client-sso/node_modules/@smithy/util-utf8/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": { + "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/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-sts/node_modules/@aws-sdk/types": { + "version": "3.609.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", "tslib": "^2.6.2" }, @@ -2779,8 +2722,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -2790,30 +2733,62 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/protocol-http": { - "version": "4.1.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/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/querystring-builder": { - "version": "3.0.3", + "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/util-uri-escape": "^3.0.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/querystring-parser": { + "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": { @@ -2824,20 +2799,23 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/service-error-classification": { + "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" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-sts/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" }, @@ -2845,82 +2823,103 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/smithy-client": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.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/util-stream": "^3.1.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/client-sts/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-sts/node_modules/@smithy/url-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/protocol-http": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-builder": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@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-sts/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-parser": { + "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-sts/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sts/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-sts/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-sts/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sts/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-sts/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/types": { + "version": "3.3.0", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2929,34 +2928,36 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/url-parser": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", + "@smithy/querystring-parser": "^3.0.3", "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sts/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": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "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", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-hex-encoding": { @@ -4316,26 +4317,21 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "version": "3.1.3", "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": { + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { "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" }, @@ -4343,60 +4339,18 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "3.3.0", "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/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", - "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/types": { - "version": "3.3.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "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", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.37.0", "license": "Apache-2.0", "dependencies": { "@aws-sdk/property-provider": "3.37.0", @@ -4776,16 +4730,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", @@ -5192,9 +5136,9 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.267", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.267.tgz", - "integrity": "sha512-qVEHuEW6WgqUafJP5oVtlaaWDtn2+6CklzqQgruqH7gxlNLBgi9pM9dpEC8xOYrHN3m1UW0LagUUgRS4ndDOyw==", + "version": "1.0.275", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.275.tgz", + "integrity": "sha512-wy8L1xerMwBq+p/fcMkmR5pmPbZ17hG1dPgmThAaKEj6qYJ42pxEWjsCa+VqftA4FtXj4yEtSdja+M0d6Qd4bQ==", "dev": true, "dependencies": { "ajv": "^6.12.6", @@ -5428,6 +5372,19 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", + "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcherny/json-schema-ref-parser": { "version": "10.0.5-fork", "dev": true, @@ -5903,145 +5860,168 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/core": { - "version": "2.4.0", + "node_modules/@smithy/config-resolver": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", + "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", "license": "Apache-2.0", "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.9", + "@smithy/types": "^3.6.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@smithy/config-resolver/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@smithy/config-resolver/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", "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", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@smithy/config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", + "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "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/@smithy/core/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", + "node_modules/@smithy/config-resolver/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "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" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", + "node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", + "node_modules/@smithy/core/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@smithy/core/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.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", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "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/@smithy/core/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", + "node_modules/@smithy/core/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", "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/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@smithy/core/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -6049,10 +6029,12 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -6060,10 +6042,12 @@ } }, "node_modules/@smithy/core/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -6071,77 +6055,82 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", + "node_modules/@smithy/core/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/service-error-classification": { - "version": "3.0.3", + "node_modules/@smithy/core/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==", "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/@smithy/core/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@smithy/core/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==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/smithy-client": { - "version": "3.2.0", + "node_modules/@smithy/core/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==", "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/@smithy/core/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@smithy/core/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/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/@smithy/core/node_modules/@smithy/util-base64": { - "version": "3.0.0", + "node_modules/@smithy/core/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", "license": "Apache-2.0", "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.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" }, @@ -6149,148 +6138,442 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-body-length-browser": { + "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==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { + "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==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", + "node_modules/@smithy/credential-provider-imds": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", + "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", "license": "Apache-2.0", "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-retry": { - "version": "3.0.3", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-stream": { - "version": "3.1.3", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", "license": "Apache-2.0", "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", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "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", + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", "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", + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" } }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", + "node_modules/@smithy/eventstream-codec": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", + "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.1", + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "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": ">=16.0.0" } }, - "node_modules/@smithy/middleware-retry": { - "version": "2.3.1", + "node_modules/@smithy/eventstream-codec/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==", "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" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", + "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", + "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", + "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", + "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^3.1.7", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", + "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "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==", + "license": "Apache-2.0", + "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==", + "license": "Apache-2.0", + "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.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", + "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "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.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", + "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "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": { @@ -6409,14 +6692,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.0", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.8", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -6436,10 +6721,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -6447,7 +6734,9 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "3.3.0", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -6478,10 +6767,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -6555,66 +6846,96 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.2.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==", "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-endpoints": { - "version": "2.0.5", + "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==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "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==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", + "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.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.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.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==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -6623,267 +6944,943 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-middleware": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-retry": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^2.1.5", - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-stream": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-hex-encoding": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", "license": "Apache-2.0", "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-waiter": { - "version": "3.1.2", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { - "version": "3.1.1", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "defer-to-connect": "^2.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 6" + "node": ">=16.0.0" } }, - "node_modules/@ts-morph/common": { - "version": "0.24.0", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "mkdirp": "^3.0.1", - "path-browserify": "^1.0.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" } }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", + "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==", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16.0.0" } }, - "node_modules/@ts-morph/common/node_modules/mkdirp": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "node_modules/@smithy/util-defaults-mode-browser/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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16.0.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/adm-zip": { - "version": "0.4.34", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/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==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/archiver": { - "version": "6.0.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "@types/readdir-glob": "*" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/async-lock": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.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/@types/bonjour": { - "version": "3.5.10", - "dev": true, - "license": "MIT", + "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==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/bytes": { - "version": "3.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "license": "MIT", + "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==", + "license": "Apache-2.0", "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/circular-dependency-plugin": { - "version": "5.0.8", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", + "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*", - "webpack": "^5.1.0" + "@smithy/config-resolver": "^3.0.10", + "@smithy/credential-provider-imds": "^3.2.5", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-defaults-mode-node/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==", + "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/@smithy/util-defaults-mode-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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.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-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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", + "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "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/util-retry": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^2.1.5", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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/@smithy/util-waiter": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", + "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "minimatch": "^9.0.4", + "mkdirp": "^3.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@ts-morph/common/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/adm-zip": { + "version": "0.4.34", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/async-lock": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/bytes": { + "version": "3.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/circular-dependency-plugin": { + "version": "5.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "webpack": "^5.1.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", "dev": true, "license": "MIT", "dependencies": { @@ -6941,14 +7938,6 @@ "@types/range-parser": "*" } }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/glob": { "version": "8.1.0", "dev": true, @@ -6963,6 +7952,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/he": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", + "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "license": "MIT" @@ -7056,9 +8052,13 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "14.18.63", - "license": "MIT" + "node_modules/@types/node": { + "version": "22.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.4.tgz", + "integrity": "sha512-SpNNxkftTJOPk0oN+y2bIqurEXHTA2AOZ3EJDDKeJ5VzkvvORSvmQXGQarcOzWV1ac7DCaPBEdMDxBsM+d8jWw==", + "dependencies": { + "undici-types": "~6.19.8" + } }, "node_modules/@types/node-fetch": { "version": "2.6.9", @@ -7103,18 +8103,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/readdir-glob": { - "version": "1.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/readline-sync": { - "version": "1.4.4", - "dev": true, - "license": "MIT" + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@types/readline-sync/-/readline-sync-1.4.8.tgz", + "integrity": "sha512-BL7xOf0yKLA6baAX6MMOnYkoflUyj/c7y3pqMRfU0va7XlwHAOTOIo4x55P/qLfMsuaYdJJKubToLqRVmRtRZA==", + "dev": true }, "node_modules/@types/responselike": { "version": "1.0.0", @@ -7198,8 +8191,9 @@ "license": "MIT" }, "node_modules/@types/uuid": { - "version": "9.0.1", - "dev": true, + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "license": "MIT" }, "node_modules/@types/vscode": { @@ -7218,9 +8212,10 @@ "license": "MIT" }, "node_modules/@types/webpack-env": { - "version": "1.18.1", - "dev": true, - "license": "MIT" + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.5.tgz", + "integrity": "sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==", + "dev": true }, "node_modules/@types/whatwg-url": { "version": "11.0.4", @@ -7892,419 +8887,691 @@ "dev": true, "license": "Apache-2.0", "dependencies": { - "@xtuc/long": "4.2.2" + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.41", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.41.tgz", + "integrity": "sha512-EMxPWXlEqqvsK9jxPmNvEShrIXP2LYTdQnEfsBH6OQCnlZRVo/dJIgtzbKvtK9A8PBTDQdxwxulj+QKplmW2Xg==", + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.10", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", + "node_modules/ajv-keywords": { + "version": "3.5.2", "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "dev": true, + "node_modules/amazon-q-vscode": { + "resolved": "packages/amazonq", + "link": true + }, + "node_modules/amazon-states-language-service": { + "version": "1.11.0", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "js-yaml": "^4.1.0", + "vscode-json-languageservice": "5.3.5", + "vscode-languageserver": "^8.1.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.15.1", + "yaml-language-server": "0.15.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "dev": true, + "node_modules/amazon-states-language-service/node_modules/vscode-jsonrpc": { + "version": "8.1.0", "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "dev": true, + "node_modules/amazon-states-language-service/node_modules/vscode-languageserver": { + "version": "8.1.0", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "vscode-languageserver-protocol": "3.17.3" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "dev": true, + "node_modules/amazon-states-language-service/node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, + "node_modules/ansi-colors": { + "version": "4.1.1", "license": "MIT", "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "node": ">=6" } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, + "node_modules/ansi-gray": { + "version": "0.1.1", "license": "MIT", - "engines": { - "node": ">=14.15.0" + "dependencies": { + "ansi-wrap": "0.1.0" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", + "node_modules/ansi-html-community": { + "version": "0.0.8", "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "engines": { + "node": ">=8" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.7.8", - "dev": true, + "node_modules/ansi-wrap": { + "version": "0.1.0", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=0.10.0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", + "node_modules/any-promise": { + "version": "1.3.0", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/@xtuc/long": { - "version": "4.2.2", + "node_modules/anymatch": { + "version": "3.1.2", "dev": true, - "license": "Apache-2.0" + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/a-sync-waterfall": { - "version": "1.0.1", + "node_modules/arg": { + "version": "4.1.3", "dev": true, "license": "MIT" }, - "node_modules/abort-controller": { - "version": "3.0.0", + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, "engines": { - "node": ">=6.5" + "node": ">=8" } }, - "node_modules/accepts": { - "version": "1.3.8", + "node_modules/asap": { + "version": "2.0.6", "dev": true, + "license": "MIT" + }, + "node_modules/asn1.js": { + "version": "5.4.1", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/acorn": { - "version": "8.12.0", + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/assert": { + "version": "2.1.0", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", + "node_modules/ast-types": { + "version": "0.9.14", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^8" + "engines": { + "node": ">= 0.8" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", + "node_modules/async": { + "version": "3.2.5", + "license": "MIT" + }, + "node_modules/async-lock": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "dev": true, - "license": "MIT", + "node_modules/aws-core-vscode": { + "resolved": "packages/core", + "link": true + }, + "node_modules/aws-sdk": { + "version": "2.1384.0", + "license": "Apache-2.0", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 10.0.0" } }, - "node_modules/adm-zip": { - "version": "0.5.10", + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", "license": "MIT", - "engines": { - "node": ">=6.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "dev": true, + "node_modules/aws-sdk/node_modules/xml2js": { + "version": "0.5.0", "license": "MIT", "dependencies": { - "debug": "4" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=4.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", + "node_modules/aws-ssm-document-language-service": { + "version": "1.0.0", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "vscode-json-languageservice": "3.8.3", + "vscode-languageserver": "^6.1.1", + "yaml": "^1.10.0", + "yaml-language-server": "0.10.1" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, + "node_modules/aws-ssm-document-language-service/node_modules/argparse": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "sprintf-js": "~1.0.2" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.8.2", - "dev": true, + "node_modules/aws-ssm-document-language-service/node_modules/js-yaml": { + "version": "3.14.1", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, + "node_modules/aws-ssm-document-language-service/node_modules/jsonc-parser": { + "version": "2.3.1", "license": "MIT" }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, + "node_modules/aws-ssm-document-language-service/node_modules/prettier": { + "version": "2.0.5", "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/amazon-q-vscode": { - "resolved": "packages/amazonq", - "link": true - }, - "node_modules/amazon-states-language-service": { - "version": "1.11.0", + "node_modules/aws-ssm-document-language-service/node_modules/vscode-json-languageservice": { + "version": "3.8.3", "license": "MIT", "dependencies": { - "js-yaml": "^4.1.0", - "vscode-json-languageservice": "5.3.5", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.0", + "jsonc-parser": "^2.2.1", + "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", - "yaml-language-server": "0.15.0" + "vscode-nls": "^4.1.2", + "vscode-uri": "^2.1.2" } }, - "node_modules/amazon-states-language-service/node_modules/vscode-jsonrpc": { - "version": "8.1.0", + "node_modules/aws-ssm-document-language-service/node_modules/vscode-jsonrpc": { + "version": "4.0.0", "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=8.0.0 || >=10.0.0" } }, - "node_modules/amazon-states-language-service/node_modules/vscode-languageserver": { - "version": "8.1.0", + "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver-protocol": { + "version": "3.14.1", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "3.17.3" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" } }, - "node_modules/amazon-states-language-service/node_modules/vscode-languageserver-protocol": { - "version": "3.17.3", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" - } + "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.14.0", + "license": "MIT" }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/aws-ssm-document-language-service/node_modules/vscode-nls": { + "version": "4.1.2", + "license": "MIT" }, - "node_modules/ansi-gray": { - "version": "0.1.1", + "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server": { + "version": "0.10.1", "license": "MIT", "dependencies": { - "ansi-wrap": "0.1.0" + "js-yaml": "^3.13.1", + "jsonc-parser": "^2.2.1", + "request-light": "^0.2.4", + "vscode-json-languageservice": "^3.6.0", + "vscode-languageserver": "^5.2.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-nls": "^4.1.2", + "vscode-uri": "^2.1.1", + "yaml-ast-parser-custom-tags": "0.0.43" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "optionalDependencies": { + "prettier": "2.0.5" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", + "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" + }, "bin": { - "ansi-html": "bin/ansi-html" + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { + "version": "1.0.8", + "license": "MIT" }, - "node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/aws-toolkit-vscode": { + "resolved": "packages/toolkit", + "link": true + }, + "node_modules/azure-devops-node-api": { + "version": "11.2.0", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" } }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/b4a": { + "version": "1.6.4", + "dev": true, + "license": "ISC" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.2.2", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^1.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", + "node_modules/bare-os": { + "version": "2.3.0", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "optional": true }, - "node_modules/anymatch": { - "version": "3.1.2", + "node_modules/bare-path": { + "version": "2.1.2", "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "license": "MIT", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" + "bare-os": "^2.1.0" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "license": "MIT", + "node_modules/bare-stream": { + "version": "1.0.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "streamx": "^2.16.1" } }, - "node_modules/archiver-utils/node_modules/buffer": { - "version": "6.0.3", + "node_modules/base64-js": { + "version": "1.5.1", "funding": [ { "type": "github", @@ -8319,21 +9586,59 @@ "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/archiver-utils/node_modules/events": { - "version": "3.3.0", + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": "*" } }, - "node_modules/archiver-utils/node_modules/ieee754": { - "version": "1.2.1", + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "dev": true, "funding": [ { "type": "github", @@ -8348,3000 +9653,2998 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "license": "MIT" }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.5.2", + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/archiver/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.0.13", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/archiver/node_modules/buffer-crc32": { + "node_modules/boolbase": { "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, "engines": { - "node": ">=8.0.0" + "node": ">= 4" } }, - "node_modules/archiver/node_modules/events": { - "version": "3.3.0", + "node_modules/browserify-zlib": { + "version": "0.1.4", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.x" + "dependencies": { + "pako": "~0.2.0" } }, - "node_modules/archiver/node_modules/ieee754": { - "version": "1.2.1", + "node_modules/browserify-zlib/node_modules/pako": { + "version": "0.2.9", + "dev": true, + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.23.1", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "BSD-3-Clause" - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.5.2", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/archiver/node_modules/tar-stream": { - "version": "3.1.7", + "node_modules/buffer": { + "version": "4.9.2", "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", + "node_modules/buffer-crc32": { + "version": "0.2.13", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/asap": { - "version": "2.0.6", + "node_modules/buffer-from": { + "version": "1.1.2", "dev": true, "license": "MIT" }, - "node_modules/asn1.js": { - "version": "5.4.1", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", + "node_modules/buffer-xor": { + "version": "1.0.3", "license": "MIT" }, - "node_modules/assert": { - "version": "2.1.0", + "node_modules/builtin-modules": { + "version": "3.3.0", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ast-types": { - "version": "0.9.14", - "dev": true, + "node_modules/bytes": { + "version": "3.1.2", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/async": { - "version": "3.2.5", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", + "node_modules/c8": { + "version": "9.0.0", "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-core-vscode": { - "resolved": "packages/core", - "link": true - }, - "node_modules/aws-sdk": { - "version": "2.1384.0", - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.5.0" + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" }, "engines": { - "node": ">= 10.0.0" + "node": ">=14.14.0" } }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/aws-sdk/node_modules/xml2js": { - "version": "0.5.0", + "node_modules/cache-content-type": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "mime-types": "^2.1.18", + "ylru": "^1.2.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/aws-ssm-document-language-service": { - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "vscode-json-languageservice": "3.8.3", - "vscode-languageserver": "^6.1.1", - "yaml": "^1.10.0", - "yaml-language-server": "0.10.1" + "node": ">= 6.0.0" } }, - "node_modules/aws-ssm-document-language-service/node_modules/argparse": { - "version": "1.0.10", + "node_modules/cacheable-lookup": { + "version": "5.0.4", "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "engines": { + "node": ">=10.6.0" } }, - "node_modules/aws-ssm-document-language-service/node_modules/js-yaml": { - "version": "3.14.1", + "node_modules/cacheable-request": { + "version": "7.0.2", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/aws-ssm-document-language-service/node_modules/jsonc-parser": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/aws-ssm-document-language-service/node_modules/prettier": { - "version": "2.0.5", + "node_modules/call-bind": { + "version": "1.0.7", "license": "MIT", - "optional": true, - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-ssm-document-language-service/node_modules/vscode-json-languageservice": { - "version": "3.8.3", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "jsonc-parser": "^2.2.1", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-nls": "^4.1.2", - "vscode-uri": "^2.1.2" + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/aws-ssm-document-language-service/node_modules/vscode-jsonrpc": { - "version": "4.0.0", + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.0.0 || >=10.0.0" + "node": ">=4" } }, - "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver-protocol": { - "version": "3.14.1", + "node_modules/caller-path": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.14.0", - "license": "MIT" - }, - "node_modules/aws-ssm-document-language-service/node_modules/vscode-nls": { - "version": "4.1.2", - "license": "MIT" - }, - "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server": { - "version": "0.10.1", + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "jsonc-parser": "^2.2.1", - "request-light": "^0.2.4", - "vscode-json-languageservice": "^3.6.0", - "vscode-languageserver": "^5.2.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-nls": "^4.1.2", - "vscode-uri": "^2.1.1", - "yaml-ast-parser-custom-tags": "0.0.43" - }, - "bin": { - "yaml-language-server": "bin/yaml-language-server" - }, "engines": { - "node": "*" - }, - "optionalDependencies": { - "prettier": "2.0.5" + "node": ">=6" } }, - "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server/node_modules/vscode-languageserver": { - "version": "5.2.1", + "node_modules/camelcase": { + "version": "6.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" + "engines": { + "node": ">=10" }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/aws-ssm-document-language-service/node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { - "version": "1.0.8", - "license": "MIT" - }, - "node_modules/aws-toolkit-vscode": { - "resolved": "packages/toolkit", - "link": true - }, - "node_modules/azure-devops-node-api": { - "version": "11.2.0", + "node_modules/camelcase-keys": { + "version": "6.2.2", "dev": true, "license": "MIT", "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/b4a": { - "version": "1.6.4", - "license": "ISC" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.2.2", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.0", + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/bare-os": { - "version": "2.3.0", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.2", + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/bare-stream": { - "version": "1.0.0", + "node_modules/caniuse-lite": { + "version": "1.0.30001638", "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.16.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT" + "license": "CC-BY-4.0" }, - "node_modules/basic-auth": { - "version": "2.0.1", + "node_modules/chalk": { + "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.1.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", + "node_modules/charenc": { + "version": "0.0.2", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } }, - "node_modules/big.js": { - "version": "5.2.2", + "node_modules/cheerio": { + "version": "1.0.0-rc.12", "dev": true, "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, "engines": { - "node": "*" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", + "node_modules/cheerio-select": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=8" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/bl": { - "version": "4.1.0", + "node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "engines": { + "node": ">=6.0" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", + "node_modules/ci-info": { + "version": "4.0.0", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/sibiraj-s" } ], "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">=8" } }, - "node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "dev": true, + "node_modules/cipher-base": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.2", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "node_modules/clean-regexp": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" } }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8.0" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.0.13", + "node_modules/cli-color": { + "version": "2.0.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/boolbase": { - "version": "1.0.0", + "node_modules/cliui": { + "version": "7.0.4", "dev": true, - "license": "ISC" - }, - "node_modules/bowser": { - "version": "2.11.0", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/clone": { + "version": "2.1.2", "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "engines": { + "node": ">=0.8" } }, - "node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/clone-buffer": { + "version": "1.0.0", "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "node": ">= 0.10" } }, - "node_modules/browserify-rsa": { - "version": "4.1.0", + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.2", - "license": "ISC", - "dependencies": { - "bn.js": "^5.2.1", - "browserify-rsa": "^4.1.0", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.4", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.6", - "readable-stream": "^3.6.2", - "safe-buffer": "^5.2.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "dev": true, + "node_modules/clone-response": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "pako": "~0.2.0" + "mimic-response": "^1.0.0" } }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "0.2.9", - "dev": true, + "node_modules/clone-stats": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/browserslist": { - "version": "4.23.1", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/cloneable-readable": { + "version": "1.1.3", "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.7", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/buffer": { - "version": "4.9.2", + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", + "node_modules/co": { + "version": "4.6.0", "dev": true, "license": "MIT", "engines": { - "node": "*" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" + "node_modules/code-block-writer": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.2.tgz", + "integrity": "sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==", + "dev": true }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "dev": true, + "node_modules/color": { + "version": "3.2.1", "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, - "node_modules/bytes": { - "version": "3.1.2", + "node_modules/color-convert": { + "version": "2.0.1", "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "9.0.0", - "dev": true, - "license": "ISC", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^3.1.1", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1" - }, - "bin": { - "c8": "bin/c8.js" + "color-name": "~1.1.4" }, "engines": { - "node": ">=14.14.0" + "node": ">=7.0.0" } }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "21.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "dev": true, + "node_modules/color-string": { + "version": "1.9.1", "license": "MIT", "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "license": "MIT", - "engines": { - "node": ">=10.6.0" + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "bin": { + "color-support": "bin.js" } }, - "node_modules/cacheable-request": { - "version": "7.0.2", + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" + "color-name": "1.1.3" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" }, - "node_modules/call-me-maybe": { - "version": "1.0.2", + "node_modules/colorette": { + "version": "2.0.16", "dev": true, "license": "MIT" }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "dev": true, + "node_modules/colorspace": { + "version": "1.1.4", "license": "MIT", "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "node_modules/caller-path": { - "version": "2.0.0", + "node_modules/combined-stream": { + "version": "1.0.8", "dev": true, "license": "MIT", "dependencies": { - "caller-callsite": "^2.0.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/callsites": { - "version": "3.1.0", + "node_modules/commander": { + "version": "6.2.1", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/camelcase": { - "version": "6.2.0", + "node_modules/compressible": { + "version": "2.0.18", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "mime-db": ">= 1.43.0 < 2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.6" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", + "node_modules/compression": { + "version": "1.7.4", "dev": true, "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001638", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" + "license": "MIT" }, - "node_modules/chalk": { - "version": "4.1.2", + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz", + "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.1.0", + "date-fns": "^2.16.1", + "lodash": "^4.17.21", + "rxjs": "^6.6.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^16.2.0" }, - "engines": { - "node": ">=10" + "bin": { + "concurrently": "dist/bin/concurrently.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": "*" + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" }, "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", + "node_modules/concurrently/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=10" } }, - "node_modules/chokidar": { - "version": "3.5.3", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=0.8" } }, - "node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", + "node_modules/content-disposition": { + "version": "0.5.4", "dev": true, "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">=6.0" + "node": ">= 0.6" } }, - "node_modules/ci-info": { - "version": "4.0.0", + "node_modules/content-type": { + "version": "1.0.5", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/cipher-base": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" }, - "node_modules/circular-dependency-plugin": { - "version": "5.2.2", + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, - "license": "ISC", "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.1" + "node": ">= 0.6" } }, - "node_modules/clean-regexp": { - "version": "1.0.0", + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "depd": "~2.0.0", + "keygrip": "~1.1.0" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/cookies/node_modules/depd": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "node_modules/cli-color": { - "version": "2.0.3", + "node_modules/core-js-compat": { + "version": "3.37.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.61", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" + "browserslist": "^4.23.0" }, - "engines": { - "node": ">=0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/cliui": { - "version": "7.0.4", + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "1.0.10", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/clone": { - "version": "2.1.2", + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/clone-buffer": { - "version": "1.0.0", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/clone-deep": { - "version": "4.0.1", + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", "dev": true, "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/clone-response": { - "version": "1.0.2", + "node_modules/create-ecdh": { + "version": "4.0.4", "license": "MIT", "dependencies": { - "mimic-response": "^1.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/clone-stats": { - "version": "1.0.0", + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", "license": "MIT" }, - "node_modules/cloneable-readable": { - "version": "1.1.3", + "node_modules/create-hash": { + "version": "1.2.0", "license": "MIT", "dependencies": { + "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.7", + "node_modules/create-hmac": { + "version": "1.1.7", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/cloneable-readable/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/create-require": { + "version": "1.1.1", + "dev": true, "license": "MIT" }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/cross-fetch": { + "version": "4.0.0", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "node-fetch": "^2.6.12" } }, - "node_modules/co": { - "version": "4.6.0", - "dev": true, + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "node": ">= 8" } }, - "node_modules/code-block-writer": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.2.tgz", - "integrity": "sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==", - "dev": true + "node_modules/crypt": { + "version": "0.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } }, - "node_modules/color": { - "version": "3.2.1", + "node_modules/crypto-browserify": { + "version": "3.12.0", "license": "MIT", "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" } }, - "node_modules/color-convert": { - "version": "2.0.1", + "node_modules/css-loader": { + "version": "6.10.0", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", + "node_modules/css-select": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "bin": { - "color-support": "bin.js" + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/cssstyle": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" } }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", + "node_modules/csstype": { + "version": "3.1.2", "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.16", + "node_modules/cubic2quad": { + "version": "1.2.1", "dev": true, "license": "MIT" }, - "node_modules/colorspace": { - "version": "1.1.4", - "license": "MIT", + "node_modules/d": { + "version": "1.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/combined-stream": { - "version": "1.0.8", + "node_modules/data-urls": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/commander": { - "version": "6.2.1", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">= 14" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/compress-commons/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/debug": { + "version": "4.3.4", + "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/compress-commons/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "ms": "2.1.2" + }, "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/compress-commons/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } - ], - "license": "BSD-3-Clause" + } }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.5.2", + "node_modules/decamelize": { + "version": "4.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compressible": { - "version": "2.0.18", + "node_modules/decamelize-keys": { + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/compression": { - "version": "1.7.4", + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", "dev": true, "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", + "node_modules/decimal.js": { + "version": "10.4.3", "dev": true, + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/deep-extend": { + "version": "0.6.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/concat-map": { - "version": "0.0.1", + "node_modules/deep-is": { + "version": "0.1.4", "license": "MIT" }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, + "node_modules/deepmerge": { + "version": "4.2.2", "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=0.10.0" } }, - "node_modules/content-disposition": { - "version": "0.5.4", + "node_modules/default-gateway": { + "version": "6.0.3", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "safe-buffer": "5.2.1" + "execa": "^5.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/content-type": { - "version": "1.0.5", - "dev": true, + "node_modules/defer-to-connect": { + "version": "2.0.1", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/convert-source-map": { + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { "version": "2.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/cookie": { - "version": "0.6.0", + "node_modules/define-properties": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", + "node_modules/delegates": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/cookies": { - "version": "0.9.1", + "node_modules/depd": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/cookies/node_modules/depd": { - "version": "2.0.0", + "node_modules/des.js": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/core-js-compat": { - "version": "3.37.1", + "node_modules/detect-libc": { + "version": "2.0.2", "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" } }, - "node_modules/core-util-is": { - "version": "1.0.3", + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "5.2.1", + "node_modules/diff": { + "version": "5.1.0", "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.3.1" } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "1.0.10", - "dev": true, + "node_modules/diffie-hellman": { + "version": "5.0.3", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "path-type": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.1", + "node_modules/dns-equal": { + "version": "1.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "MIT" }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "4.0.0", + "node_modules/dns-packet": { + "version": "5.4.0", "dev": true, "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/cosmiconfig/node_modules/resolve-from": { + "node_modules/doctrine": { "version": "3.0.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.8" + "node": ">=6.0.0" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", + "node_modules/dom-serializer": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">= 14" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/crc32-stream/node_modules/buffer": { - "version": "6.0.3", + "node_modules/domelementtype": { + "version": "2.3.0", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "license": "BSD-2-Clause" }, - "node_modules/crc32-stream/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/crc32-stream/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.5.2", - "license": "MIT", + "node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", + "node_modules/downlevel-dts": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/downlevel-dts/-/downlevel-dts-0.10.1.tgz", + "integrity": "sha512-bwY63Y0Gfwotcly4vU6rB66m5txvfQzDGd1Gai9E9orqsDIswXKjkdR18Tm6TidnAk9+J5N68a5VMDO2bsQCKQ==", + "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "semver": "^7.3.2", + "shelljs": "^0.8.3", + "typescript": "next" + }, + "bin": { + "downlevel-dts": "index.js" } }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", + "node_modules/downlevel-dts/node_modules/typescript": { + "version": "5.7.0-dev.20241023", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.0-dev.20241023.tgz", + "integrity": "sha512-HB6rRd9ySnFMoQUuDasWnBtvOg1P4CFG3nRfs2ZvFbenUkxSzoeeZ0PUwJJ7MKJp5zz7uMTZamGt7zdj0tP9YA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", "license": "MIT" }, - "node_modules/create-hash": { - "version": "1.2.0", + "node_modules/duplexify": { + "version": "3.7.1", + "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", + "end-of-stream": "^1.0.0", "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/create-require": { - "version": "1.1.1", + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, "license": "MIT" }, - "node_modules/cross-fetch": { - "version": "4.0.0", + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "node-fetch": "^2.6.12" + "safe-buffer": "~5.1.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.812", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.7", "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/crypt": { - "version": "0.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" }, - "node_modules/crypto-browserify": { - "version": "3.12.0", + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, "engines": { - "node": "*" + "node": ">= 4" } }, - "node_modules/css-loader": { - "version": "6.10.0", + "node_modules/enabled": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/css-select": { - "version": "5.1.0", + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "dev": true, + "node_modules/entities": { + "version": "4.5.0", "license": "BSD-2-Clause", "engines": { - "node": ">= 6" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/cssesc": { - "version": "3.0.0", + "node_modules/envinfo": { + "version": "7.11.1", "dev": true, "license": "MIT", "bin": { - "cssesc": "bin/cssesc" + "envinfo": "dist/cli.js" }, "engines": { "node": ">=4" } }, - "node_modules/cssstyle": { - "version": "3.0.0", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" + "is-arrayish": "^0.2.1" } }, - "node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/cubic2quad": { - "version": "1.2.1", + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", "dev": true, "license": "MIT" }, - "node_modules/d": { - "version": "1.0.1", - "dev": true, - "license": "ISC", + "node_modules/es-abstract": { + "version": "1.20.2", + "license": "MIT", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.2", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/data-urls": { - "version": "5.0.0", - "dev": true, + "node_modules/es-define-property": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" + "get-intrinsic": "^1.2.4" }, "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, + "node_modules/es-errors": { + "version": "1.3.0", "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/decamelize": { - "version": "4.0.0", + "node_modules/es-module-lexer": { + "version": "1.2.1", "dev": true, + "license": "MIT" + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", + "node_modules/es5-ext": { + "version": "0.10.64", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "license": "ISC", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", + "node_modules/es6-iterator": { + "version": "2.0.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "dev": true, + "node_modules/es6-promise": { + "version": "4.2.8", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "es6-promise": "^4.0.3" } }, - "node_modules/decimal.js": { - "version": "10.4.3", + "node_modules/es6-symbol": { + "version": "3.1.3", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "license": "MIT", + "node_modules/es6-weak-map": { + "version": "2.0.3", + "dev": true, + "license": "ISC", "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", + "node_modules/esbuild": { + "version": "0.15.13", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=10" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@esbuild/android-arm": "0.15.13", + "@esbuild/linux-loong64": "0.15.13", + "esbuild-android-64": "0.15.13", + "esbuild-android-arm64": "0.15.13", + "esbuild-darwin-64": "0.15.13", + "esbuild-darwin-arm64": "0.15.13", + "esbuild-freebsd-64": "0.15.13", + "esbuild-freebsd-arm64": "0.15.13", + "esbuild-linux-32": "0.15.13", + "esbuild-linux-64": "0.15.13", + "esbuild-linux-arm": "0.15.13", + "esbuild-linux-arm64": "0.15.13", + "esbuild-linux-mips64le": "0.15.13", + "esbuild-linux-ppc64le": "0.15.13", + "esbuild-linux-riscv64": "0.15.13", + "esbuild-linux-s390x": "0.15.13", + "esbuild-netbsd-64": "0.15.13", + "esbuild-openbsd-64": "0.15.13", + "esbuild-sunos-64": "0.15.13", + "esbuild-windows-32": "0.15.13", + "esbuild-windows-64": "0.15.13", + "esbuild-windows-arm64": "0.15.13" } }, - "node_modules/deep-equal": { - "version": "1.0.1", + "node_modules/esbuild-loader": { + "version": "2.20.0", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "esbuild": "^0.15.6", + "joycon": "^3.0.1", + "json5": "^2.2.0", + "loader-utils": "^2.0.0", + "tapable": "^2.2.0", + "webpack-sources": "^2.2.0" + }, + "funding": { + "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + }, + "peerDependencies": { + "webpack": "^4.40.0 || ^5.0.0" + } }, - "node_modules/deep-extend": { - "version": "0.6.0", + "node_modules/esbuild/node_modules/esbuild-darwin-arm64": { + "version": "0.15.13", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4.0.0" + "node": ">=12" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.2.2", + "node_modules/escalade": { + "version": "3.1.2", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" }, - "node_modules/defer-to-connect": { - "version": "2.0.1", + "node_modules/escape-string-regexp": { + "version": "4.0.0", "license": "MIT", "engines": { "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", + "node_modules/eslint": { + "version": "8.56.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", + "node_modules/eslint-config-prettier": { + "version": "9.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.4.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" + "node_modules/eslint-plugin-aws-toolkits": { + "resolved": "plugins/eslint-plugin-aws-toolkits", + "link": true }, - "node_modules/depd": { - "version": "1.1.2", + "node_modules/eslint-plugin-header": { + "version": "3.1.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "peerDependencies": { + "eslint": ">=7.7.0" } }, - "node_modules/destroy": { - "version": "1.2.0", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", "dev": true, "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/detect-libc": { - "version": "2.0.2", + "node_modules/eslint-plugin-security-node": { + "version": "1.1.4", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "5.1.0", + "node_modules/eslint-plugin-unicorn": { + "version": "54.0.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "@eslint-community/eslint-utils": "^4.4.0", + "@eslint/eslintrc": "^3.0.2", + "ci-info": "^4.0.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.37.0", + "esquery": "^1.5.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.10.0", + "semver": "^7.6.1", + "strip-indent": "^3.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.56.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" + "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/dir-glob": { - "version": "3.0.1", + "node_modules/eslint-plugin-unicorn/node_modules/espree": { + "version": "10.1.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "path-type": "^4.0.0" + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/dns-packet": { - "version": "5.4.0", + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "14.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", "dependencies": { - "esutils": "^2.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/domhandler": { - "version": "5.0.3", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "domelementtype": "^2.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/domutils": { - "version": "3.1.0", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">=4.0" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "license": "MIT" - }, - "node_modules/duplexify": { - "version": "3.7.1", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/duplexify/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/esniff": { + "version": "2.0.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "safe-buffer": "~5.1.0" + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.812", + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", "dev": true, "license": "ISC" }, - "node_modules/elliptic": { - "version": "6.5.7", - "license": "MIT", + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/emojis-list": { - "version": "3.0.0", + "node_modules/esquery": { + "version": "1.5.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">= 4" + "node": ">=0.10" } }, - "node_modules/enabled": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.8" + "node": ">=4.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "license": "MIT", + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "once": "^1.4.0" + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10.13.0" + "node": ">=4.0" } }, - "node_modules/entities": { - "version": "4.5.0", + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/envinfo": { - "version": "7.11.1", + "node_modules/etag": { + "version": "1.8.1", "dev": true, "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/error-ex": { - "version": "1.3.2", + "node_modules/event-emitter": { + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "d": "1", + "es5-ext": "~0.10.14" } }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/es-abstract": { - "version": "1.20.2", + "node_modules/event-stream": { + "version": "3.3.5", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" } }, - "node_modules/es-define-property": { - "version": "1.0.0", + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "1.1.1", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.x" } }, - "node_modules/es-errors": { - "version": "1.3.0", + "node_modules/evp_bytestokey": { + "version": "1.0.3", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/es-module-lexer": { - "version": "1.2.1", + "node_modules/execa": { + "version": "5.1.1", "dev": true, - "license": "MIT" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/es5-ext": { - "version": "0.10.64", + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", "dev": true, - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es6-iterator": { + "node_modules/expand-template": { "version": "2.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "license": "MIT" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "license": "(MIT OR WTFPL)", + "optional": true, + "engines": { + "node": ">=6" } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, - "license": "ISC", "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/esbuild": { - "version": "0.15.13", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.13", - "@esbuild/linux-loong64": "0.15.13", - "esbuild-android-64": "0.15.13", - "esbuild-android-arm64": "0.15.13", - "esbuild-darwin-64": "0.15.13", - "esbuild-darwin-arm64": "0.15.13", - "esbuild-freebsd-64": "0.15.13", - "esbuild-freebsd-arm64": "0.15.13", - "esbuild-linux-32": "0.15.13", - "esbuild-linux-64": "0.15.13", - "esbuild-linux-arm": "0.15.13", - "esbuild-linux-arm64": "0.15.13", - "esbuild-linux-mips64le": "0.15.13", - "esbuild-linux-ppc64le": "0.15.13", - "esbuild-linux-riscv64": "0.15.13", - "esbuild-linux-s390x": "0.15.13", - "esbuild-netbsd-64": "0.15.13", - "esbuild-openbsd-64": "0.15.13", - "esbuild-sunos-64": "0.15.13", - "esbuild-windows-32": "0.15.13", - "esbuild-windows-64": "0.15.13", - "esbuild-windows-arm64": "0.15.13" + "node": ">= 0.10.0" } }, - "node_modules/esbuild-loader": { - "version": "2.20.0", + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.15.6", - "joycon": "^3.0.1", - "json5": "^2.2.0", - "loader-utils": "^2.0.0", - "tapable": "^2.2.0", - "webpack-sources": "^2.2.0" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" + "ms": "2.0.0" } }, - "node_modules/esbuild/node_modules/esbuild-darwin-arm64": { - "version": "0.15.13", - "cpu": [ - "arm64" - ], + "node_modules/express/node_modules/depd": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/escalade": { - "version": "3.1.2", + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/escape-html": { - "version": "1.0.3", + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.10", + "dev": true, + "license": "MIT" }, - "node_modules/eslint": { - "version": "8.56.0", + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", + "node_modules/ext": { + "version": "1.6.0", "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "license": "ISC", + "dependencies": { + "type": "^2.5.0" } }, - "node_modules/eslint-plugin-aws-toolkits": { - "resolved": "plugins/eslint-plugin-aws-toolkits", - "link": true - }, - "node_modules/eslint-plugin-header": { - "version": "3.1.1", + "node_modules/ext/node_modules/type": { + "version": "2.7.2", "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7.7.0" - } + "license": "ISC" }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "dev": true, + "node_modules/fancy-log": { + "version": "1.3.3", "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "node": ">= 0.10" } }, - "node_modules/eslint-plugin-security-node": { - "version": "1.1.4", + "node_modules/fast-deep-equal": { + "version": "3.1.3", "dev": true, - "license": "ISC", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/eslint-plugin-unicorn": { - "version": "54.0.0", + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "@eslint-community/eslint-utils": "^4.4.0", - "@eslint/eslintrc": "^3.0.2", - "ci-info": "^4.0.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.37.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.6.1", - "strip-indent": "^3.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=18.18" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.56.0" + "node": ">=8.6.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/@eslint/eslintrc": { - "version": "3.1.0", + "node_modules/fast-json-patch": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", "dev": true, + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "4.4.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "strnum": "^1.0.5" }, - "funding": { - "url": "https://opencollective.com/eslint" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/eslint-plugin-unicorn/node_modules/eslint-visitor-keys": { - "version": "4.0.0", + "node_modules/fastest-levenshtein": { + "version": "1.0.12", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.13.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/eslint-plugin-unicorn/node_modules/espree": { - "version": "10.1.0", + "node_modules/faye-websocket": { + "version": "0.11.4", "dev": true, - "license": "BSD-2-Clause", + "license": "Apache-2.0", "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.8.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "14.0.0", + "node_modules/fd-slicer": { + "version": "1.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", + "node_modules/fecha": { + "version": "4.2.1", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=8.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", + "node_modules/file-loader": { + "version": "6.2.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 10.13.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/fill-range": { + "version": "7.1.1", "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", + "node_modules/finalhandler": { + "version": "1.3.1", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/find-up": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esniff": { - "version": "2.0.1", + "node_modules/flat": { + "version": "5.0.2", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.10" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/esniff/node_modules/type": { - "version": "2.7.3", + "node_modules/flatted": { + "version": "3.2.2", "dev": true, "license": "ISC" }, - "node_modules/espree": { - "version": "9.6.1", + "node_modules/fn.name": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", "dependencies": { - "estraverse": "^5.1.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=0.10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", "engines": { - "node": ">=4.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esrecurse": { - "version": "4.3.0", + "node_modules/form-data": { + "version": "4.0.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", + "node_modules/forwarded": { + "version": "0.2.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/estraverse": { - "version": "4.3.0", + "node_modules/fresh": { + "version": "0.5.2", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/estree-walker": { - "version": "2.0.2", + "node_modules/from": { + "version": "0.1.7", "license": "MIT" }, - "node_modules/esutils": { - "version": "2.0.3", + "node_modules/fs-constants": { + "version": "1.0.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true }, - "node_modules/etag": { - "version": "1.8.1", + "node_modules/fs-monkey": { + "version": "1.0.3", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "dev": true, + "node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/event-stream": { - "version": "3.3.5", + "node_modules/function.prototype.name": { + "version": "1.1.5", "license": "MIT", "dependencies": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", + "node_modules/functions-have-names": { + "version": "1.2.3", "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", + "node_modules/geometry-interfaces": { + "version": "1.1.4", "dev": true, "license": "MIT" }, - "node_modules/events": { - "version": "1.1.1", - "license": "MIT", + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/execa": { - "version": "5.1.1", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.2.4", "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", + "node_modules/get-stdin": { + "version": "8.0.0", "dev": true, "license": "MIT", "engines": { @@ -11351,658 +12654,552 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "dev": true, - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.21.0", - "dev": true, + "node_modules/get-stream": { + "version": "5.2.0", "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "pump": "^3.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, + "node_modules/get-symbol-description": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", + "node_modules/github-from-package": { + "version": "0.0.0", "dev": true, "license": "MIT", + "optional": true + }, + "node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { - "node": ">= 0.8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/express/node_modules/encodeurl": { - "version": "2.0.0", + "node_modules/glob-parent": { + "version": "5.1.2", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", + "node_modules/glob-to-regexp": { + "version": "0.4.1", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause" }, - "node_modules/express/node_modules/statuses": { + "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/ext": { - "version": "1.6.0", - "dev": true, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", "license": "ISC", "dependencies": { - "type": "^2.5.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", + "node_modules/globals": { + "version": "13.24.0", "dev": true, - "license": "ISC" - }, - "node_modules/fancy-log": { - "version": "1.3.3", "license": "MIT", "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">= 0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "license": "MIT" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fast-glob": { - "version": "3.3.2", + "node_modules/globby": { + "version": "11.1.0", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], + "node_modules/got": { + "version": "11.8.5", "license": "MIT", "dependencies": { - "strnum": "^1.0.5" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", + "node_modules/graceful-fs": { + "version": "4.2.11", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/fastq": { - "version": "1.13.0", + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, - "node_modules/faye-websocket": { - "version": "0.11.4", + "node_modules/gunzip-maybe": { + "version": "1.4.2", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "websocket-driver": ">=0.5.1" + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" }, - "engines": { - "node": ">=0.8.0" + "bin": { + "gunzip-maybe": "bin.js" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", + "node_modules/handle-thing": { + "version": "2.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.1", "license": "MIT" }, - "node_modules/file-entry-cache": { - "version": "6.0.1", + "node_modules/hard-rejection": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "dev": true, + "node_modules/has": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">= 0.4.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "dev": true, + "node_modules/has-bigints": { + "version": "1.0.2", "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler": { - "version": "1.3.1", + "node_modules/has-flag": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, + "node_modules/has-proto": { + "version": "1.0.3", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.1", - "dev": true, + "node_modules/has-symbols": { + "version": "1.0.3", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, + "node_modules/hash-base": { + "version": "3.1.0", "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=4" } }, - "node_modules/flatted": { - "version": "3.2.2", + "node_modules/hash-sum": { + "version": "2.0.0", "dev": true, - "license": "ISC" - }, - "node_modules/fn.name": { - "version": "1.1.0", "license": "MIT" }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", + "node_modules/hash.js": { + "version": "1.1.7", "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "license": "BSD-3-Clause", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12.0.0" } }, - "node_modules/form-data": { - "version": "4.0.0", - "dev": true, + "node_modules/hmac-drbg": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/forwarded": { - "version": "0.2.0", + "node_modules/hosted-git-info": { + "version": "4.0.2", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/fresh": { - "version": "0.5.2", + "node_modules/hpack.js": { + "version": "2.1.6", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/from": { - "version": "0.1.7", - "license": "MIT" - }, - "node_modules/fs-constants": { - "version": "1.0.0", + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", "dev": true, - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" + "license": "MIT" }, - "node_modules/fsevents": { - "version": "2.3.2", + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/function.prototype.name": { - "version": "1.1.5", + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/geometry-interfaces": { - "version": "1.1.4", + "node_modules/html-entities": { + "version": "2.3.2", "dev": true, "license": "MIT" }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/get-intrinsic": { - "version": "1.2.4", + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", + "node_modules/http-assert": { + "version": "1.5.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8" } }, - "node_modules/get-stream": { - "version": "5.2.0", + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/github-from-package": { - "version": "0.0.0", + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "10.3.10", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8" } }, - "node_modules/glob-parent": { - "version": "5.1.2", + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", + "node_modules/http-parser-js": { + "version": "0.5.8", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6" } }, - "node_modules/globals": { - "version": "13.24.0", + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { "node": ">=10" }, @@ -12010,114 +13207,137 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, + "node_modules/http2-wrapper": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.19.0" } }, - "node_modules/gopd": { - "version": "1.0.1", + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "agent-base": "6", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/got": { - "version": "11.8.5", + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.0.7", + "dev": true, "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "bin": { + "husky": "bin.js" }, "engines": { - "node": ">=10.19.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, + "node_modules/i18n-ts": { + "version": "1.0.5", "license": "MIT" }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", + "node_modules/iconv-lite": { + "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" + "safer-buffer": ">= 2.1.2 < 3" }, - "bin": { - "gunzip-maybe": "bin.js" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/handle-thing": { - "version": "2.0.1", + "node_modules/immediate": { + "version": "3.0.6", "dev": true, "license": "MIT" }, - "node_modules/hard-rejection": { - "version": "2.1.0", + "node_modules/immutable": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has": { - "version": "1.0.3", + "node_modules/import-local": { + "version": "3.0.3", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/has-bigints": { - "version": "1.0.2", + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.8.19" } }, - "node_modules/has-flag": { + "node_modules/indent-string": { "version": "4.0.0", "dev": true, "license": "MIT", @@ -12125,41 +13345,72 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/has-proto": { + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/internal-slot": { "version": "1.0.3", "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.13.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", + "node_modules/ip-regex": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12168,1833 +13419,1943 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-sum": { - "version": "2.0.0", + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, - "license": "MIT" - }, - "node_modules/hash.js": { - "version": "1.1.7", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.2", + "node_modules/is-boolean-object": { + "version": "1.1.2", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/he": { - "version": "1.2.0", + "node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", "dev": true, "license": "MIT", - "bin": { - "he": "bin/he" + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/highlight.js": { - "version": "11.9.0", - "license": "BSD-3-Clause", + "node_modules/is-callable": { + "version": "1.2.4", + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", + "node_modules/is-core-module": { + "version": "2.9.0", + "dev": true, "license": "MIT", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info": { - "version": "4.0.2", - "dev": true, - "license": "ISC", + "node_modules/is-date-object": { + "version": "1.0.5", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hpack.js": { - "version": "2.1.6", + "node_modules/is-deflate": { + "version": "1.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } + "license": "MIT" }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", + "node_modules/is-directory": { + "version": "0.3.1", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/is-docker": { + "version": "2.2.1", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/html-entities": { - "version": "2.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "engines": { + "node": ">=8" } }, - "node_modules/http-assert": { - "version": "1.5.0", - "dev": true, + "node_modules/is-generator-function": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", + "node_modules/is-gzip": { + "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/http-errors": { - "version": "2.0.0", + "node_modules/is-nan": { + "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "dev": true, + "node_modules/is-negative-zero": { + "version": "2.0.2", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", + "node_modules/is-number": { + "version": "7.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.12.0" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, + "node_modules/is-number-object": { + "version": "1.0.7", "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", + "node_modules/is-path-inside": { + "version": "3.0.3", "dev": true, "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", + "node_modules/is-plain-obj": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": ">=8" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", + "node_modules/is-plain-object": { + "version": "2.0.4", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "isobject": "^3.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", "license": "MIT", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "dev": true, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/husky": { - "version": "9.0.7", - "dev": true, + "node_modules/is-string": { + "version": "1.0.7", "license": "MIT", - "bin": { - "husky": "bin.js" + "dependencies": { + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/i18n-ts": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, + "node_modules/is-symbol": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "dev": true, - "license": "ISC", + "node_modules/is-typed-array": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ieee754": { - "version": "1.1.13", - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.1", + "node_modules/is-unicode-supported": { + "version": "0.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immediate": { - "version": "3.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/immutable": { - "version": "4.3.0", + "node_modules/is-url": { + "version": "1.2.4", "license": "MIT" }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, + "node_modules/is-weakref": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-local": { - "version": "3.0.3", + "node_modules/is-wsl": { + "version": "2.2.0", "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, + "node_modules/is2": { + "version": "2.0.7", "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, "engines": { - "node": ">=0.8.19" + "node": ">=v0.10.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/interpret": { - "version": "3.1.1", + "node_modules/istanbul-reports": { + "version": "3.1.6", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/is": { - "version": "3.3.0", + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": "*" + "node": ">= 10.13.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "license": "MIT" + "node_modules/jmespath": { + "version": "0.16.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.6.0" + } }, - "node_modules/is-bigint": { - "version": "1.0.4", + "node_modules/jose": { + "version": "5.4.1", "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/panva" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/joycon": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", + "node_modules/jsdom": { + "version": "23.0.1", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "cssstyle": "^3.0.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.7", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.14.2", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "debug": "^4.3.4" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/is-callable": { - "version": "1.2.4", + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "7.0.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 14" } }, - "node_modules/is-core-module": { - "version": "2.9.0", + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.2", "dev": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "agent-base": "^7.0.2", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 14" } }, - "node_modules/is-date-object": { - "version": "1.0.5", + "node_modules/jsesc": { + "version": "3.0.2", + "dev": true, "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-deflate": { - "version": "1.0.0", + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "node_modules/is-directory": { - "version": "0.3.1", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/is-docker": { - "version": "2.2.1", + "node_modules/json-schema-to-typescript": { + "version": "13.1.1", "dev": true, "license": "MIT", + "dependencies": { + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + }, "bin": { - "is-docker": "cli.js" + "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/json-schema-to-typescript/node_modules/@types/glob": { + "version": "7.2.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "license": "MIT", + "node_modules/json-schema-to-typescript/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", "dependencies": { - "has-tostringtag": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/json-schema-to-typescript/node_modules/glob-promise": { + "version": "4.2.2", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "@types/glob": "^7.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" } }, - "node_modules/is-gzip": { - "version": "1.0.0", + "node_modules/json-schema-to-typescript/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-nan": { - "version": "1.3.2", + "node_modules/json-schema-to-typescript/node_modules/prettier": { + "version": "2.8.8", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">= 0.4" + "node": ">=10.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", "dev": true, "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=0.12.0" + "node": ">=6" } }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/jsonc-parser": { + "version": "3.2.0", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", + "node_modules/jszip": { + "version": "3.10.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, + "node_modules/just-clone": { + "version": "6.2.0", "license": "MIT" }, - "node_modules/is-promise": { - "version": "2.2.2", + "node_modules/just-extend": { + "version": "4.2.1", "dev": true, "license": "MIT" }, - "node_modules/is-regex": { - "version": "1.1.4", + "node_modules/keygrip": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "tsscmp": "1.0.6" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "node_modules/keytar": { + "version": "7.9.0", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/keyv": { + "version": "4.0.3", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "json-buffer": "3.0.1" } }, - "node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.9", + "node_modules/koa": { + "version": "2.15.3", + "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", + "node_modules/koa-compose": { + "version": "4.1.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", "license": "MIT" }, - "node_modules/is-weakref": { - "version": "1.0.2", + "node_modules/koa-convert": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "co": "^4.6.0", + "koa-compose": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 10" } }, - "node_modules/is-wsl": { - "version": "2.2.0", + "node_modules/koa-morgan": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" + "morgan": "^1.6.1" } }, - "node_modules/is2": { - "version": "2.0.7", + "node_modules/koa-mount": { + "version": "4.0.0", + "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" + "debug": "^4.0.1", + "koa-compose": "^4.1.0" }, "engines": { - "node": ">=v0.10.0" + "node": ">= 7.6.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", + "node_modules/koa-send": { + "version": "5.0.1", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", + "node_modules/koa-send/node_modules/http-errors": { + "version": "1.8.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/istanbul-reports": { - "version": "3.1.6", + "node_modules/koa-static": { + "version": "5.0.0", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "debug": "^3.1.0", + "koa-send": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">= 7.6.0" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "ms": "^2.1.1" } }, - "node_modules/jest-worker": { - "version": "27.5.1", + "node_modules/koa/node_modules/depd": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.8" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/jmespath": { - "version": "0.16.0", - "license": "Apache-2.0", + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">= 0.6" } }, - "node_modules/jose": { - "version": "5.4.1", + "node_modules/kuler": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" } }, - "node_modules/joycon": { - "version": "3.0.1", + "node_modules/leven": { + "version": "3.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/js-tokens": { - "version": "4.0.0", + "node_modules/levn": { + "version": "0.4.1", "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/jsdom": { - "version": "23.0.1", + "node_modules/lie": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "cssstyle": "^3.0.0", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.14.2", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "immediate": "~3.0.5" } }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.0", + "node_modules/lines-and-columns": { + "version": "1.2.4", "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" + "uc.micro": "^1.0.1" } }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "7.0.0", + "node_modules/loader-runner": { + "version": "4.2.0", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">=6.11.5" } }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.2", + "node_modules/loader-utils": { + "version": "2.0.4", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">= 14" + "node": ">=8.9.0" } }, - "node_modules/jsesc": { - "version": "3.0.2", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-buffer": { - "version": "3.0.1", + "node_modules/lodash": { + "version": "4.17.21", "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", + "node_modules/lodash.get": { + "version": "4.4.2", "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "node_modules/lodash.merge": { + "version": "4.6.2", "dev": true, "license": "MIT" }, - "node_modules/json-schema-to-typescript": { - "version": "13.1.1", + "node_modules/log-symbols": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "@bcherny/json-schema-ref-parser": "10.0.5-fork", - "@types/json-schema": "^7.0.11", - "@types/lodash": "^4.14.182", - "@types/prettier": "^2.6.1", - "cli-color": "^2.0.2", - "get-stdin": "^8.0.0", - "glob": "^7.1.6", - "glob-promise": "^4.2.2", - "is-glob": "^4.0.3", - "lodash": "^4.17.21", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.6.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, - "bin": { - "json2ts": "dist/src/cli.js" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=8" } }, - "node_modules/json-schema-to-typescript/node_modules/@types/glob": { - "version": "7.2.0", + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", "dev": true, "license": "MIT", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "es5-ext": "~0.10.2" } }, - "node_modules/json-schema-to-typescript/node_modules/glob": { - "version": "7.2.3", + "node_modules/magic-string": { + "version": "0.30.0", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "semver": "^7.5.3" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-schema-to-typescript/node_modules/glob-promise": { - "version": "4.2.2", + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "license": "MIT" + }, + "node_modules/markdown-it": { + "version": "13.0.2", + "license": "MIT", "dependencies": { - "@types/glob": "^7.1.3" + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "3.0.1", + "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">=0.12" }, "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^7.1.6" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", + "node_modules/marked": { + "version": "13.0.1", "dev": true, "license": "MIT", "bin": { - "mkdirp": "bin/cmd.js" + "marked": "bin/marked.js" }, "engines": { - "node": ">=10" + "node": ">= 18" } }, - "node_modules/json-schema-to-typescript/node_modules/prettier": { - "version": "2.8.8", + "node_modules/md5": { + "version": "2.3.0", "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "node_modules/json-stable-stringify-without-jsonify": { + "node_modules/mdurl": { "version": "1.0.1", - "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", + "node_modules/media-typer": { + "version": "0.3.0", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "license": "MIT", + "node_modules/memfs": { + "version": "3.4.7", + "dev": true, + "license": "Unlicense", "dependencies": { - "universalify": "^2.0.0" + "fs-monkey": "^1.0.3" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/jszip": { - "version": "3.10.1", + "node_modules/memoizee": { + "version": "0.4.15", "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", + "license": "ISC", "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" } }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/meow": { + "version": "9.0.0", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/meow/node_modules/decamelize": { + "version": "1.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/just-clone": { - "version": "6.2.0", + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, "license": "MIT" }, - "node_modules/just-extend": { - "version": "4.2.1", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/keygrip": { - "version": "1.1.0", + "node_modules/methods": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, "engines": { "node": ">= 0.6" } }, - "node_modules/keytar": { - "version": "7.9.0", + "node_modules/microbuffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/keyv": { - "version": "4.0.3", + "node_modules/miller-rabin": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/kind-of": { - "version": "6.0.3", + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/klona": { - "version": "2.0.6", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/koa": { - "version": "2.15.3", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" + "mime-db": "1.52.0" }, "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + "node": ">= 0.6" } }, - "node_modules/koa-compose": { - "version": "4.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/koa-convert": { - "version": "2.0.0", + "node_modules/mimic-fn": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/koa-morgan": { + "node_modules/mimic-response": { "version": "1.0.1", - "dev": true, "license": "MIT", - "dependencies": { - "morgan": "^1.6.1" + "engines": { + "node": ">=4" } }, - "node_modules/koa-mount": { - "version": "4.0.0", + "node_modules/min-indent": { + "version": "1.0.1", "dev": true, "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "debug": "^4.0.1", - "koa-compose": "^4.1.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 7.6.0" + "node": "*" } }, - "node_modules/koa-send": { - "version": "5.0.1", + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "engines": { - "node": ">= 8" + "node": ">= 6" } }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/koa-static": { - "version": "5.0.0", + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, "engines": { - "node": ">= 7.6.0" + "node": ">=0.10.0" } }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "dev": true, + "node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/koa/node_modules/depd": { - "version": "2.0.0", + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/mocha": { + "version": "10.1.0", "dev": true, "license": "MIT", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">= 0.8" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", + "node_modules/mocha-junit-reporter": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "debug": "^4.3.4", + "md5": "^2.3.0", + "mkdirp": "^3.0.0", + "strip-ansi": "^6.0.1", + "xml": "^1.0.1" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "mocha": ">=2.2.5" } }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", + "node_modules/mocha-junit-reporter/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/kuler": { - "version": "2.0.0", - "license": "MIT" + "node_modules/mocha-junit-reporter/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/launch-editor": { - "version": "2.6.0", + "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/lazystream": { - "version": "1.0.1", + "node_modules/mocha-multi-reporters": { + "version": "1.5.1", + "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "^2.0.5" + "debug": "^4.1.1", + "lodash": "^4.17.15" }, "engines": { - "node": ">= 0.6.3" + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" } }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "balanced-match": "^1.0.0" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", "dependencies": { - "safe-buffer": "~5.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/leven": { - "version": "3.1.0", + "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/levn": { - "version": "0.4.1", + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.8.0" + "node": "*" } }, - "node_modules/lie": { - "version": "3.3.0", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "immediate": "~3.0.5" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", "dev": true, "license": "MIT" }, - "node_modules/linkify-it": { - "version": "4.0.1", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/loader-runner": { - "version": "4.2.0", + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", "dev": true, "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, "engines": { - "node": ">=6.11.5" + "node": ">=10" } }, - "node_modules/loader-utils": { - "version": "2.0.4", + "node_modules/morgan": { + "version": "1.10.0", "dev": true, "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" }, "engines": { - "node": ">=8.9.0" + "node": ">= 0.8.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.5.0", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "node": ">= 0.8" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", + "node_modules/mri": { + "version": "1.2.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/lru-cache": { - "version": "6.0.0", + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "engines": { - "node": ">=10" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/lru-queue": { - "version": "0.1.0", + "node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "license": "ISC" + }, + "node_modules/mvdan-sh": { + "version": "0.10.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/mz": { + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "es5-ext": "~0.10.2" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/magic-string": { - "version": "0.30.0", + "node_modules/nanoid": { + "version": "3.3.3", + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/make-dir": { - "version": "4.0.0", + "node_modules/napi-build-utils": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true }, - "node_modules/make-error": { - "version": "1.3.6", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/map-obj": { - "version": "4.3.0", + "node_modules/neatequal": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "varstream": "^0.3.2" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/map-stream": { - "version": "0.0.7", + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, "license": "MIT" }, - "node_modules/markdown-it": { - "version": "13.0.2", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } + "node_modules/next-tick": { + "version": "1.1.0", + "dev": true, + "license": "ISC" }, - "node_modules/markdown-it/node_modules/entities": { - "version": "3.0.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node_modules/nise": { + "version": "5.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/marked": { - "version": "13.0.1", + "node_modules/node-abi": { + "version": "3.45.0", "dev": true, "license": "MIT", - "bin": { - "marked": "bin/marked.js" + "optional": true, + "dependencies": { + "semver": "^7.3.5" }, "engines": { - "node": ">= 18" + "node": ">=10" } }, - "node_modules/md5": { - "version": "2.3.0", + "node_modules/node-addon-api": { + "version": "4.3.0", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } + "license": "MIT", + "optional": true }, - "node_modules/md5.js": { - "version": "1.3.5", + "node_modules/node-fetch": { + "version": "2.7.0", "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/mdurl": { - "version": "1.0.1", + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/memfs": { - "version": "3.4.7", + "node_modules/node-forge": { + "version": "1.3.1", "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.3" - }, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">= 4.0.0" + "node": ">= 6.13.0" } }, - "node_modules/memoizee": { - "version": "0.4.15", + "node_modules/node-releases": { + "version": "2.0.14", "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } + "license": "MIT" }, - "node_modules/meow": { - "version": "9.0.0", + "node_modules/normalize-package-data": { + "version": "3.0.3", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/decamelize": { - "version": "1.2.0", + "node_modules/normalize-path": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", "engines": { "node": ">=10" }, @@ -14002,1612 +15363,1614 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", + "node_modules/npm-run-path": { + "version": "4.0.1", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/merge-stream": { - "version": "2.0.0", + "node_modules/nth-check": { + "version": "2.1.1", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } }, - "node_modules/merge2": { - "version": "1.4.1", + "node_modules/nunjucks": { + "version": "3.2.4", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, "engines": { - "node": ">= 8" + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/methods": { - "version": "1.1.2", + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/microbuffer": { - "version": "1.0.0", + "node_modules/nwsapi": { + "version": "2.2.7", "dev": true, "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", + "node_modules/object-assign": { + "version": "4.1.1", "dev": true, "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", + "node_modules/object-inspect": { + "version": "1.13.2", "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "engines": { + "node": ">= 0.4" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", + "node_modules/object-is": { + "version": "1.1.5", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mime-db": { - "version": "1.52.0", + "node_modules/object-keys": { + "version": "1.1.1", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" } }, - "node_modules/mime-types": { - "version": "2.1.35", + "node_modules/object.assign": { + "version": "4.1.4", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/obuf": { + "version": "1.1.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/mimic-response": { - "version": "1.0.1", + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/min-indent": { - "version": "1.0.1", + "node_modules/on-headers": { + "version": "1.0.2", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", + "node_modules/once": { + "version": "1.4.0", "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "wrappy": "1" } }, - "node_modules/minimist": { - "version": "1.2.8", + "node_modules/one-time": { + "version": "1.0.0", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "fn.name": "1.x.x" } }, - "node_modules/minimist-options": { - "version": "4.1.0", + "node_modules/onetime": { + "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", + "node_modules/only": { + "version": "0.0.2", + "dev": true + }, + "node_modules/open": { + "version": "8.4.0", "dev": true, "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", + "node_modules/optionator": { + "version": "0.9.3", "dev": true, "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/minipass": { - "version": "7.0.4", - "license": "ISC", + "node_modules/os-browserify": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "0.5.6", + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "yocto-queue": "^0.1.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/mocha": { - "version": "10.1.0", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha-junit-reporter": { - "version": "2.2.1", + "node_modules/p-retry": { + "version": "4.6.1", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "md5": "^2.3.0", - "mkdirp": "^3.0.0", - "strip-ansi": "^6.0.1", - "xml": "^1.0.1" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" }, - "peerDependencies": { - "mocha": ">=2.2.5" + "engines": { + "node": ">=8" } }, - "node_modules/mocha-junit-reporter/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/p-try": { + "version": "2.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/mocha-junit-reporter/node_modules/mkdirp": { - "version": "3.0.1", + "node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "callsites": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=6" } }, - "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/parse-asn1": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha-multi-reporters": { - "version": "1.5.1", - "dev": true, + "node_modules/parse-node-version": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "lodash": "^4.17.15" - }, "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "mocha": ">=3.1.2" + "node": ">= 0.10" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/parse-semver": { + "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "semver": "^5.1.0" } }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", + "node_modules/parse-srcset": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.1.2", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "entities": "^4.4.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/parseurl": { + "version": "1.3.3", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", + "node_modules/path-browserify": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", "dev": true, "license": "MIT" }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", + "node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "license": "ISC", "engines": { - "node": ">=10" + "node": "14 || >=16.14" } }, - "node_modules/morgan": { - "version": "1.10.0", + "node_modules/path-to-regexp": { + "version": "1.9.0", "dev": true, "license": "MIT", "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" + "isarray": "0.0.1" } }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } + "license": "MIT" }, - "node_modules/morgan/node_modules/depd": { - "version": "2.0.0", + "node_modules/path-type": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" + "node_modules/pause-stream": { + "version": "0.0.11", + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "dev": true, + "node_modules/pbkdf2": { + "version": "3.1.2", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">= 0.8" + "node": ">=0.12" } }, - "node_modules/mri": { - "version": "1.2.0", + "node_modules/peek-stream": { + "version": "1.1.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" } }, - "node_modules/ms": { - "version": "2.1.2", + "node_modules/pend": { + "version": "1.2.0", + "dev": true, "license": "MIT" }, - "node_modules/multicast-dns": { - "version": "7.2.5", + "node_modules/picocolors": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "engines": { + "node": ">=8.6" }, - "bin": { - "multicast-dns": "cli.js" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "license": "ISC" - }, - "node_modules/mvdan-sh": { - "version": "0.10.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/mz": { - "version": "2.7.0", + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/nanoid": { - "version": "3.3.3", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=8" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/neatequal": { - "version": "1.0.0", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { - "varstream": "^0.3.2" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/negotiator": { - "version": "0.6.3", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/nise": { - "version": "5.1.1", + "node_modules/playwright": { + "version": "1.44.0", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "playwright-core": "1.44.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/node-abi": { - "version": "3.45.0", + "node_modules/playwright-core": { + "version": "1.44.0", "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "node_modules/node-addon-api": { - "version": "4.3.0", + "node_modules/pluralize": { + "version": "8.0.0", "dev": true, "license": "MIT", - "optional": true + "engines": { + "node": ">=4" + } }, - "node_modules/node-fetch": { - "version": "2.7.0", + "node_modules/portfinder": { + "version": "1.0.32", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 0.12.0" } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "lodash": "^4.17.14" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/postcss": { + "version": "8.4.33", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >=14" } }, - "node_modules/normalize-path": { + "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "license": "MIT", + "dev": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/nth-check": { - "version": "2.1.1", + "node_modules/postcss-modules-scope": { + "version": "3.1.1", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "boolbase": "^1.0.0" + "postcss-selector-parser": "^6.0.4" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/nunjucks": { - "version": "3.2.4", + "node_modules/postcss-modules-values": { + "version": "4.0.0", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "a-sync-waterfall": "^1.0.0", - "asap": "^2.0.3", - "commander": "^5.1.0" - }, - "bin": { - "nunjucks-precompile": "bin/precompile" + "icss-utils": "^5.0.0" }, "engines": { - "node": ">= 6.9.0" + "node": "^10 || ^12 || >= 14" }, "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "postcss": "^8.1.0" } }, - "node_modules/nunjucks/node_modules/commander": { - "version": "5.1.0", + "node_modules/postcss-selector-parser": { + "version": "6.0.15", "dev": true, "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/nwsapi": { - "version": "2.2.7", + "node_modules/postcss-value-parser": { + "version": "4.2.0", "dev": true, "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", "dev": true, "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/object-inspect": { - "version": "1.13.2", + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/object-is": { - "version": "1.1.5", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "fast-diff": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6.0.0" } }, - "node_modules/object.assign": { - "version": "4.1.4", + "node_modules/prettier-plugin-sh": { + "version": "0.14.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "mvdan-sh": "^0.10.1", + "sh-syntax": "^0.4.1" }, "engines": { - "node": ">= 0.4" + "node": ">=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/unts" + }, + "peerDependencies": { + "prettier": "^3.0.3" } }, - "node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", + "node_modules/pretty-quick": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "execa": "^5.1.1", + "find-up": "^5.0.0", + "ignore": "^5.3.0", + "mri": "^1.2.0", + "picocolors": "^1.0.0", + "picomatch": "^3.0.1", + "tslib": "^2.6.2" + }, + "bin": { + "pretty-quick": "lib/cli.mjs" }, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "peerDependencies": { + "prettier": "^3.0.0" } }, - "node_modules/on-headers": { - "version": "1.0.2", + "node_modules/pretty-quick/node_modules/picomatch": { + "version": "3.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node_modules/prismjs": { + "version": "1.29.0", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/one-time": { - "version": "1.0.0", + "node_modules/private": { + "version": "0.1.8", + "dev": true, "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" + "engines": { + "node": ">= 0.6" } }, - "node_modules/onetime": { - "version": "5.1.2", - "dev": true, + "node_modules/process": { + "version": "0.11.10", "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6.0" } }, - "node_modules/only": { - "version": "0.0.2", - "dev": true + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" }, - "node_modules/open": { - "version": "8.4.0", + "node_modules/proxy-addr": { + "version": "2.0.7", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/optionator": { - "version": "0.9.3", + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", "dev": true, "license": "MIT", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, - "node_modules/os-browserify": { - "version": "0.3.0", + "node_modules/psl": { + "version": "1.9.0", + "dev": true, "license": "MIT" }, - "node_modules/p-cancelable": { - "version": "2.1.1", + "node_modules/public-encrypt": { + "version": "4.0.3", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/p-locate": { - "version": "5.0.0", + "node_modules/pumpify": { + "version": "1.5.1", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "node_modules/p-retry": { - "version": "4.6.1", + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, + "node_modules/punycode": { + "version": "2.3.1", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", + "node_modules/qs": { + "version": "6.13.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "callsites": "^3.0.0" + "side-channel": "^1.0.6" }, "engines": { - "node": ">=6" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "node_modules/querystring": { + "version": "0.2.0", + "engines": { + "node": ">=0.4.x" } }, - "node_modules/parse-json": { - "version": "5.2.0", + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/queue-tick": { + "version": "1.0.1", "dev": true, + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", + "node_modules/randombytes": { + "version": "2.1.0", "license": "MIT", - "engines": { - "node": ">= 0.10" + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/parse-semver": { - "version": "1.1.1", - "dev": true, + "node_modules/randomfill": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "semver": "^5.1.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", + "node_modules/range-parser": { + "version": "1.2.1", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/parse-srcset": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/parse5": { - "version": "7.1.2", + "node_modules/raw-body": { + "version": "2.5.2", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">= 0.8" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", + "node_modules/rc": { + "version": "1.2.8", "dev": true, - "license": "MIT", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "bin": { + "rc": "cli.js" } }, - "node_modules/parseurl": { - "version": "1.3.3", + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", + "node_modules/read": { + "version": "1.0.7", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", + "license": "ISC", + "dependencies": { + "mute-stream": "~0.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/path-key": { - "version": "3.1.1", + "node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", + "node_modules/read-pkg-up": { + "version": "7.0.1", "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-to-regexp": { - "version": "1.9.0", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "isarray": "0.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { "node": ">=8" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "license": [ - "MIT", - "Apache2" - ], - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "p-try": "^2.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/peek-stream": { - "version": "1.1.3", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/pend": { - "version": "1.2.0", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.1", "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.1", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/readdirp": { + "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/readline-sync": { + "version": "1.4.10", "dev": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/recast": { + "version": "0.11.23", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/playwright": { - "version": "1.44.0", + "node_modules/recast/node_modules/ast-types": { + "version": "0.9.6", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.44.0" - }, - "bin": { - "playwright": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "fsevents": "2.3.2" + "node": ">= 0.8" } }, - "node_modules/playwright-core": { - "version": "1.44.0", + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", "dev": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", "bin": { - "playwright-core": "cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=16" + "node": ">=4" } }, - "node_modules/pluralize": { - "version": "8.0.0", + "node_modules/recast/node_modules/source-map": { + "version": "0.5.7", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/portfinder": { - "version": "1.0.32", + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, "license": "MIT", "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.12.0" + "node": ">= 10.13.0" } }, - "node_modules/portfinder/node_modules/async": { - "version": "2.6.4", + "node_modules/redent": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "lodash": "^4.17.14" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "node_modules/postcss": { - "version": "8.4.33", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">= 0.4" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", + "node_modules/regjsparser": { + "version": "0.10.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" + "jsesc": "~0.5.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.10" } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "dev": true, - "license": "ISC", + "node_modules/request-light": { + "version": "0.2.5", + "license": "MIT", "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "vscode-nls": "^4.1.1" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "dev": true, + "node_modules/request-light/node_modules/agent-base": { + "version": "4.3.0", "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "es6-promisify": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">= 4.0.0" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/request-light/node_modules/debug": { + "version": "3.1.0", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "dev": true, + "node_modules/request-light/node_modules/http-proxy-agent": { + "version": "2.1.0", "license": "MIT", - "optional": true, "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "agent-base": "4", + "debug": "3.1.0" }, "engines": { - "node": ">=10" + "node": ">= 4.5.0" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, + "node_modules/request-light/node_modules/https-proxy-agent": { + "version": "2.2.4", "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 4.5.0" } }, - "node_modules/prettier": { - "version": "3.3.2", - "dev": true, + "node_modules/request-light/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/request-light/node_modules/vscode-nls": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", + "node_modules/require-from-string": { + "version": "2.0.2", "dev": true, "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/prettier-plugin-sh": { - "version": "0.14.0", + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", "dev": true, "license": "MIT", "dependencies": { - "mvdan-sh": "^0.10.1", - "sh-syntax": "^0.4.1" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=16.0.0" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://opencollective.com/unts" - }, - "peerDependencies": { - "prettier": "^3.0.3" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-quick": { - "version": "4.0.0", + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.1.1", - "find-up": "^5.0.0", - "ignore": "^5.3.0", - "mri": "^1.2.0", - "picocolors": "^1.0.0", - "picomatch": "^3.0.1", - "tslib": "^2.6.2" - }, - "bin": { - "pretty-quick": "lib/cli.mjs" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "prettier": "^3.0.0" + "node": ">=8" } }, - "node_modules/pretty-quick/node_modules/picomatch": { - "version": "3.0.1", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=8" } }, - "node_modules/prismjs": { - "version": "1.29.0", + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/private": { - "version": "0.1.8", + "node_modules/resolve-path": { + "version": "1.4.0", "dev": true, "license": "MIT", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/process": { - "version": "0.11.10", + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.6" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" }, - "node_modules/proxy-addr": { - "version": "2.0.7", + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", "dev": true, + "license": "ISC" + }, + "node_modules/responselike": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "lowercase-keys": "^2.0.0" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", + "node_modules/retry": { + "version": "0.13.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 4" } }, - "node_modules/psl": { - "version": "1.9.0", + "node_modules/reusify": { + "version": "1.0.4", "dev": true, - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "license": "MIT", + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pumpify": { - "version": "1.5.1", + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "dev": true, + "node_modules/ripemd160": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/punycode": { - "version": "2.3.1", + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/qs": { - "version": "6.13.0", + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" + "tslib": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", "engines": { - "node": ">=0.4.x" + "npm": ">=2.0.0" } }, - "node_modules/querystringify": { - "version": "2.2.0", + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "MIT" + "license": "0BSD" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", "funding": [ { "type": "github", @@ -15624,3819 +16987,4130 @@ ], "license": "MIT" }, - "node_modules/queue-tick": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", + "node_modules/safe-stable-stringify": { + "version": "2.3.1", "license": "MIT", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" }, - "node_modules/randomfill": { - "version": "1.0.4", + "node_modules/sanitize-html": { + "version": "2.13.0", "license": "MIT", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, + "node_modules/sanitize-html/node_modules/is-plain-object": { + "version": "5.0.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/raw-body": { - "version": "2.5.2", + "node_modules/sass": { + "version": "1.69.5", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "sass": "sass.js" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", + "node_modules/sass-loader": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "dev": true, - "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "neo-async": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/sax": { + "version": "1.2.1", + "license": "ISC" }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/saxes": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "p-limit": "^2.2.0" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node": ">=v12.22.7" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", + "node_modules/schema-utils": { + "version": "3.3.0", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", + "node_modules/semver": { + "version": "7.6.2", "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, - "node_modules/readdirp": { - "version": "3.6.0", + "node_modules/send": { + "version": "0.19.0", "dev": true, "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readline-sync": { - "version": "1.4.10", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/recast": { - "version": "0.11.23", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" + "ms": "2.0.0" } }, - "node_modules/recast/node_modules/ast-types": { - "version": "0.9.6", + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/recast/node_modules/esprima": { - "version": "3.1.3", + "node_modules/send/node_modules/ms": { + "version": "2.1.3", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/recast/node_modules/source-map": { - "version": "0.5.7", + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/rechoir": { - "version": "0.8.0", + "node_modules/serialize-javascript": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" + "randombytes": "^2.1.0" } }, - "node_modules/redent": { - "version": "3.0.0", + "node_modules/serve-index": { + "version": "1.9.1", "dev": true, "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/regexp-tree": { - "version": "0.1.27", + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", "dev": true, "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/regjsparser": { - "version": "0.10.0", + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } + "license": "ISC" }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } + "license": "MIT" }, - "node_modules/remove-trailing-separator": { + "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "dev": true, "license": "ISC" }, - "node_modules/replace-ext": { - "version": "1.0.1", + "node_modules/serve-static": { + "version": "1.16.2", + "dev": true, "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8.0" } }, - "node_modules/request-light": { - "version": "0.2.5", + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "vscode-nls": "^4.1.1" + "engines": { + "node": ">= 0.8" } }, - "node_modules/request-light/node_modules/agent-base": { - "version": "4.3.0", + "node_modules/set-function-length": { + "version": "1.2.2", "license": "MIT", "dependencies": { - "es6-promisify": "^5.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4" } }, - "node_modules/request-light/node_modules/debug": { - "version": "3.1.0", + "node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/sh-syntax": { + "version": "0.4.2", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/request-light/node_modules/http-proxy-agent": { - "version": "2.1.0", - "license": "MIT", + "node_modules/sha.js": { + "version": "2.4.11", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "agent-base": "4", - "debug": "3.1.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">= 4.5.0" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/request-light/node_modules/https-proxy-agent": { - "version": "2.2.4", + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "kind-of": "^6.0.2" }, "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/request-light/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/request-light/node_modules/vscode-nls": { - "version": "4.1.2", - "license": "MIT" + "node": ">=8" + } }, - "node_modules/require-directory": { - "version": "2.1.1", + "node_modules/shebang-command": { + "version": "2.0.0", "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, + "node_modules/shebang-regex": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.1", + "node_modules/shell-quote": { + "version": "1.8.1", "dev": true, "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "resolve-from": "^5.0.0" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-from": { - "version": "4.0.0", + "node_modules/shelljs/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/resolve-path": { - "version": "1.4.0", + "node_modules/shelljs/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, - "license": "MIT", "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" + "resolve": "^1.1.6" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, + "node_modules/side-channel": { + "version": "1.0.6", "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, "license": "ISC" }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", + "node_modules/simple-concat": { + "version": "1.0.1", "dev": true, - "license": "ISC" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true }, - "node_modules/responselike": { - "version": "2.0.0", + "node_modules/simple-get": { + "version": "4.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", + "optional": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/retry": { - "version": "0.13.1", - "dev": true, + "node_modules/simple-swizzle": { + "version": "0.2.2", "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "is-arrayish": "^0.3.1" } }, - "node_modules/reusify": { - "version": "1.0.4", + "node_modules/sinon": { + "version": "14.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^6.1.1", + "diff": "^5.0.0", + "nise": "^5.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/rimraf": { - "version": "3.0.2", + "node_modules/sockjs": { + "version": "0.3.24", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "uuid": "dist/bin/uuid" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", + "node_modules/source-list-map": { + "version": "2.0.1", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", + "node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, "license": "MIT", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", + "node_modules/spdx-exceptions": { + "version": "2.3.0", "dev": true, - "license": "MIT" + "license": "CC-BY-3.0" }, - "node_modules/run-parallel": { - "version": "1.2.0", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "dev": true, + "license": "CC0-1.0" }, - "node_modules/safe-stable-stringify": { - "version": "2.3.1", + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/sanitize-html": { - "version": "2.13.0", + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "deepmerge": "^4.2.2", - "escape-string-regexp": "^4.0.0", - "htmlparser2": "^8.0.0", - "is-plain-object": "^5.0.0", - "parse-srcset": "^1.0.2", - "postcss": "^8.3.11" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/sanitize-html/node_modules/is-plain-object": { - "version": "5.0.0", + "node_modules/split": { + "version": "1.0.1", "license": "MIT", + "dependencies": { + "through": "2" + }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/sass": { - "version": "1.69.5", - "dev": true, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/stack-trace": { + "version": "0.0.10", "license": "MIT", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, "engines": { - "node": ">=14.0.0" + "node": "*" } }, - "node_modules/sass-loader": { - "version": "12.6.0", + "node_modules/statuses": { + "version": "1.5.0", "dev": true, "license": "MIT", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/sax": { - "version": "1.2.1", - "license": "ISC" - }, - "node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", + "node_modules/stream-browserify": { + "version": "3.0.0", + "license": "MIT", "dependencies": { - "xmlchars": "^2.2.0" - }, + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "license": "Unlicense", "engines": { - "node": ">=v12.22.7" + "node": ">= 0.10.0" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, + "node_modules/stream-combiner": { + "version": "0.2.2", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "duplexer": "~0.1.1", + "through": "~2.3.4" } }, - "node_modules/select-hose": { - "version": "2.0.0", + "node_modules/stream-shift": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/selfsigned": { - "version": "2.1.1", + "node_modules/streamx": { + "version": "2.16.1", "dev": true, "license": "MIT", "dependencies": { - "node-forge": "^1" + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" }, - "engines": { - "node": ">=10" + "optionalDependencies": { + "bare-events": "^2.2.0" } }, - "node_modules/semver": { - "version": "7.6.2", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/send": { - "version": "0.19.0", - "dev": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "dev": true, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "dev": true, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "dev": true, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, + "node_modules/strip-ansi": { + "version": "5.2.0", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "license": "MIT", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/serve-index/node_modules/ms": { + "node_modules/strip-final-newline": { "version": "2.0.0", "dev": true, - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/serve-static": { - "version": "1.16.2", + "node_modules/strip-indent": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "min-indent": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "node": ">=8" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/setimmediate": { + "node_modules/strnum": { "version": "1.0.5", - "dev": true, "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", + "node_modules/style-loader": { + "version": "3.3.3", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } }, - "node_modules/sh-syntax": { - "version": "0.4.2", + "node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sha.js": { - "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "node_modules/svg-pathdata": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/svg2ttf": { + "version": "6.0.3", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@xmldom/xmldom": "^0.7.2", + "argparse": "^2.0.1", + "cubic2quad": "^1.2.1", + "lodash": "^4.17.10", + "microbuffer": "^1.0.0", + "svgpath": "^2.1.5" }, "bin": { - "sha.js": "bin.js" + "svg2ttf": "svg2ttf.js" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", + "node_modules/svgicons2svgfont": { + "version": "10.0.6", "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "commander": "^7.2.0", + "geometry-interfaces": "^1.1.4", + "glob": "^7.1.6", + "neatequal": "^1.0.0", + "readable-stream": "^3.4.0", + "sax": "^1.2.4", + "svg-pathdata": "^6.0.0" + }, + "bin": { + "svgicons2svgfont": "bin/svgicons2svgfont.js" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/svgicons2svgfont/node_modules/commander": { + "version": "7.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", + "node_modules/svgicons2svgfont/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/shell-quote": { - "version": "1.8.1", + "node_modules/svgicons2svgfont/node_modules/sax": { + "version": "1.2.4", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/side-channel": { - "version": "1.0.6", + "node_modules/svgpath": { + "version": "2.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.8.8", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/unts" } }, - "node_modules/signal-exit": { - "version": "3.0.7", + "node_modules/tapable": { + "version": "2.2.1", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/simple-concat": { - "version": "1.0.1", + "node_modules/tar-fs": { + "version": "2.1.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", - "optional": true + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } }, - "node_modules/simple-get": { - "version": "4.0.1", + "node_modules/tar-stream": { + "version": "2.2.0", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "optional": true, "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", + "node_modules/tcp-port-used": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "is-arrayish": "^0.3.1" + "debug": "4.3.1", + "is2": "^2.0.6" } }, - "node_modules/sinon": { - "version": "14.0.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" + "ms": "2.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", + "node_modules/terser": { + "version": "5.31.6", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause", "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/sockjs": { - "version": "0.3.24", + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", "dev": true, "license": "MIT", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.2", "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", "dev": true, "license": "MIT" }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "node_modules/spdx-correct": { - "version": "3.1.1", + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", + "node_modules/text-hex": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", "dev": true, - "license": "CC-BY-3.0" + "license": "MIT" }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", + "node_modules/thenify": { + "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "any-promise": "^1.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/spdy": { - "version": "4.0.2", + "node_modules/thenify-all": { + "version": "1.6.0", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.8" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", + "node_modules/through": { + "version": "2.3.8", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/split": { - "version": "1.0.1", + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, "license": "MIT", "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" }, - "node_modules/stack-trace": { - "version": "0.0.10", + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/statuses": { - "version": "1.5.0", + "node_modules/thunky": { + "version": "1.1.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/stream-browserify": { - "version": "3.0.0", + "node_modules/time-stamp": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "license": "Unlicense", "engines": { - "node": ">= 0.10.0" + "node": ">=0.10.0" } }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "license": "MIT", + "node_modules/timers-ext": { + "version": "0.1.7", + "dev": true, + "license": "ISC", "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "es5-ext": "~0.10.46", + "next-tick": "1" } }, - "node_modules/stream-shift": { - "version": "1.0.1", + "node_modules/tmp": { + "version": "0.2.1", "dev": true, - "license": "MIT" - }, - "node_modules/streamx": { - "version": "2.16.1", "license": "MIT", "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "rimraf": "^3.0.0" }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "engines": { + "node": ">=8.17.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/string-width": { - "version": "4.2.3", + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", + "node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/tr46": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "punycode": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", + "node_modules/triple-beam": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "engines": { + "node": ">=16" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", + "node_modules/ts-morph": { + "version": "23.0.0", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "@ts-morph/common": "~0.24.0", + "code-block-writer": "^13.0.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=6" + "node": ">=0.3.1" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/tsscmp": { + "version": "1.0.6", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.6.x" } }, - "node_modules/strip-final-newline": { + "node_modules/ttf2eot": { "version": "2.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "argparse": "^1.0.6", + "microbuffer": "^1.0.0" + }, + "bin": { + "ttf2eot": "ttf2eot.js" } }, - "node_modules/strip-indent": { - "version": "3.0.0", + "node_modules/ttf2eot/node_modules/argparse": { + "version": "1.0.10", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" + "sprintf-js": "~1.0.2" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/ttf2woff": { + "version": "2.0.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "argparse": "^1.0.6", + "microbuffer": "^1.0.0", + "pako": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "ttf2woff": "ttf2woff.js" } }, - "node_modules/strnum": { - "version": "1.0.5", - "license": "MIT" + "node_modules/ttf2woff/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, - "node_modules/style-loader": { - "version": "3.3.3", + "node_modules/tunnel": { + "version": "0.0.6", "dev": true, "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/supports-color": { - "version": "7.2.0", + "node_modules/tunnel-agent": { + "version": "0.6.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "has-flag": "^4.0.0" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", + "node_modules/type": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "prelude-ls": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/svg-pathdata": { - "version": "6.0.3", + "node_modules/type-detect": { + "version": "4.0.8", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=4" } }, - "node_modules/svg2ttf": { - "version": "6.0.3", + "node_modules/type-fest": { + "version": "0.8.1", "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.7.2", - "argparse": "^2.0.1", - "cubic2quad": "^1.2.1", - "lodash": "^4.17.10", - "microbuffer": "^1.0.0", - "svgpath": "^2.1.5" - }, - "bin": { - "svg2ttf": "svg2ttf.js" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" } }, - "node_modules/svgicons2svgfont": { - "version": "10.0.6", + "node_modules/type-is": { + "version": "1.6.18", "dev": true, "license": "MIT", "dependencies": { - "commander": "^7.2.0", - "geometry-interfaces": "^1.1.4", - "glob": "^7.1.6", - "neatequal": "^1.0.0", - "readable-stream": "^3.4.0", - "sax": "^1.2.4", - "svg-pathdata": "^6.0.0" - }, - "bin": { - "svgicons2svgfont": "bin/svgicons2svgfont.js" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.6" } }, - "node_modules/svgicons2svgfont/node_modules/commander": { - "version": "7.2.0", + "node_modules/typed-rest-client": { + "version": "1.8.11", "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" } }, - "node_modules/svgicons2svgfont/node_modules/glob": { - "version": "7.2.3", + "node_modules/typescript": { + "version": "5.0.4", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12.20" } }, - "node_modules/svgicons2svgfont/node_modules/sax": { - "version": "1.2.4", - "dev": true, - "license": "ISC" - }, - "node_modules/svgpath": { - "version": "2.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "dev": true, + "node_modules/uc.micro": { + "version": "1.0.6", "license": "MIT" }, - "node_modules/synckit": { - "version": "0.8.8", + "node_modules/umd-compat-loader": { + "version": "2.1.2", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "ast-types": "^0.9.2", + "loader-utils": "^1.0.3", + "recast": "^0.11.17" } }, - "node_modules/tar-fs": { - "version": "2.1.1", + "node_modules/umd-compat-loader/node_modules/json5": { + "version": "1.0.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/tar-stream": { - "version": "2.2.0", + "node_modules/umd-compat-loader/node_modules/loader-utils": { + "version": "1.4.2", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=4.0.0" } }, - "node_modules/tcp-port-used": { + "node_modules/unbox-primitive": { "version": "1.0.2", "license": "MIT", "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", + "node_modules/underscore": { + "version": "1.13.6", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "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", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 10.0.0" } }, - "node_modules/terser": { - "version": "5.31.6", + "node_modules/unpipe": { + "version": "1.0.0", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", + "node_modules/update-browserslist-db": { + "version": "1.0.16", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "browserslist": ">= 4.21.0" } }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.2", + "node_modules/uri-js": { + "version": "4.4.1", "dev": true, - "license": "BSD-3-Clause", + "license": "BSD-2-Clause", "dependencies": { - "randombytes": "^2.1.0" + "punycode": "^2.1.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "node_modules/url": { + "version": "0.10.3", + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", + "node_modules/url-parse": { + "version": "1.5.10", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/text-hex": { - "version": "1.0.0", + "node_modules/util-deprecate": { + "version": "1.0.2", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", + "node_modules/utils-merge": { + "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } }, - "node_modules/thenify": { - "version": "3.3.1", - "dev": true, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/thenify-all": { - "version": "1.6.0", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "dev": true, + "license": "ISC", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=10.12.0" } }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", + "node_modules/varstream": { + "version": "0.3.2", "dev": true, - "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "readable-stream": "^1.0.33" + }, + "bin": { + "json2varstream": "cli/json2varstream.js", + "varstream2json": "cli/varstream2json.js" + }, + "engines": { + "node": ">=0.10.*" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/varstream/node_modules/isarray": { + "version": "0.0.1", "dev": true, "license": "MIT" }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/varstream/node_modules/readable-stream": { + "version": "1.1.14", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/thunky": { - "version": "1.1.0", + "node_modules/varstream/node_modules/string_decoder": { + "version": "0.10.31", "dev": true, "license": "MIT" }, - "node_modules/time-stamp": { - "version": "1.1.0", + "node_modules/vary": { + "version": "1.1.2", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" + "node": ">= 0.8" } }, - "node_modules/tmp": { - "version": "0.2.1", - "dev": true, + "node_modules/vinyl": { + "version": "2.2.1", "license": "MIT", "dependencies": { - "rimraf": "^3.0.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" }, "engines": { - "node": ">=8.17.0" + "node": ">= 0.10" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, + "node_modules/vscode-json-languageservice": { + "version": "5.3.5", "license": "MIT", "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "@vscode/l10n": "^0.0.13", + "jsonc-parser": "^3.2.0", + "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-types": "^3.17.3", + "vscode-uri": "^3.0.7" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, + "node_modules/vscode-json-languageservice/node_modules/vscode-uri": { + "version": "3.0.7", + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "5.0.1", "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=8.0.0 || >=10.0.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/vscode-languageclient": { + "version": "6.1.4", + "license": "MIT", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "semver": "^6.3.0", + "vscode-languageserver-protocol": "3.15.3" }, "engines": { - "node": ">=6" + "vscode": "^1.41.0" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/tr46": { - "version": "5.0.0", + "node_modules/vscode-languageserver": { + "version": "6.1.1", "license": "MIT", "dependencies": { - "punycode": "^2.3.1" + "vscode-languageserver-protocol": "^3.15.3" }, - "engines": { - "node": ">=18" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "dev": true, + "node_modules/vscode-languageserver-protocol": { + "version": "3.15.3", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "vscode-jsonrpc": "^5.0.1", + "vscode-languageserver-types": "3.15.1" } }, - "node_modules/triple-beam": { - "version": "1.3.0", + "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.15.1", "license": "MIT" }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "dev": true, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "license": "MIT" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "license": "MIT" + }, + "node_modules/vscode-nls-dev": { + "version": "4.0.4", "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "ansi-colors": "^4.1.1", + "clone": "^2.1.2", + "event-stream": "^3.3.4", + "fancy-log": "^1.3.3", + "glob": "^7.2.0", + "iconv-lite": "^0.6.3", + "is": "^3.3.0", + "source-map": "^0.6.1", + "typescript": "^4.5.4", + "vinyl": "^2.2.1", + "xml2js": "^0.5.0", + "yargs": "^17.3.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "bin": { + "vscl": "lib/vscl.js" } }, - "node_modules/ts-morph": { - "version": "23.0.0", - "dev": true, - "license": "MIT", + "node_modules/vscode-nls-dev/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", "dependencies": { - "@ts-morph/common": "~0.24.0", - "code-block-writer": "^13.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, + "node_modules/vscode-nls-dev/node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-nls-dev/node_modules/typescript": { + "version": "4.9.5", + "license": "Apache-2.0", "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">=4.2.0" } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/vscode-nls-dev/node_modules/xml2js": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=4.0.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" + "node_modules/vscode-uri": { + "version": "2.1.2", + "license": "MIT" }, - "node_modules/tsscmp": { - "version": "1.0.6", - "dev": true, + "node_modules/vue": { + "version": "3.3.4", "license": "MIT", - "engines": { - "node": ">=0.6.x" + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, - "node_modules/ttf2eot": { - "version": "2.0.0", + "node_modules/vue-loader": { + "version": "17.2.2", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.6", - "microbuffer": "^1.0.0" + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "watchpack": "^2.4.0" }, - "bin": { - "ttf2eot": "ttf2eot.js" + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "vue": { + "optional": true + } } }, - "node_modules/ttf2eot/node_modules/argparse": { - "version": "1.0.10", + "node_modules/vue-style-loader": { + "version": "4.1.3", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" } }, - "node_modules/ttf2woff": { - "version": "2.0.2", + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-style-loader/node_modules/json5": { + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.6", - "microbuffer": "^1.0.0", - "pako": "^1.0.0" + "minimist": "^1.2.0" }, "bin": { - "ttf2woff": "ttf2woff.js" + "json5": "lib/cli.js" } }, - "node_modules/ttf2woff/node_modules/argparse": { - "version": "1.0.10", + "node_modules/vue-style-loader/node_modules/loader-utils": { + "version": "1.4.2", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" } }, - "node_modules/tunnel": { - "version": "0.0.6", + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", "dev": true, "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + "node": ">=18" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", + "node_modules/watchpack": { + "version": "2.4.2", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": "*" + "node": ">=10.13.0" } }, - "node_modules/type": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", + "node_modules/wawoff2": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "woff2_compress.js": "bin/woff2_compress.js", + "woff2_decompress.js": "bin/woff2_decompress.js" } }, - "node_modules/type-detect": { - "version": "4.0.8", + "node_modules/wbuf": { + "version": "1.7.3", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "minimalistic-assert": "^1.0.0" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "node_modules/web-toolkit": { + "resolved": "packages/core/src/web", + "link": true }, - "node_modules/type-is": { - "version": "1.6.18", + "node_modules/web-tree-sitter": { + "version": "0.20.8", + "license": "MIT" + }, + "node_modules/webfont": { + "version": "11.2.26", "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "cosmiconfig": "^5.2.0", + "deepmerge": "^4.2.2", + "globby": "^11.0.0", + "meow": "^9.0.0", + "nunjucks": "^3.2.3", + "p-limit": "^3.1.0", + "parse-json": "^5.2.0", + "resolve-from": "^5.0.0", + "svg2ttf": "^6.0.2", + "svgicons2svgfont": "^10.0.3", + "ttf2eot": "^2.0.0", + "ttf2woff": "^2.0.2", + "wawoff2": "^2.0.0", + "xml2js": "^0.4.23" + }, + "bin": { + "webfont": "dist/cli.js" }, "engines": { - "node": ">= 0.6" + "node": ">= 12.0.0" } }, - "node_modules/typed-rest-client": { - "version": "1.8.11", + "node_modules/webfont/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, "license": "MIT", - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" + "engines": { + "node": ">=8" } }, - "node_modules/typescript": { - "version": "5.0.4", + "node_modules/webfont/node_modules/xml2js": { + "version": "0.5.0", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=12.20" + "node": ">=4.0.0" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/umd-compat-loader": { - "version": "2.1.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ast-types": "^0.9.2", - "loader-utils": "^1.0.3", - "recast": "^0.11.17" + "node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" } }, - "node_modules/umd-compat-loader/node_modules/json5": { - "version": "1.0.2", + "node_modules/webpack": { + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, - "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" }, "bin": { - "json5": "lib/cli.js" + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/umd-compat-loader/node_modules/loader-utils": { - "version": "1.4.2", + "node_modules/webpack-cli": { + "version": "5.1.4", "dev": true, "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "node": ">=14.15.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "dev": true, - "license": "MIT" - }, - "node_modules/unescape-html": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/unpipe": { - "version": "1.0.0", + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=14" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.16", + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" }, - "bin": { - "update-browserslist-db": "cli.js" + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "browserslist": ">= 4.21.0" + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/url": { - "version": "0.10.3", + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, "license": "MIT", "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/url-join": { - "version": "4.0.1", + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/url-parse": { - "version": "1.5.10", + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/util": { - "version": "0.12.5", + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.8.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" }, "engines": { - "node": ">=10.12.0" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", + "node_modules/webpack-merge": { + "version": "5.10.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/varstream": { - "version": "0.3.2", + "node_modules/webpack-sources": { + "version": "2.3.1", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "^1.0.33" - }, - "bin": { - "json2varstream": "cli/json2varstream.js", - "varstream2json": "cli/varstream2json.js" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" }, "engines": { - "node": ">=0.10.*" + "node": ">=10.13.0" } }, - "node_modules/varstream/node_modules/isarray": { - "version": "0.0.1", + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } }, - "node_modules/varstream/node_modules/readable-stream": { - "version": "1.1.14", + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", "dev": true, "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/varstream/node_modules/string_decoder": { - "version": "0.10.31", + "node_modules/websocket-driver": { + "version": "0.7.4", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/vary": { - "version": "1.1.2", + "node_modules/websocket-extensions": { + "version": "0.1.4", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=0.8.0" } }, - "node_modules/vinyl": { - "version": "2.2.1", + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "dev": true, "license": "MIT", "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "iconv-lite": "0.6.3" }, "engines": { - "node": ">= 0.10" + "node": ">=18" } }, - "node_modules/vscode-json-languageservice": { - "version": "5.3.5", + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, "license": "MIT", "dependencies": { - "@vscode/l10n": "^0.0.13", - "jsonc-parser": "^3.2.0", - "vscode-languageserver-textdocument": "^1.0.8", - "vscode-languageserver-types": "^3.17.3", - "vscode-uri": "^3.0.7" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/vscode-json-languageservice/node_modules/vscode-uri": { - "version": "3.0.7", - "license": "MIT" - }, - "node_modules/vscode-jsonrpc": { - "version": "5.0.1", + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.0.0 || >=10.0.0" + "node": ">=18" } }, - "node_modules/vscode-languageclient": { - "version": "6.1.4", + "node_modules/whatwg-url": { + "version": "14.0.0", "license": "MIT", "dependencies": { - "semver": "^6.3.0", - "vscode-languageserver-protocol": "3.15.3" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "vscode": "^1.41.0" + "node": ">=18" } }, - "node_modules/vscode-languageclient/node_modules/semver": { - "version": "6.3.1", + "node_modules/which": { + "version": "2.0.2", "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/vscode-languageserver": { - "version": "6.1.1", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "^3.15.3" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.15.3", + "node_modules/which-typed-array": { + "version": "1.1.8", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "^5.0.1", - "vscode-languageserver-types": "3.15.1" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.15.1", + "node_modules/wildcard": { + "version": "2.0.0", + "dev": true, "license": "MIT" }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "license": "MIT" + "node_modules/winston": { + "version": "3.11.0", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.3", - "license": "MIT" + "node_modules/winston-transport": { + "version": "4.6.0", + "license": "MIT", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } }, - "node_modules/vscode-nls": { - "version": "5.2.0", - "license": "MIT" + "node_modules/winston/node_modules/@colors/colors": { + "version": "1.6.0", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } }, - "node_modules/vscode-nls-dev": { - "version": "4.0.4", + "node_modules/workerpool": { + "version": "6.2.1", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1", - "clone": "^2.1.2", - "event-stream": "^3.3.4", - "fancy-log": "^1.3.3", - "glob": "^7.2.0", - "iconv-lite": "^0.6.3", - "is": "^3.3.0", - "source-map": "^0.6.1", - "typescript": "^4.5.4", - "vinyl": "^2.2.1", - "xml2js": "^0.5.0", - "yargs": "^17.3.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "bin": { - "vscl": "lib/vscl.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/vscode-nls-dev/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/vscode-nls-dev/node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/vscode-nls-dev/node_modules/typescript": { - "version": "4.9.5", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", "engines": { - "node": ">=4.2.0" + "node": ">=8" } }, - "node_modules/vscode-nls-dev/node_modules/xml2js": { - "version": "0.5.0", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/vscode-uri": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.3.4", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-sfc": "3.3.4", - "@vue/runtime-dom": "3.3.4", - "@vue/server-renderer": "3.3.4", - "@vue/shared": "3.3.4" - } + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" }, - "node_modules/vue-loader": { - "version": "17.2.2", + "node_modules/ws": { + "version": "8.17.1", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "watchpack": "^2.4.0" + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "webpack": "^4.1.0 || ^5.0.0-0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "@vue/compiler-sfc": { + "bufferutil": { "optional": true }, - "vue": { + "utf-8-validate": { "optional": true } } }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "node_modules/vue-style-loader/node_modules/hash-sum": { - "version": "1.0.2", + "node_modules/xml": { + "version": "1.0.1", "dev": true, "license": "MIT" }, - "node_modules/vue-style-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/vue-style-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/w3c-xmlserializer": { + "node_modules/xml-name-validator": { "version": "5.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, + "license": "Apache-2.0", "engines": { "node": ">=18" } }, - "node_modules/watchpack": { - "version": "2.4.2", - "dev": true, + "node_modules/xml2js": { + "version": "0.6.1", "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=4.0.0" } }, - "node_modules/wawoff2": { - "version": "2.0.1", - "dev": true, + "node_modules/xmlbuilder": { + "version": "11.0.1", "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "woff2_compress.js": "bin/woff2_compress.js", - "woff2_decompress.js": "bin/woff2_decompress.js" + "engines": { + "node": ">=4.0" } }, - "node_modules/wbuf": { - "version": "1.7.3", + "node_modules/xmlchars": { + "version": "2.2.0", "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-toolkit": { - "resolved": "packages/core/src/web", - "link": true - }, - "node_modules/web-tree-sitter": { - "version": "0.20.8", "license": "MIT" }, - "node_modules/webfont": { - "version": "11.2.26", + "node_modules/xtend": { + "version": "4.0.2", "dev": true, "license": "MIT", - "dependencies": { - "cosmiconfig": "^5.2.0", - "deepmerge": "^4.2.2", - "globby": "^11.0.0", - "meow": "^9.0.0", - "nunjucks": "^3.2.3", - "p-limit": "^3.1.0", - "parse-json": "^5.2.0", - "resolve-from": "^5.0.0", - "svg2ttf": "^6.0.2", - "svgicons2svgfont": "^10.0.3", - "ttf2eot": "^2.0.0", - "ttf2woff": "^2.0.2", - "wawoff2": "^2.0.0", - "xml2js": "^0.4.23" - }, - "bin": { - "webfont": "dist/cli.js" - }, "engines": { - "node": ">= 12.0.0" + "node": ">=0.4" } }, - "node_modules/webfont/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/webfont/node_modules/xml2js": { - "version": "0.5.0", + "node_modules/yallist": { + "version": "4.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", "engines": { - "node": ">=4.0.0" + "node": ">= 6" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "node_modules/yaml-ast-parser-custom-tags": { + "version": "0.0.43", + "license": "Apache-2.0" + }, + "node_modules/yaml-cfn": { + "version": "0.3.2", + "license": "Apache-2.0", + "dependencies": { + "js-yaml": "^4.0.0" + }, + "bin": { + "yaml-cfn": "cli.js" } }, - "node_modules/webpack": { - "version": "5.94.0", - "dev": true, + "node_modules/yaml-language-server": { + "version": "0.15.0", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "js-yaml": "^3.13.1", + "jsonc-parser": "^2.2.1", + "request-light": "^0.2.4", + "vscode-json-languageservice": "^3.10.0", + "vscode-languageserver": "^5.2.1", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-nls": "^4.1.2", + "vscode-uri": "^2.1.1", + "yaml-language-server-parser": "0.1.2" }, "bin": { - "webpack": "bin/webpack.js" + "yaml-language-server": "bin/yaml-language-server" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": "*" }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "optionalDependencies": { + "prettier": "2.0.5" } }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, + "node_modules/yaml-language-server-parser": { + "version": "0.1.2", + "license": "Apache-2.0" + }, + "node_modules/yaml-language-server/node_modules/argparse": { + "version": "1.0.10", "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" + "sprintf-js": "~1.0.2" + } + }, + "node_modules/yaml-language-server/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, + "node_modules/yaml-language-server/node_modules/jsonc-parser": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/prettier": { + "version": "2.0.5", "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">=14" + "node": ">=10.13.0" } }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "dev": true, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { + "version": "3.11.0", "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.2.0", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-languageserver-types": { + "version": "3.16.0-next.2", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { + "version": "5.2.0", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=8.0.0 || >=10.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "dev": true, + "node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "5.2.1", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "vscode-languageserver-protocol": "3.14.1", + "vscode-uri": "^1.0.6" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { + "version": "3.14.1", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { + "version": "3.14.0", "license": "MIT" }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "dev": true, + "node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/vscode-nls": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/yargs": { + "version": "17.7.2", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=12" } }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", + "node_modules/yargs-parser": { + "version": "20.2.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.8.2", - "dev": true, - "license": "MIT", + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=12" } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "ansi-regex": "^5.0.1" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=8" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", + "node_modules/yauzl": { + "version": "2.10.0", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "node_modules/webpack-merge": { - "version": "5.10.0", + "node_modules/yazl": { + "version": "2.5.1", "dev": true, "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "buffer-crc32": "~0.2.3" } }, - "node_modules/webpack-sources": { - "version": "2.3.1", + "node_modules/ylru": { + "version": "1.4.0", "dev": true, "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, "engines": { - "node": ">=10.13.0" + "node": ">= 4.0.0" } }, - "node_modules/webpack/node_modules/events": { - "version": "3.3.0", + "node_modules/yn": { + "version": "3.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">=6" } }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", + "node_modules/yocto-queue": { + "version": "0.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, + "packages/amazonq": { + "name": "amazon-q-vscode", + "version": "1.34.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "aws-core-vscode": "file:../core/" }, "engines": { - "node": ">=0.8.0" + "npm": "^10.1.0", + "vscode": "^1.83.0" } }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, + "packages/core": { + "name": "aws-core-vscode", + "version": "1.0.0", + "hasInstallScript": true, "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "dev": true, - "license": "MIT", "dependencies": { - "iconv-lite": "0.6.3" + "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", + "@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", + "@aws-sdk/client-sso-oidc": "^3.574.0", + "@aws-sdk/credential-provider-ini": "3.46.0", + "@aws-sdk/credential-provider-process": "3.37.0", + "@aws-sdk/credential-provider-sso": "^3.345.0", + "@aws-sdk/property-provider": "3.46.0", + "@aws-sdk/smithy-client": "^3.46.0", + "@aws-sdk/util-arn-parser": "^3.46.0", + "@aws/mynah-ui": "^4.15.11", + "@gerhobbelt/gitignore-parser": "^0.2.0-9", + "@iarna/toml": "^2.2.5", + "@smithy/middleware-retry": "^2.3.1", + "@smithy/protocol-http": "^3.3.0", + "@smithy/service-error-classification": "^2.1.5", + "@smithy/shared-ini-file-loader": "^2.2.8", + "@smithy/util-retry": "^2.2.0", + "@vscode/debugprotocol": "^1.57.0", + "@zip.js/zip.js": "^2.7.41", + "adm-zip": "^0.5.10", + "amazon-states-language-service": "^1.11.0", + "async-lock": "^1.4.0", + "aws-sdk": "^2.1384.0", + "aws-ssm-document-language-service": "^1.0.0", + "bytes": "^3.1.2", + "cross-fetch": "^4.0.0", + "cross-spawn": "^7.0.3", + "fast-json-patch": "^3.1.1", + "glob": "^10.3.10", + "got": "^11.8.5", + "highlight.js": "^11.9.0", + "i18n-ts": "^1.0.5", + "immutable": "^4.3.0", + "jose": "5.4.1", + "js-yaml": "^4.1.0", + "jsonc-parser": "^3.2.0", + "lodash": "^4.17.21", + "markdown-it": "^13.0.2", + "mime-types": "^2.1.32", + "node-fetch": "^2.7.0", + "portfinder": "^1.0.32", + "semver": "^7.5.4", + "stream-buffers": "^3.0.2", + "strip-ansi": "^5.2.0", + "tcp-port-used": "^1.0.1", + "vscode-languageclient": "^6.1.4", + "vscode-languageserver": "^6.1.1", + "vscode-languageserver-protocol": "^3.15.3", + "vscode-languageserver-textdocument": "^1.0.8", + "vue": "^3.3.4", + "web-tree-sitter": "^0.20.8", + "whatwg-url": "^14.0.0", + "winston": "^3.11.0", + "winston-transport": "^4.6.0", + "xml2js": "^0.6.1", + "yaml-cfn": "^0.3.2" + }, + "devDependencies": { + "@aws-sdk/types": "^3.13.1", + "@aws/fully-qualified-names": "^2.1.4", + "@cspotcode/source-map-support": "^0.8.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/adm-zip": "^0.4.34", + "@types/async-lock": "^1.4.0", + "@types/bytes": "^3.1.0", + "@types/circular-dependency-plugin": "^5.0.8", + "@types/cross-spawn": "^6.0.6", + "@types/diff": "^5.0.7", + "@types/glob": "^8.1.0", + "@types/js-yaml": "^4.0.5", + "@types/jsdom": "^21.1.6", + "@types/lodash": "^4.14.180", + "@types/markdown-it": "^13.0.2", + "@types/mime-types": "^2.1.4", + "@types/mocha": "^10.0.6", + "@types/node": "^16.18.95", + "@types/node-fetch": "^2.6.8", + "@types/prismjs": "^1.26.0", + "@types/proper-lockfile": "^4.1.4", + "@types/readline-sync": "^1.4.8", + "@types/semver": "^7.5.0", + "@types/sinon": "^10.0.5", + "@types/sinonjs__fake-timers": "^8.1.2", + "@types/stream-buffers": "^3.0.7", + "@types/tcp-port-used": "^1.0.1", + "@types/uuid": "^9.0.1", + "@types/whatwg-url": "^11.0.4", + "@types/xml2js": "^0.4.11", + "@vue/compiler-sfc": "^3.3.2", + "c8": "^9.0.0", + "circular-dependency-plugin": "^5.2.2", + "css-loader": "^6.10.0", + "diff": "^5.1.0", + "esbuild-loader": "2.20.0", + "file-loader": "^6.2.0", + "jsdom": "^23.0.1", + "json-schema-to-typescript": "^13.1.1", + "marked": "^13.0.1", + "mocha": "^10.1.0", + "mocha-junit-reporter": "^2.2.1", + "mocha-multi-reporters": "^1.5.1", + "readline-sync": "^1.4.9", + "sass": "^1.49.8", + "sass-loader": "^16.0.2", + "sinon": "^14.0.0", + "style-loader": "^3.3.1", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "umd-compat-loader": "^2.1.2", + "vue-loader": "^17.2.2", + "vue-style-loader": "^4.1.3", + "webfont": "^11.2.26" }, "engines": { - "node": ">=18" + "npm": "^10.1.0", + "vscode": "^1.83.0" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", + "packages/core/node_modules/@types/node": { + "version": "16.18.95", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "packages/core/src/web": { + "name": "web-toolkit", + "license": "Apache-2.0", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "crypto-browserify": "^3.12.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "stream-browserify": "^3.0.0" + }, + "devDependencies": { + "assert": "^2.1.0" } }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "packages/toolkit": { + "name": "aws-toolkit-vscode", + "version": "3.32.0-SNAPSHOT", + "license": "Apache-2.0", + "dependencies": { + "aws-core-vscode": "file:../core/" + }, + "devDependencies": {}, "engines": { - "node": ">=18" + "npm": "^10.1.0", + "vscode": "^1.83.0" } }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" + "plugins/eslint-plugin-aws-toolkits": { + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "mocha": "^10.1.0" }, "engines": { - "node": ">=18" + "npm": "^10.1.0" } }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client": { + "version": "1.0.0", + "hasInstallScript": true, "dependencies": { - "isexe": "^2.0.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.6", + "@smithy/eventstream-serde-browser": "^3.0.9", + "@smithy/eventstream-serde-config-resolver": "^3.0.6", + "@smithy/eventstream-serde-node": "^3.0.8", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@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.21", + "@smithy/util-defaults-mode-node": "^3.0.21", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, - "bin": { - "node-which": "bin/node-which" + "devDependencies": { + "@tsconfig/node16": "16.1.3", + "@types/node": "^16.18.96", + "@types/uuid": "^9.0.4", + "concurrently": "7.0.0", + "downlevel-dts": "0.10.1", + "rimraf": "^3.0.0", + "typescript": "~4.9.5" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/client-sso": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.658.1.tgz", + "integrity": "sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q==", + "license": "Apache-2.0", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@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.21", + "@smithy/util-defaults-mode-node": "^3.0.21", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.1.tgz", + "integrity": "sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw==", + "license": "Apache-2.0", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@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.21", + "@smithy/util-defaults-mode-node": "^3.0.21", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.658.1" } }, - "node_modules/wildcard": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/winston": { - "version": "3.11.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/client-sts": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.658.1.tgz", + "integrity": "sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg==", + "license": "Apache-2.0", "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.21", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@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.21", + "@smithy/util-defaults-mode-node": "^3.0.21", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/winston-transport": { - "version": "4.6.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/core": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.658.1.tgz", + "integrity": "sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA==", + "license": "Apache-2.0", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" + "@smithy/core": "^2.4.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/signature-v4": "^4.1.4", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-middleware": "^3.0.6", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/winston/node_modules/@colors/colors": { - "version": "1.6.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz", + "integrity": "sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.1.90" + "node": ">=16.0.0" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.658.1.tgz", + "integrity": "sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@aws-sdk/types": "3.654.0", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/node-http-handler": "^3.2.3", + "@smithy/property-provider": "^3.1.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.5", + "@smithy/types": "^3.4.2", + "@smithy/util-stream": "^3.1.8", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=16.0.0" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.1.tgz", + "integrity": "sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@aws-sdk/credential-provider-env": "3.654.0", + "@aws-sdk/credential-provider-http": "3.658.1", + "@aws-sdk/credential-provider-process": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.658.1", + "@aws-sdk/credential-provider-web-identity": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.658.1" } }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.1.tgz", + "integrity": "sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA==", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^5.0.1" + "@aws-sdk/credential-provider-env": "3.654.0", + "@aws-sdk/credential-provider-http": "3.658.1", + "@aws-sdk/credential-provider-ini": "3.658.1", + "@aws-sdk/credential-provider-process": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.658.1", + "@aws-sdk/credential-provider-web-identity": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz", + "integrity": "sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^5.0.1" + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.17.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=16.0.0" } }, - "node_modules/xml": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "dev": true, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.1.tgz", + "integrity": "sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA==", "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xml2js": { - "version": "0.6.1", - "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "@aws-sdk/client-sso": "3.658.1", + "@aws-sdk/token-providers": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=16.0.0" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz", + "integrity": "sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.654.0" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/xtend": { - "version": "4.0.2", - "dev": true, - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz", + "integrity": "sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.4" + "node": ">=16.0.0" } }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz", + "integrity": "sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz", + "integrity": "sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 6" + "node": ">=16.0.0" } }, - "node_modules/yaml-ast-parser-custom-tags": { - "version": "0.0.43", - "license": "Apache-2.0" - }, - "node_modules/yaml-cfn": { - "version": "0.3.2", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz", + "integrity": "sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==", "license": "Apache-2.0", "dependencies": { - "js-yaml": "^4.0.0" + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, - "bin": { - "yaml-cfn": "cli.js" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/yaml-language-server": { - "version": "0.15.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz", + "integrity": "sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==", + "license": "Apache-2.0", "dependencies": { - "js-yaml": "^3.13.1", - "jsonc-parser": "^2.2.1", - "request-light": "^0.2.4", - "vscode-json-languageservice": "^3.10.0", - "vscode-languageserver": "^5.2.1", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-nls": "^4.1.2", - "vscode-uri": "^2.1.1", - "yaml-language-server-parser": "0.1.2" - }, - "bin": { - "yaml-language-server": "bin/yaml-language-server" + "@aws-sdk/types": "3.654.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.6", + "tslib": "^2.6.2" }, "engines": { - "node": "*" - }, - "optionalDependencies": { - "prettier": "2.0.5" + "node": ">=16.0.0" } }, - "node_modules/yaml-language-server-parser": { - "version": "0.1.2", - "license": "Apache-2.0" - }, - "node_modules/yaml-language-server/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/token-providers": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz", + "integrity": "sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==", + "license": "Apache-2.0", "dependencies": { - "sprintf-js": "~1.0.2" + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.654.0" } }, - "node_modules/yaml-language-server/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/types": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.654.0.tgz", + "integrity": "sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==", + "license": "Apache-2.0", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/yaml-language-server/node_modules/jsonc-parser": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/prettier": { - "version": "2.0.5", - "license": "MIT", - "optional": true, - "bin": { - "prettier": "bin-prettier.js" + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz", + "integrity": "sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", + "@smithy/util-endpoints": "^2.1.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10.13.0" + "node": ">=16.0.0" } }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice": { - "version": "3.11.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz", + "integrity": "sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==", + "license": "Apache-2.0", "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "3.16.0-next.2", - "vscode-nls": "^5.0.0", - "vscode-uri": "^2.1.2" + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { - "version": "3.2.0", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-languageserver-types": { - "version": "3.16.0-next.2", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/vscode-json-languageservice/node_modules/vscode-nls": { - "version": "5.2.0", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { - "version": "4.0.0", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz", + "integrity": "sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8.0.0 || >=10.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver": { - "version": "5.2.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { - "version": "3.14.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", "dependencies": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.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" } }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.14.0", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/vscode-languageserver/node_modules/vscode-uri": { - "version": "1.0.8", - "license": "MIT" - }, - "node_modules/yaml-language-server/node_modules/vscode-nls": { - "version": "4.1.2", - "license": "MIT" - }, - "node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "dev": true, - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "dev": true, - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/middleware-retry": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", + "license": "Apache-2.0", "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^5.0.1" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "dev": true, - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/yazl": { - "version": "2.5.1", - "dev": true, - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/ylru": { - "version": "1.4.0", - "dev": true, - "license": "MIT", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=16.0.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/zip-stream": { - "version": "6.0.1", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/service-error-classification": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", + "license": "Apache-2.0", "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" + "@smithy/types": "^3.6.0" }, "engines": { - "node": ">= 14" + "node": ">=16.0.0" } }, - "node_modules/zip-stream/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/zip-stream/node_modules/events": { - "version": "3.3.0", - "license": "MIT", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.8.x" + "node": ">=16.0.0" } }, - "node_modules/zip-stream/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "4.5.2", - "license": "MIT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16.0.0" } }, - "packages/amazonq": { - "name": "amazon-q-vscode", - "version": "1.29.0-SNAPSHOT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "dependencies": { - "aws-core-vscode": "file:../core/" + "tslib": "^2.6.2" }, - "devDependencies": {}, "engines": { - "npm": "^10.1.0", - "vscode": "^1.68.0" + "node": ">=16.0.0" } }, - "packages/core": { - "name": "aws-core-vscode", - "version": "1.0.0", - "hasInstallScript": true, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", "license": "Apache-2.0", "dependencies": { - "@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-sso": "^3.342.0", - "@aws-sdk/client-sso-oidc": "^3.574.0", - "@aws-sdk/credential-provider-ini": "3.46.0", - "@aws-sdk/credential-provider-process": "3.37.0", - "@aws-sdk/credential-provider-sso": "^3.345.0", - "@aws-sdk/property-provider": "3.46.0", - "@aws-sdk/smithy-client": "^3.46.0", - "@aws-sdk/util-arn-parser": "^3.46.0", - "@aws/mynah-ui": "^4.15.11", - "@gerhobbelt/gitignore-parser": "^0.2.0-9", - "@iarna/toml": "^2.2.5", - "@smithy/middleware-retry": "^2.3.1", - "@smithy/protocol-http": "^3.3.0", - "@smithy/service-error-classification": "^2.1.5", - "@smithy/shared-ini-file-loader": "^2.2.8", - "@smithy/util-retry": "^2.2.0", - "@vscode/debugprotocol": "^1.57.0", - "adm-zip": "^0.5.10", - "amazon-states-language-service": "^1.11.0", - "archiver": "^7.0.1", - "async-lock": "^1.4.0", - "aws-sdk": "^2.1384.0", - "aws-ssm-document-language-service": "^1.0.0", - "bytes": "^3.1.2", - "cross-fetch": "^4.0.0", - "cross-spawn": "^7.0.3", - "fast-json-patch": "^3.1.1", - "fs-extra": "^10.0.1", - "glob": "^10.3.10", - "got": "^11.8.5", - "highlight.js": "^11.9.0", - "i18n-ts": "^1.0.5", - "immutable": "^4.3.0", - "jose": "5.4.1", - "js-yaml": "^4.1.0", - "jsonc-parser": "^3.2.0", - "lodash": "^4.17.21", - "markdown-it": "^13.0.2", - "mime-types": "^2.1.32", - "node-fetch": "^2.7.0", - "portfinder": "^1.0.32", - "semver": "^7.5.4", - "stream-buffers": "^3.0.2", - "strip-ansi": "^5.2.0", - "tcp-port-used": "^1.0.1", - "vscode-languageclient": "^6.1.4", - "vscode-languageserver": "^6.1.1", - "vscode-languageserver-protocol": "^3.15.3", - "vscode-languageserver-textdocument": "^1.0.8", - "vue": "^3.3.4", - "web-tree-sitter": "^0.20.8", - "whatwg-url": "^14.0.0", - "winston": "^3.11.0", - "winston-transport": "^4.6.0", - "xml2js": "^0.6.1", - "yaml-cfn": "^0.3.2" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "devDependencies": { - "@aws-sdk/types": "^3.13.1", - "@aws/fully-qualified-names": "^2.1.4", - "@cspotcode/source-map-support": "^0.8.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/adm-zip": "^0.4.34", - "@types/archiver": "^6.0.2", - "@types/async-lock": "^1.4.0", - "@types/bytes": "^3.1.0", - "@types/circular-dependency-plugin": "^5.0.8", - "@types/cross-spawn": "^6.0.6", - "@types/diff": "^5.0.7", - "@types/fs-extra": "^9.0.11", - "@types/glob": "^8.1.0", - "@types/js-yaml": "^4.0.5", - "@types/jsdom": "^21.1.6", - "@types/lodash": "^4.14.180", - "@types/markdown-it": "^13.0.2", - "@types/mime-types": "^2.1.4", - "@types/mocha": "^10.0.6", - "@types/node": "^16.18.95", - "@types/node-fetch": "^2.6.8", - "@types/prismjs": "^1.26.0", - "@types/proper-lockfile": "^4.1.4", - "@types/readline-sync": "^1.4.3", - "@types/semver": "^7.5.0", - "@types/sinon": "^10.0.5", - "@types/sinonjs__fake-timers": "^8.1.2", - "@types/stream-buffers": "^3.0.7", - "@types/tcp-port-used": "^1.0.1", - "@types/uuid": "^9.0.1", - "@types/whatwg-url": "^11.0.4", - "@types/xml2js": "^0.4.11", - "@vue/compiler-sfc": "^3.3.2", - "c8": "^9.0.0", - "circular-dependency-plugin": "^5.2.2", - "css-loader": "^6.10.0", - "diff": "^5.1.0", - "esbuild-loader": "2.20.0", - "file-loader": "^6.2.0", - "jsdom": "^23.0.1", - "json-schema-to-typescript": "^13.1.1", - "marked": "^13.0.1", - "mocha": "^10.1.0", - "mocha-junit-reporter": "^2.2.1", - "mocha-multi-reporters": "^1.5.1", - "readline-sync": "^1.4.9", - "sass": "^1.49.8", - "sass-loader": "^12.6.0", - "sinon": "^14.0.0", - "style-loader": "^3.3.1", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", - "umd-compat-loader": "^2.1.2", - "vue-loader": "^17.2.2", - "vue-style-loader": "^4.1.3", - "webfont": "^11.2.26" + "engines": { + "node": ">=16.0.0" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "npm": "^10.1.0", - "vscode": "^1.83.0" + "node": ">=16.0.0" } }, - "packages/core/node_modules/@types/node": { - "version": "16.18.95", - "dev": true, - "license": "MIT" + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "packages/core/src/web": { - "name": "web-toolkit", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "license": "Apache-2.0", "dependencies": { - "crypto-browserify": "^3.12.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "stream-browserify": "^3.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "devDependencies": { - "assert": "^2.1.0" + "engines": { + "node": ">=16.0.0" } }, - "packages/toolkit": { - "name": "aws-toolkit-vscode", - "version": "3.28.0-SNAPSHOT", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/util-retry": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", "license": "Apache-2.0", "dependencies": { - "aws-core-vscode": "file:../core/" + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "devDependencies": {}, "engines": { - "npm": "^10.1.0", - "vscode": "^1.68.0" + "node": ">=16.0.0" } }, - "plugins/eslint-plugin-aws-toolkits": { - "version": "1.0.0", + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", "license": "Apache-2.0", - "devDependencies": { - "mocha": "^10.1.0" + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.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": { - "npm": "^10.1.0" + "node": ">=16.0.0" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/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==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@tsconfig/node16": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.3.tgz", + "integrity": "sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw==", + "dev": true, + "license": "MIT" + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/@types/node": { + "version": "16.18.115", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.115.tgz", + "integrity": "sha512-NF5ajYn+dq0tRfswdyp8Df75h7D9z+L8TCIwrXoh46ZLK6KZVXkRhf/luXaZytvm/keUo9vU4m1Bg39St91a5w==", + "dev": true, + "license": "MIT" + }, + "src.gen/@amzn/amazon-q-developer-streaming-client/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" } }, "src.gen/@amzn/codewhisperer-streaming": { @@ -19771,17 +21445,6 @@ "tslib": "^2.3.1" } }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/@babel/runtime": { - "version": "7.25.6", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/@smithy/abort-controller": { "version": "2.2.0", "license": "Apache-2.0", @@ -20296,201 +21959,37 @@ "license": "MIT" }, "src.gen/@amzn/codewhisperer-streaming/node_modules/@types/uuid": { - "version": "8.3.4", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/bowser": { - "version": "2.11.0", - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/concurrently": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/date-fns": { - "version": "2.30.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/downlevel-dts": { - "version": "0.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.2", - "shelljs": "^0.8.3", - "typescript": "next" - }, - "bin": { - "downlevel-dts": "index.js" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/downlevel-dts/node_modules/typescript": { - "version": "5.7.0-dev.20240926", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } + "version": "8.3.4", + "dev": true, + "license": "MIT" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/emoji-regex": { - "version": "8.0.0", + "src.gen/@amzn/codewhisperer-streaming/node_modules/balanced-match": { + "version": "1.0.2", "dev": true, "license": "MIT" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/escalade": { - "version": "3.2.0", + "src.gen/@amzn/codewhisperer-streaming/node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "src.gen/@amzn/codewhisperer-streaming/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0" } }, + "src.gen/@amzn/codewhisperer-streaming/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, "src.gen/@amzn/codewhisperer-streaming/node_modules/fs.realpath": { "version": "1.0.0", "dev": true, "license": "ISC" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/function-bind": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/glob": { "version": "7.2.3", "dev": true, @@ -20530,25 +22029,6 @@ "node": "*" } }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/hasown": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/inflight": { "version": "1.0.6", "dev": true, @@ -20563,46 +22043,11 @@ "dev": true, "license": "ISC" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/interpret": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/is-core-module": { - "version": "2.15.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/jsonc-parser": { "version": "3.3.1", "dev": true, "license": "MIT" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/lunr": { "version": "2.3.9", "dev": true, @@ -20646,50 +22091,6 @@ "node": ">=0.10.0" } }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/path-parse": { - "version": "1.0.7", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/rechoir": { - "version": "0.6.2", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/regenerator-runtime": { - "version": "0.14.1", - "dev": true, - "license": "MIT" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/resolve": { - "version": "1.22.8", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/rimraf": { "version": "3.0.2", "dev": true, @@ -20704,49 +22105,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/rxjs": { - "version": "6.6.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/shelljs": { - "version": "0.8.5", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/shiki": { "version": "0.11.1", "dev": true, @@ -20757,67 +22115,6 @@ "vscode-textmate": "^6.0.0" } }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/spawn-command": { - "version": "0.0.2", - "dev": true - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/tree-kill": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/tslib": { "version": "2.7.0", "license": "0BSD" @@ -20871,59 +22168,10 @@ "dev": true, "license": "MIT" }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "src.gen/@amzn/codewhisperer-streaming/node_modules/wrappy": { "version": "1.0.2", "dev": true, "license": "ISC" - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/y18n": { - "version": "5.0.8", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "src.gen/@amzn/codewhisperer-streaming/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } } } } diff --git a/package.json b/package.json index c4b768d96e6..dae76a7a8c2 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "scripts": { "prepare": "ts-node ./scripts/prepare.ts", - "preinstall": "cd src.gen/@amzn/codewhisperer-streaming && npm i", + "preinstall": "cd src.gen/@amzn/codewhisperer-streaming && npm i && cd ../amazon-q-developer-streaming-client && npm i", "postinstall": "npm run buildCustomLintPlugin && npm run postinstall -ws --if-present", "buildCustomLintPlugin": "npm run build -w plugins/eslint-plugin-aws-toolkits", "compile": "npm run compile -w packages/", @@ -39,11 +39,12 @@ "generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.267", + "@aws-toolkits/telemetry": "^1.0.274", "@playwright/browser-chromium": "^1.43.1", + "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", "@types/vscode-webview": "^1.57.1", - "@types/webpack-env": "^1.18.1", + "@types/webpack-env": "^1.18.5", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.14.1", "@vscode/codicons": "^0.0.33", @@ -58,17 +59,19 @@ "eslint-plugin-security-node": "^1.1.4", "eslint-plugin-unicorn": "^54.0.0", "husky": "^9.0.7", - "prettier": "^3.3.2", + "prettier": "^3.3.3", "prettier-plugin-sh": "^0.14.0", "pretty-quick": "^4.0.0", "ts-node": "^10.9.1", "typescript": "^5.0.4", - "webpack": "^5.83.0", + "webpack": "^5.95.0", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^4.15.2", "webpack-merge": "^5.10.0" }, "dependencies": { + "@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/amazonq/.changes/1.29.0.json b/packages/amazonq/.changes/1.29.0.json new file mode 100644 index 00000000000..35cc08b1b25 --- /dev/null +++ b/packages/amazonq/.changes/1.29.0.json @@ -0,0 +1,54 @@ +{ + "date": "2024-10-10", + "version": "1.29.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Amazon Q /dev: include telemetry for workspace usage when generating new files" + }, + { + "type": "Bug Fix", + "description": "Amazon Q extension may fail to start if AWS Toolkit extension fails to start" + }, + { + "type": "Bug Fix", + "description": "Start language server by default" + }, + { + "type": "Bug Fix", + "description": "Amazon Q Feature Dev: Add error messages when the upload URL expires" + }, + { + "type": "Bug Fix", + "description": "Amazon Q (/dev): view diffs of previous /dev iterations" + }, + { + "type": "Bug Fix", + "description": "Q dev handle no change required" + }, + { + "type": "Deprecation", + "description": "The next release of this extension will require VS Code 1.83.0 or newer." + }, + { + "type": "Feature", + "description": "Automatically pause and resume @workspace indexing when OS CPU load is high" + }, + { + "type": "Feature", + "description": "Add buttons to code blocks to view and accept diffs." + }, + { + "type": "Feature", + "description": "Inline completion for more json files, and all yaml files" + }, + { + "type": "Feature", + "description": "Show a one-time warning if new VS Code is required" + }, + { + "type": "Removal", + "description": "Minimum required VSCode version is now 1.83" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.30.0.json b/packages/amazonq/.changes/1.30.0.json new file mode 100644 index 00000000000..070f0f7be5f --- /dev/null +++ b/packages/amazonq/.changes/1.30.0.json @@ -0,0 +1,10 @@ +{ + "date": "2024-10-17", + "version": "1.30.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Various fixes and changes" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.31.0.json b/packages/amazonq/.changes/1.31.0.json new file mode 100644 index 00000000000..882fbad0f49 --- /dev/null +++ b/packages/amazonq/.changes/1.31.0.json @@ -0,0 +1,34 @@ +{ + "date": "2024-10-29", + "version": "1.31.0", + "entries": [ + { + "type": "Breaking Change", + "description": "Change keybind for focusing chat to ctrl+win+i on Windows, ctrl+cmd+i on macOS and ctrl+meta+i on Linux" + }, + { + "type": "Bug Fix", + "description": "Inline Suggestions: Occasional `ValidationException` if user context has too many characters." + }, + { + "type": "Bug Fix", + "description": "Update `@workspace` index when adding or deleting a file" + }, + { + "type": "Bug Fix", + "description": "fixed device code detection when running auth through tunneled vscode" + }, + { + "type": "Feature", + "description": "Use inline chat to select code and transform it with natural language instructions" + }, + { + "type": "Feature", + "description": "Amazon Q /dev: Add stop generation action" + }, + { + "type": "Feature", + "description": "Provide more frequent updates about code changes made by agent" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.32.0.json b/packages/amazonq/.changes/1.32.0.json new file mode 100644 index 00000000000..5d5a61c848a --- /dev/null +++ b/packages/amazonq/.changes/1.32.0.json @@ -0,0 +1,26 @@ +{ + "date": "2024-10-29", + "version": "1.32.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Remove warning when no input is provided to inline chat input box" + }, + { + "type": "Bug Fix", + "description": "Use Sagemaker environment IAM Credentials for Code Completion when they're available" + }, + { + "type": "Bug Fix", + "description": "Inline: Code completion not working for Sagemaker Pro Tier users." + }, + { + "type": "Bug Fix", + "description": "Disable /transform and /dev commands for sagemaker users as they're not supported" + }, + { + "type": "Feature", + "description": "Enable Free Tier Chat for IAM users" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.33.0.json b/packages/amazonq/.changes/1.33.0.json new file mode 100644 index 00000000000..ac740352518 --- /dev/null +++ b/packages/amazonq/.changes/1.33.0.json @@ -0,0 +1,10 @@ +{ + "date": "2024-10-30", + "version": "1.33.0", + "entries": [ + { + "type": "Bug Fix", + "description": "Amazon Q /dev: fix for stop button showing for Code Transformation" + } + ] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Bug Fix-3f76aff8-1622-4647-aafe-3210cf0c3b74.json b/packages/amazonq/.changes/next-release/Bug Fix-3f76aff8-1622-4647-aafe-3210cf0c3b74.json deleted file mode 100644 index e9fab5cf084..00000000000 --- a/packages/amazonq/.changes/next-release/Bug Fix-3f76aff8-1622-4647-aafe-3210cf0c3b74.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Amazon Q extension may fail to start if AWS Toolkit extension fails to start" -} diff --git a/packages/amazonq/.changes/next-release/Bug Fix-63cca37f-cf3c-42ff-bc9d-b3f71c0e3202.json b/packages/amazonq/.changes/next-release/Bug Fix-63cca37f-cf3c-42ff-bc9d-b3f71c0e3202.json new file mode 100644 index 00000000000..a7a14bc22e1 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Bug Fix-63cca37f-cf3c-42ff-bc9d-b3f71c0e3202.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "Align example help text with prompt message in chat" +} diff --git a/packages/amazonq/.changes/next-release/Bug Fix-ff32752d-fa0b-4d38-b719-68eb3c9ddca6.json b/packages/amazonq/.changes/next-release/Bug Fix-ff32752d-fa0b-4d38-b719-68eb3c9ddca6.json deleted file mode 100644 index afb6952b969..00000000000 --- a/packages/amazonq/.changes/next-release/Bug Fix-ff32752d-fa0b-4d38-b719-68eb3c9ddca6.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Bug Fix", - "description": "Q dev handle no change required" -} diff --git a/packages/amazonq/.changes/next-release/Deprecation-4577def6-0191-48db-bec3-480b226285b8.json b/packages/amazonq/.changes/next-release/Deprecation-4577def6-0191-48db-bec3-480b226285b8.json deleted file mode 100644 index 78d58a5fbe6..00000000000 --- a/packages/amazonq/.changes/next-release/Deprecation-4577def6-0191-48db-bec3-480b226285b8.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Deprecation", - "description": "The next release of this extension will require VS Code 1.83.0 or newer." -} diff --git a/packages/amazonq/.changes/next-release/Feature-4eed9d3c-8ada-44de-9621-fb34fbbc9e15.json b/packages/amazonq/.changes/next-release/Feature-4eed9d3c-8ada-44de-9621-fb34fbbc9e15.json new file mode 100644 index 00000000000..9ba30d72858 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-4eed9d3c-8ada-44de-9621-fb34fbbc9e15.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Allow users to View and Apply diff when they explictily send code to Amazon Q using - Fix, Refactor, Optimize and Send To Prompt." +} diff --git a/packages/amazonq/.changes/next-release/Feature-b02fae9d-cb44-4625-af37-0b119c18ef63.json b/packages/amazonq/.changes/next-release/Feature-b02fae9d-cb44-4625-af37-0b119c18ef63.json deleted file mode 100644 index 021933ef072..00000000000 --- a/packages/amazonq/.changes/next-release/Feature-b02fae9d-cb44-4625-af37-0b119c18ef63.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "Show a one-time warning if new VS Code is required" -} diff --git a/packages/amazonq/.changes/next-release/Removal-c259464a-0437-47e6-be6c-8df023ad477c.json b/packages/amazonq/.changes/next-release/Removal-c259464a-0437-47e6-be6c-8df023ad477c.json deleted file mode 100644 index a97df091840..00000000000 --- a/packages/amazonq/.changes/next-release/Removal-c259464a-0437-47e6-be6c-8df023ad477c.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Removal", - "description": "Minimum required VSCode version is now 1.83" -} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index c64783d32bf..7ecc7cd43bb 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,44 @@ +## 1.33.0 2024-10-30 + +- **Bug Fix** Amazon Q /dev: fix for stop button showing for Code Transformation + +## 1.32.0 2024-10-29 + +- **Bug Fix** Remove warning when no input is provided to inline chat input box +- **Bug Fix** Use Sagemaker environment IAM Credentials for Code Completion when they're available +- **Bug Fix** Inline: Code completion not working for Sagemaker Pro Tier users. +- **Bug Fix** Disable /transform and /dev commands for sagemaker users as they're not supported +- **Feature** Enable Free Tier Chat for IAM users + +## 1.31.0 2024-10-29 + +- **Breaking Change** Change keybind for focusing chat to ctrl+win+i on Windows, ctrl+cmd+i on macOS and ctrl+meta+i on Linux +- **Bug Fix** Inline Suggestions: Occasional `ValidationException` if user context has too many characters. +- **Bug Fix** Update `@workspace` index when adding or deleting a file +- **Bug Fix** fixed device code detection when running auth through tunneled vscode +- **Feature** Use inline chat to select code and transform it with natural language instructions +- **Feature** Amazon Q /dev: Add stop generation action +- **Feature** Provide more frequent updates about code changes made by agent + +## 1.30.0 2024-10-17 + +- **Bug Fix** Various fixes and changes + +## 1.29.0 2024-10-10 + +- **Bug Fix** Amazon Q /dev: include telemetry for workspace usage when generating new files +- **Bug Fix** Amazon Q extension may fail to start if AWS Toolkit extension fails to start +- **Bug Fix** Start language server by default +- **Bug Fix** Amazon Q Feature Dev: Add error messages when the upload URL expires +- **Bug Fix** Amazon Q (/dev): view diffs of previous /dev iterations +- **Bug Fix** Q dev handle no change required +- **Deprecation** The next release of this extension will require VS Code 1.83.0 or newer. +- **Feature** Automatically pause and resume @workspace indexing when OS CPU load is high +- **Feature** Add buttons to code blocks to view and accept diffs. +- **Feature** Inline completion for more json files, and all yaml files +- **Feature** Show a one-time warning if new VS Code is required +- **Removal** Minimum required VSCode version is now 1.83 + ## 1.28.0 2024-10-03 - **Bug Fix** Amazon Q /dev: define first folder as a root path for LLM-created files when using workspaces diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index d3c38c991a3..3f82d6c06af 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "Amazon Q is your generative AI-powered assistant across the software development lifecycle.", - "version": "1.29.0-SNAPSHOT", + "version": "1.34.0-SNAPSHOT", "extensionKind": [ "workspace" ], @@ -71,7 +71,6 @@ "dependencies": { "aws-core-vscode": "file:../core/" }, - "devDependencies": {}, "contributesComments": { "configuration": { "properties": "Any settings also defined in packages/core/package.json will override same-named settings in this file." @@ -188,17 +187,22 @@ }, "views": { "amazonq": [ + { + "id": "aws.amazonq.notifications", + "name": "%AWS.notifications.title%", + "when": "!isCloud9 && !aws.isSageMaker && aws.amazonq.notifications.show" + }, { "type": "webview", "id": "aws.amazonq.AmazonCommonAuth", "name": "%AWS.amazonq.login%", - "when": "!aws.isSageMaker && !aws.isWebExtHost && aws.amazonq.showLoginView" + "when": "!aws.isWebExtHost && aws.amazonq.showLoginView" }, { "type": "webview", "id": "aws.AmazonQChatView", "name": "%AWS.amazonq.chat%", - "when": "!aws.isSageMaker && !aws.isWebExtHost && !aws.amazonq.showLoginView" + "when": "!aws.isWebExtHost && !aws.amazonq.showLoginView" }, { "id": "aws.AmazonQNeverShowBadge", @@ -362,6 +366,10 @@ { "command": "aws.amazonq.sendToPrompt", "group": "cw_chat@6" + }, + { + "command": "aws.amazonq.inline.invokeChat", + "group": "cw_chat@7" } ], "editor/context": [ @@ -370,6 +378,13 @@ "group": "cw_chat" } ], + "view/item/context": [ + { + "command": "_aws.amazonq.notifications.dismiss", + "when": "viewItem == amazonqNotificationStartUp", + "group": "inline@1" + } + ], "aws.amazonq.submenu.feedback": [ { "command": "aws.amazonq.submitFeedback", @@ -397,6 +412,13 @@ ] }, "commands": [ + { + "command": "_aws.amazonq.notifications.dismiss", + "title": "%AWS.generic.dismiss%", + "category": "%AWS.amazonq.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(remove-close)" + }, { "command": "aws.amazonq.explainCode", "title": "%AWS.command.amazonq.explainCode%", @@ -576,14 +598,20 @@ "title": "%AWS.amazonq.toggleCodeScan%", "category": "%AWS.amazonq.title%", "enablement": "aws.codewhisperer.connected" + }, + { + "command": "aws.amazonq.inline.invokeChat", + "title": "%AWS.amazonq.inline.invokeChat%", + "category": "%AWS.amazonq.title%", + "enablement": "aws.codewhisperer.connected" } ], "keybindings": [ { "command": "_aws.amazonq.focusChat.keybinding", - "win": "win+i", - "mac": "cmd+i", - "linux": "meta+i" + "win": "ctrl+win+i", + "mac": "ctrl+cmd+i", + "linux": "ctrl+meta+i" }, { "command": "aws.amazonq.explainCode", @@ -649,6 +677,23 @@ "key": "left", "command": "editor.action.inlineSuggest.showPrevious", "when": "inlineSuggestionVisible && !editorReadonly && aws.codewhisperer.connected" + }, + { + "command": "aws.amazonq.inline.invokeChat", + "win": "ctrl+i", + "mac": "cmd+i", + "linux": "ctrl+i", + "when": "editorTextFocus && aws.codewhisperer.connected" + }, + { + "command": "aws.amazonq.inline.waitForUserDecisionAcceptAll", + "key": "enter", + "when": "editorTextFocus && aws.codewhisperer.connected && amazonq.inline.codelensShortcutEnabled" + }, + { + "command": "aws.amazonq.inline.waitForUserDecisionRejectAll", + "key": "escape", + "when": "editorTextFocus && aws.codewhisperer.connected && amazonq.inline.codelensShortcutEnabled" } ], "icons": { @@ -1050,6 +1095,6 @@ }, "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" } } diff --git a/packages/amazonq/scripts/build/copyFiles.ts b/packages/amazonq/scripts/build/copyFiles.ts index c1b0861321d..725c66ad7c0 100644 --- a/packages/amazonq/scripts/build/copyFiles.ts +++ b/packages/amazonq/scripts/build/copyFiles.ts @@ -4,7 +4,7 @@ */ /* eslint-disable no-restricted-imports */ -import * as fs from 'fs-extra' +import fs from 'fs' import * as path from 'path' // Moves all dependencies into `dist` @@ -73,14 +73,14 @@ const tasks: CopyTask[] = [ }, ] -async function copy(task: CopyTask): Promise { +function copy(task: CopyTask): void { const src = path.resolve(projectRoot, task.target) const dst = path.resolve(outRoot, task.destination ?? task.target) try { - await fs.copy(src, dst, { + fs.cpSync(src, dst, { recursive: true, - overwrite: true, + force: true, errorOnExist: false, }) } catch (error) { @@ -88,18 +88,20 @@ async function copy(task: CopyTask): Promise { } } -void (async () => { - const args = process.argv.slice(2) - if (args.includes('--vueHr')) { - vueHr = true - console.log('Using Vue Hot Reload webpacks from core/') - } +const args = process.argv.slice(2) +if (args.includes('--vueHr')) { + vueHr = true + console.log('Using Vue Hot Reload webpacks from core/') +} +function main() { try { - await Promise.all(tasks.map(copy)) + tasks.map(copy) } catch (error) { console.error('`copyFiles.ts` failed') console.error(error) process.exit(1) } -})() +} + +void main() diff --git a/packages/amazonq/src/api.ts b/packages/amazonq/src/api.ts index 51b5225079b..03b2a32ea55 100644 --- a/packages/amazonq/src/api.ts +++ b/packages/amazonq/src/api.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { SendMessageCommandOutput, SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client' import { GenerateAssistantResponseCommandOutput, GenerateAssistantResponseRequest } from '@amzn/codewhisperer-streaming' import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { ChatSession } from 'aws-core-vscode/codewhispererChat' @@ -12,7 +13,11 @@ export default { chatApi: { async chat(request: GenerateAssistantResponseRequest): Promise { const chatSession = new ChatSession() - return chatSession.chat(request) + return chatSession.chatSso(request) + }, + async chatIam(request: SendMessageRequest): Promise { + const chatSession = new ChatSession() + return chatSession.chatIam(request) }, }, authApi: { diff --git a/packages/amazonq/src/app/chat/activation.ts b/packages/amazonq/src/app/chat/activation.ts index 82cc92f7b3a..5edd9affdcd 100644 --- a/packages/amazonq/src/app/chat/activation.ts +++ b/packages/amazonq/src/app/chat/activation.ts @@ -9,11 +9,12 @@ import { telemetry } from 'aws-core-vscode/telemetry' import { AuthUtil, CodeWhispererSettings } from 'aws-core-vscode/codewhisperer' import { Commands, placeholder, funcUtil } from 'aws-core-vscode/shared' import * as amazonq from 'aws-core-vscode/amazonq' +import { init as inlineChatInit } from '../../inlineChat/app' export async function activate(context: ExtensionContext) { const appInitContext = amazonq.DefaultAmazonQAppInitContext.instance - registerApps(appInitContext) + registerApps(appInitContext, context) const provider = new amazonq.AmazonQChatViewProvider( context, @@ -25,7 +26,11 @@ export async function activate(context: ExtensionContext) { await amazonq.TryChatCodeLensProvider.register(appInitContext.onDidChangeAmazonQVisibility.event) const setupLsp = funcUtil.debounce(async () => { - void amazonq.LspController.instance.trySetupLsp(context) + void amazonq.LspController.instance.trySetupLsp(context, { + startUrl: AuthUtil.instance.startUrl, + maxIndexSize: CodeWhispererSettings.instance.getMaxIndexSize(), + isVectorIndexEnabled: CodeWhispererSettings.instance.isLocalIndexEnabled(), + }) }, 5000) context.subscriptions.push( @@ -60,10 +65,11 @@ export async function activate(context: ExtensionContext) { void setupAuthNotification() } -function registerApps(appInitContext: amazonq.AmazonQAppInitContext) { +function registerApps(appInitContext: amazonq.AmazonQAppInitContext, context: ExtensionContext) { amazonq.cwChatAppInit(appInitContext) amazonq.featureDevChatAppInit(appInitContext) amazonq.gumbyChatAppInit(appInitContext) + inlineChatInit(context) } /** diff --git a/packages/amazonq/src/extension.ts b/packages/amazonq/src/extension.ts index bc5c8ae34c8..599aa9264a4 100644 --- a/packages/amazonq/src/extension.ts +++ b/packages/amazonq/src/extension.ts @@ -20,11 +20,14 @@ import { import { makeEndpointsProvider, registerGenericCommands } from 'aws-core-vscode' import { CommonAuthWebview } from 'aws-core-vscode/login' import { + amazonQDiffScheme, DefaultAWSClientBuilder, DefaultAwsContext, ExtContext, RegionProvider, Settings, + VirtualFileSystem, + VirtualMemoryFile, activateLogger, activateTelemetry, env, @@ -41,6 +44,7 @@ import { setContext, setupUninstallHandler, maybeShowMinVscodeWarning, + isSageMaker, } from 'aws-core-vscode/shared' import { ExtStartUpSources, telemetry } from 'aws-core-vscode/telemetry' import { VSCODE_EXTENSION_ID } from 'aws-core-vscode/utils' @@ -136,6 +140,14 @@ export async function activateAmazonQCommon(context: vscode.ExtensionContext, is // Handle Amazon Q Extension un-installation. setupUninstallHandler(VSCODE_EXTENSION_ID.amazonq, context.extension.packageJSON.version, context) + const vfs = new VirtualFileSystem() + + // Register an empty file that's used when a to open a diff + vfs.registerProvider( + vscode.Uri.from({ scheme: amazonQDiffScheme, path: 'empty' }), + new VirtualMemoryFile(new Uint8Array()) + ) + // Hide the Amazon Q tree in toolkit explorer await setContext('aws.toolkit.amazonq.dismissed', true) @@ -182,7 +194,7 @@ export async function activateAmazonQCommon(context: vscode.ExtensionContext, is } } const currConn = AuthUtil.instance.conn - if (currConn !== undefined && !isAnySsoConnection(currConn)) { + if (currConn !== undefined && !(isAnySsoConnection(currConn) || isSageMaker())) { getLogger().error(`Current Amazon Q connection is not SSO, type is: %s`, currConn?.type) } diff --git a/packages/amazonq/src/extensionNode.ts b/packages/amazonq/src/extensionNode.ts index b203e541a84..d21e9535383 100644 --- a/packages/amazonq/src/extensionNode.ts +++ b/packages/amazonq/src/extensionNode.ts @@ -17,6 +17,7 @@ import { DevOptions } from 'aws-core-vscode/dev' import { Auth } from 'aws-core-vscode/auth' import api from './api' import { activate as activateCWChat } from './app/chat/activation' +import { beta } from 'aws-core-vscode/dev' export async function activate(context: vscode.ExtensionContext) { // IMPORTANT: No other code should be added to this function. Place it in one of the following 2 functions where appropriate. @@ -32,7 +33,8 @@ export async function activate(context: vscode.ExtensionContext) { * the code compatible with web and move it to {@link activateAmazonQCommon}. */ async function activateAmazonQNode(context: vscode.ExtensionContext) { - await (await CrashMonitoring.instance()).start() + // Intentionally do not await since this is slow and non-critical + void (await CrashMonitoring.instance())?.start() const extContext = { extensionContext: context, @@ -58,6 +60,7 @@ async function activateAmazonQNode(context: vscode.ExtensionContext) { filetypes.activate() await setupDevMode(context) + await beta.activate(context) } /** @@ -96,5 +99,5 @@ async function setupDevMode(context: vscode.ExtensionContext) { export async function deactivate() { // Run concurrently to speed up execution. stop() does not throw so it is safe - await Promise.all([(await CrashMonitoring.instance()).stop(), deactivateCommon()]) + await Promise.all([(await CrashMonitoring.instance())?.shutdown(), deactivateCommon()]) } diff --git a/packages/amazonq/src/inlineChat/app.ts b/packages/amazonq/src/inlineChat/app.ts new file mode 100644 index 00000000000..f783ef8d84f --- /dev/null +++ b/packages/amazonq/src/inlineChat/app.ts @@ -0,0 +1,12 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { InlineChatController } from '../inlineChat/controller/inlineChatController' +import { registerInlineCommands } from '../inlineChat/command/registerInlineCommands' + +export function init(context: vscode.ExtensionContext) { + const inlineChatController = new InlineChatController(context) + registerInlineCommands(context, inlineChatController) +} diff --git a/packages/amazonq/src/inlineChat/codeLenses/codeLenseProvider.ts b/packages/amazonq/src/inlineChat/codeLenses/codeLenseProvider.ts new file mode 100644 index 00000000000..34a85e10b38 --- /dev/null +++ b/packages/amazonq/src/inlineChat/codeLenses/codeLenseProvider.ts @@ -0,0 +1,76 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as os from 'os' +import { InlineTask, TaskState } from '../controller/inlineTask' + +export class CodelensProvider implements vscode.CodeLensProvider { + private codeLenses: vscode.CodeLens[] = [] + private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter() + public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event + + constructor(context: vscode.ExtensionContext) { + context.subscriptions.push(vscode.languages.registerCodeLensProvider('*', this)) + this.provideCodeLenses = this.provideCodeLenses.bind(this) + } + + public provideCodeLenses(_document: vscode.TextDocument, _token: vscode.CancellationToken): vscode.CodeLens[] { + return this.codeLenses + } + + public updateLenses(task: InlineTask): void { + if (task.state === TaskState.Complete) { + this.codeLenses = [] + this._onDidChangeCodeLenses.fire() + return + } + switch (task.state) { + case TaskState.InProgress: { + this.codeLenses = [] + this.codeLenses.push( + new vscode.CodeLens(new vscode.Range(task.selectedRange.start, task.selectedRange.start), { + title: 'Amazon Q is generating...', + command: '', + }) + ) + break + } + case TaskState.WaitingForDecision: { + let acceptTitle: string + let rejectTitle: string + if (os.platform() === 'darwin') { + acceptTitle = 'Accept ($(newline))' + rejectTitle = `Reject ( \u238B )` + } else { + acceptTitle = 'Accept (Enter)' + rejectTitle = `Reject (Esc)` + } + + this.codeLenses = [] + this.codeLenses.push( + new vscode.CodeLens(new vscode.Range(task.selectedRange.start, task.selectedRange.start), { + title: acceptTitle, + command: 'aws.amazonq.inline.waitForUserDecisionAcceptAll', + arguments: [task], + }) + ) + this.codeLenses.push( + new vscode.CodeLens(new vscode.Range(task.selectedRange.start, task.selectedRange.start), { + title: rejectTitle, + command: 'aws.amazonq.inline.waitForUserDecisionRejectAll', + arguments: [task], + }) + ) + break + } + default: { + this.codeLenses = [] + break + } + } + this._onDidChangeCodeLenses.fire() + } +} diff --git a/packages/amazonq/src/inlineChat/command/registerInlineCommands.ts b/packages/amazonq/src/inlineChat/command/registerInlineCommands.ts new file mode 100644 index 00000000000..48b1fbf5145 --- /dev/null +++ b/packages/amazonq/src/inlineChat/command/registerInlineCommands.ts @@ -0,0 +1,22 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import vscode from 'vscode' +import { InlineChatController } from '../controller/inlineChatController' +import { InlineTask } from '../controller/inlineTask' + +export function registerInlineCommands(context: vscode.ExtensionContext, inlineChatController: InlineChatController) { + context.subscriptions.push( + vscode.commands.registerCommand('aws.amazonq.inline.invokeChat', async () => { + await inlineChatController.inlineQuickPick() + }), + vscode.commands.registerCommand('aws.amazonq.inline.waitForUserDecisionAcceptAll', async (task: InlineTask) => { + await inlineChatController.acceptAllChanges(task, true) + }), + vscode.commands.registerCommand('aws.amazonq.inline.waitForUserDecisionRejectAll', async (task: InlineTask) => { + await inlineChatController.rejectAllChanges(task, true) + }) + ) +} diff --git a/packages/amazonq/src/inlineChat/controller/inlineChatController.ts b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts new file mode 100644 index 00000000000..7f692e5acf1 --- /dev/null +++ b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts @@ -0,0 +1,408 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import { randomUUID } from 'crypto' +import * as vscode from 'vscode' +import { InlineDecorator } from '../decorations/inlineDecorator' +import { InlineChatProvider } from '../provider/inlineChatProvider' +import { InlineTask, TaskState, TextDiff } from './inlineTask' +import { responseTransformer } from '../output/responseTransformer' +import { adjustTextDiffForEditing, computeDiff } from '../output/computeDiff' +import { computeDecorations } from '../decorations/computeDecorations' +import { CodelensProvider } from '../codeLenses/codeLenseProvider' +import { PromptMessage, ReferenceLogController } from 'aws-core-vscode/codewhispererChat' +import { CodeWhispererSettings } from 'aws-core-vscode/codewhisperer' +import { + codicon, + getIcon, + getLogger, + messages, + setContext, + Timeout, + textDocumentUtil, + isSageMaker, +} from 'aws-core-vscode/shared' +import { InlineLineAnnotationController } from '../decorations/inlineLineAnnotationController' + +export class InlineChatController { + private task: InlineTask | undefined + private readonly decorator = new InlineDecorator() + private readonly inlineChatProvider: InlineChatProvider + private readonly codeLenseProvider: CodelensProvider + private readonly referenceLogController = new ReferenceLogController() + private readonly inlineLineAnnotationController: InlineLineAnnotationController + private userQuery: string | undefined + private listeners: vscode.Disposable[] = [] + + constructor(context: vscode.ExtensionContext) { + this.inlineChatProvider = new InlineChatProvider() + this.inlineChatProvider.onErrorOccured(() => this.handleError()) + this.codeLenseProvider = new CodelensProvider(context) + this.inlineLineAnnotationController = new InlineLineAnnotationController(context) + } + + public async createTask( + query: string, + document: vscode.TextDocument, + selectionRange: vscode.Selection + ): Promise { + const inlineTask = new InlineTask(query, document, selectionRange) + return inlineTask + } + + public async acceptAllChanges(task = this.task, userInvoked: boolean): Promise { + if (!task) { + return + } + const editor = vscode.window.visibleTextEditors.find( + (editor) => editor.document.uri.toString() === task.document.uri.toString() + ) + if (!editor) { + return + } + if (userInvoked) { + this.inlineChatProvider.sendTelemetryEvent( + { + userDecision: 'ACCEPT', + }, + this.task + ) + } + const deletions = task.diff.filter((diff) => diff.type === 'deletion') + await editor.edit( + (editBuilder) => { + for (const deletion of deletions) { + editBuilder.delete(deletion.range) + } + }, + { undoStopAfter: false, undoStopBefore: false } + ) + task.diff = [] + task.updateDecorations() + this.decorator.applyDecorations(task) + await this.updateTaskAndLenses(task) + this.referenceLogController.addReferenceLog(task.codeReferences, task.replacement ? task.replacement : '') + await this.reset() + } + + public async rejectAllChanges(task = this.task, userInvoked: boolean): Promise { + if (!task) { + return + } + const editor = vscode.window.visibleTextEditors.find( + (editor) => editor.document.uri.toString() === task.document.uri.toString() + ) + if (!editor) { + return + } + if (userInvoked) { + this.inlineChatProvider.sendTelemetryEvent( + { + userDecision: 'REJECT', + }, + this.task + ) + } + const insertions = task.diff.filter((diff) => diff.type === 'insertion') + await editor.edit( + (editBuilder) => { + for (const insertion of insertions) { + editBuilder.delete(insertion.range) + } + }, + { undoStopAfter: false, undoStopBefore: false } + ) + task.diff = [] + task.updateDecorations() + this.decorator.applyDecorations(task) + await this.updateTaskAndLenses(task) + this.referenceLogController.addReferenceLog(task.codeReferences, task.replacement ? task.replacement : '') + await this.reset() + } + + public async updateTaskAndLenses(task: InlineTask, taskState?: TaskState) { + if (taskState) { + task.state = taskState + } else if (!task.diff || task.diff.length === 0) { + // If the previous state was waiting for a decision and the code diff is clean, then we mark the task as completed + if (task.state === TaskState.WaitingForDecision) { + task.state = TaskState.Complete + } + } + this.codeLenseProvider.updateLenses(task) + if (task.state === TaskState.InProgress) { + if (vscode.window.activeTextEditor) { + await this.inlineLineAnnotationController.hide(vscode.window.activeTextEditor) + } + } + await this.refreshCodeLenses(task) + if (task.state === TaskState.Complete) { + await this.reset() + } + } + + private async handleError() { + if (!this.task) { + return + } + this.task.state = TaskState.Error + this.codeLenseProvider.updateLenses(this.task) + await this.refreshCodeLenses(this.task) + await this.reset() + } + + private async reset() { + this.listeners.forEach((listener) => listener.dispose()) + this.listeners = [] + + this.task = undefined + this.inlineLineAnnotationController.enable() + await setContext('amazonq.inline.codelensShortcutEnabled', undefined) + } + + private async refreshCodeLenses(task: InlineTask): Promise { + await vscode.commands.executeCommand('vscode.executeCodeLensProvider', task.document.uri) + } + + public async inlineQuickPick(previouseQuery?: string) { + const editor = vscode.window.activeTextEditor + if (!editor) { + return + } + + if (isSageMaker()) { + void vscode.window.showWarningMessage('Amazon Q: Inline chat is not supported in Sagemaker') + return + } + + if (this.task && this.task.isActiveState()) { + void vscode.window.showWarningMessage( + 'Amazon Q: Reject or Accept the current suggestion before creating a new one' + ) + return + } + + await vscode.window + .showInputBox({ + value: previouseQuery ?? '', + placeHolder: 'Enter instructions for Q', + prompt: codicon`${getIcon('aws-amazonq-q-white')} Edit code`, + }) + .then(async (query) => { + if (!query || query.trim() === '') { + getLogger().info('inlineQuickPick query is empty') + return + } + + this.userQuery = query + await textDocumentUtil.addEofNewline(editor) + this.task = await this.createTask(query, editor.document, editor.selection) + await this.inlineLineAnnotationController.disable(editor) + await this.computeDiffAndRenderOnEditor(query, editor.document).catch(async (err) => { + getLogger().error(err) + if (err instanceof Error) { + void vscode.window.showErrorMessage(`Amazon Q: ${err.message}`) + } else { + void vscode.window.showErrorMessage('Amazon Q encountered an error') + } + await this.handleError() + }) + }) + } + + private async computeDiffAndRenderOnEditor(query: string, document: vscode.TextDocument) { + if (!this.task) { + return + } + + await this.updateTaskAndLenses(this.task, TaskState.InProgress) + getLogger().info(`inline chat query:\n${query}`) + const uuid = randomUUID() + const message: PromptMessage = { + message: query, + messageId: uuid, + command: undefined, + userIntent: undefined, + tabID: uuid, + } + + const requestStart = performance.now() + let responseStartLatency: number | undefined + + const response = await this.inlineChatProvider.processPromptMessage(message) + this.task.requestId = response?.$metadata.requestId + + // Deselect all code + const editor = vscode.window.activeTextEditor + if (editor) { + const selection = editor.selection + if (!selection.isEmpty) { + const cursor = selection.active + const newSelection = new vscode.Selection(cursor, cursor) + editor.selection = newSelection + } + } + + if (response) { + let qSuggestedCodeResponse = '' + for await (const chatEvent of response.generateAssistantResponseResponse!) { + if ( + chatEvent.assistantResponseEvent?.content !== undefined && + chatEvent.assistantResponseEvent.content.length > 0 + ) { + if (responseStartLatency === undefined) { + responseStartLatency = performance.now() - requestStart + } + + qSuggestedCodeResponse += chatEvent.assistantResponseEvent.content + + const transformedResponse = responseTransformer(qSuggestedCodeResponse, this.task, false) + if (transformedResponse) { + const textDiff = computeDiff(transformedResponse, this.task, true) + const decorations = computeDecorations(this.task) + this.task.decorations = decorations + await this.applyDiff(this.task!, textDiff ?? [], { + undoStopBefore: false, + undoStopAfter: false, + }) + this.decorator.applyDecorations(this.task) + this.task.previouseDiff = textDiff + } + } + if ( + chatEvent.codeReferenceEvent?.references !== undefined && + chatEvent.codeReferenceEvent.references.length > 0 + ) { + this.task.codeReferences = this.task.codeReferences.concat(chatEvent.codeReferenceEvent?.references) + // clear diff if user settings is off for code reference + if (!CodeWhispererSettings.instance.isSuggestionsWithCodeReferencesEnabled()) { + await this.rejectAllChanges(this.task, false) + void vscode.window.showInformationMessage( + 'Your settings do not allow code generation with references.' + ) + await this.updateTaskAndLenses(this.task, TaskState.Complete) + return + } + } + if (chatEvent.error) { + await this.rejectAllChanges(this.task, false) + void vscode.window.showErrorMessage(`Amazon Q: ${chatEvent.error.message}`) + await this.updateTaskAndLenses(this.task, TaskState.Complete) + return + } + } + + if (this.task) { + // Unclear why we need to check if task is defined, but occasionally an error occurs otherwise + this.task.responseStartLatency = responseStartLatency + this.task.responseEndLatency = performance.now() - requestStart + } + getLogger().info(`qSuggestedCodeResponse:\n${qSuggestedCodeResponse}`) + const transformedResponse = responseTransformer(qSuggestedCodeResponse, this.task, true) + if (transformedResponse) { + const textDiff = computeDiff(transformedResponse, this.task, false) + const decorations = computeDecorations(this.task) + this.task.decorations = decorations + await this.applyDiff(this.task, textDiff ?? []) + this.decorator.applyDecorations(this.task) + await this.updateTaskAndLenses(this.task, TaskState.WaitingForDecision) + await setContext('amazonq.inline.codelensShortcutEnabled', true) + this.undoListener(this.task) + } else { + void messages.showMessageWithCancel( + 'No suggestions from Q, please try different instructions.', + new Timeout(5000) + ) + await this.updateTaskAndLenses(this.task, TaskState.Complete) + await this.inlineQuickPick(this.userQuery) + await this.handleError() + } + } + } + + private async applyDiff( + task: InlineTask, + textDiff: TextDiff[], + undoOption?: { undoStopBefore: boolean; undoStopAfter: boolean } + ) { + const adjustedTextDiff = adjustTextDiffForEditing(textDiff) + const visibleEditor = vscode.window.visibleTextEditors.find( + (editor) => editor.document.uri === task.document.uri + ) + const previousDiff = task.previouseDiff?.filter((diff) => diff.type === 'insertion') + + if (visibleEditor) { + if (previousDiff) { + await visibleEditor.edit( + (editBuilder) => { + for (const insertion of previousDiff) { + editBuilder.delete(insertion.range) + } + }, + { undoStopAfter: false, undoStopBefore: false } + ) + } + await visibleEditor.edit( + (editBuilder) => { + for (const change of adjustedTextDiff) { + if (change.type === 'insertion') { + editBuilder.insert(change.range.start, change.replacementText) + } + } + }, + undoOption ?? { undoStopBefore: true, undoStopAfter: false } + ) + } else { + if (previousDiff) { + const edit = new vscode.WorkspaceEdit() + for (const insertion of previousDiff) { + edit.delete(task.document.uri, insertion.range) + } + await vscode.workspace.applyEdit(edit) + } + const edit = new vscode.WorkspaceEdit() + for (const change of textDiff) { + if (change.type === 'insertion') { + edit.insert(task.document.uri, change.range.start, change.replacementText) + } + } + await vscode.workspace.applyEdit(edit) + } + } + + private undoListener(task: InlineTask) { + const listener: vscode.Disposable = vscode.workspace.onDidChangeTextDocument(async (event) => { + const { document, contentChanges } = event + + if (document.uri.toString() !== task.document.uri.toString()) { + return + } + + const changeIntersectsRange = contentChanges.some((change) => { + const { range } = change + if (task.selectedRange) { + return !( + range.end.isBefore(task.selectedRange.start) || range.start.isAfter(task.selectedRange.end) + ) + } + }) + + if (!changeIntersectsRange) { + return + } + + const updatedSelectedText = document.getText(task.selectedRange) + + if (updatedSelectedText.trim() === task.selectedText.trim()) { + task.diff = [] + await this.updateTaskAndLenses(task) + task.updateDecorations() + this.decorator.applyDecorations(task) + listener.dispose() + } + }) + + this.listeners.push(listener) + } +} diff --git a/packages/amazonq/src/inlineChat/controller/inlineTask.ts b/packages/amazonq/src/inlineChat/controller/inlineTask.ts new file mode 100644 index 00000000000..a6a169ad58c --- /dev/null +++ b/packages/amazonq/src/inlineChat/controller/inlineTask.ts @@ -0,0 +1,160 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import type { CodeReference } from 'aws-core-vscode/amazonq' +import type { InlineChatEvent } from 'aws-core-vscode/codewhisperer' +import type { Decorations } from '../decorations/inlineDecorator' +import { computeDecorations } from '../decorations/computeDecorations' +import { extractLanguageNameFromFile } from 'aws-core-vscode/codewhispererChat' +import { textDocumentUtil } from 'aws-core-vscode/shared' + +interface TextToInsert { + type: 'insertion' + replacementText: string + range: vscode.Range +} + +interface TextToDelete { + type: 'deletion' + originalText: string + range: vscode.Range +} + +interface DiffBlock { + originalText: string + replacementText: string + range: vscode.Range +} + +export type TextDiff = TextToInsert | TextToDelete + +export enum TaskState { + Idle = 'Idle', + InProgress = 'InProgress', + WaitingForDecision = 'WaitingForDecision', + Complete = 'Complete', + Error = 'Error', +} + +export class InlineTask { + public state: TaskState = TaskState.Idle + public diff: TextDiff[] = [] + public decorations: Decorations | undefined + public diffBlock: DiffBlock[] = [] + public codeReferences: CodeReference[] = [] + public selectedText: string + public languageName: string | undefined + + public partialSelectedText: string | undefined + public partialSelectedTextRight: string | undefined + + public previouseDiff: TextDiff[] | undefined + public selectedRange: vscode.Range + public inProgressReplacement: string | undefined + public replacement: string | undefined + + // Telemetry fields + public requestId?: string + public responseStartLatency?: number + public responseEndLatency?: number + + constructor( + public query: string, + public document: vscode.TextDocument, + selection: vscode.Selection + ) { + this.selectedRange = textDocumentUtil.expandSelectionToFullLines(document, selection) + this.selectedText = document.getText(this.selectedRange) + this.languageName = extractLanguageNameFromFile(document) + } + + public revertDiff(): void { + this.diff = [] + this.decorations = { + linesAdded: [], + linesRemoved: [], + } + } + + public removeDiffChangeByRange(range: vscode.Range): void { + if (this.diff) { + this.diff = this.diff.filter((change) => !change.range.isEqual(range)) + } + } + + public updateDecorations(): void { + const isEmpty = + !this.decorations || + (this.decorations?.linesAdded?.length === 0 && this.decorations?.linesRemoved?.length === 0) + + if (isEmpty) { + return + } + const updatedDecorations = computeDecorations(this) + this.decorations = updatedDecorations + } + + public updateDiff(affectedRange: vscode.Range, deletedLines: number) { + const diffsAfter = this.diff.filter((edit) => edit.range.start.isAfter(affectedRange.end)) + for (const diff of diffsAfter) { + diff.range = new vscode.Range( + diff.range.start.translate(-deletedLines), + diff.range.end.translate(-deletedLines) + ) + } + } + + // Telemetry methods + public get numSelectedLines() { + return this.selectedText.split('\n').length + } + + public get inputLength() { + return this.query.length + } + + public inlineChatEventBase() { + let numSuggestionAddChars = 0 + let numSuggestionAddLines = 0 + let numSuggestionDelChars = 0 + let numSuggestionDelLines = 0 + + for (const diff of this.diff) { + if (diff.type === 'insertion') { + numSuggestionAddChars += diff.replacementText.length + numSuggestionAddLines += diff.range.end.line - diff.range.start.line + 1 + } else { + numSuggestionDelChars += diff.originalText.length + numSuggestionDelLines += diff.range.end.line - diff.range.start.line + 1 + } + } + + const programmingLanguage = this.languageName + ? { + languageName: this.languageName, + } + : undefined + + const event: Partial = { + requestId: this.requestId, + timestamp: new Date(), + inputLength: this.inputLength, + numSelectedLines: this.numSelectedLines, + codeIntent: true, + responseStartLatency: this.responseStartLatency, + responseEndLatency: this.responseEndLatency, + numSuggestionAddChars, + numSuggestionAddLines, + numSuggestionDelChars, + numSuggestionDelLines, + programmingLanguage, + } + return event + } + + public isActiveState() { + return !(this.state === TaskState.Complete || this.state === TaskState.Error) + } +} diff --git a/packages/amazonq/src/inlineChat/decorations/computeDecorations.ts b/packages/amazonq/src/inlineChat/decorations/computeDecorations.ts new file mode 100644 index 00000000000..fb289494b3f --- /dev/null +++ b/packages/amazonq/src/inlineChat/decorations/computeDecorations.ts @@ -0,0 +1,32 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { InlineTask } from '../controller/inlineTask' +import { Decorations } from './inlineDecorator' + +export function computeDecorations(task: InlineTask): Decorations | undefined { + if (!task.diff) { + return + } + + const decorations: Decorations = { + linesAdded: [], + linesRemoved: [], + } + + for (const edit of task.diff) { + const countChanged = edit.range.end.line - edit.range.start.line - 1 + if (edit.type === 'deletion') { + decorations.linesRemoved.push({ + range: new vscode.Range(edit.range.start.line, 0, edit.range.start.line + countChanged, 0), + }) + } else if (edit.type === 'insertion') { + decorations.linesAdded.push({ + range: new vscode.Range(edit.range.start.line, 0, edit.range.start.line + countChanged, 0), + }) + } + } + return decorations +} diff --git a/packages/amazonq/src/inlineChat/decorations/inlineDecorator.ts b/packages/amazonq/src/inlineChat/decorations/inlineDecorator.ts new file mode 100644 index 00000000000..3c4e3899e13 --- /dev/null +++ b/packages/amazonq/src/inlineChat/decorations/inlineDecorator.ts @@ -0,0 +1,38 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { InlineTask } from '../controller/inlineTask' + +export interface Decorations { + linesAdded: vscode.DecorationOptions[] + linesRemoved: vscode.DecorationOptions[] +} + +const removedTextDecorationType = vscode.window.createTextEditorDecorationType({ + backgroundColor: 'rgba(255, 0, 0, 0.1)', + isWholeLine: true, +}) + +const AddedTextDecorationType = vscode.window.createTextEditorDecorationType({ + backgroundColor: 'rgba(0, 255, 0, 0.1)', + isWholeLine: true, +}) + +export class InlineDecorator { + public applyDecorations(task: InlineTask): void { + const decorations = task.decorations + if (!decorations) { + return + } + const editors = vscode.window.visibleTextEditors.filter( + (editor) => editor.document.uri.toString() === task.document.uri.toString() + ) + for (const editor of editors) { + editor.setDecorations(AddedTextDecorationType, decorations.linesAdded ?? []) + editor.setDecorations(removedTextDecorationType, decorations.linesRemoved ?? []) + } + } +} diff --git a/packages/amazonq/src/inlineChat/decorations/inlineLineAnnotationController.ts b/packages/amazonq/src/inlineChat/decorations/inlineLineAnnotationController.ts new file mode 100644 index 00000000000..9ec5e08122d --- /dev/null +++ b/packages/amazonq/src/inlineChat/decorations/inlineLineAnnotationController.ts @@ -0,0 +1,57 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Container } from 'aws-core-vscode/codewhisperer' +import * as vscode from 'vscode' + +export class InlineLineAnnotationController { + private enabled: boolean = true + + constructor(context: vscode.ExtensionContext) { + context.subscriptions.push( + vscode.window.onDidChangeTextEditorSelection(async ({ selections, textEditor }) => { + let showShow = false + + if (this.enabled) { + for (const selection of selections) { + if (selection.end.line === selection.start.line + 1 && selection.end.character === 0) { + // dont show if the selection is just a newline + } else if (selection.start.line !== selection.end.line) { + showShow = true + break + } + } + } + + await this.setVisible(textEditor, showShow) + }, this) + ) + } + + private async setVisible(editor: vscode.TextEditor, visible: boolean) { + let needsRefresh: boolean + if (visible) { + needsRefresh = await Container.instance.lineAnnotationController.tryShowInlineHint() + } else { + needsRefresh = await Container.instance.lineAnnotationController.tryHideInlineHint() + } + if (needsRefresh) { + await Container.instance.lineAnnotationController.refresh(editor, 'codewhisperer') + } + } + + async hide(editor: vscode.TextEditor) { + await this.setVisible(editor, false) + } + + enable() { + this.enabled = true + } + + async disable(editor: vscode.TextEditor) { + this.enabled = false + await this.setVisible(editor, false) + } +} diff --git a/packages/amazonq/src/inlineChat/output/computeDiff.ts b/packages/amazonq/src/inlineChat/output/computeDiff.ts new file mode 100644 index 00000000000..9b599b2eff3 --- /dev/null +++ b/packages/amazonq/src/inlineChat/output/computeDiff.ts @@ -0,0 +1,116 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import { type LinesOptions, diffLines, Change } from 'diff' +import * as vscode from 'vscode' +import { InlineTask, TextDiff } from '../controller/inlineTask' + +export function computeDiff(response: string, inlineTask: InlineTask, isPartialDiff: boolean): TextDiff[] | undefined { + if (!response) { + return + } + const selectedRange = inlineTask.selectedRange + const partialSelectedText = inlineTask.partialSelectedText ?? '' + const selectedText = isPartialDiff ? partialSelectedText : inlineTask.selectedText + + const normalizedResponse = + getLeadingWhitespace(selectedText) + response.trim() + getTrailingWhitespace(selectedText) + + const diffs = diffLines(selectedText, normalizedResponse, { + stripTrailingCr: true, + ignoreNewlineAtEof: true, + } as LinesOptions) + + const textDiff: TextDiff[] = [] + let startLine = selectedRange.start.line + + diffs.forEach((part: Change) => { + const count = part.count ?? 0 + if (part.removed) { + if (part.value !== '\n') { + textDiff.push({ + type: 'deletion', + originalText: part.value, + range: new vscode.Range(startLine, 0, startLine + count, 0), + }) + } + } else if (part.added) { + if (part.value !== '\n') { + // The partial response sometimes doesn't have the correct ending newline character (\n), so we ensure that every insertion respects the code formatting. + if (isPartialDiff && !part.value.endsWith('\n')) { + part.value += '\n' + } + textDiff.push({ + type: 'insertion', + replacementText: part.value, + range: new vscode.Range(startLine, 0, startLine + count, 0), + }) + } + } + startLine += count + }) + inlineTask.diff = textDiff + return textDiff +} + +export function adjustTextDiffForEditing(textDiff: TextDiff[]): TextDiff[] { + let linesAdded = 0 + const adjustedDiff: TextDiff[] = [] + + for (const edit of textDiff) { + const { range, type } = edit + const { start, end } = range + const linesChanged = end.line - start.line + + const adjustedRange = new vscode.Range( + new vscode.Position(start.line - linesAdded, start.character), + new vscode.Position(end.line - linesAdded, end.character) + ) + + adjustedDiff.push({ + ...edit, + range: adjustedRange, + }) + + if (type === 'insertion') { + linesAdded += linesChanged + } + } + + return adjustedDiff +} + +export function getDiffBlocks(inlineTask: InlineTask): vscode.Range[] { + const diff = inlineTask.diff + + if (!diff || diff.length === 0) { + return [] + } + + const diffBlocks: vscode.Range[] = [] + let currentRange: vscode.Range | undefined + + for (const change of diff) { + const { range } = change + if (!currentRange || range.start.line !== currentRange.end.line) { + currentRange = range + diffBlocks.push(range) + } else { + currentRange = new vscode.Range(currentRange.start, range.end) + diffBlocks[diffBlocks.length - 1] = currentRange + } + } + + return diffBlocks +} + +function getLeadingWhitespace(str: string): string { + const match = str.match(/^\s*/) + return match ? match[0] : '' +} + +function getTrailingWhitespace(str: string): string { + const match = str.match(/\s*$/) + return match ? match[0] : '' +} diff --git a/packages/amazonq/src/inlineChat/output/responseTransformer.ts b/packages/amazonq/src/inlineChat/output/responseTransformer.ts new file mode 100644 index 00000000000..b965ced519e --- /dev/null +++ b/packages/amazonq/src/inlineChat/output/responseTransformer.ts @@ -0,0 +1,55 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { getLogger } from 'aws-core-vscode/shared' +import { decode } from 'he' +import { InlineTask } from '../controller/inlineTask' + +/** + * Transforms the response from the INLINE_CHAT GenerateAssistantResponse call. + * + * @param response - The raw response string from GenerateAssistantResponse. + * @param inlineTask - The inline task object containing information about the current task. + * @param isWholeResponse - A boolean indicating whether this is a complete response or a partial one. + * @returns The decoded response string, or undefined if an error occurs. + */ +export function responseTransformer( + response: string, + inlineTask: InlineTask, + isWholeResponse: boolean +): string | undefined { + try { + const decodedResponse = decode(response) + if (!isWholeResponse) { + const [partialSelectedCode, right] = extractPartialCode(decodedResponse, inlineTask) + inlineTask.partialSelectedText = partialSelectedCode + inlineTask.partialSelectedTextRight = right + return decodedResponse + } else { + return decodedResponse + } + } catch (err) { + getLogger().error('An unknown error occurred: %s', (err as Error).message) + return undefined + } +} + +/** + * This function is used to handle partial responses in inline tasks. It divides + * the selected text into two parts: + * 1. The "left" part, which contains the same number of lines as the response. + * 2. The "right" part, which contains the remaining lines. + * + * @param response - The response string from the assistant. + * @param inlineTask - The inline task object containing the full selected text. + * @returns A tuple with two strings: [leftPart, rightPart]. + */ +function extractPartialCode(response: string, inlineTask: InlineTask): [string, string] { + const lineCount = response.split('\n').length + const splitLines = inlineTask.selectedText.split('\n') + const left = splitLines.slice(0, lineCount).join('\n') + const right = splitLines.slice(lineCount).join('\n') + return [left, right] +} diff --git a/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts b/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts new file mode 100644 index 00000000000..99c1e21c321 --- /dev/null +++ b/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts @@ -0,0 +1,186 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { + CodeWhispererStreamingServiceException, + GenerateAssistantResponseCommandOutput, +} from '@amzn/codewhisperer-streaming' +import { AuthUtil, getSelectedCustomization } from 'aws-core-vscode/codewhisperer' +import { + ChatSessionStorage, + ChatTriggerType, + EditorContextExtractor, + PromptMessage, + TriggerEventsStorage, + TriggerPayload, + triggerPayloadToChatRequest, + UserIntentRecognizer, +} from 'aws-core-vscode/codewhispererChat' +import { AwsClientResponseError, getLogger, isAwsError, ToolkitError } from 'aws-core-vscode/shared' +import { randomUUID } from 'crypto' +import { codeWhispererClient } from 'aws-core-vscode/codewhisperer' +import type { InlineChatEvent } from 'aws-core-vscode/codewhisperer' +import { InlineTask } from '../controller/inlineTask' +import { extractAuthFollowUp } from 'aws-core-vscode/amazonq' + +export class InlineChatProvider { + private readonly editorContextExtractor: EditorContextExtractor + private readonly userIntentRecognizer: UserIntentRecognizer + private readonly sessionStorage: ChatSessionStorage + private readonly triggerEventsStorage: TriggerEventsStorage + private errorEmitter = new vscode.EventEmitter() + public onErrorOccured = this.errorEmitter.event + + public constructor() { + this.editorContextExtractor = new EditorContextExtractor() + this.userIntentRecognizer = new UserIntentRecognizer() + this.sessionStorage = new ChatSessionStorage() + this.triggerEventsStorage = new TriggerEventsStorage() + } + + public async processPromptMessage(message: PromptMessage) { + return this.editorContextExtractor + .extractContextForTrigger('ChatMessage') + .then((context) => { + const triggerID = randomUUID() + this.triggerEventsStorage.addTriggerEvent({ + id: triggerID, + tabID: message.tabID, + message: message.message, + type: 'inline_chat', + context, + }) + return this.generateResponse( + { + message: message.message, + trigger: ChatTriggerType.InlineChatMessage, + query: message.message, + codeSelection: context?.focusAreaContext?.selectionInsideExtendedCodeBlock, + fileText: context?.focusAreaContext?.extendedCodeBlock, + fileLanguage: context?.activeFileContext?.fileLanguage, + filePath: context?.activeFileContext?.filePath, + matchPolicy: context?.activeFileContext?.matchPolicy, + codeQuery: context?.focusAreaContext?.names, + userIntent: this.userIntentRecognizer.getFromPromptChatMessage(message), + customization: getSelectedCustomization(), + }, + triggerID + ) + }) + .catch((e) => { + this.processException(e, message.tabID) + }) + } + + private async generateResponse( + triggerPayload: TriggerPayload & { projectContextQueryLatencyMs?: number }, + triggerID: string + ) { + const triggerEvent = this.triggerEventsStorage.getTriggerEvent(triggerID) + if (triggerEvent === undefined) { + return + } + + if (triggerEvent.tabID === 'no-available-tabs') { + return + } + + if (triggerEvent.tabID === undefined) { + setTimeout(() => { + this.generateResponse(triggerPayload, triggerID).catch((e) => { + getLogger().error('generateResponse failed: %s', (e as Error).message) + }) + }, 20) + return + } + + const tabID = triggerEvent.tabID + + const credentialsState = await AuthUtil.instance.getChatAuthState() + if ( + !(credentialsState.codewhispererChat === 'connected' && credentialsState.codewhispererCore === 'connected') + ) { + const { message } = extractAuthFollowUp(credentialsState) + this.errorEmitter.fire() + throw new ToolkitError(message) + } + triggerPayload.useRelevantDocuments = false + + const request = triggerPayloadToChatRequest(triggerPayload) + const session = this.sessionStorage.getSession(tabID) + getLogger().info( + `request from tab: ${tabID} conversationID: ${session.sessionIdentifier} request: ${JSON.stringify( + request + )}` + ) + + let response: GenerateAssistantResponseCommandOutput | undefined = undefined + session.createNewTokenSource() + try { + response = await session.chatSso(request) + getLogger().info( + `response to tab: ${tabID} conversationID: ${session.sessionIdentifier} requestID: ${response.$metadata.requestId} metadata: ${JSON.stringify( + response.$metadata + )}` + ) + } catch (e: any) { + this.processException(e, tabID) + } + + return response + } + + private processException(e: any, tabID: string) { + let errorMessage: string | undefined + let requestID: string | undefined + if (typeof e === 'string') { + errorMessage = e.toUpperCase() + } else if (e instanceof SyntaxError) { + // Workaround to handle case when LB returns web-page with error and our client doesn't return proper exception + errorMessage = AwsClientResponseError.tryExtractReasonFromSyntaxError(e) + } else if (e instanceof CodeWhispererStreamingServiceException) { + errorMessage = e.message + requestID = e.$metadata.requestId + } else if (e instanceof Error) { + errorMessage = e.message + } + + this.errorEmitter.fire() + this.sessionStorage.deleteSession(tabID) + + throw ToolkitError.chain(e, errorMessage ?? 'Failed to get response', { + details: { + tabID, + requestID, + }, + }) + } + + public sendTelemetryEvent(inlineChatEvent: InlineChatEvent, currentTask?: InlineTask) { + codeWhispererClient + .sendTelemetryEvent({ + telemetryEvent: { + inlineChatEvent: { + ...inlineChatEvent, + ...(currentTask?.inlineChatEventBase() ?? {}), + }, + }, + }) + .then() + .catch((error) => { + let requestId: string | undefined + if (isAwsError(error)) { + requestId = error.requestId + } + + getLogger().debug( + `Failed to sendTelemetryEvent to CodeWhisperer, requestId: ${ + requestId ?? '' + }, message: ${error.message}` + ) + }) + } +} diff --git a/packages/amazonq/test/e2e/amazonq/featureDev.test.ts b/packages/amazonq/test/e2e/amazonq/featureDev.test.ts index 861ce35fb2b..9cd87003f36 100644 --- a/packages/amazonq/test/e2e/amazonq/featureDev.test.ts +++ b/packages/amazonq/test/e2e/amazonq/featureDev.test.ts @@ -110,7 +110,7 @@ describe('Amazon Q Feature Dev', function () { beforeEach(() => { registerAuthHook('amazonq-test-account') - framework = new qTestingFramework('featuredev', true) + framework = new qTestingFramework('featuredev', true, []) tab = framework.createTab() }) @@ -135,7 +135,7 @@ describe('Amazon Q Feature Dev', function () { it('Does NOT show /dev when feature dev is NOT enabled', () => { // The beforeEach registers a framework which accepts requests. If we don't dispose before building a new one we have duplicate messages framework.dispose() - framework = new qTestingFramework('featuredev', false) + framework = new qTestingFramework('featuredev', false, []) const tab = framework.createTab() const command = tab.findCommand('/dev') if (command.length > 0) { diff --git a/packages/amazonq/test/e2e/amazonq/framework/framework.ts b/packages/amazonq/test/e2e/amazonq/framework/framework.ts index 8c9e89c49f8..b65e8b184f7 100644 --- a/packages/amazonq/test/e2e/amazonq/framework/framework.ts +++ b/packages/amazonq/test/e2e/amazonq/framework/framework.ts @@ -12,6 +12,7 @@ import * as vscode from 'vscode' import { MynahUI, MynahUIProps } from '@aws/mynah-ui' import { DefaultAmazonQAppInitContext, TabType, createMynahUI } from 'aws-core-vscode/amazonq' import { Messenger, MessengerOptions } from './messenger' +import { FeatureContext } from 'aws-core-vscode/shared' /** * Abstraction over Amazon Q to make e2e testing easier @@ -23,7 +24,7 @@ export class qTestingFramework { lastEventId: string = '' - constructor(featureName: TabType, amazonQEnabled: boolean) { + constructor(featureName: TabType, amazonQEnabled: boolean, featureConfigsSerialized: [string, FeatureContext][]) { /** * Instantiate the UI and override the postMessage to publish using the app message * publishers directly. @@ -42,7 +43,8 @@ export class qTestingFramework { appMessagePublisher.publish(message) }, }, - amazonQEnabled + amazonQEnabled, + featureConfigsSerialized ) this.mynahUI = ui.mynahUI this.mynahUIProps = (this.mynahUI as any).props diff --git a/packages/amazonq/test/e2e/amazonq/framework/jsdomInjector.ts b/packages/amazonq/test/e2e/amazonq/framework/jsdomInjector.ts index ef92521b1d9..f5d2d1c2770 100644 --- a/packages/amazonq/test/e2e/amazonq/framework/jsdomInjector.ts +++ b/packages/amazonq/test/e2e/amazonq/framework/jsdomInjector.ts @@ -34,5 +34,5 @@ export function injectJSDOM() { }) // jsdom doesn't have support for structuredClone. See https://github.com/jsdom/jsdom/issues/3363 - global.structuredClone = (val) => JSON.parse(JSON.stringify(val)) + global.structuredClone = (val: any) => JSON.parse(JSON.stringify(val)) } diff --git a/packages/amazonq/test/unit/amazonq/lsp/lspClient.test.ts b/packages/amazonq/test/unit/amazonq/lsp/lspClient.test.ts index affbc20a802..0ffb6adc907 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/lspClient.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/lspClient.test.ts @@ -18,7 +18,7 @@ describe('Amazon Q LSP client', function () { }) it('encrypts payload of query ', async () => { - await lspClient.query('mock_input') + await lspClient.queryVectorIndex('mock_input') assert.ok(encryptFunc.calledOnce) assert.ok(encryptFunc.calledWith(JSON.stringify({ query: 'mock_input' }))) const value = await encryptFunc.returnValues[0] @@ -27,14 +27,15 @@ describe('Amazon Q LSP client', function () { }) it('encrypts payload of index files ', async () => { - await lspClient.indexFiles(['fileA'], 'path', false) + await lspClient.buildIndex(['fileA'], 'path', 'all') assert.ok(encryptFunc.calledOnce) assert.ok( encryptFunc.calledWith( JSON.stringify({ filePaths: ['fileA'], - rootPath: 'path', - refresh: false, + projectRoot: 'path', + config: 'all', + language: '', }) ) ) diff --git a/packages/amazonq/test/unit/amazonqFeatureDev/session/session.test.ts b/packages/amazonq/test/unit/amazonqFeatureDev/session/session.test.ts index 2af763ecf11..f2a08348d23 100644 --- a/packages/amazonq/test/unit/amazonqFeatureDev/session/session.test.ts +++ b/packages/amazonq/test/unit/amazonqFeatureDev/session/session.test.ts @@ -96,7 +96,8 @@ describe('session', () => { [], [], tabID, - 0 + 0, + {} ) const session = await createSession({ messenger, sessionState: codeGenState, conversationID }) encodedContent = new TextEncoder().encode(notRejectedFileContent) diff --git a/packages/amazonq/test/unit/codewhisperer/commands/onAcceptance.test.ts b/packages/amazonq/test/unit/codewhisperer/commands/onAcceptance.test.ts index 6dfc46ee9dd..5af3252ec82 100644 --- a/packages/amazonq/test/unit/codewhisperer/commands/onAcceptance.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/commands/onAcceptance.test.ts @@ -8,18 +8,14 @@ import * as vscode from 'vscode' import * as sinon from 'sinon' import { onAcceptance, - UserGroup, AcceptedSuggestionEntry, session, CodeWhispererTracker, RecommendationHandler, - CodeWhispererUserGroupSettings, AuthUtil, } from 'aws-core-vscode/codewhisperer' import { resetCodeWhispererGlobalVariables, createMockTextEditor } from 'aws-core-vscode/test' import { assertTelemetryCurried } from 'aws-core-vscode/test' -import { globals } from 'aws-core-vscode/shared' -import { extensionVersion } from 'aws-core-vscode/shared' describe('onAcceptance', function () { describe('onAcceptance', function () { @@ -31,7 +27,6 @@ describe('onAcceptance', function () { afterEach(function () { sinon.restore() session.reset() - CodeWhispererUserGroupSettings.instance.reset() }) it('Should enqueue an event object to tracker', async function () { @@ -75,11 +70,6 @@ describe('onAcceptance', function () { }) it('Should report telemetry that records this user decision event', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.Control, - version: extensionVersion, - }) - const testStartUrl = 'testStartUrl' sinon.stub(AuthUtil.instance, 'startUrl').value(testStartUrl) const mockEditor = createMockTextEditor() @@ -117,7 +107,6 @@ describe('onAcceptance', function () { codewhispererCompletionType: 'Line', codewhispererLanguage: 'python', credentialStartUrl: testStartUrl, - codewhispererUserGroup: 'Control', }) }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/commands/onInlineAcceptance.test.ts b/packages/amazonq/test/unit/codewhisperer/commands/onInlineAcceptance.test.ts index 082114dc7ae..ae02e7bd7c3 100644 --- a/packages/amazonq/test/unit/codewhisperer/commands/onInlineAcceptance.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/commands/onInlineAcceptance.test.ts @@ -8,14 +8,7 @@ import * as vscode from 'vscode' import * as sinon from 'sinon' import { resetCodeWhispererGlobalVariables, createMockTextEditor } from 'aws-core-vscode/test' import { assertTelemetryCurried } from 'aws-core-vscode/test' -import { - onInlineAcceptance, - RecommendationHandler, - AuthUtil, - session, - CodeWhispererUserGroupSettings, - UserGroup, -} from 'aws-core-vscode/codewhisperer' +import { onInlineAcceptance, RecommendationHandler, AuthUtil, session } from 'aws-core-vscode/codewhisperer' import { globals } from 'aws-core-vscode/shared' import { extensionVersion } from 'aws-core-vscode/shared' @@ -29,7 +22,6 @@ describe('onInlineAcceptance', function () { afterEach(function () { sinon.restore() session.reset() - CodeWhispererUserGroupSettings.instance.reset() }) it('Should dispose inline completion provider', async function () { @@ -53,7 +45,6 @@ describe('onInlineAcceptance', function () { it('Should report telemetry that records this user decision event', async function () { await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.Classifier, version: extensionVersion, }) @@ -95,7 +86,6 @@ describe('onInlineAcceptance', function () { codewhispererCompletionType: 'Line', codewhispererLanguage: 'python', credentialStartUrl: testStartUrl, - codewhispererUserGroup: 'Classifier', }) }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/service/keyStrokeHandler.test.ts b/packages/amazonq/test/unit/codewhisperer/service/keyStrokeHandler.test.ts index 0b1160f5117..075dc769b0e 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/keyStrokeHandler.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/keyStrokeHandler.test.ts @@ -13,14 +13,12 @@ import { resetCodeWhispererGlobalVariables, } from 'aws-core-vscode/test' import * as EditorContext from 'aws-core-vscode/codewhisperer' -import * as CodeWhispererConstants from 'aws-core-vscode/codewhisperer' import { ConfigurationEntry, DocumentChangedSource, KeyStrokeHandler, DefaultDocumentChangedType, RecommendationService, - CodeWhispererUserGroupSettings, ClassifierTrigger, isInlineCompletionEnabled, RecommendationHandler, @@ -52,7 +50,6 @@ describe('keyStrokeHandler', function () { }) afterEach(function () { sinon.restore() - CodeWhispererUserGroupSettings.instance.reset() }) it('Whatever the input is, should skip when automatic trigger is turned off, should not call invokeAutomatedTrigger', async function () { @@ -145,19 +142,13 @@ describe('keyStrokeHandler', function () { } }) - async function testShouldInvoke( - input: string, - shouldTrigger: boolean, - rightContext: string = '', - userGroup: CodeWhispererConstants.UserGroup = CodeWhispererConstants.UserGroup.Control - ) { + async function testShouldInvoke(input: string, shouldTrigger: boolean, rightContext: string = '') { const mockEditor = createMockTextEditor(rightContext, 'test.js', 'javascript', 0, 0) const mockEvent: vscode.TextDocumentChangeEvent = createTextDocumentChangeEvent( mockEditor.document, new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 1)), input ) - CodeWhispererUserGroupSettings.instance.userGroup = userGroup await KeyStrokeHandler.instance.processKeyStroke(mockEvent, mockEditor, mockClient, config) assert.strictEqual( invokeSpy.called, diff --git a/packages/amazonq/test/unit/codewhisperer/service/recommendationHandler.test.ts b/packages/amazonq/test/unit/codewhisperer/service/recommendationHandler.test.ts index 4330ac823dc..4bc10329f81 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/recommendationHandler.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/recommendationHandler.test.ts @@ -10,13 +10,11 @@ import { ReferenceInlineProvider, session, AuthUtil, - CodeWhispererUserGroupSettings, DefaultCodeWhispererClient, RecommendationsList, ConfigurationEntry, RecommendationHandler, CodeWhispererCodeCoverageTracker, - UserGroup, supplementalContextUtil, } from 'aws-core-vscode/codewhisperer' import { @@ -26,7 +24,6 @@ import { resetCodeWhispererGlobalVariables, } from 'aws-core-vscode/test' // import * as supplementalContextUtil from 'aws-core-vscode/codewhisperer' -import { globals, extensionVersion } from 'aws-core-vscode/shared' describe('recommendationHandler', function () { const config: ConfigurationEntry = { @@ -55,7 +52,6 @@ describe('recommendationHandler', function () { afterEach(function () { sinon.restore() - CodeWhispererUserGroupSettings.instance.reset() }) it('should assign correct recommendations given input', async function () { @@ -110,11 +106,6 @@ describe('recommendationHandler', function () { }) it('should call telemetry function that records a CodeWhisperer service invocation', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.CrossFile, - version: extensionVersion, - }) - const mockServerResult = { recommendations: [{ content: "print('Hello World!')" }, { content: '' }], $response: { @@ -157,16 +148,10 @@ describe('recommendationHandler', function () { codewhispererSupplementalContextTimeout: false, codewhispererSupplementalContextLatency: 0, codewhispererSupplementalContextLength: 100, - codewhispererUserGroup: 'CrossFile', }) }) it('should call telemetry function that records a Empty userDecision event', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.CrossFile, - version: extensionVersion, - }) - const mockServerResult = { recommendations: [], nextToken: '', @@ -198,7 +183,6 @@ describe('recommendationHandler', function () { codewhispererCompletionType: 'Line', codewhispererLanguage: 'python', credentialStartUrl: testStartUrl, - codewhispererUserGroup: 'CrossFile', }) }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/service/securityScanHandler.test.ts b/packages/amazonq/test/unit/codewhisperer/service/securityScanHandler.test.ts index c88a9001a87..d9f492e6128 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/securityScanHandler.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/securityScanHandler.test.ts @@ -17,7 +17,7 @@ import { import assert from 'assert' import sinon from 'sinon' import * as vscode from 'vscode' -import fs from 'fs' +import fs from 'fs' // eslint-disable-line no-restricted-imports const mockCodeScanFindings = JSON.stringify([ { diff --git a/packages/amazonq/test/unit/codewhisperer/service/telemetry.test.ts b/packages/amazonq/test/unit/codewhisperer/service/telemetry.test.ts index 750364ce061..0f1429f130b 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/telemetry.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/telemetry.test.ts @@ -53,7 +53,6 @@ describe.skip('CodeWhisperer telemetry', async function () { codewhispererSuggestionState: 'Accept', codewhispererSuggestionImportCount: 0, codewhispererTypeaheadLength: 0, - codewhispererUserGroup: 'Control', ...ops, } } diff --git a/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererCodeCoverageTracker.test.ts b/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererCodeCoverageTracker.test.ts index 966dec30aab..ee001b3328d 100644 --- a/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererCodeCoverageTracker.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererCodeCoverageTracker.test.ts @@ -11,11 +11,10 @@ import { vsCodeState, TelemetryHelper, AuthUtil, - UserGroup, - CodeWhispererUserGroupSettings, + getUnmodifiedAcceptedTokens, } from 'aws-core-vscode/codewhisperer' import { createMockDocument, createMockTextEditor, resetCodeWhispererGlobalVariables } from 'aws-core-vscode/test' -import { globals, extensionVersion } from 'aws-core-vscode/shared' +import { globals } from 'aws-core-vscode/shared' import { assertTelemetryCurried } from 'aws-core-vscode/test' describe('codewhispererCodecoverageTracker', function () { @@ -30,11 +29,6 @@ describe('codewhispererCodecoverageTracker', function () { it('unsupported language', function () { assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('vb'), undefined) assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('ipynb'), undefined) - assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('r'), undefined) - assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('dart'), undefined) - assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('swift'), undefined) - assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('lua'), undefined) - assert.strictEqual(CodeWhispererCodeCoverageTracker.getTracker('powershell'), undefined) }) it('supported language', function () { @@ -162,14 +156,13 @@ describe('codewhispererCodecoverageTracker', function () { }) it('Should return correct unmodified accepted tokens count', function () { - const tracker = CodeWhispererCodeCoverageTracker.getTracker(language) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('foo', 'fou'), 2) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('foo', 'f11111oo'), 3) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('foo', 'fo'), 2) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('helloworld', 'HelloWorld'), 8) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('helloworld', 'World'), 4) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('CodeWhisperer', 'CODE'), 1) - assert.strictEqual(tracker?.getUnmodifiedAcceptedTokens('CodeWhisperer', 'CodeWhispererGood'), 13) + assert.strictEqual(getUnmodifiedAcceptedTokens('foo', 'fou'), 2) + assert.strictEqual(getUnmodifiedAcceptedTokens('foo', 'f11111oo'), 3) + assert.strictEqual(getUnmodifiedAcceptedTokens('foo', 'fo'), 2) + assert.strictEqual(getUnmodifiedAcceptedTokens('helloworld', 'HelloWorld'), 8) + assert.strictEqual(getUnmodifiedAcceptedTokens('helloworld', 'World'), 4) + assert.strictEqual(getUnmodifiedAcceptedTokens('CodeWhisperer', 'CODE'), 1) + assert.strictEqual(getUnmodifiedAcceptedTokens('CodeWhisperer', 'CodeWhispererGood'), 13) }) }) @@ -516,21 +509,14 @@ describe('codewhispererCodecoverageTracker', function () { if (tracker) { sinon.stub(tracker, 'isActive').returns(true) } - CodeWhispererUserGroupSettings.instance.reset() }) afterEach(function () { sinon.restore() CodeWhispererCodeCoverageTracker.instances.clear() - CodeWhispererUserGroupSettings.instance.reset() }) it('should emit correct code coverage telemetry in python file', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.Control, - version: extensionVersion, - }) - const tracker = CodeWhispererCodeCoverageTracker.getTracker(language) const assertTelemetry = assertTelemetryCurried('codewhisperer_codePercentage') @@ -545,16 +531,10 @@ describe('codewhispererCodecoverageTracker', function () { codewhispererSuggestedTokens: 7, codewhispererPercentage: 7, successCount: 1, - codewhispererUserGroup: 'Control', }) }) it('should emit correct code coverage telemetry when success count = 0', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.Control, - version: extensionVersion, - }) - const tracker = CodeWhispererCodeCoverageTracker.getTracker('java') const assertTelemetry = assertTelemetryCurried('codewhisperer_codePercentage') @@ -574,7 +554,6 @@ describe('codewhispererCodecoverageTracker', function () { codewhispererSuggestedTokens: 18, codewhispererPercentage: 60, successCount: 2, - codewhispererUserGroup: 'Control', }) }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererTracker.test.ts b/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererTracker.test.ts index 8fc7e76257c..ed17c181ee5 100644 --- a/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererTracker.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/tracker/codewhispererTracker.test.ts @@ -6,14 +6,9 @@ import assert from 'assert' import * as sinon from 'sinon' import { assertTelemetryCurried } from 'aws-core-vscode/test' -import { - AuthUtil, - CodeWhispererTracker, - UserGroup, - CodeWhispererUserGroupSettings, -} from 'aws-core-vscode/codewhisperer' +import { AuthUtil, CodeWhispererTracker } from 'aws-core-vscode/codewhisperer' import { resetCodeWhispererGlobalVariables, createAcceptedSuggestionEntry } from 'aws-core-vscode/test' -import { globals, extensionVersion } from 'aws-core-vscode/shared' +import { globals } from 'aws-core-vscode/shared' describe('codewhispererTracker', function () { describe('enqueue', function () { @@ -86,20 +81,7 @@ describe('codewhispererTracker', function () { }) describe('emitTelemetryOnSuggestion', function () { - beforeEach(function () { - CodeWhispererUserGroupSettings.instance.reset() - }) - - afterEach(function () { - CodeWhispererUserGroupSettings.instance.reset() - }) - it('Should call recordCodewhispererUserModification with suggestion event', async function () { - await globals.globalState.update('CODEWHISPERER_USER_GROUP', { - group: UserGroup.CrossFile, - version: extensionVersion, - }) - const testStartUrl = 'testStartUrl' sinon.stub(AuthUtil.instance, 'startUrl').value(testStartUrl) const suggestion = createAcceptedSuggestionEntry() @@ -114,7 +96,6 @@ describe('codewhispererTracker', function () { codewhispererCompletionType: 'Line', codewhispererLanguage: 'java', credentialStartUrl: testStartUrl, - codewhispererUserGroup: 'CrossFile', codewhispererCharactersAccepted: suggestion.originalString.length, codewhispererCharactersModified: 0, }) diff --git a/packages/amazonq/test/unit/codewhisperer/util/authUtil.test.ts b/packages/amazonq/test/unit/codewhisperer/util/authUtil.test.ts index f2f71c278d9..74a2c97dd75 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/authUtil.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/authUtil.test.ts @@ -13,12 +13,12 @@ import { } from 'aws-core-vscode/codewhisperer' import { assertTelemetry, - captureEventOnce, getTestWindow, SeverityLevel, createBuilderIdProfile, createSsoProfile, createTestAuth, + captureEventNTimes, } from 'aws-core-vscode/test' import { Auth, Connection, isAnySsoConnection, isBuilderIdConnection } from 'aws-core-vscode/auth' import { globals, vscodeComponent } from 'aws-core-vscode/shared' @@ -231,15 +231,13 @@ describe('AuthUtil', async function () { assert.strictEqual(auth.activeConnection?.id, authUtil.conn?.id) // Switch to unsupported connection - const cwAuthUpdatedConnection = captureEventOnce(authUtil.secondaryAuth.onDidChangeActiveConnection) + const cwAuthUpdatedConnection = captureEventNTimes(authUtil.secondaryAuth.onDidChangeActiveConnection, 2) await auth.useConnection(unsupportedConn) - // This is triggered when the main Auth connection is switched + // - This is triggered when the main Auth connection is switched + // - This is triggered by registerAuthListener() when it saves the previous active connection as a fallback. await cwAuthUpdatedConnection - // This is triggered by registerAuthListener() when it saves the previous active connection as a fallback. - // TODO in a refactor see if we can simplify multiple multiple triggers on the same event. - await captureEventOnce(authUtil.secondaryAuth.onDidChangeActiveConnection) - // Is using the fallback connection + // TODO in a refactor see if we can simplify multiple multiple triggers on the same event. assert.ok(authUtil.isConnected()) assert.ok(authUtil.isUsingSavedConnection) assert.notStrictEqual(auth.activeConnection?.id, authUtil.conn?.id) diff --git a/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts b/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts index eaf1ae332ba..5694b33365d 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/commonUtil.test.ts @@ -4,7 +4,11 @@ */ import assert from 'assert' -import { checkLeftContextKeywordsForJsonAndYaml, getPrefixSuffixOverlap } from 'aws-core-vscode/codewhisperer' +import { + JsonConfigFileNamingConvention, + checkLeftContextKeywordsForJson, + getPrefixSuffixOverlap, +} from 'aws-core-vscode/codewhisperer' describe('commonUtil', function () { describe('getPrefixSuffixOverlap', function () { @@ -31,29 +35,47 @@ describe('commonUtil', function () { }) }) - describe('checkLeftContextKeywordsForJsonAndYaml', function () { + describe('checkLeftContextKeywordsForJson', function () { it('Should return true for valid left context keywords', async function () { assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer', 'json'), - true - ) - assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer', 'yaml'), + checkLeftContextKeywordsForJson('foo.json', 'Create an S3 Bucket named CodeWhisperer', 'json'), true ) }) it('Should return false for invalid left context keywords', async function () { assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml('Create an S3 Bucket named CodeWhisperer in cfn', 'yaml'), - false - ) - assert.strictEqual( - checkLeftContextKeywordsForJsonAndYaml( + checkLeftContextKeywordsForJson( + 'foo.json', 'Create an S3 Bucket named CodeWhisperer in Cloudformation', 'json' ), false ) }) + + for (const jsonConfigFile of JsonConfigFileNamingConvention) { + it(`should evalute by filename ${jsonConfigFile}`, function () { + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile, 'foo', 'json'), false) + + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile.toUpperCase(), 'bar', 'json'), false) + + assert.strictEqual(checkLeftContextKeywordsForJson(jsonConfigFile.toUpperCase(), 'baz', 'json'), false) + }) + + const upperCaseFilename = jsonConfigFile.toUpperCase() + it(`should evalute by filename and case insensitive ${upperCaseFilename}`, function () { + assert.strictEqual(checkLeftContextKeywordsForJson(upperCaseFilename, 'foo', 'json'), false) + + assert.strictEqual( + checkLeftContextKeywordsForJson(upperCaseFilename.toUpperCase(), 'bar', 'json'), + false + ) + + assert.strictEqual( + checkLeftContextKeywordsForJson(upperCaseFilename.toUpperCase(), 'baz', 'json'), + false + ) + }) + } }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/util/crossFileContextUtil.test.ts b/packages/amazonq/test/unit/codewhisperer/util/crossFileContextUtil.test.ts index 0395d09483e..f18db3cc38f 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/crossFileContextUtil.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/crossFileContextUtil.test.ts @@ -7,8 +7,8 @@ import assert from 'assert' import * as vscode from 'vscode' import * as sinon from 'sinon' import * as crossFile from 'aws-core-vscode/codewhisperer' -import { createMockTextEditor } from 'aws-core-vscode/test' -import { CodeWhispererUserGroupSettings, UserGroup, crossFileContextConfig } from 'aws-core-vscode/codewhisperer' +import { aStringWithLineCount, createMockTextEditor } from 'aws-core-vscode/test' +import { crossFileContextConfig } from 'aws-core-vscode/codewhisperer' import { assertTabCount, closeAllEditors, @@ -20,7 +20,6 @@ import { import { areEqual, normalize } from 'aws-core-vscode/shared' import * as path from 'path' -const userGroupSettings = CodeWhispererUserGroupSettings.instance let tempFolder: string describe('crossFileContextUtil', function () { @@ -36,30 +35,18 @@ describe('crossFileContextUtil', function () { tempFolder = (await createTestWorkspaceFolder()).uri.fsPath }) - describe('should fetch 3 chunks and each chunk should contains 10 lines', function () { - async function assertCorrectCodeChunk() { - await toTextEditor(sampleFileOf60Lines, 'CrossFile.java', tempFolder, { preview: false }) - const myCurrentEditor = await toTextEditor('', 'TargetFile.java', tempFolder, { - preview: false, - }) - const actual = await crossFile.fetchSupplementalContextForSrc(myCurrentEditor, fakeCancellationToken) - assert.ok(actual) - assert.ok(actual.supplementalContextItems.length === 3) - - assert.strictEqual(actual.supplementalContextItems[0].content.split('\n').length, 10) - assert.strictEqual(actual.supplementalContextItems[1].content.split('\n').length, 10) - assert.strictEqual(actual.supplementalContextItems[2].content.split('\n').length, 10) - } - - it('control group', async function () { - CodeWhispererUserGroupSettings.instance.userGroup = UserGroup.Control - await assertCorrectCodeChunk() + it('should fetch 3 chunks and each chunk should contains 50 lines', async function () { + await toTextEditor(aStringWithLineCount(200), 'CrossFile.java', tempFolder, { preview: false }) + const myCurrentEditor = await toTextEditor('', 'TargetFile.java', tempFolder, { + preview: false, }) + const actual = await crossFile.fetchSupplementalContextForSrc(myCurrentEditor, fakeCancellationToken) + assert.ok(actual) + assert.ok(actual.supplementalContextItems.length === 3) - it('treatment group', async function () { - CodeWhispererUserGroupSettings.instance.userGroup = UserGroup.CrossFile - await assertCorrectCodeChunk() - }) + assert.strictEqual(actual.supplementalContextItems[0].content.split('\n').length, 50) + assert.strictEqual(actual.supplementalContextItems[1].content.split('\n').length, 50) + assert.strictEqual(actual.supplementalContextItems[2].content.split('\n').length, 50) }) }) @@ -140,12 +127,11 @@ describe('crossFileContextUtil', function () { }) }) - describe('partial support - control group', function () { + describe.skip('partial support - control group', function () { const fileExtLists: string[] = [] before(async function () { this.timeout(60000) - userGroupSettings.userGroup = UserGroup.Control }) beforeEach(async function () { @@ -172,12 +158,11 @@ describe('crossFileContextUtil', function () { }) }) - describe('partial support - crossfile group', function () { + describe.skip('partial support - crossfile group', function () { const fileExtLists: string[] = [] before(async function () { this.timeout(60000) - userGroupSettings.userGroup = UserGroup.CrossFile }) beforeEach(async function () { @@ -265,73 +250,59 @@ describe('crossFileContextUtil', function () { assert.strictEqual(chunks[1].content, 'line_6\nline_7') }) - it('codewhisperer crossfile config should use 10 lines', async function () { + it('codewhisperer crossfile config should use 50 lines', async function () { const filePath = path.join(tempFolder, 'file.txt') - await toFile(sampleFileOf60Lines, filePath) + await toFile(aStringWithLineCount(210), filePath) const chunks = await crossFile.splitFileToChunks(filePath, crossFileContextConfig.numberOfLinesEachChunk) - assert.strictEqual(chunks.length, 6) + + // (210 / 50) + 1 + assert.strictEqual(chunks.length, 5) + // line0 -> line49 + assert.strictEqual(chunks[0].content, aStringWithLineCount(50, 0)) + // line50 -> line99 + assert.strictEqual(chunks[1].content, aStringWithLineCount(50, 50)) + // line100 -> line149 + assert.strictEqual(chunks[2].content, aStringWithLineCount(50, 100)) + // line150 -> line199 + assert.strictEqual(chunks[3].content, aStringWithLineCount(50, 150)) + // line 200 -> line209 + assert.strictEqual(chunks[4].content, aStringWithLineCount(10, 200)) + }) + + it('linkChunks should add another chunk which will link to the first chunk and chunk.nextContent should reflect correct value', async function () { + const filePath = path.join(tempFolder, 'file.txt') + await toFile(aStringWithLineCount(210), filePath) + + const chunks = await crossFile.splitFileToChunks(filePath, crossFileContextConfig.numberOfLinesEachChunk) + const linkedChunks = crossFile.linkChunks(chunks) + + // 210 / 50 + 2 + assert.strictEqual(linkedChunks.length, 6) + + // 0th + assert.strictEqual(linkedChunks[0].content, aStringWithLineCount(3, 0)) + assert.strictEqual(linkedChunks[0].nextContent, aStringWithLineCount(50, 0)) + + // 1st + assert.strictEqual(linkedChunks[1].content, aStringWithLineCount(50, 0)) + assert.strictEqual(linkedChunks[1].nextContent, aStringWithLineCount(50, 50)) + + // 2nd + assert.strictEqual(linkedChunks[2].content, aStringWithLineCount(50, 50)) + assert.strictEqual(linkedChunks[2].nextContent, aStringWithLineCount(50, 100)) + + // 3rd + assert.strictEqual(linkedChunks[3].content, aStringWithLineCount(50, 100)) + assert.strictEqual(linkedChunks[3].nextContent, aStringWithLineCount(50, 150)) + + // 4th + assert.strictEqual(linkedChunks[4].content, aStringWithLineCount(50, 150)) + assert.strictEqual(linkedChunks[4].nextContent, aStringWithLineCount(10, 200)) + + // 5th + assert.strictEqual(linkedChunks[5].content, aStringWithLineCount(10, 200)) + assert.strictEqual(linkedChunks[5].nextContent, aStringWithLineCount(10, 200)) }) }) }) - -const sampleFileOf60Lines = `import java.util.List; -// we need this comment on purpose because chunk will be trimed right, adding this to avoid trimRight and make assertion easier -/** - * - * - * - * - * - **/ -class Main { - public static void main(String[] args) { - Calculator calculator = new Calculator(); - calculator.add(1, 2); - calculator.subtract(1, 2); - calculator.multiply(1, 2); - calculator.divide(1, 2); - calculator.remainder(1, 2); - } -} -// -class Calculator { - public Calculator() { - System.out.println("constructor"); - } -// - public add(int num1, int num2) { - System.out.println("add"); - return num1 + num2; - } -// - public subtract(int num1, int num2) { - System.out.println("subtract"); - return num1 - num2; - } -// - public multiply(int num1, int num2) { - System.out.println("multiply"); - return num1 * num2; - } -// - public divide(int num1, int num2) { - System.out.println("divide"); - return num1 / num2; - } -// - public remainder(int num1, int num2) { - System.out.println("remainder"); - return num1 % num2; - } -// - public power(int num1, int num2) { - System.out.println("power"); - return (int) Math.pow(num1, num2); - } -// - public squareRoot(int num1) { - System.out.println("squareRoot"); - return (int) Math.sqrt(num1); - } -}` diff --git a/packages/amazonq/test/unit/codewhisperer/util/runtimeLanguageContext.test.ts b/packages/amazonq/test/unit/codewhisperer/util/runtimeLanguageContext.test.ts index 2efb537ef60..5a3e2185be7 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/runtimeLanguageContext.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/runtimeLanguageContext.test.ts @@ -36,13 +36,13 @@ describe('runtimeLanguageContext', function () { ['json', true], ['yaml', true], ['tf', true], - ['dart', false], - ['lua', false], - ['powershell', false], - ['r', false], - ['swift', false], - ['systemVerilog', false], - ['vue', false], + ['dart', true], + ['lua', true], + ['powershell', true], + ['r', true], + ['swift', true], + ['systemVerilog', true], + ['vue', true], ['plaintext', false], ['html', false], ['vb', false], @@ -182,7 +182,7 @@ describe('runtimeLanguageContext', function () { }) describe('toRuntimeLanguage', function () { - const codewhispererLanguageIds: CodewhispererLanguage[][] = [ + const codewhispererLanguageIds: [CodewhispererLanguage, string][] = [ ['c', 'c'], ['cpp', 'cpp'], ['csharp', 'csharp'], @@ -201,6 +201,13 @@ describe('runtimeLanguageContext', function () { ['sql', 'sql'], ['tsx', 'typescript'], ['typescript', 'typescript'], + ['dart', 'dart'], + ['lua', 'lua'], + ['powershell', 'powershell'], + ['r', 'r'], + ['swift', 'swift'], + ['systemVerilog', 'systemverilog'], + ['vue', 'vue'], ] for (const [inputCwsprLanguageId, expectedCwsprLanguageId] of codewhispererLanguageIds) { @@ -258,7 +265,7 @@ describe('runtimeLanguageContext', function () { }) } - const arbitraryStrs: (string | undefined)[] = ['foo', undefined, 'bar', 'R', 'r', 'unknown'] + const arbitraryStrs: (string | undefined)[] = ['foo', undefined, 'bar', 'unknown'] for (const inputStr of arbitraryStrs) { it(`should return undefined when input str is ${inputStr}`, function () { const actual = languageContext.getLanguageExtensionForNotebook(inputStr) diff --git a/packages/amazonq/test/unit/codewhisperer/util/telemetryHelper.test.ts b/packages/amazonq/test/unit/codewhisperer/util/telemetryHelper.test.ts index d1f665cc897..d6190a6c0fd 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/telemetryHelper.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/telemetryHelper.test.ts @@ -5,8 +5,7 @@ import assert from 'assert' import { assertTelemetryCurried, resetCodeWhispererGlobalVariables } from 'aws-core-vscode/test' -import { TelemetryHelper, CodeWhispererUserGroupSettings, Completion, session } from 'aws-core-vscode/codewhisperer' -import * as CodeWhispererConstants from 'aws-core-vscode/codewhisperer' +import { TelemetryHelper, Completion, session } from 'aws-core-vscode/codewhisperer' import { CodewhispererCompletionType, CodewhispererSuggestionState, @@ -29,7 +28,6 @@ function aUserDecision( codewhispererSuggestionState: codewhispererSuggestionState, codewhispererTriggerType: 'OnDemand', credentialStartUrl: 'https://www.amazon.com', - codewhispererUserGroup: 'Control', } } @@ -96,7 +94,6 @@ describe('telemetryHelper', function () { beforeEach(async function () { await resetCodeWhispererGlobalVariables() sut = new TelemetryHelper() - CodeWhispererUserGroupSettings.instance.userGroup = CodeWhispererConstants.UserGroup.Control }) it('should return Line and Accept', function () { @@ -126,7 +123,6 @@ describe('telemetryHelper', function () { codewhispererSuggestionCount: 4, codewhispererSuggestionImportCount: 0, codewhispererSuggestionState: 'Accept', - codewhispererUserGroup: 'Control', codewhispererCompletionType: 'Line', codewhispererTypeaheadLength: 0, codewhispererCharactersAccepted: aCompletion().content.length, @@ -160,7 +156,6 @@ describe('telemetryHelper', function () { codewhispererSuggestionCount: 4, codewhispererSuggestionImportCount: 0, codewhispererSuggestionState: 'Accept', - codewhispererUserGroup: 'Control', codewhispererCompletionType: 'Line', codewhispererTypeaheadLength: 0, codewhispererCharactersAccepted: aCompletion().content.length, @@ -194,7 +189,6 @@ describe('telemetryHelper', function () { codewhispererSuggestionCount: 4, codewhispererSuggestionImportCount: 0, codewhispererSuggestionState: 'Reject', - codewhispererUserGroup: 'Control', codewhispererCompletionType: 'Line', codewhispererTypeaheadLength: 0, codewhispererCharactersAccepted: 0, @@ -252,13 +246,7 @@ describe('telemetryHelper', function () { await resetCodeWhispererGlobalVariables() }) - afterEach(function () { - CodeWhispererUserGroupSettings.instance.reset() - }) - it('Should call telemetry record for each recommendations with proper arguments', async function () { - CodeWhispererUserGroupSettings.instance.userGroup = CodeWhispererConstants.UserGroup.Classifier - const telemetryHelper = new TelemetryHelper() const response = [{ content: "print('Hello')" }] const requestIdList = ['test_x', 'test_x', 'test_y'] @@ -286,7 +274,6 @@ describe('telemetryHelper', function () { codewhispererSuggestionReferenceCount: 0, codewhispererCompletionType: 'Line', codewhispererLanguage: 'python', - codewhispererUserGroup: 'Classifier', }) }) }) diff --git a/packages/amazonq/test/unit/codewhisperer/util/utgUtils.test.ts b/packages/amazonq/test/unit/codewhisperer/util/utgUtils.test.ts index b9e2789f174..67359b8a6fc 100644 --- a/packages/amazonq/test/unit/codewhisperer/util/utgUtils.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/util/utgUtils.test.ts @@ -5,43 +5,32 @@ import assert from 'assert' import * as utgUtils from 'aws-core-vscode/codewhisperer' -import { UserGroup } from 'aws-core-vscode/codewhisperer' describe('shouldFetchUtgContext', () => { it('fully supported language', function () { - assert.ok(utgUtils.shouldFetchUtgContext('java', UserGroup.Control)) - assert.ok(utgUtils.shouldFetchUtgContext('java', UserGroup.CrossFile)) + assert.ok(utgUtils.shouldFetchUtgContext('java')) }) it('partially supported language', () => { - assert.strictEqual(utgUtils.shouldFetchUtgContext('python', UserGroup.Control), false) - assert.strictEqual(utgUtils.shouldFetchUtgContext('python', UserGroup.CrossFile), true) + assert.strictEqual(utgUtils.shouldFetchUtgContext('python'), false) }) it('not supported language', () => { - assert.strictEqual(utgUtils.shouldFetchUtgContext('typescript', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('typescript', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('typescript'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('javascript', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('javascript', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('javascript'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('javascriptreact', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('javascriptreact', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('javascriptreact'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('typescriptreact', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('typescriptreact', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('typescriptreact'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('scala', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('scala', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('scala'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('shellscript', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('shellscript', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('shellscript'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('csharp', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('csharp', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('csharp'), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('c', UserGroup.Control), undefined) - assert.strictEqual(utgUtils.shouldFetchUtgContext('c', UserGroup.CrossFile), undefined) + assert.strictEqual(utgUtils.shouldFetchUtgContext('c'), undefined) }) }) diff --git a/packages/core/.c8rc.json b/packages/core/.c8rc.json deleted file mode 100644 index 26b94d764c1..00000000000 --- a/packages/core/.c8rc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "report-dir": "../../coverage/core", - "reporter": ["lcov"], - "all": true, - "include": ["src/**", "dist/src/**"], - "exclude": [ - "dist/src/ssmDocument/ssm/ssmServer.js", - "dist/src/test/**", - "dist/src/testE2E/**", - "dist/src/testLint/**", - "dist/src/testInteg/**", - "dist/src/testFixtures/**", - "src/ssmDocument/ssm/ssmServer.js", - "src/test/**", - "src/testE2E/**", - "src/testLint/**", - "src/testInteg/**", - "src/testFixtures/**" - ] -} diff --git a/packages/core/package.json b/packages/core/package.json index 74d0eb2011d..f74f4b8482e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -5,7 +5,7 @@ "license": "Apache-2.0", "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" }, "exports": { ".": "./dist/src/extension.js", @@ -27,7 +27,8 @@ "./utils": "./dist/src/shared/utilities/index.js", "./feedback": "./dist/src/feedback/index.js", "./telemetry": "./dist/src/shared/telemetry/index.js", - "./dev": "./dist/src/dev/index.js" + "./dev": "./dist/src/dev/index.js", + "./notifications": "./dist/src/notifications/index.js" }, "contributes": { "icons": { @@ -405,13 +406,11 @@ "@cspotcode/source-map-support": "^0.8.1", "@sinonjs/fake-timers": "^10.0.2", "@types/adm-zip": "^0.4.34", - "@types/archiver": "^6.0.2", "@types/async-lock": "^1.4.0", "@types/bytes": "^3.1.0", "@types/circular-dependency-plugin": "^5.0.8", "@types/cross-spawn": "^6.0.6", "@types/diff": "^5.0.7", - "@types/fs-extra": "^9.0.11", "@types/glob": "^8.1.0", "@types/js-yaml": "^4.0.5", "@types/jsdom": "^21.1.6", @@ -423,7 +422,7 @@ "@types/node-fetch": "^2.6.8", "@types/prismjs": "^1.26.0", "@types/proper-lockfile": "^4.1.4", - "@types/readline-sync": "^1.4.3", + "@types/readline-sync": "^1.4.8", "@types/semver": "^7.5.0", "@types/sinon": "^10.0.5", "@types/sinonjs__fake-timers": "^8.1.2", @@ -447,7 +446,7 @@ "mocha-multi-reporters": "^1.5.1", "readline-sync": "^1.4.9", "sass": "^1.49.8", - "sass-loader": "^12.6.0", + "sass-loader": "^16.0.2", "sinon": "^14.0.0", "style-loader": "^3.3.1", "ts-node": "^10.9.1", @@ -458,9 +457,11 @@ "webfont": "^11.2.26" }, "dependencies": { + "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@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", @@ -478,9 +479,9 @@ "@smithy/shared-ini-file-loader": "^2.2.8", "@smithy/util-retry": "^2.2.0", "@vscode/debugprotocol": "^1.57.0", + "@zip.js/zip.js": "^2.7.41", "adm-zip": "^0.5.10", "amazon-states-language-service": "^1.11.0", - "archiver": "^7.0.1", "async-lock": "^1.4.0", "aws-sdk": "^2.1384.0", "aws-ssm-document-language-service": "^1.0.0", @@ -488,7 +489,6 @@ "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", "fast-json-patch": "^3.1.1", - "fs-extra": "^10.0.1", "glob": "^10.3.10", "got": "^11.8.5", "highlight.js": "^11.9.0", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index b945d221b5b..bc3d2182452 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -5,6 +5,7 @@ "AWS.productName.cn": "Amazon Toolkit", "AWS.amazonq.productName": "Amazon Q", "AWS.codecatalyst.submenu.title": "Manage CodeCatalyst", + "AWS.notifications.title": "Notifications", "AWS.configuration.profileDescription": "The name of the credential profile to obtain credentials from.", "AWS.configuration.description.lambda.recentlyUploaded": "Recently selected Lambda upload targets.", "AWS.configuration.description.ecs.openTerminalCommand": "The command to run when starting a new interactive terminal session.", @@ -78,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", @@ -117,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", @@ -129,6 +139,7 @@ "AWS.command.ec2.stopInstance": "Stop EC2 Instance", "AWS.command.ec2.rebootInstance": "Reboot EC2 Instance", "AWS.command.ec2.copyInstanceId": "Copy Instance Id", + "AWS.command.ec2.viewLogs": "View EC2 Logs", "AWS.command.ecr.copyTagUri": "Copy Tag URI", "AWS.command.ecr.copyRepositoryUri": "Copy Repository URI", "AWS.command.ecr.createRepository": "Create Repository...", @@ -146,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...", @@ -196,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", @@ -244,6 +257,7 @@ "AWS.generic.promptUpdate": "Update...", "AWS.generic.preview": "Preview", "AWS.generic.viewDocs": "View Documentation", + "AWS.generic.dismiss": "Dismiss", "AWS.ssmDocument.ssm.maxItemsComputed.desc": "Controls the maximum number of problems produced by the SSM Document language server.", "AWS.walkthrough.gettingStarted.title": "Get started with AWS", "AWS.walkthrough.gettingStarted.description": "These walkthroughs help you set up the AWS Toolkit.", @@ -280,6 +294,7 @@ "AWS.amazonq.featureDev.error.codeGen.denyListedError": "I'm sorry, I'm having trouble generating your code and can't continue at the moment. Please try again later, and share feedback to help me improve.", "AWS.amazonq.featureDev.error.codeGen.default": "I'm sorry, I ran into an issue while trying to generate your code. Please try again.", "AWS.amazonq.featureDev.error.codeGen.timeout": "Code generation did not finish within the expected time", + "AWS.amazonq.featureDev.error.uploadURLExpired": "I’m sorry, I wasn’t able to generate code. A connection timed out or became unavailable. Please try again or check the following:\n\n- Exclude non-essential files in your workspace’s `.gitignore.`\n\n- Check that your network connection is stable.", "AWS.amazonq.featureDev.error.workspaceFolderNotFoundError": "I couldn't find a workspace folder. Open a workspace, and then open a new chat tab and enter /dev to start discussing your code task with me.", "AWS.amazonq.featureDev.error.selectedFolderNotInWorkspaceFolderError": "The folder you chose isn't in your open workspace folder. You can add this folder to your workspace, or choose a folder in your open workspace.", "AWS.amazonq.featureDev.error.userMessageNotFoundError": "It looks like you didn't provide an input. Please enter your message in the text bar.", @@ -297,6 +312,7 @@ "AWS.amazonq.featureDev.pillText.generatingCode": "Generating code...", "AWS.amazonq.featureDev.pillText.requestingChanges": "Requesting changes ...", "AWS.amazonq.featureDev.pillText.insertCode": "Accept code", + "AWS.amazonq.featureDev.pillText.stoppingCodeGeneration": "Stopping code generation...", "AWS.amazonq.featureDev.pillText.sendFeedback": "Send feedback", "AWS.amazonq.featureDev.pillText.selectFiles": "Select files for context", "AWS.amazonq.featureDev.pillText.retry": "Retry", @@ -313,8 +329,20 @@ "AWS.amazonq.featureDev.answer.sessionClosed": "Okay, I've ended this chat session. You can open a new tab to chat or start another workflow.", "AWS.amazonq.featureDev.answer.newTaskChanges": "What new task would you like to work on?", "AWS.amazonq.featureDev.placeholder.chatInputDisabled": "Chat input is disabled", - "AWS.amazonq.featureDev.placeholder.additionalImprovements": "Choose an option to proceed", + "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.amazonq.featureDev.placeholder.sessionClosed": "Open a new chat tab to continue", + "AWS.amazonq.inline.invokeChat": "Inline chat", + "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/css/amazonq-chat.css b/packages/core/resources/css/amazonq-chat.css new file mode 100644 index 00000000000..5e954bba89f --- /dev/null +++ b/packages/core/resources/css/amazonq-chat.css @@ -0,0 +1,25 @@ +/* Pulsating effect */ +@keyframes pulsate { + 0% { + opacity: 0; + } + 50% { + opacity: 0.15; + } + 100% { + opacity: 0; + } +} + +body[data-feature-viewdiffinchat='TREATMENT'] { + .mynah-syntax-highlighter-copy-buttons button:nth-of-type(2)::after, /* Accept Diff and Insert At Cursor */ + .mynah-syntax-highlighter-copy-buttons button:nth-of-type(3)::after { + /* View Diff */ + content: ''; + animation-name: pulsate; + animation-duration: 1.5s; + animation-timing-function: ease-in-out; + animation-iteration-count: 2; + transform: translate3d(0%, 0, 0); + } +} 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/scripts/build/copyFiles.ts b/packages/core/scripts/build/copyFiles.ts index ee5c9492bcb..e926a6d9963 100644 --- a/packages/core/scripts/build/copyFiles.ts +++ b/packages/core/scripts/build/copyFiles.ts @@ -4,7 +4,7 @@ */ /* eslint-disable no-restricted-imports */ -import * as fs from 'fs-extra' +import fs from 'fs' import * as path from 'path' // Moves all dependencies into `dist` @@ -46,27 +46,28 @@ const tasks: CopyTask[] = [ }, ] -async function copy(task: CopyTask): Promise { +function copy(task: CopyTask): void { const src = path.resolve(projectRoot, task.target) const dst = path.resolve(outRoot, task.destination ?? task.target) try { - await fs.copy(src, dst, { + fs.cpSync(src, dst, { recursive: true, - overwrite: true, + force: true, errorOnExist: false, }) } catch (error) { throw new Error(`Copy "${src}" to "${dst}" failed: ${error instanceof Error ? error.message : error}`) } } - -void (async () => { +function main() { try { - await Promise.all(tasks.map(copy)) + tasks.map(copy) } catch (error) { console.error('`copyFiles.ts` failed') console.error(error) process.exit(1) } -})() +} + +void main() diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index 8d550929605..c095fe5ed54 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -4,7 +4,7 @@ */ import * as proc from 'child_process' -import * as nodefs from 'fs' +import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' const repoRoot = path.join(process.cwd(), '../../') // root/packages/toolkit -> root/ diff --git a/packages/core/scripts/test/launchTestUtilities.ts b/packages/core/scripts/test/launchTestUtilities.ts index 87031d065ef..bf3fd6614b3 100644 --- a/packages/core/scripts/test/launchTestUtilities.ts +++ b/packages/core/scripts/test/launchTestUtilities.ts @@ -182,13 +182,16 @@ async function invokeVSCodeCli(vsCodeExecutablePath: string, args: string[]): Pr } console.log(`Invoking vscode CLI command:\n "${cli}" ${JSON.stringify(cmdArgs)}`) + // Shell option must be true on windows to avoid security error: https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2 const spawnResult = proc.spawnSync(cli, cmdArgs, { encoding: 'utf-8', stdio: 'pipe', + shell: process.platform === 'win32', }) if (spawnResult.status !== 0) { console.log('output: %s', spawnResult.output) + console.log('error: %O', spawnResult.error) throw new Error(`VS Code CLI command failed (exit-code: ${spawnResult.status}): ${cli} ${cmdArgs}`) } diff --git a/packages/core/src/amazonq/commons/controllers/contentController.ts b/packages/core/src/amazonq/commons/controllers/contentController.ts index d77ef176ec1..821e2988f96 100644 --- a/packages/core/src/amazonq/commons/controllers/contentController.ts +++ b/packages/core/src/amazonq/commons/controllers/contentController.ts @@ -4,8 +4,29 @@ */ import * as vscode from 'vscode' +import path from 'path' import { Position, TextEditor, window } from 'vscode' import { getLogger } from '../../../shared/logger' +import { amazonQDiffScheme, amazonQTabSuffix } from '../../../shared/constants' +import { disposeOnEditorClose } from '../../../shared/utilities/editorUtilities' +import { + applyChanges, + createTempFileForDiff, + getIndentedCode, + getSelectionFromRange, +} from '../../../shared/utilities/textDocumentUtilities' +import { extractFileAndCodeSelectionFromMessage, fs, getErrorMsg, ToolkitError } from '../../../shared' + +class ContentProvider implements vscode.TextDocumentContentProvider { + constructor(private uri: vscode.Uri) {} + + provideTextDocumentContent(_uri: vscode.Uri) { + return fs.readFileText(this.uri.fsPath) + } +} + +const chatDiffCode = 'ChatDiff' +const ChatDiffError = ToolkitError.named(chatDiffCode) export class EditorContentController { /* * @@ -52,4 +73,106 @@ export class EditorContentController { ) } } + + /** + * Accepts and applies a diff to a file, then closes the associated diff view tab. + * + * @param {any} message - The message containing diff information. + * @returns {Promise} A promise that resolves when the diff is applied and the tab is closed. + * + * @description + * This method performs the following steps: + * 1. Extracts file path and selection from the message. + * 2. If valid file path, non-empty code, and selection are present: + * a. Opens the document. + * b. Gets the indented code to update. + * c. Applies the changes to the document. + * d. Attempts to close the diff view tab for the file. + * + * @throws {Error} If there's an issue opening the document or applying changes. + */ + public async acceptDiff(message: any) { + const errorNotification = 'Unable to Apply code changes.' + const { filePath, selection } = extractFileAndCodeSelectionFromMessage(message) + + if (filePath && message?.code?.trim().length > 0 && selection) { + try { + const doc = await vscode.workspace.openTextDocument(filePath) + + const code = getIndentedCode(message, doc, selection) + const range = getSelectionFromRange(doc, selection) + await applyChanges(doc, range, code) + + // Sets the editor selection from the start of the given range, extending it by the number of lines in the code till the end of the last line + const editor = await vscode.window.showTextDocument(doc) + editor.selection = new vscode.Selection( + range.start, + new Position(range.start.line + code.split('\n').length, Number.MAX_SAFE_INTEGER) + ) + + // If vscode.diff is open for the filePath then close it. + vscode.window.tabGroups.all.flatMap(({ tabs }) => + tabs.map((tab) => { + if (tab.label === `${path.basename(filePath)} ${amazonQTabSuffix}`) { + const tabClosed = vscode.window.tabGroups.close(tab) + if (!tabClosed) { + getLogger().error( + '%s: Unable to close the diff view tab for %s', + chatDiffCode, + tab.label + ) + } + } + }) + ) + } catch (error) { + void vscode.window.showInformationMessage(errorNotification) + const wrappedError = ChatDiffError.chain(error, `Failed to Accept Diff`, { code: chatDiffCode }) + getLogger().error('%s: Failed to open diff view %s', chatDiffCode, getErrorMsg(wrappedError, true)) + throw wrappedError + } + } + } + + /** + * Displays a diff view comparing proposed changes with the existing file. + * + * How is diff generated: + * 1. Creates a temporary file as a clone of the original file. + * 2. Applies the proposed changes to the temporary file within the selected range. + * 3. Opens a diff view comparing original file to the temporary file. + * + * This approach ensures that the diff view only shows the changes proposed by Amazon Q, + * isolating them from any other modifications in the original file. + * + * @param message the message from Amazon Q chat + */ + public async viewDiff(message: any, scheme: string = amazonQDiffScheme) { + const errorNotification = 'Unable to Open Diff.' + const { filePath, selection } = extractFileAndCodeSelectionFromMessage(message) + + try { + if (filePath && message?.code?.trim().length > 0 && selection) { + const originalFileUri = vscode.Uri.file(filePath) + const uri = await createTempFileForDiff(originalFileUri, message, selection, scheme) + + // Register content provider and show diff + const contentProvider = new ContentProvider(uri) + const disposable = vscode.workspace.registerTextDocumentContentProvider(scheme, contentProvider) + await vscode.commands.executeCommand( + 'vscode.diff', + originalFileUri, + uri, + `${path.basename(filePath)} ${amazonQTabSuffix}` + ) + + disposeOnEditorClose(uri, disposable) + } + } catch (error) { + void vscode.window.showInformationMessage(errorNotification) + const wrappedError = ChatDiffError.chain(error, `Failed to Open Diff View`, { code: chatDiffCode }) + getLogger().error('%s: Failed to open diff view %s', chatDiffCode, getErrorMsg(wrappedError, true)) + throw wrappedError + } + } } diff --git a/packages/core/src/amazonq/extApi.ts b/packages/core/src/amazonq/extApi.ts index 8475fc6ba56..874ee018526 100644 --- a/packages/core/src/amazonq/extApi.ts +++ b/packages/core/src/amazonq/extApi.ts @@ -5,6 +5,7 @@ import vscode from 'vscode' import { VSCODE_EXTENSION_ID } from '../shared/utilities' +import { SendMessageCommandOutput, SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client' import { GenerateAssistantResponseCommandOutput, GenerateAssistantResponseRequest } from '@amzn/codewhisperer-streaming' import { FeatureAuthState } from '../codewhisperer/util/authUtil' import { ToolkitError } from '../shared' @@ -16,6 +17,7 @@ import { ToolkitError } from '../shared' export interface api { chatApi: { chat(request: GenerateAssistantResponseRequest): Promise + chatIam(request: SendMessageRequest): Promise } authApi: { reauthIfNeeded(): Promise diff --git a/packages/core/src/amazonq/index.ts b/packages/core/src/amazonq/index.ts index ec7dc9a3bf8..a08748b2b98 100644 --- a/packages/core/src/amazonq/index.ts +++ b/packages/core/src/amazonq/index.ts @@ -28,6 +28,10 @@ export { listCodeWhispererCommandsWalkthrough } from '../codewhisperer/ui/status export { focusAmazonQPanel, focusAmazonQPanelKeybinding } from '../codewhispererChat/commands/registerCommands' export { TryChatCodeLensProvider, tryChatCodeLensCommand } from '../codewhispererChat/editor/codelens' export { createAmazonQUri, openDiff, openDeletedDiff, getOriginalFileUri, getFileDiffUris } from './commons/diff' +export { CodeReference } from '../codewhispererChat/view/connector/connector' +export { AuthMessageDataMap, AuthFollowUpType } from './auth/model' +export { extractAuthFollowUp } from './util/authUtils' +import { FeatureContext } from '../shared' /** * main from createMynahUI is a purely browser dependency. Due to this @@ -35,10 +39,15 @@ export { createAmazonQUri, openDiff, openDeletedDiff, getOriginalFileUri, getFil * while only running on browser instances (like the e2e tests). If we * just export it regularly we will get "ReferenceError: self is not defined" */ -export function createMynahUI(ideApi: any, amazonQEnabled: boolean) { +export function createMynahUI( + ideApi: any, + amazonQEnabled: boolean, + featureConfigsSerialized: [string, FeatureContext][], + disabledCommands?: string[] +) { if (typeof window !== 'undefined') { const mynahUI = require('./webview/ui/main') - return mynahUI.createMynahUI(ideApi, amazonQEnabled) + return mynahUI.createMynahUI(ideApi, amazonQEnabled, featureConfigsSerialized, disabledCommands) } throw new Error('Not implemented for node') } diff --git a/packages/core/src/amazonq/lsp/lspClient.ts b/packages/core/src/amazonq/lsp/lspClient.ts index fc55022bbd0..5fd176531a4 100644 --- a/packages/core/src/amazonq/lsp/lspClient.ts +++ b/packages/core/src/amazonq/lsp/lspClient.ts @@ -17,7 +17,17 @@ import * as jose from 'jose' import { Disposable, ExtensionContext } from 'vscode' import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient' -import { GetUsageRequestType, IndexRequestType, QueryRequestType, UpdateIndexRequestType, Usage } from './types' +import { + BuildIndexRequestPayload, + BuildIndexRequestType, + GetUsageRequestType, + IndexConfig, + QueryInlineProjectContextRequestType, + QueryVectorIndexRequestType, + UpdateIndexV2RequestPayload, + UpdateIndexV2RequestType, + Usage, +} from './types' import { Writable } from 'stream' import { CodeWhispererSettings } from '../../codewhisperer/util/codewhispererSettings' import { fs, getLogger } from '../../shared' @@ -61,52 +71,67 @@ export class LspClient { .encrypt(key) } - async indexFiles(request: string[], rootPath: string, refresh: boolean) { + async buildIndex(paths: string[], rootPath: string, config: IndexConfig) { + const payload: BuildIndexRequestPayload = { + filePaths: paths, + projectRoot: rootPath, + config: config, + language: '', + } try { - const encryptedRequest = await this.encrypt( - JSON.stringify({ - filePaths: request, - rootPath: rootPath, - refresh: refresh, - }) - ) - const resp = await this.client?.sendRequest(IndexRequestType, encryptedRequest) + const encryptedRequest = await this.encrypt(JSON.stringify(payload)) + const resp = await this.client?.sendRequest(BuildIndexRequestType, encryptedRequest) return resp } catch (e) { - getLogger().error(`LspClient: indexFiles error: ${e}`) + getLogger().error(`LspClient: buildIndex error: ${e}`) return undefined } } - async query(request: string) { + async queryVectorIndex(request: string) { try { const encryptedRequest = await this.encrypt( JSON.stringify({ query: request, }) ) - const resp = await this.client?.sendRequest(QueryRequestType, encryptedRequest) + const resp = await this.client?.sendRequest(QueryVectorIndexRequestType, encryptedRequest) return resp } catch (e) { - getLogger().error(`LspClient: query error: ${e}`) + getLogger().error(`LspClient: queryVectorIndex error: ${e}`) return [] } } + async queryInlineProjectContext(query: string, path: string) { + try { + const request = JSON.stringify({ + query: query, + filePath: path, + }) + const encrypted = await this.encrypt(request) + const resp: any = await this.client?.sendRequest(QueryInlineProjectContextRequestType, encrypted) + return resp + } catch (e) { + getLogger().error(`LspClient: queryInlineProjectContext error: ${e}`) + throw e + } + } + async getLspServerUsage(): Promise { if (this.client) { return (await this.client.sendRequest(GetUsageRequestType, '')) as Usage } } - async updateIndex(filePath: string) { + async updateIndex(filePath: string[], mode: 'update' | 'remove' | 'add') { + const payload: UpdateIndexV2RequestPayload = { + filePaths: filePath, + updateMode: mode, + } try { - const encryptedRequest = await this.encrypt( - JSON.stringify({ - filePath: filePath, - }) - ) - const resp = await this.client?.sendRequest(UpdateIndexRequestType, encryptedRequest) + const encryptedRequest = await this.encrypt(JSON.stringify(payload)) + const resp = await this.client?.sendRequest(UpdateIndexV2RequestType, encryptedRequest) return resp } catch (e) { getLogger().error(`LspClient: updateIndex error: ${e}`) @@ -197,15 +222,26 @@ export async function activate(extensionContext: ExtensionContext) { return } savedDocument = document.uri - }) - ) - toDispose.push( + }), vscode.window.onDidChangeActiveTextEditor((editor) => { if (savedDocument && editor && editor.document.uri.fsPath !== savedDocument.fsPath) { - void LspClient.instance.updateIndex(savedDocument.fsPath) + void LspClient.instance.updateIndex([savedDocument.fsPath], 'update') } + }), + vscode.workspace.onDidCreateFiles((e) => { + void LspClient.instance.updateIndex( + e.files.map((f) => f.fsPath), + 'add' + ) + }), + vscode.workspace.onDidDeleteFiles((e) => { + void LspClient.instance.updateIndex( + e.files.map((f) => f.fsPath), + 'remove' + ) }) ) + return LspClient.instance.client.onReady().then(() => { const disposableFunc = { dispose: () => rangeFormatting?.dispose() as void } toDispose.push(disposableFunc) diff --git a/packages/core/src/amazonq/lsp/lspController.ts b/packages/core/src/amazonq/lsp/lspController.ts index 7494f70289d..03306e34e75 100644 --- a/packages/core/src/amazonq/lsp/lspController.ts +++ b/packages/core/src/amazonq/lsp/lspController.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode' import * as path from 'path' import * as crypto from 'crypto' -import { createWriteStream } from 'fs' +import { createWriteStream } from 'fs' // eslint-disable-line no-restricted-imports import { getLogger } from '../../shared/logger/logger' import { CurrentWsFolders, collectFilesForIndex } from '../../shared/utilities/workspaceUtils' import fetch from 'node-fetch' @@ -15,12 +15,10 @@ import { LspClient } from './lspClient' import AdmZip from 'adm-zip' import { RelevantTextDocument } from '@amzn/codewhisperer-streaming' import { makeTemporaryToolkitFolder, tryRemoveFolder } from '../../shared/filesystemUtilities' -import { CodeWhispererSettings } from '../../codewhisperer/util/codewhispererSettings' import { activate as activateLsp } from './lspClient' import { telemetry } from '../../shared/telemetry' import { isCloud9 } from '../../shared/extensionUtilities' import { fs, globals, ToolkitError } from '../../shared' -import { AuthUtil } from '../../codewhisperer' import { isWeb } from '../../shared/extensionGlobals' import { getUserAgent } from '../../shared/telemetry/util' import { isAmazonInternalOs } from '../../shared/vscode/env' @@ -68,9 +66,16 @@ export interface Manifest { } const manifestUrl = 'https://aws-toolkit-language-servers.amazonaws.com/q-context/manifest.json' // this LSP client in Q extension is only going to work with these LSP server versions -const supportedLspServerVersions = ['0.1.9'] +const supportedLspServerVersions = ['0.1.24'] const nodeBinName = process.platform === 'win32' ? 'node.exe' : 'node' + +export interface BuildIndexConfig { + startUrl?: string + maxIndexSize: number + isVectorIndexEnabled: boolean +} + /* * LSP Controller manages the status of Amazon Q LSP: * 1. Downloading, verifying and installing LSP using DEXP LSP manifest and CDN. @@ -281,11 +286,11 @@ export class LspController { } async query(s: string): Promise { - const chunks: Chunk[] | undefined = await LspClient.instance.query(s) + const chunks: Chunk[] | undefined = await LspClient.instance.queryVectorIndex(s) const resp: RelevantTextDocument[] = [] chunks?.forEach((chunk) => { const text = chunk.context ? chunk.context : chunk.content - if (chunk.programmingLanguage) { + if (chunk.programmingLanguage && chunk.programmingLanguage !== 'unknown') { resp.push({ text: text, relativeFilePath: chunk.relativePath ? chunk.relativePath : path.basename(chunk.filePath), @@ -303,8 +308,16 @@ export class LspController { return resp } - async buildIndex() { - getLogger().info(`LspController: Starting to build vector index of project`) + async queryInlineProjectContext(query: string, path: string) { + try { + return await LspClient.instance.queryInlineProjectContext(query, path) + } catch (e) { + return [] + } + } + + async buildIndex(buildIndexConfig: BuildIndexConfig) { + getLogger().info(`LspController: Starting to build index of project`) const start = performance.now() const projPaths = getProjectPaths() projPaths.sort() @@ -318,20 +331,18 @@ export class LspController { projPaths, vscode.workspace.workspaceFolders as CurrentWsFolders, true, - CodeWhispererSettings.instance.getMaxIndexSize() * 1024 * 1024 + buildIndexConfig.maxIndexSize * 1024 * 1024 ) const totalSizeBytes = files.reduce( (accumulator, currentFile) => accumulator + currentFile.fileSizeBytes, 0 ) getLogger().info(`LspController: Found ${files.length} files in current project ${getProjectPaths()}`) - const resp = await LspClient.instance.indexFiles( - files.map((f) => f.fileUri.fsPath), - projRoot, - false - ) + const config = buildIndexConfig.isVectorIndexEnabled ? 'all' : 'default' + const r = files.map((f) => f.fileUri.fsPath) + const resp = await LspClient.instance.buildIndex(r, projRoot, config) if (resp) { - getLogger().debug(`LspController: Finish building vector index of project`) + getLogger().debug(`LspController: Finish building index of project`) const usage = await LspClient.instance.getLspServerUsage() telemetry.amazonq_indexWorkspace.emit({ duration: performance.now() - start, @@ -340,43 +351,41 @@ export class LspController { amazonqIndexMemoryUsageInMB: usage ? usage.memoryUsage / (1024 * 1024) : undefined, amazonqIndexCpuUsagePercentage: usage ? usage.cpuUsage : undefined, amazonqIndexFileSizeInMB: totalSizeBytes / (1024 * 1024), - credentialStartUrl: AuthUtil.instance.startUrl, + credentialStartUrl: buildIndexConfig.startUrl, }) } else { - getLogger().error(`LspController: Failed to build vector index of project`) + getLogger().error(`LspController: Failed to build index of project`) telemetry.amazonq_indexWorkspace.emit({ duration: performance.now() - start, result: 'Failed', amazonqIndexFileCount: 0, amazonqIndexFileSizeInMB: 0, + reason: `Unknown`, }) } - } catch (e) { - getLogger().error(`LspController: Failed to build vector index of project`) + } catch (error) { + //TODO: use telemetry.run() + getLogger().error(`LspController: Failed to build index of project`) telemetry.amazonq_indexWorkspace.emit({ duration: performance.now() - start, result: 'Failed', amazonqIndexFileCount: 0, amazonqIndexFileSizeInMB: 0, + reason: `${error instanceof Error ? error.name : 'Unknown'}`, + reasonDesc: `Error when building index. ${error instanceof Error ? error.message : error}`, }) } finally { this._isIndexingInProgress = false } } - async trySetupLsp(context: vscode.ExtensionContext) { + async trySetupLsp(context: vscode.ExtensionContext, buildIndexConfig: BuildIndexConfig) { if (isCloud9() || isWeb() || isAmazonInternalOs()) { getLogger().warn('LspController: Skipping LSP setup. LSP is not compatible with the current environment. ') // do not do anything if in Cloud9 or Web mode or in AL2 (AL2 does not support node v18+) return } setImmediate(async () => { - if (!CodeWhispererSettings.instance.isLocalIndexEnabled()) { - // only download LSP for users who did not turn on this feature - // do not start LSP server - await LspController.instance.tryInstallLsp(context) - return - } const ok = await LspController.instance.tryInstallLsp(context) if (!ok) { return @@ -384,7 +393,7 @@ export class LspController { try { await activateLsp(context) getLogger().info('LspController: LSP activated') - void LspController.instance.buildIndex() + void LspController.instance.buildIndex(buildIndexConfig) // log the LSP server CPU and Memory usage per 30 minutes. globals.clock.setInterval( async () => { diff --git a/packages/core/src/amazonq/lsp/types.ts b/packages/core/src/amazonq/lsp/types.ts index bc6e37a75d9..292581bddfc 100644 --- a/packages/core/src/amazonq/lsp/types.ts +++ b/packages/core/src/amazonq/lsp/types.ts @@ -11,10 +11,6 @@ export type IndexRequestPayload = { refresh: boolean } -export type IndexRequest = string - -export const IndexRequestType: RequestType = new RequestType('lsp/index') - export type ClearRequest = string export const ClearRequestType: RequestType = new RequestType('lsp/clear') @@ -23,10 +19,6 @@ export type QueryRequest = string export const QueryRequestType: RequestType = new RequestType('lsp/query') -export type UpdateIndexRequest = string - -export const UpdateIndexRequestType: RequestType = new RequestType('lsp/updateIndex') - export type GetUsageRequest = string export const GetUsageRequestType: RequestType = new RequestType('lsp/getUsage') @@ -35,3 +27,40 @@ export interface Usage { memoryUsage: number cpuUsage: number } + +export type BuildIndexRequestPayload = { + filePaths: string[] + projectRoot: string + config: string + language: string +} + +export type BuildIndexRequest = string + +export const BuildIndexRequestType: RequestType = new RequestType('lsp/buildIndex') + +export type UpdateIndexV2Request = string + +export type UpdateIndexV2RequestPayload = { filePaths: string[]; updateMode: string } + +export const UpdateIndexV2RequestType: RequestType = new RequestType( + 'lsp/updateIndexV2' +) + +export type QueryInlineProjectContextRequest = string +export type QueryInlineProjectContextRequestPayload = { + query: string + filePath: string +} +export const QueryInlineProjectContextRequestType: RequestType = + new RequestType('lsp/queryInlineProjectContext') + +export type QueryVectorIndexRequestPayload = { query: string } + +export type QueryVectorIndexRequest = string + +export const QueryVectorIndexRequestType: RequestType = new RequestType( + 'lsp/queryVectorIndex' +) + +export type IndexConfig = 'all' | 'default' diff --git a/packages/core/src/amazonq/util/authUtils.ts b/packages/core/src/amazonq/util/authUtils.ts new file mode 100644 index 00000000000..0fd48ebc4c9 --- /dev/null +++ b/packages/core/src/amazonq/util/authUtils.ts @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { FeatureAuthState } from '../../codewhisperer' +import { AuthFollowUpType, AuthMessageDataMap } from '../auth/model' + +/** + * This function evaluates the authentication state of CodeWhisperer features (chat and core) + * when the authentication is not valid, and returns the appropriate authentication follow-up type and message. + * + * @param credentialState - The current authentication state for each CodeWhisperer feature + * @returns An object containing: + * - authType: The type of authentication follow-up required (AuthFollowUpType) + * - message: The corresponding message for the determined auth type + */ +export function extractAuthFollowUp(credentialState: FeatureAuthState) { + let authType: AuthFollowUpType = 'full-auth' + let message = AuthMessageDataMap[authType].message + if (credentialState.codewhispererChat === 'disconnected' && credentialState.codewhispererCore === 'disconnected') { + authType = 'full-auth' + message = AuthMessageDataMap[authType].message + } + + if (credentialState.codewhispererCore === 'connected' && credentialState.codewhispererChat === 'expired') { + authType = 'missing_scopes' + message = AuthMessageDataMap[authType].message + } + + if (credentialState.codewhispererChat === 'expired' && credentialState.codewhispererCore === 'expired') { + authType = 're-auth' + message = AuthMessageDataMap[authType].message + } + + return { + authType, + message, + } as const +} diff --git a/packages/core/src/amazonq/util/functionUtils.ts b/packages/core/src/amazonq/util/functionUtils.ts new file mode 100644 index 00000000000..b5d6a9bb9dc --- /dev/null +++ b/packages/core/src/amazonq/util/functionUtils.ts @@ -0,0 +1,24 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Tries to create map and returns empty map if failed. + * + * @param {[unknown, unknown][]} arr - An array of tuples, where each tuple represents a key-value pair. + * @returns {Map} A new Map object created from the input array. + * If the conversion fails, an empty Map is returned. + * + * @example + * const array = [['key1', 'value1'], ['key2', 'value2']]; + * const map = tryNewMap(array); + * // map is now a Map object with entries: { 'key1' => 'value1', 'key2' => 'value2' } + */ +export function tryNewMap(arr: [unknown, unknown][]) { + try { + return new Map(arr) + } catch (error) { + return new Map() + } +} diff --git a/packages/core/src/amazonq/webview/generators/webViewContent.ts b/packages/core/src/amazonq/webview/generators/webViewContent.ts index 47cb59a9f2e..da1492f467f 100644 --- a/packages/core/src/amazonq/webview/generators/webViewContent.ts +++ b/packages/core/src/amazonq/webview/generators/webViewContent.ts @@ -6,9 +6,23 @@ import path from 'path' import { Uri, Webview } from 'vscode' import { AuthUtil } from '../../../codewhisperer/util/authUtil' -import { globals } from '../../../shared' +import { FeatureConfigProvider, FeatureContext, globals, isSageMaker } from '../../../shared' export class WebViewContentGenerator { + private async generateFeatureConfigsData(): Promise { + let featureConfigs = new Map() + try { + await FeatureConfigProvider.instance.fetchFeatureConfigs() + featureConfigs = FeatureConfigProvider.getFeatureConfigs() + } catch (error) { + // eslint-disable-next-line aws-toolkits/no-console-log + console.error('Error fetching feature configs:', error) + } + + // Convert featureConfigs to a string suitable for data-features + return JSON.stringify(Array.from(featureConfigs.entries())) + } + public async generate(extensionURI: Uri, webView: Webview): Promise { const entrypoint = process.env.WEBPACK_DEVELOPER_SERVER ? 'http: localhost' @@ -17,14 +31,25 @@ export class WebViewContentGenerator { const contentPolicy = `default-src ${entrypoint} data: blob: 'unsafe-inline'; script-src ${entrypoint} filesystem: ws: wss: 'unsafe-inline';` + let featureDataAttributes = '' + try { + // Fetch and parse featureConfigs + const featureConfigs = JSON.parse(await this.generateFeatureConfigsData()) + featureDataAttributes = featureConfigs + .map((config: FeatureContext[]) => `data-feature-${config[1].name}="${config[1].variation}"`) + .join(' ') + } catch (error) { + // eslint-disable-next-line aws-toolkits/no-console-log + console.error('Error setting data-feature attribute for featureConfigs:', error) + } return ` - Amazon Q (Preview) - ${await this.generateJS(extensionURI, webView)} + Amazon Q (Preview) + ${await this.generateJS(extensionURI, webView)} - + ` } @@ -41,20 +66,29 @@ export class WebViewContentGenerator { ? Uri.parse(serverHostname).with({ path: `/${source}` }) : webView.asWebviewUri(javascriptUri) - const cssEntrypoint = webView.asWebviewUri( - Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-webview.css') - ) + const cssEntrypoints = [ + Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-webview.css'), + Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-chat.css'), + ] + + const cssEntrypointsMap = cssEntrypoints.map((item) => webView.asWebviewUri(item)) + const cssLinks = cssEntrypointsMap.map((uri) => ``).join('\n') + + // Fetch featureConfigs and use it within the script + const featureConfigsString = await this.generateFeatureConfigsData() + + const disabledCommandsString = isSageMaker() ? `['/dev', '/transform']` : '[]' return ` - + ${cssLinks} + ` } } diff --git a/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts b/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts index c7da7b10410..3e5ea73b3ba 100644 --- a/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts +++ b/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { ChatItem, ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui' +import { ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui' import { ExtensionMessage } from '../commands' import { CodeReference } from './amazonqCommonsConnector' import { TabOpenType, TabsStorage } from '../storages/tabsStorage' import { FollowUpGenerator } from '../followUps/generator' +import { CWCChatItem } from '../connector' interface ChatPayload { chatMessage: string @@ -17,8 +18,8 @@ interface ChatPayload { export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void - onCWCContextCommandMessage: (message: ChatItem, command?: string) => string | undefined + onChatAnswerReceived?: (tabID: string, message: CWCChatItem, messageData: any) => void + onCWCContextCommandMessage: (message: CWCChatItem, command?: string) => string | undefined onError: (tabID: string, message: string, title: string) => void onWarning: (tabID: string, message: string, title: string) => void onOpenSettingsMessage: (tabID: string) => void @@ -109,7 +110,9 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string, + codeBlockLanguage?: string ): void => { this.sendMessageToExtension({ tabID: tabID, @@ -122,6 +125,8 @@ export class Connector { eventId, codeBlockIndex, totalCodeBlocks, + userIntent, + codeBlockLanguage, }) } @@ -133,7 +138,9 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string, + codeBlockLanguage?: string ): void => { this.sendMessageToExtension({ tabID: tabID, @@ -146,6 +153,8 @@ export class Connector { eventId, codeBlockIndex, totalCodeBlocks, + userIntent, + codeBlockLanguage, }) } @@ -282,13 +291,15 @@ export class Connector { } : undefined - const answer: ChatItem = { + const answer: CWCChatItem = { type: messageData.messageType, messageId: messageData.messageID ?? messageData.triggerID, body: messageData.message, followUp: followUps, canBeVoted: true, codeReference: messageData.codeReference, + userIntent: messageData.userIntent, + codeBlockLanguage: messageData.codeBlockLanguage, } // If it is not there we will not set it @@ -302,7 +313,7 @@ export class Connector { content: messageData.relatedSuggestions, } } - this.onChatAnswerReceived(messageData.tabID, answer) + this.onChatAnswerReceived(messageData.tabID, answer, messageData) // Exit the function if we received an answer from AI if ( @@ -315,12 +326,14 @@ export class Connector { return } if (messageData.messageType === ChatItemType.ANSWER) { - const answer: ChatItem = { + const answer: CWCChatItem = { type: messageData.messageType, body: undefined, relatedContent: undefined, messageId: messageData.messageID, codeReference: messageData.codeReference, + userIntent: messageData.userIntent, + codeBlockLanguage: messageData.codeBlockLanguage, followUp: messageData.followUps !== undefined && messageData.followUps.length > 0 ? { @@ -329,7 +342,7 @@ export class Connector { } : undefined, } - this.onChatAnswerReceived(messageData.tabID, answer) + this.onChatAnswerReceived(messageData.tabID, answer, messageData) return } @@ -340,13 +353,17 @@ export class Connector { return } - this.onChatAnswerReceived(messageData.tabID, { - type: ChatItemType.ANSWER, - messageId: messageData.triggerID, - body: messageData.message, - followUp: this.followUpGenerator.generateAuthFollowUps('cwc', messageData.authType), - canBeVoted: false, - }) + this.onChatAnswerReceived( + messageData.tabID, + { + type: ChatItemType.ANSWER, + messageId: messageData.triggerID, + body: messageData.message, + followUp: this.followUpGenerator.generateAuthFollowUps('cwc', messageData.authType), + canBeVoted: false, + }, + messageData + ) return } diff --git a/packages/core/src/amazonq/webview/ui/apps/featureDevChatConnector.ts b/packages/core/src/amazonq/webview/ui/apps/featureDevChatConnector.ts index 37657c803cf..cca7ee8dee8 100644 --- a/packages/core/src/amazonq/webview/ui/apps/featureDevChatConnector.ts +++ b/packages/core/src/amazonq/webview/ui/apps/featureDevChatConnector.ts @@ -18,8 +18,14 @@ interface ChatPayload { export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void + onAsyncEventProgress: ( + tabID: string, + inProgress: boolean, + message: string, + messageId: string | undefined, + enableStopAction: boolean + ) => void + onChatAnswerReceived?: (tabID: string, message: ChatItem, messageData: any) => void sendFeedback?: (tabId: string, feedbackPayload: FeedbackPayload) => void | undefined onError: (tabID: string, message: string, title: string) => void onWarning: (tabID: string, message: string, title: string) => void @@ -94,12 +100,13 @@ export class Connector { }) } - onOpenDiff = (tabID: string, filePath: string, deleted: boolean): void => { + onOpenDiff = (tabID: string, filePath: string, deleted: boolean, messageId?: string): void => { this.sendMessageToExtension({ command: 'open-diff', tabID, filePath, deleted, + messageId, tabType: 'featuredev', }) } @@ -153,7 +160,7 @@ export class Connector { } : undefined, } - this.onChatAnswerReceived(messageData.tabID, answer) + this.onChatAnswerReceived(messageData.tabID, answer, messageData) } } @@ -167,7 +174,11 @@ export class Connector { canBeVoted: true, codeReference: messageData.references, // TODO get the backend to store a message id in addition to conversationID - messageId: messageData.messageID ?? messageData.triggerID ?? messageData.conversationID, + messageId: + messageData.codeGenerationId ?? + messageData.messageID ?? + messageData.triggerID ?? + messageData.conversationID, fileList: { rootFolderTitle: 'Changes', filePaths: messageData.filePaths.map((f: DiffTreeFileInfo) => f.zipFilePath), @@ -176,7 +187,7 @@ export class Connector { }, body: '', } - this.onChatAnswerReceived(messageData.tabID, answer) + this.onChatAnswerReceived(messageData.tabID, answer, messageData) } } @@ -185,19 +196,27 @@ export class Connector { return } - this.onChatAnswerReceived(messageData.tabID, { - type: ChatItemType.ANSWER, - body: messageData.message, - followUp: undefined, - canBeVoted: false, - }) - - this.onChatAnswerReceived(messageData.tabID, { - type: ChatItemType.SYSTEM_PROMPT, - body: undefined, - followUp: this.followUpGenerator.generateAuthFollowUps('featuredev', messageData.authType), - canBeVoted: false, - }) + this.onChatAnswerReceived( + messageData.tabID, + { + type: ChatItemType.ANSWER, + body: messageData.message, + followUp: undefined, + canBeVoted: false, + }, + messageData + ) + + this.onChatAnswerReceived( + messageData.tabID, + { + type: ChatItemType.SYSTEM_PROMPT, + body: undefined, + followUp: this.followUpGenerator.generateAuthFollowUps('featuredev', messageData.authType), + canBeVoted: false, + }, + messageData + ) return } @@ -233,7 +252,14 @@ export class Connector { } if (messageData.type === 'asyncEventProgressMessage') { - this.onAsyncEventProgress(messageData.tabID, messageData.inProgress, messageData.message ?? undefined) + const enableStopAction = true + this.onAsyncEventProgress( + messageData.tabID, + messageData.inProgress, + messageData.message ?? undefined, + messageData.messageId ?? undefined, + enableStopAction + ) return } @@ -267,6 +293,7 @@ export class Connector { this.sendMessageToExtension({ tabID: tabID, command: 'stop-response', + tabType: 'featuredev', }) } diff --git a/packages/core/src/amazonq/webview/ui/apps/gumbyChatConnector.ts b/packages/core/src/amazonq/webview/ui/apps/gumbyChatConnector.ts index 533a20da332..a6c7d2efef2 100644 --- a/packages/core/src/amazonq/webview/ui/apps/gumbyChatConnector.ts +++ b/packages/core/src/amazonq/webview/ui/apps/gumbyChatConnector.ts @@ -16,8 +16,14 @@ import { ChatPayload } from '../connector' export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string, messageId: string) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void + onAsyncEventProgress: ( + tabID: string, + inProgress: boolean, + message: string, + messageId: string, + enableStopAction: boolean + ) => void + onChatAnswerReceived?: (tabID: string, message: ChatItem, messageData: any) => void onChatAnswerUpdated?: (tabID: string, message: ChatItem) => void onQuickHandlerCommand: (tabID: string, command: string, eventId?: string) => void onError: (tabID: string, message: string, title: string) => void @@ -90,7 +96,7 @@ export class Connector { canBeVoted: false, } - this.onChatAnswerReceived(tabID, answer) + this.onChatAnswerReceived(tabID, answer, messageData) return } @@ -114,7 +120,7 @@ export class Connector { return } - this.onChatAnswerReceived(messageData.tabID, answer) + this.onChatAnswerReceived(messageData.tabID, answer, messageData) } } @@ -143,10 +149,14 @@ export class Connector { return } - this.onChatAnswerReceived(messageData.tabID, { - type: ChatItemType.SYSTEM_PROMPT, - body: messageData.message, - }) + this.onChatAnswerReceived( + messageData.tabID, + { + type: ChatItemType.SYSTEM_PROMPT, + body: messageData.message, + }, + messageData + ) } onCustomFormAction( @@ -192,7 +202,8 @@ export class Connector { messageData.tabID, messageData.inProgress, messageData.message, - messageData.messageId + messageData.messageId, + false ) break case 'authNeededException': diff --git a/packages/core/src/amazonq/webview/ui/commands.ts b/packages/core/src/amazonq/webview/ui/commands.ts index 6b803611d63..d502cba861d 100644 --- a/packages/core/src/amazonq/webview/ui/commands.ts +++ b/packages/core/src/amazonq/webview/ui/commands.ts @@ -16,6 +16,8 @@ type MessageCommand = | 'open-diff' | 'code_was_copied_to_clipboard' | 'insert_code_at_cursor_position' + | 'accept_diff' + | 'view_diff' | 'stop-response' | 'trigger-tabID-received' | 'clear' diff --git a/packages/core/src/amazonq/webview/ui/connector.ts b/packages/core/src/amazonq/webview/ui/connector.ts index 63504c67ceb..1d832c8e023 100644 --- a/packages/core/src/amazonq/webview/ui/connector.ts +++ b/packages/core/src/amazonq/webview/ui/connector.ts @@ -3,7 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { ChatItem, FeedbackPayload, Engagement, ChatItemAction } from '@aws/mynah-ui' +import { + ChatItem, + FeedbackPayload, + Engagement, + ChatItemAction, + CodeSelectionType, + ReferenceTrackerInformation, +} from '@aws/mynah-ui' import { Connector as CWChatConnector } from './apps/cwChatConnector' import { Connector as FeatureDevChatConnector } from './apps/featureDevChatConnector' import { Connector as AmazonQCommonsConnector } from './apps/amazonqCommonsConnector' @@ -13,6 +20,7 @@ import { TabType, TabsStorage } from './storages/tabsStorage' import { WelcomeFollowupType } from './apps/amazonqCommonsConnector' import { AuthFollowUpType } from './followUps/generator' import { DiffTreeFileInfo } from './diffTree/types' +import { UserIntent } from '@amzn/codewhisperer-streaming' export interface CodeReference { licenseName?: string @@ -24,16 +32,33 @@ export interface CodeReference { } } +export interface UploadHistory { + [key: string]: { + uploadId: string + timestamp: number + tabId: string + filePaths: DiffTreeFileInfo[] + deletedFiles: DiffTreeFileInfo[] + } +} + export interface ChatPayload { chatMessage: string chatCommand?: string } +// Adding userIntent param by extending ChatItem to send userIntent as part of amazonq_interactWithMessage telemetry event +export interface CWCChatItem extends ChatItem { + traceId?: string + userIntent?: UserIntent + codeBlockLanguage?: string +} + export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void onChatAnswerUpdated?: (tabID: string, message: ChatItem) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void + onChatAnswerReceived?: (tabID: string, message: ChatItem, messageData: any) => void onWelcomeFollowUpClicked: (tabID: string, welcomeFollowUpType: WelcomeFollowupType) => void onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string | undefined) => void onQuickHandlerCommand: (tabID: string, command?: string, eventId?: string) => void @@ -151,6 +176,17 @@ export class Connector { this.gumbyChatConnector.transform(tabID) } + onStopChatResponse = (tabID: string): void => { + switch (this.tabsStorage.getTab(tabID)?.type) { + case 'featuredev': + this.featureDevChatConnector.onStopChatResponse(tabID) + break + case 'cwc': + this.cwChatConnector.onStopChatResponse(tabID) + break + } + } + handleMessageReceive = async (message: MessageEvent): Promise => { if (message.data === undefined) { return @@ -170,6 +206,9 @@ export class Connector { } else if (messageData.sender === 'gumbyChat') { await this.gumbyChatConnector.handleMessageReceive(messageData) } + + // Reset lastCommand after message is rendered. + this.tabsStorage.updateTabLastCommand(messageData.tabID, '') } onTabAdd = (tabID: string): void => { @@ -214,7 +253,9 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string, + codeBlockLanguage?: string ): void => { switch (this.tabsStorage.getTab(tabID)?.type) { case 'cwc': @@ -226,7 +267,9 @@ export class Connector { codeReference, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + userIntent, + codeBlockLanguage ) break case 'featuredev': @@ -235,6 +278,64 @@ export class Connector { } } + onAcceptDiff = ( + tabId: string, + messageId: string, + actionId: string, + data?: string, + code?: string, + type?: CodeSelectionType, + referenceTrackerInformation?: ReferenceTrackerInformation[], + eventId?: string, + codeBlockIndex?: number, + totalCodeBlocks?: number + ) => { + const tabType = this.tabsStorage.getTab(tabId)?.type + this.sendMessageToExtension({ + tabType, + tabID: tabId, + command: 'accept_diff', + messageId, + actionId, + data, + code, + type, + referenceTrackerInformation, + eventId, + codeBlockIndex, + totalCodeBlocks, + }) + } + + onViewDiff = ( + tabId: string, + messageId: string, + actionId: string, + data?: string, + code?: string, + type?: CodeSelectionType, + referenceTrackerInformation?: ReferenceTrackerInformation[], + eventId?: string, + codeBlockIndex?: number, + totalCodeBlocks?: number + ) => { + const tabType = this.tabsStorage.getTab(tabId)?.type + this.sendMessageToExtension({ + tabType, + tabID: tabId, + command: 'view_diff', + messageId, + actionId, + data, + code, + type, + referenceTrackerInformation, + eventId, + codeBlockIndex, + totalCodeBlocks, + }) + } + onCopyCodeToClipboard = ( tabID: string, messageId: string, @@ -243,7 +344,9 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string, + codeBlockLanguage?: string ): void => { switch (this.tabsStorage.getTab(tabID)?.type) { case 'cwc': @@ -255,7 +358,9 @@ export class Connector { codeReference, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + userIntent, + codeBlockLanguage ) break case 'featuredev': @@ -355,21 +460,10 @@ export class Connector { } } - onOpenDiff = (tabID: string, filePath: string, deleted: boolean): void => { - switch (this.tabsStorage.getTab(tabID)?.type) { - case 'featuredev': - this.featureDevChatConnector.onOpenDiff(tabID, filePath, deleted) - break - } - } - - onStopChatResponse = (tabID: string): void => { + onOpenDiff = (tabID: string, filePath: string, deleted: boolean, messageId?: string): void => { switch (this.tabsStorage.getTab(tabID)?.type) { case 'featuredev': - this.featureDevChatConnector.onStopChatResponse(tabID) - break - case 'cwc': - this.cwChatConnector.onStopChatResponse(tabID) + this.featureDevChatConnector.onOpenDiff(tabID, filePath, deleted, messageId) break } } diff --git a/packages/core/src/amazonq/webview/ui/followUps/handler.ts b/packages/core/src/amazonq/webview/ui/followUps/handler.ts index 32b7600ea94..032ae47d50b 100644 --- a/packages/core/src/amazonq/webview/ui/followUps/handler.ts +++ b/packages/core/src/amazonq/webview/ui/followUps/handler.ts @@ -46,6 +46,7 @@ export class FollowUpInteractionHandler { if (followUp.prompt !== undefined) { this.mynahUI.updateStore(tabID, { loadingChat: true, + cancelButtonWhenLoading: false, promptInputDisabledState: true, }) this.mynahUI.addChatItem(tabID, { diff --git a/packages/core/src/amazonq/webview/ui/main.ts b/packages/core/src/amazonq/webview/ui/main.ts index 31ac4baeaec..db9035b2517 100644 --- a/packages/core/src/amazonq/webview/ui/main.ts +++ b/packages/core/src/amazonq/webview/ui/main.ts @@ -2,8 +2,17 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { Connector } from './connector' -import { ChatItem, ChatItemType, MynahIcons, MynahUI, MynahUIDataModel, NotificationType } from '@aws/mynah-ui' +import { Connector, CWCChatItem } from './connector' +import { + ChatItem, + ChatItemType, + CodeSelectionType, + MynahIcons, + MynahUI, + MynahUIDataModel, + NotificationType, + ReferenceTrackerInformation, +} from '@aws/mynah-ui' import { ChatPrompt } from '@aws/mynah-ui/dist/static' import { TabsStorage, TabType } from './storages/tabsStorage' import { WelcomeFollowupType } from './apps/amazonqCommonsConnector' @@ -16,12 +25,21 @@ import { TextMessageHandler } from './messages/handler' import { MessageController } from './messages/controller' import { getActions, getDetails } from './diffTree/actions' import { DiffTreeFileInfo } from './diffTree/types' +import { FeatureContext } from '../../../shared' +import { tryNewMap } from '../../util/functionUtils' -export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { +export const createMynahUI = ( + ideApi: any, + amazonQEnabled: boolean, + featureConfigsSerialized: [string, FeatureContext][], + disabledCommands?: string[] +) => { // eslint-disable-next-line prefer-const let mynahUI: MynahUI // eslint-disable-next-line prefer-const let connector: Connector + //Store the mapping between messageId and messageUserIntent for amazonq_interactWithMessage telemetry + const responseMetadata = new Map() window.addEventListener('error', (e) => { const { error, message } = e @@ -60,6 +78,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { let tabDataGenerator = new TabDataGenerator({ isFeatureDevEnabled, isGumbyEnabled, + disabledCommands, }) // eslint-disable-next-line prefer-const @@ -71,6 +90,23 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { // eslint-disable-next-line prefer-const let messageController: MessageController + // @ts-ignore + let featureConfigs: Map = tryNewMap(featureConfigsSerialized) + + function shouldDisplayDiff(messageData: any) { + const tab = tabsStorage.getTab(messageData?.tabID || '') + const allowedCommands = [ + 'aws.amazonq.refactorCode', + 'aws.amazonq.fixCode', + 'aws.amazonq.optimizeCode', + 'aws.amazonq.sendToPrompt', + ] + if (tab?.type === 'cwc' && allowedCommands.includes(tab.lastCommand || '')) { + return true + } + return false + } + // eslint-disable-next-line prefer-const connector = new Connector({ tabsStorage, @@ -84,12 +120,17 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { tabsStorage, isFeatureDevEnabled, isGumbyEnabled, + disabledCommands, }) tabDataGenerator = new TabDataGenerator({ isFeatureDevEnabled, isGumbyEnabled, + disabledCommands, }) + + featureConfigs = tryNewMap(featureConfigsSerialized) + // Set the new defaults for the quick action commands in all tabs now that isFeatureDevEnabled was enabled/disabled for (const tab of tabsStorage.getTabs()) { mynahUI.updateStore(tab.id, { @@ -115,6 +156,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { }, onFileActionClick: (tabID: string, messageId: string, filePath: string, actionName: string): void => {}, onQuickHandlerCommand: (tabID: string, command?: string, eventId?: string) => { + tabsStorage.updateTabLastCommand(tabID, command) if (command === 'aws.awsq.transform') { quickActionHandler.handle({ command: '/transform' }, tabID, eventId) } else if (command === 'aws.awsq.clearchat') { @@ -122,10 +164,13 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { } }, onCWCContextCommandMessage: (message: ChatItem, command?: string): string | undefined => { + const selectedTab = tabsStorage.getSelectedTab() + tabsStorage.updateTabLastCommand(selectedTab?.id || '', command || '') + if (command === 'aws.amazonq.sendToPrompt') { - return messageController.sendSelectedCodeToTab(message) + return messageController.sendSelectedCodeToTab(message, command) } else { - const tabID = messageController.sendMessageToTab(message, 'cwc') + const tabID = messageController.sendMessageToTab(message, 'cwc', command) if (tabID) { ideApi.postMessage({ command: 'start-chat-message-telemetry', @@ -150,12 +195,14 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { tabID: string, inProgress: boolean, message: string | undefined, - messageId: string | undefined = undefined + messageId: string | undefined = undefined, + enableStopAction: boolean = false ) => { if (inProgress) { mynahUI.updateStore(tabID, { loadingChat: true, promptInputDisabledState: true, + cancelButtonWhenLoading: enableStopAction, }) if (message && messageId) { @@ -199,7 +246,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { } as ChatItem) } }, - onChatAnswerReceived: (tabID: string, item: ChatItem) => { + onChatAnswerReceived: (tabID: string, item: CWCChatItem, messageData: any) => { if (item.type === ChatItemType.ANSWER_PART || item.type === ChatItemType.CODE_RESULT) { mynahUI.updateLastChatAnswer(tabID, { ...(item.messageId !== undefined ? { messageId: item.messageId } : {}), @@ -211,6 +258,13 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { ? { type: ChatItemType.CODE_RESULT, fileList: item.fileList } : {}), }) + if ( + item.messageId !== undefined && + item.userIntent !== undefined && + item.codeBlockLanguage !== undefined + ) { + responseMetadata.set(item.messageId, [item.userIntent, item.codeBlockLanguage]) + } ideApi.postMessage({ command: 'update-chat-message-telemetry', tabID, @@ -227,7 +281,29 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { item.formItems !== undefined || item.buttons !== undefined ) { - mynahUI.addChatItem(tabID, item) + mynahUI.addChatItem(tabID, { + ...item, + messageId: item.messageId, + codeBlockActions: { + ...(shouldDisplayDiff(messageData) + ? { + 'insert-to-cursor': undefined, + accept_diff: { + id: 'accept_diff', + label: 'Apply Diff', + icon: MynahIcons.OK_CIRCLED, + data: messageData, + }, + view_diff: { + id: 'view_diff', + label: 'View Diff', + icon: MynahIcons.EYE, + data: messageData, + }, + } + : {}), + }, + }) } if ( @@ -237,6 +313,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { ) { mynahUI.updateStore(tabID, { loadingChat: true, + cancelButtonWhenLoading: false, promptInputDisabledState: true, }) @@ -354,6 +431,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { connector.onUpdateTabType(newTabID) mynahUI.updateStore(newTabID, tabDataGenerator.getTabData(tabType, true)) + featureConfigs = tryNewMap(featureConfigsSerialized) }, onOpenSettingsMessage(tabId: string) { mynahUI.addChatItem(tabId, { @@ -391,6 +469,13 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { onTabRemove: connector.onTabRemove, onTabChange: connector.onTabChange, // TODO: update mynah-ui this type doesn't seem correct https://github.com/aws/mynah-ui/blob/3777a39eb534a91fd6b99d6cf421ce78ee5c7526/src/main.ts#L372 + onStopChatResponse: (tabID: string) => { + mynahUI.updateStore(tabID, { + loadingChat: false, + promptInputDisabledState: false, + }) + connector.onStopChatResponse(tabID) + }, onChatPrompt: (tabID: string, prompt: ChatPrompt, eventId: string | undefined) => { if ((prompt.prompt ?? '') === '' && (prompt.command ?? '') === '') { return @@ -429,7 +514,74 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { content: 'Thanks for your feedback.', }) }, - onCodeInsertToCursorPosition: connector.onCodeInsertToCursorPosition, + onCodeInsertToCursorPosition: ( + tabId, + messageId, + code, + type, + referenceTrackerInfo, + eventId, + codeBlockIndex, + totalCodeBlocks + ) => { + connector.onCodeInsertToCursorPosition( + tabId, + messageId, + code, + type, + referenceTrackerInfo, + eventId, + codeBlockIndex, + totalCodeBlocks, + responseMetadata.get(messageId)?.[0] ?? undefined, + responseMetadata.get(messageId)?.[1] ?? undefined + ) + }, + onCodeBlockActionClicked: ( + tabId: string, + messageId: string, + actionId: string, + data?: string, + code?: string, + type?: CodeSelectionType, + referenceTrackerInformation?: ReferenceTrackerInformation[], + eventId?: string, + codeBlockIndex?: number, + totalCodeBlocks?: number + ) => { + switch (actionId) { + case 'accept_diff': + connector.onAcceptDiff( + tabId, + messageId, + actionId, + data, + code, + type, + referenceTrackerInformation, + eventId, + codeBlockIndex, + totalCodeBlocks + ) + break + case 'view_diff': + connector.onViewDiff( + tabId, + messageId, + actionId, + data, + code, + type, + referenceTrackerInformation, + eventId, + codeBlockIndex, + totalCodeBlocks + ) + break + default: + break + } + }, onCopyCodeToClipboard: ( tabId, messageId, @@ -448,7 +600,9 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { referenceTrackerInfo, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + responseMetadata.get(messageId)?.[0] ?? undefined, + responseMetadata.get(messageId)?.[1] ?? undefined ) mynahUI.notify({ type: NotificationType.SUCCESS, diff --git a/packages/core/src/amazonq/webview/ui/messages/constants.ts b/packages/core/src/amazonq/webview/ui/messages/constants.ts deleted file mode 100644 index af2f108b339..00000000000 --- a/packages/core/src/amazonq/webview/ui/messages/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ diff --git a/packages/core/src/amazonq/webview/ui/messages/controller.ts b/packages/core/src/amazonq/webview/ui/messages/controller.ts index a63034c637a..f49b9a631ce 100644 --- a/packages/core/src/amazonq/webview/ui/messages/controller.ts +++ b/packages/core/src/amazonq/webview/ui/messages/controller.ts @@ -15,6 +15,7 @@ export interface MessageControllerProps { tabsStorage: TabsStorage isFeatureDevEnabled: boolean isGumbyEnabled: boolean + disabledCommands?: string[] } export class MessageController { @@ -30,10 +31,11 @@ export class MessageController { this.tabDataGenerator = new TabDataGenerator({ isFeatureDevEnabled: props.isFeatureDevEnabled, isGumbyEnabled: props.isGumbyEnabled, + disabledCommands: props.disabledCommands, }) } - public sendSelectedCodeToTab(message: ChatItem): string | undefined { + public sendSelectedCodeToTab(message: ChatItem, command: string = ''): string | undefined { const selectedTab = { ...this.tabsStorage.getSelectedTab() } if (selectedTab?.id === undefined || selectedTab?.type === 'featuredev') { // Create a new tab if there's none @@ -53,6 +55,7 @@ export class MessageController { type: 'cwc', status: 'free', isSelected: true, + lastCommand: command, }) selectedTab.id = newTabID } @@ -61,7 +64,7 @@ export class MessageController { return selectedTab.id } - public sendMessageToTab(message: ChatItem, tabType: TabType): string | undefined { + public sendMessageToTab(message: ChatItem, tabType: TabType, command: string = ''): string | undefined { const selectedTab = this.tabsStorage.getSelectedTab() if ( @@ -71,9 +74,11 @@ export class MessageController { ) { this.tabsStorage.updateTabStatus(selectedTab.id, 'busy') this.tabsStorage.updateTabTypeFromUnknown(selectedTab.id, tabType) + this.tabsStorage.updateTabLastCommand(selectedTab.id, command) this.mynahUI.updateStore(selectedTab.id, { loadingChat: true, + cancelButtonWhenLoading: false, promptInputDisabledState: true, }) this.mynahUI.addChatItem(selectedTab.id, message) @@ -96,6 +101,7 @@ export class MessageController { }) return undefined } else { + this.tabsStorage.updateTabLastCommand(newTabID, command) this.mynahUI.addChatItem(newTabID, message) this.mynahUI.addChatItem(newTabID, { type: ChatItemType.ANSWER_STREAM, @@ -104,6 +110,7 @@ export class MessageController { this.mynahUI.updateStore(newTabID, { loadingChat: true, + cancelButtonWhenLoading: false, promptInputDisabledState: true, }) @@ -114,6 +121,7 @@ export class MessageController { status: 'busy', isSelected: true, openInteractionType: 'contextMenu', + lastCommand: command, }) this.tabsStorage.updateTabTypeFromUnknown(newTabID, 'cwc') diff --git a/packages/core/src/amazonq/webview/ui/messages/handler.ts b/packages/core/src/amazonq/webview/ui/messages/handler.ts index eeec2e65745..d85774d23f6 100644 --- a/packages/core/src/amazonq/webview/ui/messages/handler.ts +++ b/packages/core/src/amazonq/webview/ui/messages/handler.ts @@ -25,6 +25,7 @@ export class TextMessageHandler { } public handle(chatPrompt: ChatPrompt, tabID: string, eventID: string) { + this.tabsStorage.updateTabLastCommand(tabID, chatPrompt.command) this.tabsStorage.updateTabTypeFromUnknown(tabID, 'cwc') this.tabsStorage.resetTabTimer(tabID) this.connector.onUpdateTabType(tabID) @@ -35,6 +36,7 @@ export class TextMessageHandler { this.mynahUI.updateStore(tabID, { loadingChat: true, + cancelButtonWhenLoading: false, promptInputDisabledState: true, }) diff --git a/packages/core/src/amazonq/webview/ui/quickActions/generator.ts b/packages/core/src/amazonq/webview/ui/quickActions/generator.ts index 335019e2f06..7c0bf334c15 100644 --- a/packages/core/src/amazonq/webview/ui/quickActions/generator.ts +++ b/packages/core/src/amazonq/webview/ui/quickActions/generator.ts @@ -9,22 +9,25 @@ import { TabType } from '../storages/tabsStorage' export interface QuickActionGeneratorProps { isFeatureDevEnabled: boolean isGumbyEnabled: boolean + disableCommands?: string[] } export class QuickActionGenerator { public isFeatureDevEnabled: boolean private isGumbyEnabled: boolean + private disabledCommands: string[] constructor(props: QuickActionGeneratorProps) { this.isFeatureDevEnabled = props.isFeatureDevEnabled this.isGumbyEnabled = props.isGumbyEnabled + this.disabledCommands = props.disableCommands ?? [] } public generateForTab(tabType: TabType): QuickActionCommandGroup[] { const quickActionCommands = [ { commands: [ - ...(this.isFeatureDevEnabled + ...(this.isFeatureDevEnabled && !this.disabledCommands.includes('/dev') ? [ { command: '/dev', @@ -33,11 +36,11 @@ export class QuickActionGenerator { }, ] : []), - ...(this.isGumbyEnabled + ...(this.isGumbyEnabled && !this.disabledCommands.includes('/transform') ? [ { command: '/transform', - description: 'Transform your Java 8 or 11 Maven project to Java 17', + description: 'Transform your Java project', }, ] : []), @@ -55,7 +58,7 @@ export class QuickActionGenerator { }, ], }, - ] + ].filter((section) => section.commands.length > 0) const commandUnavailability: Record< TabType, diff --git a/packages/core/src/amazonq/webview/ui/quickActions/handler.ts b/packages/core/src/amazonq/webview/ui/quickActions/handler.ts index 9202949c6ff..dc9ff8e7dba 100644 --- a/packages/core/src/amazonq/webview/ui/quickActions/handler.ts +++ b/packages/core/src/amazonq/webview/ui/quickActions/handler.ts @@ -15,6 +15,7 @@ export interface QuickActionsHandlerProps { tabsStorage: TabsStorage isFeatureDevEnabled: boolean isGumbyEnabled: boolean + disabledCommands?: string[] } export class QuickActionHandler { @@ -32,6 +33,7 @@ export class QuickActionHandler { this.tabDataGenerator = new TabDataGenerator({ isFeatureDevEnabled: props.isFeatureDevEnabled, isGumbyEnabled: props.isGumbyEnabled, + disabledCommands: props.disabledCommands, }) this.isFeatureDevEnabled = props.isFeatureDevEnabled this.isGumbyEnabled = props.isGumbyEnabled @@ -79,6 +81,7 @@ export class QuickActionHandler { if (this.tabsStorage.getTab(affectedTabId)?.type !== 'unknown') { affectedTabId = this.mynahUI.updateStore('', { loadingChat: true, + cancelButtonWhenLoading: false, }) } @@ -103,6 +106,7 @@ export class QuickActionHandler { // disable chat prompt this.mynahUI.updateStore(affectedTabId, { loadingChat: true, + cancelButtonWhenLoading: false, }) this.connector.transform(affectedTabId) @@ -161,6 +165,7 @@ export class QuickActionHandler { this.mynahUI.updateStore(affectedTabId, { loadingChat: true, promptInputDisabledState: true, + cancelButtonWhenLoading: false, }) void this.connector.requestGenerativeAIAnswer(affectedTabId, '', { diff --git a/packages/core/src/amazonq/webview/ui/storages/tabsStorage.ts b/packages/core/src/amazonq/webview/ui/storages/tabsStorage.ts index c858169315b..564dd8a7a69 100644 --- a/packages/core/src/amazonq/webview/ui/storages/tabsStorage.ts +++ b/packages/core/src/amazonq/webview/ui/storages/tabsStorage.ts @@ -14,6 +14,7 @@ export interface Tab { type: TabType isSelected: boolean openInteractionType?: TabOpenType + lastCommand?: string } export class TabsStorage { @@ -62,6 +63,18 @@ export class TabsStorage { return this.tabs.get(tabID)?.status === 'dead' } + public updateTabLastCommand(tabID: string, command?: string) { + if (command === undefined) { + return + } + const currentTabValue = this.tabs.get(tabID) + if (currentTabValue === undefined || currentTabValue.status === 'dead') { + return + } + currentTabValue.lastCommand = command + this.tabs.set(tabID, currentTabValue) + } + public updateTabStatus(tabID: string, tabStatus: TabStatus) { const currentTabValue = this.tabs.get(tabID) if (currentTabValue === undefined || currentTabValue.status === 'dead') { diff --git a/packages/core/src/amazonq/webview/ui/tabs/constants.ts b/packages/core/src/amazonq/webview/ui/tabs/constants.ts index 0db6a69d379..8696274c692 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/constants.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/constants.ts @@ -2,6 +2,7 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +import { isSQLTransformReady } from '../../../../dev/config' import { TabType } from '../storages/tabsStorage' export type TabTypeData = { @@ -33,7 +34,15 @@ What would you like to work on?`, gumby: { title: 'Q - Code Transformation', placeholder: 'Open a new tab to chat with Q', - welcome: `Welcome to Code Transformation! + welcome: isSQLTransformReady + ? `Welcome to code transformation! + +I can help you with the following tasks: +- Upgrade your Java 8 and Java 11 codebases to Java 17 +- Convert embedded SQL from Oracle databases to PostgreSQL + +What would you like to do? You can enter 'language upgrade' or 'SQL conversion'.` + : `Welcome to code transformation! I can help you upgrade your Java 8 and 11 codebases to Java 17.`, }, diff --git a/packages/core/src/amazonq/webview/ui/tabs/generator.ts b/packages/core/src/amazonq/webview/ui/tabs/generator.ts index b466fab7699..e78d21b4101 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/generator.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/generator.ts @@ -12,6 +12,7 @@ import { TabTypeDataMap } from './constants' export interface TabDataGeneratorProps { isFeatureDevEnabled: boolean isGumbyEnabled: boolean + disabledCommands?: string[] } export class TabDataGenerator { @@ -23,6 +24,7 @@ export class TabDataGenerator { this.quickActionsGenerator = new QuickActionGenerator({ isFeatureDevEnabled: props.isFeatureDevEnabled, isGumbyEnabled: props.isGumbyEnabled, + disableCommands: props.disabledCommands, }) } diff --git a/packages/core/src/amazonq/webview/ui/texts/constants.ts b/packages/core/src/amazonq/webview/ui/texts/constants.ts index d0fb74469ee..5ac1f34fda9 100644 --- a/packages/core/src/amazonq/webview/ui/texts/constants.ts +++ b/packages/core/src/amazonq/webview/ui/texts/constants.ts @@ -19,7 +19,7 @@ export const uiComponentsTexts = { save: 'Save', cancel: 'Cancel', submit: 'Submit', - stopGenerating: 'Stop generating', + stopGenerating: 'Stop', copyToClipboard: 'Copied to clipboard', noMoreTabsTooltip: 'You can only open ten conversation tabs at a time.', codeSuggestionWithReferenceTitle: 'Some suggestions contain code with references.', diff --git a/packages/core/src/amazonqFeatureDev/client/codewhispererruntime-2022-11-11.json b/packages/core/src/amazonqFeatureDev/client/codewhispererruntime-2022-11-11.json index c8690b720ee..79b9a0f66fd 100644 --- a/packages/core/src/amazonqFeatureDev/client/codewhispererruntime-2022-11-11.json +++ b/packages/core/src/amazonqFeatureDev/client/codewhispererruntime-2022-11-11.json @@ -353,8 +353,8 @@ }, "AppStudioStatePropertyValueString": { "type": "string", - "max": 1024, - "min": 1, + "max": 10240, + "min": 0, "sensitive": true }, "ArtifactId": { @@ -439,7 +439,8 @@ "acceptedCharacterCount": { "shape": "Integer" }, "acceptedLineCount": { "shape": "Integer" }, "acceptedSnippetHasReference": { "shape": "Boolean" }, - "hasProjectLevelContext": { "shape": "Boolean" } + "hasProjectLevelContext": { "shape": "Boolean" }, + "userIntent": { "shape": "UserIntent" } } }, "ChatInteractWithMessageEventInteractionTargetString": { @@ -613,6 +614,17 @@ }, "exception": true }, + "ConsoleState": { + "type": "structure", + "members": { + "region": { "shape": "String" }, + "consoleUrl": { "shape": "SensitiveString" }, + "serviceId": { "shape": "String" }, + "serviceConsolePage": { "shape": "String" }, + "serviceSubconsolePage": { "shape": "String" }, + "taskName": { "shape": "SensitiveString" } + } + }, "ContentChecksumType": { "type": "string", "enum": ["SHA_256"] @@ -657,7 +669,8 @@ "contentLength": { "shape": "CreateUploadUrlRequestContentLengthLong" }, "artifactType": { "shape": "ArtifactType" }, "uploadIntent": { "shape": "UploadIntent" }, - "uploadContext": { "shape": "UploadContext" } + "uploadContext": { "shape": "UploadContext" }, + "uploadId": { "shape": "UploadId" } } }, "CreateUploadUrlRequestContentChecksumString": { @@ -811,7 +824,8 @@ "members": { "document": { "shape": "TextDocument" }, "cursorState": { "shape": "CursorState" }, - "relevantDocuments": { "shape": "RelevantDocumentList" } + "relevantDocuments": { "shape": "RelevantDocumentList" }, + "useRelevantDocuments": { "shape": "Boolean" } } }, "EnvState": { @@ -1093,6 +1107,21 @@ "max": 10, "min": 0 }, + "InlineChatEvent": { + "type": "structure", + "members": { + "inputLength": { "shape": "PrimitiveInteger" }, + "numSelectedLines": { "shape": "PrimitiveInteger" }, + "codeIntent": { "shape": "Boolean" }, + "userDecision": { "shape": "InlineChatUserDecision" }, + "responseStartLatency": { "shape": "Double" }, + "responseEndLatency": { "shape": "Double" } + } + }, + "InlineChatUserDecision": { + "type": "string", + "enum": ["ACCEPT", "REJECT", "DISMISS"] + }, "Integer": { "type": "integer", "box": true @@ -1535,7 +1564,10 @@ "required": ["conversationState", "workspaceState"], "members": { "conversationState": { "shape": "ConversationState" }, - "workspaceState": { "shape": "WorkspaceState" } + "workspaceState": { "shape": "WorkspaceState" }, + "taskAssistPlan": { "shape": "TaskAssistPlan" }, + "codeGenerationId": { "shape": "CodeGenerationId" }, + "currentCodeGenerationId": { "shape": "CodeGenerationId" } } }, "StartTaskAssistCodeGenerationResponse": { @@ -1648,6 +1680,46 @@ "type": "string", "enum": ["DECLARATION", "USAGE"] }, + "TaskAssistPlan": { + "type": "list", + "member": { "shape": "TaskAssistPlanStep" }, + "min": 0 + }, + "TaskAssistPlanStep": { + "type": "structure", + "required": ["filePath", "description"], + "members": { + "filePath": { "shape": "TaskAssistPlanStepFilePathString" }, + "description": { "shape": "TaskAssistPlanStepDescriptionString" }, + "startLine": { "shape": "TaskAssistPlanStepStartLineInteger" }, + "endLine": { "shape": "TaskAssistPlanStepEndLineInteger" }, + "action": { "shape": "TaskAssistPlanStepAction" } + } + }, + "TaskAssistPlanStepAction": { + "type": "string", + "enum": ["MODIFY", "CREATE", "DELETE", "UNKNOWN"] + }, + "TaskAssistPlanStepDescriptionString": { + "type": "string", + "max": 1024, + "min": 1 + }, + "TaskAssistPlanStepEndLineInteger": { + "type": "integer", + "box": true, + "min": 0 + }, + "TaskAssistPlanStepFilePathString": { + "type": "string", + "max": 1024, + "min": 1 + }, + "TaskAssistPlanStepStartLineInteger": { + "type": "integer", + "box": true, + "min": 0 + }, "TaskAssistPlanningUploadContext": { "type": "structure", "required": ["conversationId"], @@ -1668,7 +1740,8 @@ "chatInteractWithMessageEvent": { "shape": "ChatInteractWithMessageEvent" }, "chatUserModificationEvent": { "shape": "ChatUserModificationEvent" }, "terminalUserInteractionEvent": { "shape": "TerminalUserInteractionEvent" }, - "featureDevEvent": { "shape": "FeatureDevEvent" } + "featureDevEvent": { "shape": "FeatureDevEvent" }, + "inlineChatEvent": { "shape": "InlineChatEvent" } }, "union": true }, @@ -1777,7 +1850,7 @@ }, "TransformationDownloadArtifactType": { "type": "string", - "enum": ["ClientInstructions", "Logs"] + "enum": ["ClientInstructions", "Logs", "GeneratedCode"] }, "TransformationDownloadArtifacts": { "type": "list", @@ -1808,7 +1881,15 @@ }, "TransformationLanguage": { "type": "string", - "enum": ["JAVA_8", "JAVA_11", "JAVA_17", "C_SHARP"] + "enum": ["JAVA_8", "JAVA_11", "JAVA_17", "C_SHARP", "COBOL", "PL_I", "JCL"] + }, + "TransformationLanguages": { + "type": "list", + "member": { "shape": "TransformationLanguage" } + }, + "TransformationMainframeRuntimeEnv": { + "type": "string", + "enum": ["MAINFRAME"] }, "TransformationOperatingSystemFamily": { "type": "string", @@ -1841,24 +1922,40 @@ }, "TransformationProgressUpdateStatus": { "type": "string", - "enum": ["IN_PROGRESS", "COMPLETED", "FAILED", "PAUSED"] + "enum": ["IN_PROGRESS", "COMPLETED", "FAILED", "PAUSED", "AWAITING_CLIENT_ACTION"] + }, + "TransformationProjectArtifactDescriptor": { + "type": "structure", + "members": { + "sourceCodeArtifact": { "shape": "TransformationSourceCodeArtifactDescriptor" } + }, + "union": true }, "TransformationProjectState": { "type": "structure", "members": { "language": { "shape": "TransformationLanguage" }, "runtimeEnv": { "shape": "TransformationRuntimeEnv" }, - "platformConfig": { "shape": "TransformationPlatformConfig" } + "platformConfig": { "shape": "TransformationPlatformConfig" }, + "projectArtifact": { "shape": "TransformationProjectArtifactDescriptor" } } }, "TransformationRuntimeEnv": { "type": "structure", "members": { "java": { "shape": "TransformationJavaRuntimeEnv" }, - "dotNet": { "shape": "TransformationDotNetRuntimeEnv" } + "dotNet": { "shape": "TransformationDotNetRuntimeEnv" }, + "mainframe": { "shape": "TransformationMainframeRuntimeEnv" } }, "union": true }, + "TransformationSourceCodeArtifactDescriptor": { + "type": "structure", + "members": { + "languages": { "shape": "TransformationLanguages" }, + "runtimeEnv": { "shape": "TransformationRuntimeEnv" } + } + }, "TransformationSpec": { "type": "structure", "members": { @@ -1912,11 +2009,11 @@ }, "TransformationType": { "type": "string", - "enum": ["LANGUAGE_UPGRADE"] + "enum": ["LANGUAGE_UPGRADE", "DOCUMENT_GENERATION"] }, "TransformationUploadArtifactType": { "type": "string", - "enum": ["Dependencies"] + "enum": ["Dependencies", "ClientBuildResult"] }, "TransformationUploadContext": { "type": "structure", @@ -1998,7 +2095,9 @@ "gitState": { "shape": "GitState" }, "envState": { "shape": "EnvState" }, "appStudioContext": { "shape": "AppStudioState" }, - "diagnostic": { "shape": "Diagnostic" } + "diagnostic": { "shape": "Diagnostic" }, + "consoleState": { "shape": "ConsoleState" }, + "userSettings": { "shape": "UserSettings" } } }, "UserIntent": { @@ -2011,7 +2110,8 @@ "CITE_SOURCES", "EXPLAIN_LINE_BY_LINE", "EXPLAIN_CODE_SELECTION", - "GENERATE_CLOUDFORMATION_TEMPLATE" + "GENERATE_CLOUDFORMATION_TEMPLATE", + "GENERATE_UNIT_TESTS" ] }, "UserModificationEvent": { @@ -2026,6 +2126,12 @@ "timestamp": { "shape": "Timestamp" } } }, + "UserSettings": { + "type": "structure", + "members": { + "hasConsentedToCrossRegionCalls": { "shape": "Boolean" } + } + }, "UserTriggerDecisionEvent": { "type": "structure", "required": [ diff --git a/packages/core/src/amazonqFeatureDev/client/featureDev.ts b/packages/core/src/amazonqFeatureDev/client/featureDev.ts index 61c1954f340..8cd5ee97f90 100644 --- a/packages/core/src/amazonqFeatureDev/client/featureDev.ts +++ b/packages/core/src/amazonqFeatureDev/client/featureDev.ts @@ -10,7 +10,6 @@ import { ServiceOptions } from '../../shared/awsClientBuilder' import globals from '../../shared/extensionGlobals' import { getLogger } from '../../shared/logger' import * as FeatureDevProxyClient from './featuredevproxyclient' -import apiConfig = require('./codewhispererruntime-2022-11-11.json') import { featureName } from '../constants' import { CodeReference } from '../../amazonq/webview/ui/connector' import { @@ -25,6 +24,7 @@ import { getCodewhispererConfig } from '../../codewhisperer/client/codewhisperer import { createCodeWhispererChatStreamingClient } from '../../shared/clients/codewhispererChatClient' import { getClientId, getOptOutPreference, getOperatingSystem } from '../../shared/telemetry/util' import { extensionVersion } from '../../shared/vscode/env' +import apiConfig = require('./codewhispererruntime-2022-11-11.json') // Re-enable once BE is able to handle retries. const writeAPIRetryOptions = { @@ -46,6 +46,9 @@ export async function createFeatureDevProxyClient(options?: Partial readonly followUpClicked: EventEmitter @@ -67,6 +70,7 @@ type OpenDiffMessage = { // currently the zip file path filePath: string deleted: boolean + codeGenerationId: string } type fileClickedMessage = { @@ -212,14 +216,15 @@ export class FeatureDevController { ) let defaultMessage - const isDenyListedError = denyListedErrors.some((err) => errorMessage.includes(err)) + const isDenyListedError = denyListedErrors.some((denyListedError) => err.message.includes(denyListedError)) - switch (err.code) { - case ContentLengthError.errorName: + switch (err.constructor.name) { + case ContentLengthError.name: this.messenger.sendAnswer({ type: 'answer', tabID: message.tabID, message: err.message + messageWithConversationId(session?.conversationIdUnsafe), + canBeVoted: true, }) this.messenger.sendAnswer({ type: 'system-prompt', @@ -233,14 +238,14 @@ export class FeatureDevController { ], }) break - case MonthlyConversationLimitError.errorName: + case MonthlyConversationLimitError.name: this.messenger.sendMonthlyLimitError(message.tabID) break - case FeatureDevServiceError.errorName: - case UploadCodeError.errorName: - case UserMessageNotFoundError.errorName: - case TabIdNotFoundError.errorName: - case PrepareRepoFailedError.errorName: + case FeatureDevServiceError.name: + case UploadCodeError.name: + case UserMessageNotFoundError.name: + case TabIdNotFoundError.name: + case PrepareRepoFailedError.name: this.messenger.sendErrorMessage( errorMessage, message.tabID, @@ -248,11 +253,11 @@ export class FeatureDevController { session?.conversationIdUnsafe ) break - case PromptRefusalException.errorName: - case ZipFileError.errorName: + case PromptRefusalException.name: + case ZipFileError.name: this.messenger.sendErrorMessage(errorMessage, message.tabID, 0, session?.conversationIdUnsafe, true) break - case NoChangeRequiredException.errorName: + case NoChangeRequiredException.name: this.messenger.sendAnswer({ type: 'answer', tabID: message.tabID, @@ -261,11 +266,12 @@ export class FeatureDevController { }) // Allow users to re-work the task description. return this.newTask(message) - case CodeIterationLimitError.errorName: + case CodeIterationLimitError.name: this.messenger.sendAnswer({ type: 'answer', tabID: message.tabID, message: err.message + messageWithConversationId(session?.conversationIdUnsafe), + canBeVoted: true, }) this.messenger.sendAnswer({ type: 'system-prompt', @@ -280,6 +286,14 @@ export class FeatureDevController { ], }) break + case UploadURLExpired.name: + this.messenger.sendAnswer({ + type: 'answer', + tabID: message.tabID, + message: err.message, + canBeVoted: true, + }) + break default: if (isDenyListedError || this.retriesRemaining(session) === 0) { defaultMessage = i18n('AWS.amazonq.featureDev.error.codeGen.denyListedError') @@ -299,6 +313,25 @@ export class FeatureDevController { } } + /** + * + * This function dispose cancellation token to free resources and provide a new token. + * Since user can abort a call in the same session, when the processing ends, we need provide a new one + * to start with the new prompt and allow the ability to stop again. + * + * @param session + */ + + private disposeToken(session: Session | undefined) { + if (session?.state?.tokenSource?.token.isCancellationRequested) { + session?.state.tokenSource?.dispose() + if (session?.state?.tokenSource) { + session.state.tokenSource = new vscode.CancellationTokenSource() + } + getLogger().debug('Request cancelled, skipping further processing') + } + } + // TODO add type private async processUserChatMessage(message: any) { if (message.message === undefined) { @@ -334,6 +367,7 @@ export class FeatureDevController { await this.onCodeGeneration(session, message.message, message.tabID) } } catch (err: any) { + this.disposeToken(session) await this.processErrorChatMessage(err, message, session) // Lock the chat input until they explicitly click one of the follow ups this.messenger.sendChatInputEnabled(message.tabID, false) @@ -364,6 +398,11 @@ export class FeatureDevController { await session.send(message) const filePaths = session.state.filePaths ?? [] const deletedFiles = session.state.deletedFiles ?? [] + // Only add the follow up accept/deny buttons when the tab hasn't been closed/request hasn't been cancelled + if (session?.state?.tokenSource?.token.isCancellationRequested) { + return + } + if (filePaths.length === 0 && deletedFiles.length === 0) { this.messenger.sendAnswer({ message: i18n('AWS.amazonq.featureDev.pillText.unableGenerateChanges'), @@ -390,17 +429,13 @@ export class FeatureDevController { return } - // Only add the follow up accept/deny buttons when the tab hasn't been closed/request hasn't been cancelled - if (session?.state.tokenSource.token.isCancellationRequested) { - return - } - this.messenger.sendCodeResult( filePaths, deletedFiles, session.state.references ?? [], tabID, - session.uploadId + session.uploadId, + session.state.codeGenerationId ?? '' ) const remainingIterations = session.state.codeGenerationRemainingIterationCount @@ -426,25 +461,82 @@ export class FeatureDevController { this.messenger.sendUpdatePlaceholder(tabID, i18n('AWS.amazonq.featureDev.pillText.selectOption')) } finally { // Finish processing the event - this.messenger.sendAsyncEventProgress(tabID, false, undefined) - // Lock the chat input until they explicitly click one of the follow ups - this.messenger.sendChatInputEnabled(tabID, false) - - if (!this.isAmazonQVisible) { - const open = 'Open chat' - const resp = await vscode.window.showInformationMessage( - i18n('AWS.amazonq.featureDev.answer.qGeneratedCode'), - open + if (session?.state?.tokenSource?.token.isCancellationRequested) { + this.workOnNewTask( + session, + session.state.codeGenerationRemainingIterationCount || + TotalSteps - (session.state?.currentIteration || 0), + session.state.codeGenerationTotalIterationCount || TotalSteps, + session?.state?.tokenSource?.token.isCancellationRequested ) - if (resp === open) { - await vscode.commands.executeCommand('aws.AmazonQChatView.focus') - // TODO add focusing on the specific tab once that's implemented + this.disposeToken(session) + } else { + this.messenger.sendAsyncEventProgress(tabID, false, undefined) + + // Lock the chat input until they explicitly click one of the follow ups + this.messenger.sendChatInputEnabled(tabID, false) + + if (!this.isAmazonQVisible) { + const open = 'Open chat' + const resp = await vscode.window.showInformationMessage( + i18n('AWS.amazonq.featureDev.answer.qGeneratedCode'), + open + ) + if (resp === open) { + await vscode.commands.executeCommand('aws.AmazonQChatView.focus') + // TODO add focusing on the specific tab once that's implemented + } } } } } + private workOnNewTask( + message: any, + remainingIterations: number = 0, + totalIterations?: number, + isStoppedGeneration: boolean = false + ) { + if (isStoppedGeneration) { + this.messenger.sendAnswer({ + message: + (remainingIterations ?? 0) <= 0 + ? "I stopped generating your code. You don't have more iterations left, however, you can start a new session." + : `I stopped generating your code. If you want to continue working on this task, provide another description. You have ${remainingIterations} out of ${totalIterations} code generations left.`, + type: 'answer-part', + tabID: message.tabID, + }) + } + + if ((remainingIterations <= 0 && isStoppedGeneration) || !isStoppedGeneration) { + this.messenger.sendAnswer({ + type: 'system-prompt', + tabID: message.tabID, + followUps: [ + { + pillText: i18n('AWS.amazonq.featureDev.pillText.newTask'), + type: FollowUpTypes.NewTask, + status: 'info', + }, + { + pillText: i18n('AWS.amazonq.featureDev.pillText.closeSession'), + type: FollowUpTypes.CloseSession, + status: 'info', + }, + ], + }) + this.messenger.sendChatInputEnabled(message.tabID, false) + this.messenger.sendUpdatePlaceholder(message.tabID, i18n('AWS.amazonq.featureDev.pillText.selectOption')) + return + } + // Ensure that chat input is enabled so that they can provide additional iterations if they choose + this.messenger.sendChatInputEnabled(message.tabID, true) + this.messenger.sendUpdatePlaceholder( + message.tabID, + i18n('AWS.amazonq.featureDev.placeholder.additionalImprovements') + ) + } // TODO add type private async insertCode(message: any) { let session @@ -464,7 +556,6 @@ export class FeatureDevController { result: 'Succeeded', }) await session.insertChanges() - this.messenger.sendAnswer({ type: 'answer', tabID: message.tabID, @@ -472,26 +563,10 @@ export class FeatureDevController { canBeVoted: true, }) - this.messenger.sendAnswer({ - type: 'system-prompt', - tabID: message.tabID, - followUps: [ - { - pillText: i18n('AWS.amazonq.featureDev.pillText.newTask'), - type: FollowUpTypes.NewTask, - status: 'info', - }, - { - pillText: i18n('AWS.amazonq.featureDev.pillText.closeSession'), - type: FollowUpTypes.CloseSession, - status: 'info', - }, - ], - }) - - this.messenger.sendUpdatePlaceholder( - message.tabID, - i18n('AWS.amazonq.featureDev.placeholder.additionalImprovements') + this.workOnNewTask( + message, + session.state.codeGenerationRemainingIterationCount, + session.state.codeGenerationTotalIterationCount ) } catch (err: any) { this.messenger.sendErrorMessage( @@ -686,6 +761,7 @@ export class FeatureDevController { private async openDiff(message: OpenDiffMessage) { const tabId: string = message.tabID + const codeGenerationId: string = message.messageId const zipFilePath: string = message.filePath const session = await this.sessionStorage.getSession(tabId) telemetry.amazonq_isReviewedChanges.emit({ @@ -702,14 +778,32 @@ export class FeatureDevController { const name = path.basename(pathInfos.relativePath) await openDeletedDiff(pathInfos.absolutePath, name, tabId) } else { - const rightPath = path.join(session.uploadId, zipFilePath) + let uploadId = session.uploadId + if (session?.state?.uploadHistory && session.state.uploadHistory[codeGenerationId]) { + uploadId = session?.state?.uploadHistory[codeGenerationId].uploadId + } + const rightPath = path.join(uploadId, zipFilePath) await openDiff(pathInfos.absolutePath, rightPath, tabId) } } private async stopResponse(message: any) { + telemetry.ui_click.emit({ elementId: 'amazonq_stopCodeGeneration' }) + this.messenger.sendAnswer({ + message: i18n('AWS.amazonq.featureDev.pillText.stoppingCodeGeneration'), + type: 'answer-part', + tabID: message.tabID, + }) + this.messenger.sendUpdatePlaceholder( + message.tabID, + i18n('AWS.amazonq.featureDev.pillText.stoppingCodeGeneration') + ) + this.messenger.sendChatInputEnabled(message.tabID, false) + const session = await this.sessionStorage.getSession(message.tabID) - session.state.tokenSource.cancel() + if (session.state?.tokenSource) { + session.state?.tokenSource?.cancel() + } } private async tabOpened(message: any) { diff --git a/packages/core/src/amazonqFeatureDev/controllers/chat/messenger/messenger.ts b/packages/core/src/amazonqFeatureDev/controllers/chat/messenger/messenger.ts index a1902bd8472..cac7f6ca571 100644 --- a/packages/core/src/amazonqFeatureDev/controllers/chat/messenger/messenger.ts +++ b/packages/core/src/amazonqFeatureDev/controllers/chat/messenger/messenger.ts @@ -85,6 +85,7 @@ export class Messenger { type: 'answer', tabID: tabID, message: showDefaultMessage ? errorMessage : i18n('AWS.amazonq.featureDev.error.technicalDifficulties'), + canBeVoted: true, }) this.sendFeedback(tabID) return @@ -115,9 +116,12 @@ export class Messenger { deletedFiles: DeletedFileInfo[], references: CodeReference[], tabID: string, - uploadId: string + uploadId: string, + codeGenerationId: string ) { - this.dispatcher.sendCodeResult(new CodeResultMessage(filePaths, deletedFiles, references, tabID, uploadId)) + this.dispatcher.sendCodeResult( + new CodeResultMessage(filePaths, deletedFiles, references, tabID, uploadId, codeGenerationId) + ) } public sendAsyncEventProgress(tabID: string, inProgress: boolean, message: string | undefined) { diff --git a/packages/core/src/amazonqFeatureDev/errors.ts b/packages/core/src/amazonqFeatureDev/errors.ts index 3462963ca9f..06e994080f3 100644 --- a/packages/core/src/amazonqFeatureDev/errors.ts +++ b/packages/core/src/amazonqFeatureDev/errors.ts @@ -17,8 +17,6 @@ export class ConversationIdNotFoundError extends ToolkitError { } export class TabIdNotFoundError extends ToolkitError { - static errorName = 'TabIdNotFoundError' - constructor() { super(i18n('AWS.amazonq.featureDev.error.tabIdNotFoundError'), { code: 'TabIdNotFound', @@ -26,12 +24,6 @@ export class TabIdNotFoundError extends ToolkitError { } } -export class PanelLoadError extends ToolkitError { - constructor() { - super(`${featureName} UI panel failed to load`, { code: 'PanelLoadFailed' }) - } -} - export class WorkspaceFolderNotFoundError extends ToolkitError { constructor() { super(i18n('AWS.amazonq.featureDev.error.workspaceFolderNotFoundError'), { @@ -41,7 +33,6 @@ export class WorkspaceFolderNotFoundError extends ToolkitError { } export class UserMessageNotFoundError extends ToolkitError { - static errorName = 'UserMessageNotFoundError' constructor() { super(i18n('AWS.amazonq.featureDev.error.userMessageNotFoundError'), { code: 'MessageNotFound', @@ -58,7 +49,6 @@ export class SelectedFolderNotInWorkspaceFolderError extends ToolkitError { } export class PromptRefusalException extends ToolkitError { - static errorName = 'PromptRefusalException' constructor() { super(i18n('AWS.amazonq.featureDev.error.promptRefusalException'), { code: 'PromptRefusalException', @@ -67,7 +57,6 @@ export class PromptRefusalException extends ToolkitError { } export class NoChangeRequiredException extends ToolkitError { - static errorName = 'NoChangeRequiredException' constructor() { super(i18n('AWS.amazonq.featureDev.error.noChangeRequiredException'), { code: 'NoChangeRequiredException', @@ -76,14 +65,12 @@ export class NoChangeRequiredException extends ToolkitError { } export class FeatureDevServiceError extends ToolkitError { - static errorName = 'FeatureDevServiceError' constructor(message: string, code: string) { super(message, { code }) } } export class PrepareRepoFailedError extends ToolkitError { - static errorName = 'PrepareRepoFailedError' constructor() { super(i18n('AWS.amazonq.featureDev.error.prepareRepoFailedError'), { code: 'PrepareRepoFailed', @@ -92,12 +79,17 @@ export class PrepareRepoFailedError extends ToolkitError { } export class UploadCodeError extends ToolkitError { - static errorName = 'UploadCodeError' constructor(statusCode: string) { super(uploadCodeError, { code: `UploadCode-${statusCode}` }) } } +export class UploadURLExpired extends ToolkitError { + constructor() { + super(i18n('AWS.amazonq.featureDev.error.uploadURLExpired'), { code: 'UploadURLExpired' }) + } +} + export class IllegalStateTransition extends ToolkitError { constructor() { super(i18n('AWS.amazonq.featureDev.error.illegalStateTransition'), { code: 'IllegalStateTransition' }) @@ -105,30 +97,26 @@ export class IllegalStateTransition extends ToolkitError { } export class ContentLengthError extends ToolkitError { - static errorName = 'ContentLengthError' constructor() { - super(i18n('AWS.amazonq.featureDev.error.contentLengthError'), { code: ContentLengthError.errorName }) + super(i18n('AWS.amazonq.featureDev.error.contentLengthError'), { code: ContentLengthError.name }) } } export class ZipFileError extends ToolkitError { - static errorName = 'ZipFileError' constructor() { - super(i18n('AWS.amazonq.featureDev.error.zipFileError'), { code: ZipFileError.errorName }) + super(i18n('AWS.amazonq.featureDev.error.zipFileError'), { code: ZipFileError.name }) } } export class CodeIterationLimitError extends ToolkitError { - static errorName = 'CodeIterationLimitError' constructor() { - super(i18n('AWS.amazonq.featureDev.error.codeIterationLimitError'), { code: CodeIterationLimitError.errorName }) + super(i18n('AWS.amazonq.featureDev.error.codeIterationLimitError'), { code: CodeIterationLimitError.name }) } } export class MonthlyConversationLimitError extends ToolkitError { - static errorName = 'MonthlyConversationLimitError' constructor(message: string) { - super(message, { code: MonthlyConversationLimitError.errorName }) + super(message, { code: MonthlyConversationLimitError.name }) } } diff --git a/packages/core/src/amazonqFeatureDev/session/session.ts b/packages/core/src/amazonqFeatureDev/session/session.ts index 01e6c9a2e45..204e974eee0 100644 --- a/packages/core/src/amazonqFeatureDev/session/session.ts +++ b/packages/core/src/amazonqFeatureDev/session/session.ts @@ -26,7 +26,6 @@ import { ReferenceLogViewProvider } from '../../codewhisperer/service/referenceL import { AuthUtil } from '../../codewhisperer/util/authUtil' import { getLogger } from '../../shared' import { logWithConversationId } from '../userFacingText' - export class Session { private _state?: SessionState | Omit private task: string = '' @@ -89,6 +88,7 @@ export class Session { ...this.getSessionStateConfig(), conversationId: this.conversationId, uploadId: '', + currentCodeGenerationId: undefined, }, [], [], @@ -130,12 +130,14 @@ export class Session { fs: this.config.fs, messenger: this.messenger, telemetry: this.telemetry, + tokenSource: this.state.tokenSource, + uploadHistory: this.state.uploadHistory, }) if (resp.nextState) { - // Cancel the request before moving to a new state - this.state.tokenSource.cancel() - + if (!this.state?.tokenSource?.token.isCancellationRequested) { + this.state?.tokenSource?.cancel() + } // Move to the next state this._state = resp.nextState } @@ -181,6 +183,10 @@ export class Session { return this._state } + get currentCodeGenerationId() { + return this.state.currentCodeGenerationId + } + get uploadId() { if (!('uploadId' in this.state)) { throw new Error("UploadId has to be initialized before it's read") diff --git a/packages/core/src/amazonqFeatureDev/session/sessionState.ts b/packages/core/src/amazonqFeatureDev/session/sessionState.ts index c26f1342e0c..939234b5947 100644 --- a/packages/core/src/amazonqFeatureDev/session/sessionState.ts +++ b/packages/core/src/amazonqFeatureDev/session/sessionState.ts @@ -36,7 +36,7 @@ import { import { prepareRepoData } from '../util/files' import { TelemetryHelper } from '../util/telemetryHelper' import { uploadCode } from '../util/upload' -import { CodeReference } from '../../amazonq/webview/ui/connector' +import { CodeReference, UploadHistory } from '../../amazonq/webview/ui/connector' import { isPresent } from '../../shared/utilities/collectionUtils' import { AuthUtil } from '../../codewhisperer/util/authUtil' import { randomUUID } from '../../shared/crypto' @@ -44,6 +44,8 @@ import { collectFiles, getWorkspaceFoldersByPrefixes } from '../../shared/utilit import { i18n } from '../../shared/i18n-helper' import { Messenger } from '../controllers/chat/messenger/messenger' +const EmptyCodeGenID = 'EMPTY_CURRENT_CODE_GENERATION_ID' + export class ConversationNotStartedState implements Omit { public tokenSource: vscode.CancellationTokenSource public readonly phase = DevPhase.INIT @@ -57,11 +59,12 @@ export class ConversationNotStartedState implements Omit val.index === 0)?.name ?? '' - ] + ]) if (folder === undefined) { + telemetry.toolkit_trackScenario.emit({ + count: 1, + amazonqConversationId: conversationId, + credentialStartUrl: AuthUtil.instance.startUrl, + scenario: 'wsOrphanedDocuments', + }) getLogger().error(`No workspace folder found for file: ${zipFilePath} and prefix: ${prefix}`) continue } @@ -124,12 +133,14 @@ function getDeletedFileInfos(deletedFiles: string[], workspaceFolders: CurrentWs } abstract class CodeGenBase { - private pollCount = 180 - private requestDelay = 10000 - readonly tokenSource: vscode.CancellationTokenSource + private pollCount = 360 + private requestDelay = 5000 + public tokenSource: vscode.CancellationTokenSource public phase: SessionStatePhase = DevPhase.CODEGEN public readonly conversationId: string public readonly uploadId: string + public currentCodeGenerationId?: string + public isCancellationRequested?: boolean constructor( protected config: SessionStateConfig, @@ -138,6 +149,7 @@ abstract class CodeGenBase { this.tokenSource = new vscode.CancellationTokenSource() this.conversationId = config.conversationId this.uploadId = config.uploadId + this.currentCodeGenerationId = config.currentCodeGenerationId || EmptyCodeGenID } async generateCode({ @@ -161,7 +173,7 @@ abstract class CodeGenBase { }> { for ( let pollingIteration = 0; - pollingIteration < this.pollCount && !this.tokenSource.token.isCancellationRequested; + pollingIteration < this.pollCount && !this.isCancellationRequested; ++pollingIteration ) { const codegenResult = await this.config.proxyClient.getCodeGeneration(this.conversationId, codeGenerationId) @@ -174,7 +186,13 @@ abstract class CodeGenBase { case CodeGenerationStatus.COMPLETE: { const { newFileContents, deletedFiles, references } = await this.config.proxyClient.exportResultArchive(this.conversationId) - const newFileInfo = registerNewFiles(fs, newFileContents, this.uploadId, workspaceFolders) + const newFileInfo = registerNewFiles( + fs, + newFileContents, + this.uploadId, + workspaceFolders, + this.conversationId + ) telemetry.setNumberOfFilesGenerated(newFileInfo.length) return { @@ -240,7 +258,7 @@ abstract class CodeGenBase { } } } - if (!this.tokenSource.token.isCancellationRequested) { + if (!this.isCancellationRequested) { // still in progress const errorMessage = i18n('AWS.amazonq.featureDev.error.codeGen.timeout') throw new ToolkitError(errorMessage, { code: 'CodeGenTimeout' }) @@ -260,7 +278,8 @@ export class CodeGenState extends CodeGenBase implements SessionState { public deletedFiles: DeletedFileInfo[], public references: CodeReference[], tabID: string, - private currentIteration: number, + public currentIteration: number, + public uploadHistory: UploadHistory, public codeGenerationRemainingIterationCount?: number, public codeGenerationTotalIterationCount?: number ) { @@ -270,6 +289,12 @@ export class CodeGenState extends CodeGenBase implements SessionState { async interact(action: SessionStateAction): Promise { return telemetry.amazonq_codeGenerationInvoke.run(async (span) => { try { + action.tokenSource?.token.onCancellationRequested(() => { + this.isCancellationRequested = true + if (action.tokenSource) { + this.tokenSource = action.tokenSource + } + }) span.record({ amazonqConversationId: this.config.conversationId, credentialStartUrl: AuthUtil.instance.startUrl, @@ -277,22 +302,26 @@ export class CodeGenState extends CodeGenBase implements SessionState { action.telemetry.setGenerateCodeIteration(this.currentIteration) action.telemetry.setGenerateCodeLastInvocationTime() - - const { codeGenerationId } = await this.config.proxyClient.startCodeGeneration( + const codeGenerationId = randomUUID() + await this.config.proxyClient.startCodeGeneration( this.config.conversationId, this.config.uploadId, - action.msg + action.msg, + codeGenerationId, + this.currentCodeGenerationId ) - action.messenger.sendAnswer({ - message: i18n('AWS.amazonq.featureDev.pillText.generatingCode'), - type: 'answer-part', - tabID: this.tabID, - }) - action.messenger.sendUpdatePlaceholder( - this.tabID, - i18n('AWS.amazonq.featureDev.pillText.generatingCode') - ) + if (!this.isCancellationRequested) { + action.messenger.sendAnswer({ + message: i18n('AWS.amazonq.featureDev.pillText.generatingCode'), + type: 'answer-part', + tabID: this.tabID, + }) + action.messenger.sendUpdatePlaceholder( + this.tabID, + i18n('AWS.amazonq.featureDev.pillText.generatingCode') + ) + } const codeGeneration = await this.generateCode({ messenger: action.messenger, @@ -302,12 +331,27 @@ export class CodeGenState extends CodeGenBase implements SessionState { workspaceFolders: this.config.workspaceFolders, }) + if (codeGeneration && !action.tokenSource?.token.isCancellationRequested) { + this.config.currentCodeGenerationId = codeGenerationId + this.currentCodeGenerationId = codeGenerationId + } + this.filePaths = codeGeneration.newFiles this.deletedFiles = codeGeneration.deletedFiles this.references = codeGeneration.references this.codeGenerationRemainingIterationCount = codeGeneration.codeGenerationRemainingIterationCount this.codeGenerationTotalIterationCount = codeGeneration.codeGenerationTotalIterationCount + if (action.uploadHistory && !action.uploadHistory[codeGenerationId] && codeGenerationId) { + action.uploadHistory[codeGenerationId] = { + timestamp: Date.now(), + uploadId: this.config.uploadId, + filePaths: codeGeneration.newFiles, + deletedFiles: codeGeneration.deletedFiles, + tabId: this.tabID, + } + } + action.telemetry.setAmazonqNumberOfReferences(this.references.length) action.telemetry.recordUserCodeGenerationTelemetry(span, this.conversationId) const nextState = new PrepareCodeGenState( @@ -318,7 +362,11 @@ export class CodeGenState extends CodeGenBase implements SessionState { this.tabID, this.currentIteration + 1, this.codeGenerationRemainingIterationCount, - this.codeGenerationTotalIterationCount + this.codeGenerationTotalIterationCount, + action.uploadHistory, + this.tokenSource, + this.currentCodeGenerationId, + codeGenerationId ) return { nextState, @@ -338,6 +386,7 @@ export class MockCodeGenState implements SessionState { public filePaths: NewFileInfo[] public deletedFiles: DeletedFileInfo[] public readonly conversationId: string + public readonly codeGenerationId?: string public readonly uploadId: string constructor( @@ -364,7 +413,13 @@ export class MockCodeGenState implements SessionState { zipFilePath: f.zipFilePath, fileContent: f.fileContent, })) - this.filePaths = registerNewFiles(action.fs, newFileContents, this.uploadId, this.config.workspaceFolders) + this.filePaths = registerNewFiles( + action.fs, + newFileContents, + this.uploadId, + this.config.workspaceFolders, + this.conversationId + ) this.deletedFiles = [ { zipFilePath: 'src/this-file-should-be-deleted.ts', @@ -384,7 +439,8 @@ export class MockCodeGenState implements SessionState { }, ], this.tabID, - this.uploadId + this.uploadId, + this.codeGenerationId ?? '' ) action.messenger.sendAnswer({ message: undefined, @@ -419,23 +475,30 @@ export class MockCodeGenState implements SessionState { } export class PrepareCodeGenState implements SessionState { - public tokenSource: vscode.CancellationTokenSource public readonly phase = DevPhase.CODEGEN public uploadId: string public conversationId: string + public tokenSource: vscode.CancellationTokenSource constructor( private config: SessionStateConfig, public filePaths: NewFileInfo[], public deletedFiles: DeletedFileInfo[], public references: CodeReference[], public tabID: string, - private currentIteration: number, + public currentIteration: number, public codeGenerationRemainingIterationCount?: number, - public codeGenerationTotalIterationCount?: number + public codeGenerationTotalIterationCount?: number, + public uploadHistory: UploadHistory = {}, + public superTokenSource: vscode.CancellationTokenSource = new vscode.CancellationTokenSource(), + public currentCodeGenerationId?: string, + public codeGenerationId?: string ) { - this.tokenSource = new vscode.CancellationTokenSource() + this.tokenSource = superTokenSource || new vscode.CancellationTokenSource() this.uploadId = config.uploadId + this.currentCodeGenerationId = currentCodeGenerationId this.conversationId = config.conversationId + this.uploadHistory = uploadHistory + this.codeGenerationId = codeGenerationId } updateWorkspaceRoot(workspaceRoot: string) { @@ -450,7 +513,6 @@ export class PrepareCodeGenState implements SessionState { }) action.messenger.sendUpdatePlaceholder(this.tabID, i18n('AWS.amazonq.featureDev.pillText.uploadingCode')) - const uploadId = await telemetry.amazonq_createUpload.run(async (span) => { span.record({ amazonqConversationId: this.config.conversationId, @@ -462,35 +524,40 @@ export class PrepareCodeGenState implements SessionState { action.telemetry, span ) - - const { uploadUrl, uploadId, kmsKeyArn } = await this.config.proxyClient.createUploadUrl( + const uploadId = randomUUID() + const { uploadUrl, kmsKeyArn } = await this.config.proxyClient.createUploadUrl( this.config.conversationId, zipFileChecksum, - zipFileBuffer.length + zipFileBuffer.length, + uploadId ) await uploadCode(uploadUrl, zipFileBuffer, zipFileChecksum, kmsKeyArn) - action.messenger.sendAnswer({ - message: i18n('AWS.amazonq.featureDev.pillText.contextGatheringCompleted'), - type: 'answer-part', - tabID: this.tabID, - }) + if (!action.tokenSource?.token.isCancellationRequested) { + action.messenger.sendAnswer({ + message: i18n('AWS.amazonq.featureDev.pillText.contextGatheringCompleted'), + type: 'answer-part', + tabID: this.tabID, + }) - action.messenger.sendUpdatePlaceholder( - this.tabID, - i18n('AWS.amazonq.featureDev.pillText.contextGatheringCompleted') - ) + action.messenger.sendUpdatePlaceholder( + this.tabID, + i18n('AWS.amazonq.featureDev.pillText.contextGatheringCompleted') + ) + } return uploadId }) this.uploadId = uploadId + const nextState = new CodeGenState( - { ...this.config, uploadId }, + { ...this.config, uploadId: this.uploadId, currentCodeGenerationId: this.currentCodeGenerationId }, this.filePaths, this.deletedFiles, this.references, this.tabID, - this.currentIteration + this.currentIteration, + this.uploadHistory ) return nextState.interact(action) } diff --git a/packages/core/src/amazonqFeatureDev/types.ts b/packages/core/src/amazonqFeatureDev/types.ts index fafe26a9e24..cf046743425 100644 --- a/packages/core/src/amazonqFeatureDev/types.ts +++ b/packages/core/src/amazonqFeatureDev/types.ts @@ -9,7 +9,7 @@ import type { CancellationTokenSource } from 'vscode' import { Messenger } from './controllers/chat/messenger/messenger' import { FeatureDevClient } from './client/featureDev' import { TelemetryHelper } from './util/telemetryHelper' -import { CodeReference } from '../amazonq/webview/ui/connector' +import { CodeReference, UploadHistory } from '../amazonq/webview/ui/connector' import { DiffTreeFileInfo } from '../amazonq/webview/ui/diffTree/types' export type Interaction = { @@ -21,6 +21,7 @@ export type Interaction = { export interface SessionStateInteraction { nextState: SessionState | Omit | undefined interaction: Interaction + currentCodeGenerationId?: string } export enum DevPhase { @@ -60,12 +61,16 @@ export interface SessionState { readonly references?: CodeReference[] readonly phase?: SessionStatePhase readonly uploadId: string - readonly tokenSource: CancellationTokenSource + readonly currentIteration?: number + currentCodeGenerationId?: string + tokenSource?: CancellationTokenSource + readonly codeGenerationId?: string readonly tabID: string interact(action: SessionStateAction): Promise updateWorkspaceRoot?: (workspaceRoot: string) => void codeGenerationRemainingIterationCount?: number codeGenerationTotalIterationCount?: number + uploadHistory?: UploadHistory } export interface SessionStateConfig { @@ -74,6 +79,7 @@ export interface SessionStateConfig { conversationId: string proxyClient: FeatureDevClient uploadId: string + currentCodeGenerationId?: string } export interface SessionStateAction { @@ -82,6 +88,8 @@ export interface SessionStateAction { messenger: Messenger fs: VirtualFileSystem telemetry: TelemetryHelper + uploadHistory?: UploadHistory + tokenSource?: CancellationTokenSource } export type NewFileZipContents = { zipFilePath: string; fileContent: string } diff --git a/packages/core/src/amazonqFeatureDev/util/files.ts b/packages/core/src/amazonqFeatureDev/util/files.ts index cffa74af867..1b83bdbe2b5 100644 --- a/packages/core/src/amazonqFeatureDev/util/files.ts +++ b/packages/core/src/amazonqFeatureDev/util/files.ts @@ -18,6 +18,7 @@ import { AmazonqCreateUpload, Span, telemetry as amznTelemetry } from '../../sha import { TelemetryHelper } from './telemetryHelper' import { maxRepoSizeBytes } from '../constants' import { isCodeFile } from '../../shared/filetypes' +import { fs } from '../../shared' const getSha256 = (file: Buffer) => createHash('sha256').update(file).digest('base64') @@ -28,17 +29,17 @@ export async function prepareRepoData( repoRootPaths: string[], workspaceFolders: CurrentWsFolders, telemetry: TelemetryHelper, - span: Span + span: Span, + zip: AdmZip = new AdmZip() ) { try { const files = await collectFiles(repoRootPaths, workspaceFolders, true, maxRepoSizeBytes) - const zip = new AdmZip() let totalBytes = 0 const ignoredExtensionMap = new Map() for (const file of files) { - const fileSize = (await vscode.workspace.fs.stat(file.fileUri)).size + const fileSize = (await fs.stat(file.fileUri)).size const isCodeFile_ = isCodeFile(file.relativeFilePath) if (fileSize >= maxFileSizeBytes || !isCodeFile_) { diff --git a/packages/core/src/amazonqFeatureDev/util/upload.ts b/packages/core/src/amazonqFeatureDev/util/upload.ts index 1b7b6a4404b..f9324cfacb8 100644 --- a/packages/core/src/amazonqFeatureDev/util/upload.ts +++ b/packages/core/src/amazonqFeatureDev/util/upload.ts @@ -7,7 +7,9 @@ import request, { RequestError } from '../../shared/request' import { getLogger } from '../../shared/logger/logger' import { featureName } from '../constants' -import { UploadCodeError } from '../errors' +import { UploadCodeError, UploadURLExpired } from '../errors' +import { ToolkitError } from '../../shared' +import { i18n } from '../../shared/i18n-helper' /** * uploadCode @@ -30,8 +32,16 @@ export async function uploadCode(url: string, buffer: Buffer, checksumSha256: st }).response } catch (e: any) { getLogger().error(`${featureName}: failed to upload code to s3: ${(e as Error).message}`) - throw new UploadCodeError( - e instanceof RequestError ? `${e.response.status}: ${e.response.statusText}` : 'Unknown' - ) + if (e instanceof RequestError) { + switch (e.response.status) { + case 403: + throw new UploadURLExpired() + default: + throw new UploadCodeError( + e instanceof RequestError ? `${e.response.status}: ${e.response.statusText}` : 'Unknown' + ) + } + } + throw ToolkitError.chain(e, i18n('AWS.amazonq.featureDev.error.codeGen.default')) } } diff --git a/packages/core/src/amazonqFeatureDev/views/actions/uiMessageListener.ts b/packages/core/src/amazonqFeatureDev/views/actions/uiMessageListener.ts index 790dd1a6e05..33ed5205c91 100644 --- a/packages/core/src/amazonqFeatureDev/views/actions/uiMessageListener.ts +++ b/packages/core/src/amazonqFeatureDev/views/actions/uiMessageListener.ts @@ -108,6 +108,7 @@ export class UIMessageListener { tabID: msg.tabID, filePath: msg.filePath, deleted: msg.deleted, + messageId: msg.messageId, }) } diff --git a/packages/core/src/amazonqFeatureDev/views/connector/connector.ts b/packages/core/src/amazonqFeatureDev/views/connector/connector.ts index 06cba2b6256..9d1e681bf9c 100644 --- a/packages/core/src/amazonqFeatureDev/views/connector/connector.ts +++ b/packages/core/src/amazonqFeatureDev/views/connector/connector.ts @@ -33,6 +33,7 @@ export class ErrorMessage extends UiMessage { export class CodeResultMessage extends UiMessage { readonly message!: string + readonly codeGenerationId!: string readonly references!: { information: string recommendationContentSpan: { @@ -48,7 +49,8 @@ export class CodeResultMessage extends UiMessage { readonly deletedFiles: DeletedFileInfo[], references: CodeReference[], tabID: string, - conversationID: string + conversationID: string, + codeGenerationId: string ) { super(tabID) this.references = references @@ -64,6 +66,7 @@ export class CodeResultMessage extends UiMessage { }, } }) + this.codeGenerationId = codeGenerationId this.conversationID = conversationID } } diff --git a/packages/core/src/amazonqGumby/app.ts b/packages/core/src/amazonqGumby/app.ts index d8cba099509..1638231ef24 100644 --- a/packages/core/src/amazonqGumby/app.ts +++ b/packages/core/src/amazonqGumby/app.ts @@ -71,4 +71,5 @@ export function init(appContext: AmazonQAppInitContext) { showTransformationHub.register() transformByQState.setChatControllers(gumbyChatControllerEventEmitters) + transformByQState.setChatMessenger(messenger) } diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index eea6313e449..1a9cd74bb73 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -5,7 +5,7 @@ * This class is responsible for responding to UI events by calling * the Gumby extension. */ -import nodefs from 'fs' +import nodefs from 'fs' // eslint-disable-line no-restricted-imports import path from 'path' import * as vscode from 'vscode' import { GumbyNamedMessages, Messenger } from './messenger/messenger' @@ -19,18 +19,21 @@ import { cleanupTransformationJob, compileProject, finishHumanInTheLoop, - getValidCandidateProjects, + getValidLanguageUpgradeCandidateProjects, openBuildLogFile, openHilPomFile, parseBuildFile, postTransformationJob, - processTransformFormInput, + processLanguageUpgradeTransformFormInput, + processSQLConversionTransformFormInput, startTransformByQ, stopTransformByQ, validateCanCompileProject, setMaven, + getValidSQLConversionCandidateProjects, + validateSQLMetadataFile, } from '../../../codewhisperer/commands/startTransformByQ' -import { JDKVersion, TransformationCandidateProject, transformByQState } from '../../../codewhisperer/models/model' +import { JDKVersion, transformByQState } from '../../../codewhisperer/models/model' import { AbsolutePathDetectedError, AlternateDependencyVersionsNotFoundError, @@ -39,6 +42,7 @@ import { ModuleUploadError, NoJavaProjectsFoundError, NoMavenJavaProjectsFoundError, + NoOpenProjectsError, TransformationPreBuildError, } from '../../errors' import * as CodeWhispererConstants from '../../../codewhisperer/models/constants' @@ -56,6 +60,9 @@ import { getAuthType } from '../../../codewhisperer/service/transformByQ/transfo import DependencyVersions from '../../models/dependencies' import { getStringHash } from '../../../shared/utilities/textUtilities' import { getVersionData } from '../../../codewhisperer/service/transformByQ/transformMavenHandler' +import AdmZip from 'adm-zip' +import { AuthError } from '../../../auth/sso/server' +import { isSQLTransformReady } from '../../../dev/config' // These events can be interactions within the chat, // or elsewhere in the IDE @@ -183,76 +190,88 @@ export class GumbyController { } private async transformInitiated(message: any) { + // feature flag for SQL transformations + if (!isSQLTransformReady) { + await this.handleLanguageUpgrade(message) + return + } + + // if previous transformation was already running, show correct message to user + switch (this.sessionStorage.getSession().conversationState) { + case ConversationState.JOB_SUBMITTED: + this.messenger.sendAsyncEventProgress( + message.tabID, + true, + undefined, + GumbyNamedMessages.JOB_SUBMISSION_STATUS_MESSAGE + ) + this.messenger.sendJobSubmittedMessage(message.tabID) + return + case ConversationState.COMPILING: + this.messenger.sendAsyncEventProgress( + message.tabID, + true, + undefined, + GumbyNamedMessages.COMPILATION_PROGRESS_MESSAGE + ) + this.messenger.sendCompilationInProgress(message.tabID) + return + } + // Start /transform chat flow - const session: Session = this.sessionStorage.getSession() CodeTransformTelemetryState.instance.setSessionId() - try { - await telemetry.codeTransform_initiateTransform.run(async () => { - const authType = await getAuthType() - telemetry.record({ - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - credentialSourceId: authType, - }) + this.sessionStorage.getSession().conversationState = ConversationState.WAITING_FOR_TRANSFORMATION_OBJECTIVE + this.messenger.sendStaticTextResponse('choose-transformation-objective', message.tabID) + this.messenger.sendChatInputEnabled(message.tabID, true) + this.messenger.sendUpdatePlaceholder(message.tabID, "Enter 'language upgrade' or 'SQL conversion'") + } - // check that a project is open - const workspaceFolders = vscode.workspace.workspaceFolders - if (workspaceFolders === undefined || workspaceFolders.length === 0) { - this.messenger.sendUnrecoverableErrorResponse('no-project-found', message.tabID) - telemetry.record({ result: MetadataResult.Fail, reason: 'no-project-found' }) - return - } + private async beginTransformation(message: any) { + await telemetry.codeTransform_initiateTransform.run(async () => { + const authType = await getAuthType() + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + credentialSourceId: authType, + }) - // check that the session is authenticated - const authState = await AuthUtil.instance.getChatAuthState() - if (authState.amazonQ !== 'connected') { - void this.messenger.sendAuthNeededExceptionMessage(authState, message.tabID) - session.isAuthenticating = true - telemetry.record({ result: MetadataResult.Fail, reason: 'auth-failed' }) - return - } + const authState = await AuthUtil.instance.getChatAuthState() + if (authState.amazonQ !== 'connected') { + this.sessionStorage.getSession().isAuthenticating = true + await this.messenger.sendAuthNeededExceptionMessage(authState, message.tabID) + throw new AuthError('Not connected to Amazon Q', `AuthState=${authState.amazonQ}`) + } + this.messenger.sendTransformationIntroduction(message.tabID) + }) + } - // If previous transformation was already running - switch (this.sessionStorage.getSession().conversationState) { - case ConversationState.JOB_SUBMITTED: - this.messenger.sendAsyncEventProgress( - message.tabID, - true, - undefined, - GumbyNamedMessages.JOB_SUBMISSION_STATUS_MESSAGE - ) - this.messenger.sendJobSubmittedMessage(message.tabID) - return - case ConversationState.COMPILING: - this.messenger.sendAsyncEventProgress( - message.tabID, - true, - undefined, - GumbyNamedMessages.COMPILATION_PROGRESS_MESSAGE - ) - this.messenger.sendCompilationInProgress(message.tabID) - return - } - this.messenger.sendTransformationIntroduction(message.tabID) - }) - } catch (e: any) { - // if there was an issue getting the list of valid projects, the error message will be shown here - this.messenger.sendErrorMessage(e.message, message.tabID) + private async handleLanguageUpgrade(message: any) { + try { + await this.beginTransformation(message) + const validProjects = await this.validateLanguageUpgradeProjects(message) + if (validProjects.length > 0) { + this.sessionStorage.getSession().updateCandidateProjects(validProjects) + await this.messenger.sendLanguageUpgradeProjectPrompt(validProjects, message.tabID) + } + } catch (err: any) { + getLogger().error(`Error handling language upgrade: ${err}`) } + } + private async handleSQLConversion(message: any) { try { - const validProjects = await this.validateProjectsWithReplyOnError(message) + await this.beginTransformation(message) + const validProjects = await this.validateSQLConversionProjects(message) if (validProjects.length > 0) { this.sessionStorage.getSession().updateCandidateProjects(validProjects) - await this.messenger.sendProjectPrompt(validProjects, message.tabID) + await this.messenger.sendSelectSQLMetadataFileMessage(message.tabID) } } catch (err: any) { - // if there was an issue getting the list of valid projects, the error message will be shown here - this.messenger.sendErrorMessage(err.message, message.tabID) + getLogger().error(`Error handling SQL conversion: ${err}`) } } - private async validateProjectsWithReplyOnError(message: any): Promise { + private async validateLanguageUpgradeProjects(message: any) { let telemetryJavaVersion = JDKToTelemetryValue(JDKVersion.UNSUPPORTED) as CodeTransformJavaSourceVersionsAllowed try { const validProjects = await telemetry.codeTransform_validateProject.run(async () => { @@ -261,7 +280,7 @@ export class GumbyController { codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), }) - const validProjects = await getValidCandidateProjects() + const validProjects = await getValidLanguageUpgradeCandidateProjects() if (validProjects.length > 0) { // validProjects[0].JDKVersion will be undefined if javap errors out or no .class files found, so call it UNSUPPORTED const javaVersion = validProjects[0].JDKVersion ?? JDKVersion.UNSUPPORTED @@ -282,7 +301,27 @@ export class GumbyController { this.messenger.sendUnrecoverableErrorResponse('no-java-project-found', message.tabID) } else if (e instanceof NoMavenJavaProjectsFoundError) { this.messenger.sendUnrecoverableErrorResponse('no-maven-java-project-found', message.tabID) - } else { + } else if (e instanceof NoOpenProjectsError) { + this.messenger.sendUnrecoverableErrorResponse('no-project-found', message.tabID) + } + } + return [] + } + + private async validateSQLConversionProjects(message: any) { + try { + const validProjects = await telemetry.codeTransform_validateProject.run(async () => { + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + }) + const validProjects = await getValidSQLConversionCandidateProjects() + return validProjects + }) + return validProjects + } catch (e: any) { + if (e instanceof NoJavaProjectsFoundError) { + this.messenger.sendUnrecoverableErrorResponse('no-java-project-found', message.tabID) + } else if (e instanceof NoOpenProjectsError) { this.messenger.sendUnrecoverableErrorResponse('no-project-found', message.tabID) } } @@ -292,8 +331,8 @@ export class GumbyController { private async formActionClicked(message: any) { const typedAction = MessengerUtils.stringToEnumValue(ButtonActions, message.action as any) switch (typedAction) { - case ButtonActions.CONFIRM_TRANSFORMATION_FORM: - await this.handleUserProjectSelection(message) + case ButtonActions.CONFIRM_LANGUAGE_UPGRADE_TRANSFORMATION_FORM: + await this.handleUserLanguageUpgradeProjectChoice(message) break case ButtonActions.CANCEL_TRANSFORMATION_FORM: telemetry.codeTransform_submitSelection.emit({ @@ -301,7 +340,10 @@ export class GumbyController { userChoice: 'Cancel', result: MetadataResult.Pass, }) - this.messenger.sendJobFinishedMessage(message.tabID, CodeWhispererConstants.jobCancelledChatMessage) + this.transformationFinished({ + message: CodeWhispererConstants.jobCancelledChatMessage, + tabID: message.tabID, + }) break case ButtonActions.CONFIRM_SKIP_TESTS_FORM: await this.handleSkipTestsSelection(message) @@ -309,6 +351,12 @@ export class GumbyController { case ButtonActions.CANCEL_SKIP_TESTS_FORM: this.messenger.sendJobFinishedMessage(message.tabID, CodeWhispererConstants.jobCancelledChatMessage) break + case ButtonActions.CONFIRM_SQL_CONVERSION_TRANSFORMATION_FORM: + await this.handleUserSQLConversionProjectSelection(message) + break + case ButtonActions.SELECT_SQL_CONVERSION_METADATA_FILE: + await this.processMetadataFile(message) + break case ButtonActions.VIEW_TRANSFORMATION_HUB: await vscode.commands.executeCommand(GumbyCommands.FOCUS_TRANSFORMATION_HUB, CancelActionPositions.Chat) this.messenger.sendJobSubmittedMessage(message.tabID) @@ -357,43 +405,74 @@ export class GumbyController { await this.validateBuildWithPromptOnError(message) } - // prompt user to pick project and specify source JDK version - private async handleUserProjectSelection(message: any) { + private async handleUserLanguageUpgradeProjectChoice(message: any) { await telemetry.codeTransform_submitSelection.run(async () => { - const pathToProject: string = message.formSelectedValues['GumbyTransformProjectForm'] + const pathToProject: string = message.formSelectedValues['GumbyTransformLanguageUpgradeProjectForm'] const toJDKVersion: JDKVersion = message.formSelectedValues['GumbyTransformJdkToForm'] const fromJDKVersion: JDKVersion = message.formSelectedValues['GumbyTransformJdkFromForm'] telemetry.record({ + // TODO: remove JavaSource/TargetVersionsAllowed when BI is updated to use source/target codeTransformJavaSourceVersionsAllowed: JDKToTelemetryValue( fromJDKVersion ) as CodeTransformJavaSourceVersionsAllowed, codeTransformJavaTargetVersionsAllowed: JDKToTelemetryValue( toJDKVersion ) as CodeTransformJavaTargetVersionsAllowed, + source: fromJDKVersion, + target: toJDKVersion, codeTransformProjectId: pathToProject === undefined ? telemetryUndefined : getStringHash(pathToProject), - userChoice: 'Confirm', + userChoice: 'Confirm-Java', }) const projectName = path.basename(pathToProject) - this.messenger.sendProjectSelectionMessage(projectName, fromJDKVersion, toJDKVersion, message.tabID) + this.messenger.sendLanguageUpgradeProjectChoiceMessage( + projectName, + fromJDKVersion, + toJDKVersion, + message.tabID + ) if (fromJDKVersion === JDKVersion.UNSUPPORTED) { this.messenger.sendUnrecoverableErrorResponse('unsupported-source-jdk-version', message.tabID) - telemetry.record({ - result: MetadataResult.Fail, - reason: 'unsupported-source-jdk-version', - }) return } - await processTransformFormInput(pathToProject, fromJDKVersion, toJDKVersion) - + await processLanguageUpgradeTransformFormInput(pathToProject, fromJDKVersion, toJDKVersion) await this.messenger.sendSkipTestsPrompt(message.tabID) }) } - private async prepareProjectForSubmission(message: { pathToJavaHome: string; tabID: string }): Promise { + private async handleUserSQLConversionProjectSelection(message: any) { + await telemetry.codeTransform_submitSelection.run(async () => { + const pathToProject: string = message.formSelectedValues['GumbyTransformSQLConversionProjectForm'] + const schema: string = message.formSelectedValues['GumbyTransformSQLSchemaForm'] + + telemetry.record({ + codeTransformProjectId: pathToProject === undefined ? telemetryUndefined : getStringHash(pathToProject), + source: transformByQState.getSourceDB(), + target: transformByQState.getTargetDB(), + userChoice: 'Confirm-SQL', + }) + + const projectName = path.basename(pathToProject) + this.messenger.sendSQLConversionProjectSelectionMessage(projectName, schema, message.tabID) + + await processSQLConversionTransformFormInput(pathToProject, schema) + + this.messenger.sendAsyncEventProgress( + message.tabID, + true, + undefined, + GumbyNamedMessages.JOB_SUBMISSION_STATUS_MESSAGE + ) + this.messenger.sendJobSubmittedMessage(message.tabID) + this.sessionStorage.getSession().conversationState = ConversationState.JOB_SUBMITTED + await startTransformByQ() + }) + } + + private async prepareLanguageUpgradeProject(message: { pathToJavaHome: string; tabID: string }) { if (message.pathToJavaHome) { transformByQState.setJavaHome(message.pathToJavaHome) getLogger().info( @@ -415,6 +494,7 @@ export class GumbyController { this.messenger.sendCompilationFinished(message.tabID) + // since compilation can potentially take a long time, double check auth const authState = await AuthUtil.instance.getChatAuthState() if (authState.amazonQ !== 'connected') { void this.messenger.sendAuthNeededExceptionMessage(authState, message.tabID) @@ -436,6 +516,7 @@ export class GumbyController { await startTransformByQ() } + // only for Language Upgrades private async validateBuildWithPromptOnError(message: any | undefined = undefined): Promise { try { // Check Java Home is set (not yet prebuilding) @@ -446,12 +527,53 @@ export class GumbyController { this.messenger.sendStaticTextResponse('java-home-not-set', message.tabID) this.messenger.sendChatInputEnabled(message.tabID, true) this.messenger.sendUpdatePlaceholder(message.tabID, 'Enter the path to your Java installation.') - return } - throw err + return } - await this.prepareProjectForSubmission(message) + await this.prepareLanguageUpgradeProject(message) + } + + private async processMetadataFile(message: any) { + const fileUri = await vscode.window.showOpenDialog({ + canSelectMany: false, + openLabel: 'Select', + filters: { + 'SCT metadata': ['zip'], // Restrict user to only pick a .zip file + }, + }) + + if (!fileUri || fileUri.length === 0) { + // user closed the dialog + this.transformationFinished({ + message: CodeWhispererConstants.jobCancelledChatMessage, + tabID: message.tabID, + }) + return + } + + const metadataZip = new AdmZip(fileUri[0].fsPath) + const fileEntries = metadataZip.getEntries() + const metadataFile = fileEntries.find((entry) => entry.name.endsWith('.sct')) + if (!metadataFile) { + this.messenger.sendUnrecoverableErrorResponse('invalid-zip-no-sct-file', message.tabID) + return + } + + const fileContents = metadataFile.getData().toString('utf-8') + + const isValidMetadata = await validateSQLMetadataFile(fileContents, message) + if (!isValidMetadata) { + return + } + + this.messenger.sendSQLConversionMetadataReceivedMessage(message.tabID) + transformByQState.setMetadataPathSQL(fileUri[0].fsPath) + + await this.messenger.sendSQLConversionProjectPrompt( + Array.from(this.sessionStorage.getSession().candidateProjects.values()), + message.tabID + ) } private transformationFinished(data: { message: string | undefined; tabID: string }) { @@ -467,7 +589,7 @@ export class GumbyController { } private startHILIntervention(data: { tabID: string; codeSnippet: string }) { - this.sessionStorage.getSession().conversationState = ConversationState.WAITING_FOR_INPUT + this.sessionStorage.getSession().conversationState = ConversationState.WAITING_FOR_HIL_INPUT this.messenger.sendHumanInTheLoopInitialMessage(data.tabID, data.codeSnippet) } @@ -489,15 +611,28 @@ export class GumbyController { switch (session.conversationState) { case ConversationState.PROMPT_JAVA_HOME: { const pathToJavaHome = extractPath(data.message) - if (pathToJavaHome) { - await this.prepareProjectForSubmission({ + await this.prepareLanguageUpgradeProject({ pathToJavaHome, tabID: data.tabID, }) } else { this.messenger.sendUnrecoverableErrorResponse('invalid-java-home', data.tabID) } + break + } + + case ConversationState.WAITING_FOR_TRANSFORMATION_OBJECTIVE: { + const objective = data.message.trim().toLowerCase() + if (objective === 'language upgrade') { + await this.handleLanguageUpgrade(data) + } else if (objective === 'sql conversion') { + await this.handleSQLConversion(data) + } else { + // keep prompting user until they enter a valid option + await this.transformInitiated(data) + } + break } } } diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts index 46f40e57fb4..69f0a48cb6d 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts @@ -35,6 +35,9 @@ export type StaticTextResponseType = | 'start-transformation-confirmed' | 'job-transmitted' | 'end-HIL-early' + | 'choose-transformation-objective' + | 'language-upgrade-selected' + | 'sql-conversion-selected' export type UnrecoverableErrorType = | 'no-project-found' @@ -45,6 +48,10 @@ export type UnrecoverableErrorType = | 'unsupported-source-jdk-version' | 'upload-to-s3-failed' | 'job-start-failed' + | 'unsupported-source-db' + | 'unsupported-target-db' + | 'error-parsing-sct-file' + | 'invalid-zip-no-sct-file' export enum GumbyNamedMessages { COMPILATION_PROGRESS_MESSAGE = 'gumbyProjectCompilationMessage', @@ -148,7 +155,7 @@ export class Messenger { ) } - public async sendProjectPrompt(projects: TransformationCandidateProject[], tabID: string) { + public async sendLanguageUpgradeProjectPrompt(projects: TransformationCandidateProject[], tabID: string) { const projectFormOptions: { value: any; label: string }[] = [] const detectedJavaVersions = new Array() @@ -162,7 +169,7 @@ export class Messenger { const formItems: ChatItemFormItem[] = [] formItems.push({ - id: 'GumbyTransformProjectForm', + id: 'GumbyTransformLanguageUpgradeProjectForm', type: 'select', title: CodeWhispererConstants.chooseProjectFormTitle, mandatory: true, @@ -178,11 +185,11 @@ export class Messenger { options: [ { value: JDKVersion.JDK8, - label: JDKVersion.JDK8.toString(), + label: JDKVersion.JDK8, }, { value: JDKVersion.JDK11, - label: JDKVersion.JDK11.toString(), + label: JDKVersion.JDK11, }, { value: JDKVersion.UNSUPPORTED, @@ -207,7 +214,7 @@ export class Messenger { this.dispatcher.sendAsyncEventProgress( new AsyncEventProgressMessage(tabID, { inProgress: true, - message: MessengerUtils.createTransformationConfirmationPrompt(detectedJavaVersions), + message: MessengerUtils.createLanguageUpgradeConfirmationPrompt(detectedJavaVersions), }) ) @@ -224,7 +231,64 @@ export class Messenger { message: 'Q Code Transformation', formItems: formItems, }, - 'TransformForm', + 'LanguageUpgradeTransformForm', + tabID, + false + ) + ) + } + + public async sendSQLConversionProjectPrompt(projects: TransformationCandidateProject[], tabID: string) { + const projectFormOptions: { value: any; label: string }[] = [] + + projects.forEach((candidateProject) => { + projectFormOptions.push({ + value: candidateProject.path, + label: candidateProject.name, + }) + }) + + const formItems: ChatItemFormItem[] = [] + formItems.push({ + id: 'GumbyTransformSQLConversionProjectForm', + type: 'select', + title: 'Choose a project to transform', + mandatory: true, + options: projectFormOptions, + }) + + formItems.push({ + id: 'GumbyTransformSQLSchemaForm', + type: 'select', + title: 'Choose the schema of the database', + mandatory: true, + options: Array.from(transformByQState.getSchemaOptions()).map((schema) => ({ + value: schema, + label: schema, + })), + }) + + this.dispatcher.sendAsyncEventProgress( + new AsyncEventProgressMessage(tabID, { + inProgress: true, + message: 'I can convert your embedded SQL, but I need some more info from you first.', + }) + ) + + this.dispatcher.sendAsyncEventProgress( + new AsyncEventProgressMessage(tabID, { + inProgress: false, + message: undefined, + }) + ) + + this.dispatcher.sendChatPrompt( + new ChatPrompt( + { + message: 'Q Code Transformation', + formItems: formItems, + }, + 'SQLConversionTransformForm', tabID, false ) @@ -315,15 +379,18 @@ export class Messenger { ) } - public sendStaticTextResponse(type: StaticTextResponseType, tabID: string) { + public sendStaticTextResponse(messageType: StaticTextResponseType, tabID: string) { let message = '...' - switch (type) { + switch (messageType) { case 'java-home-not-set': message = MessengerUtils.createJavaHomePrompt() break case 'end-HIL-early': - message = `I will continue transforming your code without upgrading this dependency.` + message = 'I will continue transforming your code without upgrading this dependency.' + break + case 'choose-transformation-objective': + message = 'Choose your transformation objective.' break } @@ -366,6 +433,18 @@ export class Messenger { case 'unsupported-source-jdk-version': message = CodeWhispererConstants.unsupportedJavaVersionChatMessage break + case 'unsupported-source-db': + message = CodeWhispererConstants.invalidMetadataFileUnsupportedSourceDB + break + case 'unsupported-target-db': + message = CodeWhispererConstants.invalidMetadataFileUnsupportedTargetDB + break + case 'error-parsing-sct-file': + message = CodeWhispererConstants.invalidMetadataFileErrorParsing + break + case 'invalid-zip-no-sct-file': + message = CodeWhispererConstants.invalidMetadataFileNoSctFile + break } const buttons: ChatItemButton[] = [] @@ -442,7 +521,7 @@ export class Messenger { ) } - public sendProjectSelectionMessage( + public sendLanguageUpgradeProjectChoiceMessage( projectName: string, fromJDKVersion: JDKVersion, toJDKVersion: JDKVersion, @@ -460,6 +539,35 @@ export class Messenger { this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'prompt' }, tabID)) } + public sendSQLConversionProjectSelectionMessage(projectName: string, schema: string, tabID: string) { + const message = `### Transformation details +------------- +| | | +| :------------------- | -------: | +| **Project** | ${projectName} | +| **Schema** | ${schema} | + ` + this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'prompt' }, tabID)) + } + + public sendSQLConversionMetadataReceivedMessage(tabID: any) { + const message = `### Transformation details +------------- +| | | +| :------------------- | -------: | +| **Source DB** | ${transformByQState.getSourceDB()} | +| **Target DB** | ${transformByQState.getTargetDB()} | +| **Host** | ${transformByQState.getSourceServerName()} | + ` + this.dispatcher.sendChatMessage( + new ChatMessage( + { message: CodeWhispererConstants.sqlMetadataFileReceived, messageType: 'ai-prompt' }, + tabID + ) + ) + this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'ai-prompt' }, tabID)) + } + public sendSkipTestsSelectionMessage(skipTestsSelection: string, tabID: string) { const message = `Okay, I will ${skipTestsSelection.toLowerCase()} when building your project.` this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'ai-prompt' }, tabID)) @@ -612,4 +720,32 @@ ${codeSnippet} ) ) } + + public async sendSelectSQLMetadataFileMessage(tabID: string) { + const message = CodeWhispererConstants.selectSQLMetadataFileHelpMessage + const buttons: ChatItemButton[] = [] + + buttons.push({ + keepCardAfterClick: true, + text: 'Select metadata file', + id: ButtonActions.SELECT_SQL_CONVERSION_METADATA_FILE, + }) + + buttons.push({ + keepCardAfterClick: false, + text: 'Cancel', + id: ButtonActions.CANCEL_TRANSFORMATION_FORM, + }) + + this.dispatcher.sendChatMessage( + new ChatMessage( + { + message, + messageType: 'ai-prompt', + buttons, + }, + tabID + ) + ) + } } diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts index 184637fbc3b..b5222eb7d6b 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts @@ -13,10 +13,12 @@ import DependencyVersions from '../../../models/dependencies' export enum ButtonActions { STOP_TRANSFORMATION_JOB = 'gumbyStopTransformationJob', VIEW_TRANSFORMATION_HUB = 'gumbyViewTransformationHub', - CONFIRM_TRANSFORMATION_FORM = 'gumbyTransformFormConfirm', + CONFIRM_LANGUAGE_UPGRADE_TRANSFORMATION_FORM = 'gumbyLanguageUpgradeTransformFormConfirm', + CONFIRM_SQL_CONVERSION_TRANSFORMATION_FORM = 'gumbySQLConversionTransformFormConfirm', + CANCEL_TRANSFORMATION_FORM = 'gumbyTransformFormCancel', // shared between Language Upgrade & SQL Conversion CONFIRM_SKIP_TESTS_FORM = 'gumbyTransformSkipTestsFormConfirm', - CANCEL_TRANSFORMATION_FORM = 'gumbyTransformFormCancel', CANCEL_SKIP_TESTS_FORM = 'gumbyTransformSkipTestsFormCancel', + SELECT_SQL_CONVERSION_METADATA_FILE = 'gumbySQLConversionMetadataTransformFormConfirm', CONFIRM_DEPENDENCY_FORM = 'gumbyTransformDependencyFormConfirm', CANCEL_DEPENDENCY_FORM = 'gumbyTransformDependencyFormCancel', CONFIRM_JAVA_HOME_FORM = 'gumbyJavaHomeFormConfirm', @@ -63,7 +65,7 @@ export default class MessengerUtils { } } - static createTransformationConfirmationPrompt = (detectedJavaVersions: Array): string => { + static createLanguageUpgradeConfirmationPrompt = (detectedJavaVersions: Array): string => { let javaVersionString = 'Java project' const uniqueJavaOptions = new Set(detectedJavaVersions) diff --git a/packages/core/src/amazonqGumby/chat/session/session.ts b/packages/core/src/amazonqGumby/chat/session/session.ts index f8416fc22a2..b0ed125c7d8 100644 --- a/packages/core/src/amazonqGumby/chat/session/session.ts +++ b/packages/core/src/amazonqGumby/chat/session/session.ts @@ -10,7 +10,8 @@ export enum ConversationState { PROMPT_JAVA_HOME, COMPILING, JOB_SUBMITTED, - WAITING_FOR_INPUT, + WAITING_FOR_HIL_INPUT, + WAITING_FOR_TRANSFORMATION_OBJECTIVE, } export interface ProjectDetails { diff --git a/packages/core/src/amazonqGumby/chat/views/connector/connector.ts b/packages/core/src/amazonqGumby/chat/views/connector/connector.ts index 098682110d6..9e044780858 100644 --- a/packages/core/src/amazonqGumby/chat/views/connector/connector.ts +++ b/packages/core/src/amazonqGumby/chat/views/connector/connector.ts @@ -117,7 +117,8 @@ export class ChatPrompt extends UiMessage { keepCardAfterClick: false, waitMandatoryFormItems: false, text: 'Cancel', - id: `gumby${promptIDPrefix}Cancel`, + // makes the Cancel button shared in all forms, which is fine since we respond the same exact way each time + id: 'gumbyTransformFormCancel', }) } } diff --git a/packages/core/src/amazonqGumby/telemetry/codeTransformTelemetry.ts b/packages/core/src/amazonqGumby/telemetry/codeTransformTelemetry.ts index f2ad37de84d..edcb89bf586 100644 --- a/packages/core/src/amazonqGumby/telemetry/codeTransformTelemetry.ts +++ b/packages/core/src/amazonqGumby/telemetry/codeTransformTelemetry.ts @@ -40,54 +40,4 @@ export const JDKToTelemetryValue = ( } } -/** - * @description We want the output of our Java versions found - * that are not supported to match IntelliJ output. IntelliJ - * can read the version easily and for VSCode we must exec - * the javap -v command. - */ -export const javapOutputToTelemetryValue = (javapCommandLineOutput: string) => { - switch (javapCommandLineOutput) { - case '49': - return 'JDK_1_5' - case '50': - return 'JDK_1_6' - case '51': - return 'JDK_1_7' - case '52': - return 'JDK_1_8' - case '53': - return 'JDK_1_9' - case '54': - return 'JDK_10' - case '55': - return 'JDK_11' - case '56': - return 'JDK_12' - case '57': - return 'JDK_13' - case '58': - return 'JDK_14' - case '59': - return 'JDK_15' - case '60': - return 'JDK_16' - case '61': - return 'JDK_17' - case '62': - return 'JDK_18' - case '63': - return 'JDK_19' - case '64': - return 'JDK_20' - case '65': - return 'JDK_21' - case '66': - return 'JDK_22' - default: - // If nothing found. Output the number and lookup the java 'major version' numbers online - return javapCommandLineOutput - } -} - export const calculateTotalLatency = (startTime: number): number => globals.clock.Date.now() - startTime 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/activation.ts b/packages/core/src/auth/activation.ts index 71b9bd098b8..76c92cb7284 100644 --- a/packages/core/src/auth/activation.ts +++ b/packages/core/src/auth/activation.ts @@ -3,16 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as vscode from 'vscode' import { Auth } from './auth' import { LoginManager } from './deprecated/loginManager' import { fromString } from './providers/credentials' import { getLogger } from '../shared/logger' -import { ExtensionUse } from './utils' -import { isCloud9 } from '../shared/extensionUtilities' +import { ExtensionUse, initializeCredentialsProviderManager } from './utils' +import { isAmazonQ, isCloud9, isSageMaker } from '../shared/extensionUtilities' import { isInDevEnv } from '../shared/vscode/env' import { isWeb } from '../shared/extensionGlobals' +interface SagemakerCookie { + authMode?: 'Sso' | 'Iam' +} + export async function initialize(loginManager: LoginManager): Promise { + if (isAmazonQ() && isSageMaker()) { + // The command `sagemaker.parseCookies` is registered in VS Code Sagemaker environment. + const result = (await vscode.commands.executeCommand('sagemaker.parseCookies')) as SagemakerCookie + if (result.authMode !== 'Sso') { + initializeCredentialsProviderManager() + } + } Auth.instance.onDidChangeActiveConnection(async (conn) => { // This logic needs to be moved to `Auth.useConnection` to correctly record `passive` if (conn?.type === 'iam' && conn.state === 'valid') { diff --git a/packages/core/src/auth/connection.ts b/packages/core/src/auth/connection.ts index 29ab6d1b8ee..294fb141747 100644 --- a/packages/core/src/auth/connection.ts +++ b/packages/core/src/auth/connection.ts @@ -73,7 +73,7 @@ export function hasScopes(target: SsoConnection | SsoProfile | string[], scopes: * Not optimized, but the set of possible scopes is currently very small (< 8) */ export function hasExactScopes(target: SsoConnection | SsoProfile | string[], scopes: string[]): boolean { - const targetScopes = Array.isArray(target) ? target : target.scopes ?? [] + const targetScopes = Array.isArray(target) ? target : (target.scopes ?? []) return scopes.length === targetScopes.length && scopes.every((s) => targetScopes.includes(s)) } diff --git a/packages/core/src/auth/index.ts b/packages/core/src/auth/index.ts index 864e5bb18fd..54dd17d702b 100644 --- a/packages/core/src/auth/index.ts +++ b/packages/core/src/auth/index.ts @@ -17,6 +17,7 @@ export { isAnySsoConnection, isBuilderIdConnection, getTelemetryMetadataForConn, + isIamConnection, } from './connection' export { Auth } from './auth' export { CredentialsStore } from './credentials/store' diff --git a/packages/core/src/auth/sso/ssoAccessTokenProvider.ts b/packages/core/src/auth/sso/ssoAccessTokenProvider.ts index af00ea4f3b2..a13c4f53948 100644 --- a/packages/core/src/auth/sso/ssoAccessTokenProvider.ts +++ b/packages/core/src/auth/sso/ssoAccessTokenProvider.ts @@ -38,7 +38,7 @@ import { getIdeProperties, isAmazonQ, isCloud9 } from '../../shared/extensionUti import { randomBytes, createHash } from 'crypto' import { localize } from '../../shared/utilities/vsCodeUtils' import { randomUUID } from '../../shared/crypto' -import { isRemoteWorkspace, isWebWorkspace } from '../../shared/vscode/env' +import { getExtRuntimeContext } from '../../shared/vscode/env' import { showInputBox } from '../../shared/ui/inputPrompter' import { AmazonQPromptSettings, DevSettings, PromptSettings, ToolkitPromptSettings } from '../../shared/settings' import { onceChanged } from '../../shared/utilities/functionUtils' @@ -304,10 +304,10 @@ export abstract class SsoAccessTokenProvider { * * Since we are unable to serve the final authorization page */ - return isRemoteWorkspace() || isWebWorkspace() + return getExtRuntimeContext().extensionHost === 'remote' } ) { - if (DevSettings.instance.get('webAuth', false) && isWebWorkspace()) { + if (DevSettings.instance.get('webAuth', false) && getExtRuntimeContext().extensionHost === 'webworker') { return new WebAuthorization(profile, cache, oidc, reAuthState) } if (useDeviceFlow()) { diff --git a/packages/core/src/auth/utils.ts b/packages/core/src/auth/utils.ts index ece410203b9..0cd33ef6360 100644 --- a/packages/core/src/auth/utils.ts +++ b/packages/core/src/auth/utils.ts @@ -52,6 +52,13 @@ 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 { CredentialsProviderManager } from './providers/credentialsProviderManager' +import { SharedCredentialsProviderFactory } from './providers/sharedCredentialsProviderFactory' +import { Ec2CredentialsProvider } from './providers/ec2CredentialsProvider' +import { EcsCredentialsProvider } from './providers/ecsCredentialsProvider' +import { EnvVarsCredentialsProvider } from './providers/envVarsCredentialsProvider' +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 +108,46 @@ export async function promptAndUseConnection(...[auth, type]: Parameters { return telemetry.function_call.run( async () => { @@ -731,3 +778,9 @@ export function getAuthFormIdsFromConnection(conn?: Connection): AuthFormId[] { return authIds } + +export function initializeCredentialsProviderManager() { + const manager = CredentialsProviderManager.getInstance() + manager.addProviderFactory(new SharedCredentialsProviderFactory()) + manager.addProviders(new Ec2CredentialsProvider(), new EcsCredentialsProvider(), new EnvVarsCredentialsProvider()) +} diff --git a/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts b/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts index 3af08e76cea..406b04a6d75 100644 --- a/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts +++ b/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import * as fs from 'fs' +import * as fs from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' import { getLogger, Logger } from '../../../shared/logger' import { localize } from '../../../shared/utilities/vsCodeUtils' 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/cloudWatchLogs/changeLogSearch.ts b/packages/core/src/awsService/cloudWatchLogs/changeLogSearch.ts index 4797e06fc03..349f7339e87 100644 --- a/packages/core/src/awsService/cloudWatchLogs/changeLogSearch.ts +++ b/packages/core/src/awsService/cloudWatchLogs/changeLogSearch.ts @@ -5,7 +5,7 @@ import { CancellationError } from '../../shared/utilities/timeoutUtils' import { telemetry } from '../../shared/telemetry/telemetry' import { showInputBox } from '../../shared/ui/inputPrompter' -import { createURIFromArgs, isLogStreamUri, recordTelemetryFilter } from './cloudWatchLogsUtils' +import { cwlUriSchema, isLogStreamUri, recordTelemetryFilter } from './cloudWatchLogsUtils' import { prepareDocument } from './commands/searchLogGroup' import { getActiveDocumentUri } from './document/logDataDocumentProvider' import { CloudWatchLogsData, filterLogEventsFromUri, LogDataRegistry } from './registry/logDataRegistry' @@ -98,7 +98,7 @@ export async function changeLogSearchParams( throw new CancellationError('user') } - const newUri = createURIFromArgs(newData.logGroupInfo, newData.parameters) + const newUri = cwlUriSchema.form({ logGroupInfo: newData.logGroupInfo, parameters: newData.parameters }) await prepareDocument(newUri, newData, registry) }) } diff --git a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts index b8c769e92f8..e2356595153 100644 --- a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts +++ b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts @@ -6,8 +6,9 @@ import { telemetry } from '../../shared/telemetry/telemetry' import * as vscode from 'vscode' import { CLOUDWATCH_LOGS_SCHEME } from '../../shared/constants' import { fromExtensionManifest } from '../../shared/settings' -import { CloudWatchLogsData, CloudWatchLogsGroupInfo } from './registry/logDataRegistry' +import { CloudWatchLogsArgs, CloudWatchLogsData, CloudWatchLogsGroupInfo } from './registry/logDataRegistry' import { CloudWatchLogsParameters } from './registry/logDataRegistry' +import { UriSchema } from '../../shared/utilities/uriUtils' // URIs are the only vehicle for delivering information to a TextDocumentContentProvider. // The following functions are used to structure and destructure relevant information to/from a URI. @@ -32,8 +33,7 @@ export function recordTelemetryFilter(logData: CloudWatchLogsData): void { export function uriToKey(uri: vscode.Uri): string { if (uri.query) { try { - const { filterPattern, startTime, endTime, limit, streamNameOptions } = - parseCloudWatchLogsUri(uri).parameters + const { filterPattern, startTime, endTime, limit, streamNameOptions } = cwlUriSchema.parse(uri).parameters const parts = [uri.path, filterPattern, startTime, endTime, limit, streamNameOptions] return parts.map((p) => p ?? '').join(':') } catch { @@ -52,7 +52,7 @@ export function uriToKey(uri: vscode.Uri): string { * message as the actual log group search. That results in a more fluid UX. */ export function msgKey(logGroupInfo: CloudWatchLogsGroupInfo): string { - const uri = createURIFromArgs(logGroupInfo, {}) + const uri = cwlUriSchema.form({ logGroupInfo: logGroupInfo, parameters: {} }) return uri.toString() } @@ -60,10 +60,7 @@ export function msgKey(logGroupInfo: CloudWatchLogsGroupInfo): string { * Destructures an awsCloudWatchLogs URI into its component pieces. * @param uri URI for a Cloudwatch Logs file */ -export function parseCloudWatchLogsUri(uri: vscode.Uri): { - logGroupInfo: CloudWatchLogsGroupInfo - parameters: CloudWatchLogsParameters -} { +function parseCloudWatchLogsUri(uri: vscode.Uri): CloudWatchLogsArgs { const parts = uri.path.split(':') if (uri.scheme !== CLOUDWATCH_LOGS_SCHEME) { @@ -85,18 +82,8 @@ export function parseCloudWatchLogsUri(uri: vscode.Uri): { } } -/** True if given URI is a valid Cloud Watch Logs Uri */ -export function isCwlUri(uri: vscode.Uri): boolean { - try { - parseCloudWatchLogsUri(uri) - return true - } catch { - return false - } -} - export function patternFromCwlUri(uri: vscode.Uri): CloudWatchLogsParameters['filterPattern'] { - return parseCloudWatchLogsUri(uri).parameters.filterPattern + return cwlUriSchema.parse(uri).parameters.filterPattern } /** @@ -105,7 +92,7 @@ export function patternFromCwlUri(uri: vscode.Uri): CloudWatchLogsParameters['fi * @returns */ export function isLogStreamUri(uri: vscode.Uri): boolean { - const logGroupInfo = parseCloudWatchLogsUri(uri).logGroupInfo + const logGroupInfo = cwlUriSchema.parse(uri).logGroupInfo return logGroupInfo.streamName !== undefined } @@ -115,15 +102,13 @@ export function isLogStreamUri(uri: vscode.Uri): boolean { * @param streamName Log stream name * @param regionName AWS region */ -export function createURIFromArgs( - logGroupInfo: CloudWatchLogsGroupInfo, - parameters: CloudWatchLogsParameters -): vscode.Uri { - let uriStr = `${CLOUDWATCH_LOGS_SCHEME}:${logGroupInfo.regionName}:${logGroupInfo.groupName}` - uriStr += logGroupInfo.streamName ? `:${logGroupInfo.streamName}` : '' +function createURIFromArgs(args: CloudWatchLogsArgs): vscode.Uri { + let uriStr = `${CLOUDWATCH_LOGS_SCHEME}:${args.logGroupInfo.regionName}:${args.logGroupInfo.groupName}` + uriStr += args.logGroupInfo.streamName ? `:${args.logGroupInfo.streamName}` : '' - uriStr += `?${encodeURIComponent(JSON.stringify(parameters))}` + uriStr += `?${encodeURIComponent(JSON.stringify(args.parameters))}` return vscode.Uri.parse(uriStr) } +export const cwlUriSchema = new UriSchema(parseCloudWatchLogsUri, createURIFromArgs) export class CloudWatchLogsSettings extends fromExtensionManifest('aws.cwl', { limit: Number }) {} diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/copyLogResource.ts b/packages/core/src/awsService/cloudWatchLogs/commands/copyLogResource.ts index b7cca40c752..846f87e797e 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/copyLogResource.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/copyLogResource.ts @@ -7,7 +7,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() import * as vscode from 'vscode' -import { isLogStreamUri, parseCloudWatchLogsUri } from '../cloudWatchLogsUtils' +import { cwlUriSchema, isLogStreamUri } from '../cloudWatchLogsUtils' import { copyToClipboard } from '../../../shared/utilities/messages' export async function copyLogResource(uri?: vscode.Uri): Promise { @@ -20,7 +20,7 @@ export async function copyLogResource(uri?: vscode.Uri): Promise { throw new Error('no active text editor, or undefined URI') } } - const parsedUri = parseCloudWatchLogsUri(uri) + const parsedUri = cwlUriSchema.parse(uri) const resourceName = isLogStreamUri(uri) ? parsedUri.logGroupInfo.streamName : parsedUri.logGroupInfo.groupName if (!resourceName) { diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/saveCurrentLogDataContent.ts b/packages/core/src/awsService/cloudWatchLogs/commands/saveCurrentLogDataContent.ts index 2e83e04cf76..9d1600fafba 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/saveCurrentLogDataContent.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/saveCurrentLogDataContent.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { isLogStreamUri, parseCloudWatchLogsUri } from '../cloudWatchLogsUtils' +import { cwlUriSchema, isLogStreamUri } from '../cloudWatchLogsUtils' import { telemetry, CloudWatchResourceType, Result } from '../../../shared/telemetry/telemetry' import fs from '../../../shared/fs/fs' @@ -28,7 +28,7 @@ export async function saveCurrentLogDataContent(): Promise { const workspaceDir = vscode.workspace.workspaceFolders ? vscode.workspace.workspaceFolders[0].uri : vscode.Uri.file(fs.getUserHomeDir()) - const uriComponents = parseCloudWatchLogsUri(uri) + const uriComponents = cwlUriSchema.parse(uri) const logGroupInfo = uriComponents.logGroupInfo const localizedLogFile = localize('AWS.command.saveCurrentLogDataContent.logfile', 'Log File') diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/searchLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/searchLogGroup.ts index 0dfc491bbb4..41ce8d7922f 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/searchLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/searchLogGroup.ts @@ -16,7 +16,7 @@ import { } from '../registry/logDataRegistry' import { DataQuickPickItem } from '../../../shared/ui/pickerPrompter' import { isValidResponse, isWizardControl, Wizard, WIZARD_RETRY } from '../../../shared/wizards/wizard' -import { createURIFromArgs, msgKey, parseCloudWatchLogsUri, recordTelemetryFilter } from '../cloudWatchLogsUtils' +import { cwlUriSchema, msgKey, recordTelemetryFilter } from '../cloudWatchLogsUtils' import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { getLogger } from '../../../shared/logger' @@ -29,6 +29,7 @@ import { createBackButton, createExitButton, createHelpButton } from '../../../s import { PromptResult } from '../../../shared/ui/prompter' import { ToolkitError } from '../../../shared/errors' import { Messages } from '../../../shared/utilities/messages' +import { showFile } from '../../../shared/utilities/textDocumentUtilities' const localize = nls.loadMessageBundle() @@ -65,9 +66,7 @@ export async function prepareDocument(uri: vscode.Uri, logData: CloudWatchLogsDa try { // Gets the data: calls filterLogEventsFromUri(). await registry.fetchNextLogEvents(uri) - const doc = await vscode.workspace.openTextDocument(uri) - await vscode.window.showTextDocument(doc, { preview: false }) - await vscode.languages.setTextDocumentLanguage(doc, 'log') + await showFile(uri) } catch (err) { if (CancellationError.isUserCancelled(err)) { throw err @@ -78,7 +77,7 @@ export async function prepareDocument(uri: vscode.Uri, logData: CloudWatchLogsDa localize( 'AWS.cwl.searchLogGroup.errorRetrievingLogs', 'Failed to get logs for {0}', - parseCloudWatchLogsUri(uri).logGroupInfo.groupName + cwlUriSchema.parse(uri).logGroupInfo.groupName ) ) } @@ -105,7 +104,7 @@ export async function searchLogGroup( } const userResponse = handleWizardResponse(response, registry) - const uri = createURIFromArgs(userResponse.logGroupInfo, userResponse.parameters) + const uri = cwlUriSchema.form({ logGroupInfo: userResponse.logGroupInfo, parameters: userResponse.parameters }) await prepareDocument(uri, userResponse, registry) }) } diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/viewLogStream.ts b/packages/core/src/awsService/cloudWatchLogs/commands/viewLogStream.ts index a8ba6dbba76..2bfafd6d2d7 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/viewLogStream.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/viewLogStream.ts @@ -21,11 +21,11 @@ import { initLogData as initLogData, filterLogEventsFromUri, } from '../registry/logDataRegistry' -import { createURIFromArgs } from '../cloudWatchLogsUtils' import { prepareDocument, searchLogGroup } from './searchLogGroup' import { telemetry, Result } from '../../../shared/telemetry/telemetry' import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { formatLocalized } from '../../../shared/utilities/textUtilities' +import { cwlUriSchema } from '../cloudWatchLogsUtils' export async function viewLogStream(node: LogGroupNode, registry: LogDataRegistry): Promise { await telemetry.cloudwatchlogs_open.run(async (span) => { @@ -52,7 +52,7 @@ export async function viewLogStream(node: LogGroupNode, registry: LogDataRegistr limit: registry.configuration.get('limit', 10000), } - const uri = createURIFromArgs(logGroupInfo, parameters) + const uri = cwlUriSchema.form({ logGroupInfo: logGroupInfo, parameters: parameters }) const logData = initLogData(logGroupInfo, parameters, filterLogEventsFromUri) await prepareDocument(uri, logData, registry) }) diff --git a/packages/core/src/awsService/cloudWatchLogs/document/logDataDocumentProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/logDataDocumentProvider.ts index 8eb390f7760..5925911893b 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/logDataDocumentProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/logDataDocumentProvider.ts @@ -5,8 +5,8 @@ import * as vscode from 'vscode' import { CloudWatchLogsGroupInfo, LogDataRegistry, UriString } from '../registry/logDataRegistry' import { getLogger } from '../../../shared/logger' -import { isCwlUri } from '../cloudWatchLogsUtils' import { generateTextFromLogEvents, LineToLogStreamMap } from './textContent' +import { cwlUriSchema } from '../cloudWatchLogsUtils' export class LogDataDocumentProvider implements vscode.TextDocumentContentProvider { /** Resolves the correct {@link LineToLogStreamMap} instance for a given URI */ @@ -26,7 +26,7 @@ export class LogDataDocumentProvider implements vscode.TextDocumentContentProvid } public provideTextDocumentContent(uri: vscode.Uri): string { - if (!isCwlUri(uri)) { + if (!cwlUriSchema.isValid(uri)) { throw new Error(`Uri is not a CWL Uri, so no text can be provided: ${uri.toString()}`) } const events = this.registry.fetchCachedLogEvents(uri) diff --git a/packages/core/src/awsService/cloudWatchLogs/document/logStreamsCodeLensProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/logStreamsCodeLensProvider.ts index 5c83ab929d9..9870ff009d2 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/logStreamsCodeLensProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/logStreamsCodeLensProvider.ts @@ -6,12 +6,7 @@ import * as vscode from 'vscode' import { CLOUDWATCH_LOGS_SCHEME } from '../../../shared/constants' import { CloudWatchLogsGroupInfo, LogDataRegistry } from '../registry/logDataRegistry' -import { - CloudWatchLogsSettings, - createURIFromArgs, - isLogStreamUri, - parseCloudWatchLogsUri, -} from '../cloudWatchLogsUtils' +import { CloudWatchLogsSettings, cwlUriSchema, isLogStreamUri } from '../cloudWatchLogsUtils' import { LogDataDocumentProvider } from './logDataDocumentProvider' type IdWithLine = { streamId: string; lineNum: number } @@ -43,7 +38,7 @@ export class LogStreamCodeLensProvider implements vscode.CodeLensProvider { return [] } - const logGroupInfo = parseCloudWatchLogsUri(uri).logGroupInfo + const logGroupInfo = cwlUriSchema.parse(uri).logGroupInfo if (logGroupInfo.streamName) { // This means we have a stream file not a log search. @@ -64,7 +59,11 @@ export class LogStreamCodeLensProvider implements vscode.CodeLensProvider { createLogStreamCodeLens(logGroupInfo: CloudWatchLogsGroupInfo, idWithLine: IdWithLine): vscode.CodeLens { const settings = new CloudWatchLogsSettings() const limit = settings.get('limit', 1000) - const streamUri = createURIFromArgs({ ...logGroupInfo, streamName: idWithLine.streamId }, { limit: limit }) + const cwlArgs = { + logGroupInfo: { ...logGroupInfo, streamName: idWithLine.streamId }, + parameters: { limit: limit }, + } + const streamUri = cwlUriSchema.form(cwlArgs) const cmd: vscode.Command = { command: 'aws.loadLogStreamFile', arguments: [streamUri, this.registry], diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/logDataRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/logDataRegistry.ts index e8ae51558e5..88945d61bd2 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/logDataRegistry.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/logDataRegistry.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import { CloudWatchLogs } from 'aws-sdk' -import { CloudWatchLogsSettings, parseCloudWatchLogsUri, uriToKey, msgKey } from '../cloudWatchLogsUtils' +import { CloudWatchLogsSettings, uriToKey, msgKey, cwlUriSchema } from '../cloudWatchLogsUtils' import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' import { waitTimeout } from '../../../shared/utilities/timeoutUtils' import { Messages } from '../../../shared/utilities/messages' @@ -190,7 +190,7 @@ export class LogDataRegistry { if (this.isRegistered(uri)) { throw new Error(`Already registered: ${uri.toString()}`) } - const data = parseCloudWatchLogsUri(uri) + const data = cwlUriSchema.parse(uri) this.setLogData(uri, initLogData(data.logGroupInfo, data.parameters, retrieveLogsFunction)) } @@ -281,6 +281,11 @@ export function initLogData( } } +export type CloudWatchLogsArgs = { + logGroupInfo: CloudWatchLogsGroupInfo + parameters: CloudWatchLogsParameters +} + export type CloudWatchLogsGroupInfo = { groupName: string regionName: string diff --git a/packages/core/src/awsService/ec2/activation.ts b/packages/core/src/awsService/ec2/activation.ts index 550a0bbf47c..aa57b9ce79d 100644 --- a/packages/core/src/awsService/ec2/activation.ts +++ b/packages/core/src/awsService/ec2/activation.ts @@ -2,10 +2,11 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +import * as vscode from 'vscode' import { ExtContext } from '../../shared/extensions' import { Commands } from '../../shared/vscode/commands2' import { telemetry } from '../../shared/telemetry/telemetry' -import { Ec2InstanceNode } from './explorer/ec2InstanceNode' +import { Ec2InstanceNode, tryRefreshNode } from './explorer/ec2InstanceNode' import { copyTextCommand } from '../../awsexplorer/commands/copyText' import { Ec2Node } from './explorer/ec2ParentNode' import { @@ -14,32 +15,43 @@ import { rebootInstance, startInstance, stopInstance, - refreshExplorer, linkToLaunchInstance, + openLogDocument, } from './commands' +import { Ec2ConnecterMap } from './connectionManagerMap' +import { ec2LogsScheme } from '../../shared/constants' +import { Ec2LogDocumentProvider } from './ec2LogDocumentProvider' + +const connectionManagers = new Ec2ConnecterMap() export async function activate(ctx: ExtContext): Promise { + ctx.extensionContext.subscriptions.push( + vscode.workspace.registerTextDocumentContentProvider(ec2LogsScheme, new Ec2LogDocumentProvider()) + ) ctx.extensionContext.subscriptions.push( Commands.register('aws.ec2.openTerminal', async (node?: Ec2InstanceNode) => { await telemetry.ec2_connectToInstance.run(async (span) => { span.record({ ec2ConnectionType: 'ssm' }) - await openTerminal(node) + await openTerminal(connectionManagers, node) }) }), Commands.register('aws.ec2.copyInstanceId', async (node: Ec2InstanceNode) => { await copyTextCommand(node, 'id') }), + Commands.register('aws.ec2.viewLogs', async (node?: Ec2InstanceNode) => { + await openLogDocument(node) + }), Commands.register('aws.ec2.openRemoteConnection', async (node?: Ec2Node) => { - await openRemoteConnection(node) + await openRemoteConnection(connectionManagers, node) }), Commands.register('aws.ec2.startInstance', async (node?: Ec2Node) => { await telemetry.ec2_changeState.run(async (span) => { span.record({ ec2InstanceState: 'start' }) await startInstance(node) - refreshExplorer(node) + await tryRefreshNode(node) }) }), @@ -47,7 +59,7 @@ export async function activate(ctx: ExtContext): Promise { await telemetry.ec2_changeState.run(async (span) => { span.record({ ec2InstanceState: 'stop' }) await stopInstance(node) - refreshExplorer(node) + await tryRefreshNode(node) }) }), @@ -55,7 +67,7 @@ export async function activate(ctx: ExtContext): Promise { await telemetry.ec2_changeState.run(async (span) => { span.record({ ec2InstanceState: 'reboot' }) await rebootInstance(node) - refreshExplorer(node) + await tryRefreshNode(node) }) }), @@ -66,3 +78,7 @@ export async function activate(ctx: ExtContext): Promise { }) ) } + +export async function deactivate(): Promise { + connectionManagers.forEach(async (manager) => await manager.dispose()) +} diff --git a/packages/core/src/awsService/ec2/commands.ts b/packages/core/src/awsService/ec2/commands.ts index f09ea0ea10c..4f06f7876eb 100644 --- a/packages/core/src/awsService/ec2/commands.ts +++ b/packages/core/src/awsService/ec2/commands.ts @@ -2,37 +2,27 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ - import { Ec2InstanceNode } from './explorer/ec2InstanceNode' import { Ec2Node } from './explorer/ec2ParentNode' -import { Ec2ConnectionManager } from './model' -import { Ec2Prompter, instanceFilter, Ec2Selection } from './prompter' import { SafeEc2Instance, Ec2Client } from '../../shared/clients/ec2Client' import { copyToClipboard } from '../../shared/utilities/messages' -import { getLogger } from '../../shared/logger' +import { ec2LogSchema } from './ec2LogDocumentProvider' import { getAwsConsoleUrl } from '../../shared/awsConsole' import { showRegionPrompter } from '../../auth/utils' import { openUrl } from '../../shared/utilities/vsCodeUtils' +import { showFile } from '../../shared/utilities/textDocumentUtilities' +import { Ec2ConnecterMap } from './connectionManagerMap' +import { Ec2Prompter, Ec2Selection, instanceFilter } from './prompter' -export function refreshExplorer(node?: Ec2Node) { - if (node) { - const n = node instanceof Ec2InstanceNode ? node.parent : node - n.refreshNode().catch((e) => { - getLogger().error('refreshNode failed: %s', (e as Error).message) - }) - } -} - -export async function openTerminal(node?: Ec2Node) { +export async function openTerminal(connectionManagers: Ec2ConnecterMap, node?: Ec2Node) { const selection = await getSelection(node) - - const connectionManager = new Ec2ConnectionManager(selection.region) + const connectionManager = connectionManagers.getOrInit(selection.region) await connectionManager.attemptToOpenEc2Terminal(selection) } -export async function openRemoteConnection(node?: Ec2Node) { +export async function openRemoteConnection(connectionManagers: Ec2ConnecterMap, node?: Ec2Node) { const selection = await getSelection(node) - const connectionManager = new Ec2ConnectionManager(selection.region) + const connectionManager = connectionManagers.getOrInit(selection.region) await connectionManager.tryOpenRemoteConnection(selection) } @@ -71,3 +61,7 @@ async function getSelection(node?: Ec2Node, filter?: instanceFilter): Promise { await copyToClipboard(instanceId, 'Id') } + +export async function openLogDocument(node?: Ec2InstanceNode): Promise { + return await showFile(ec2LogSchema.form(await getSelection(node))) +} diff --git a/packages/core/src/awsService/ec2/connectionManagerMap.ts b/packages/core/src/awsService/ec2/connectionManagerMap.ts new file mode 100644 index 00000000000..add39f05bea --- /dev/null +++ b/packages/core/src/awsService/ec2/connectionManagerMap.ts @@ -0,0 +1,26 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { getLogger } from '../../shared' +import { Ec2Connecter } from './model' + +export class Ec2ConnecterMap extends Map { + private static warnSize: number = 25 + + public getOrInit(regionCode: string) { + return this.has(regionCode) ? this.get(regionCode)! : this.initManager(regionCode) + } + + private initManager(regionCode: string): Ec2Connecter { + if (this.size >= Ec2ConnecterMap.warnSize) { + getLogger().warn( + `Connection manager exceeded threshold of ${Ec2ConnecterMap.warnSize} with ${this.size} active connections` + ) + } + const newConnectionManager = new Ec2Connecter(regionCode) + this.set(regionCode, newConnectionManager) + return newConnectionManager + } +} diff --git a/packages/core/src/awsService/ec2/ec2LogDocumentProvider.ts b/packages/core/src/awsService/ec2/ec2LogDocumentProvider.ts new file mode 100644 index 00000000000..1c8e68f0e02 --- /dev/null +++ b/packages/core/src/awsService/ec2/ec2LogDocumentProvider.ts @@ -0,0 +1,42 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { Ec2Selection } from './prompter' +import { Ec2Client } from '../../shared/clients/ec2Client' +import { ec2LogsScheme } from '../../shared/constants' +import { UriSchema } from '../../shared/utilities/uriUtils' + +export class Ec2LogDocumentProvider implements vscode.TextDocumentContentProvider { + public constructor() {} + + public async provideTextDocumentContent(uri: vscode.Uri): Promise { + if (!ec2LogSchema.isValid(uri)) { + throw new Error(`Invalid EC2 Logs URI: ${uri.toString()}`) + } + const ec2Selection = ec2LogSchema.parse(uri) + const ec2Client = new Ec2Client(ec2Selection.region) + const consoleOutput = await ec2Client.getConsoleOutput(ec2Selection.instanceId, false) + return consoleOutput.Output + } +} + +export const ec2LogSchema = new UriSchema(parseEc2Uri, formEc2Uri) + +function parseEc2Uri(uri: vscode.Uri): Ec2Selection { + const parts = uri.path.split(':') + + if (uri.scheme !== ec2LogsScheme) { + throw new Error(`URI ${uri} is not parseable for EC2 Logs`) + } + + return { + instanceId: parts[1], + region: parts[0], + } +} + +function formEc2Uri(selection: Ec2Selection): vscode.Uri { + return vscode.Uri.parse(`${ec2LogsScheme}:${selection.region}:${selection.instanceId}`) +} diff --git a/packages/core/src/awsService/ec2/explorer/ec2InstanceNode.ts b/packages/core/src/awsService/ec2/explorer/ec2InstanceNode.ts index ded19d5059a..d00fe55e9c2 100644 --- a/packages/core/src/awsService/ec2/explorer/ec2InstanceNode.ts +++ b/packages/core/src/awsService/ec2/explorer/ec2InstanceNode.ts @@ -10,8 +10,9 @@ import { SafeEc2Instance } from '../../../shared/clients/ec2Client' import globals from '../../../shared/extensionGlobals' import { getIconCode } from '../utils' import { Ec2Selection } from '../prompter' -import { Ec2ParentNode } from './ec2ParentNode' +import { Ec2Node, Ec2ParentNode } from './ec2ParentNode' import { EC2 } from 'aws-sdk' +import { getLogger } from '../../../shared' export const Ec2InstanceRunningContext = 'awsEc2RunningNode' export const Ec2InstanceStoppedContext = 'awsEc2StoppedNode' @@ -29,6 +30,7 @@ export class Ec2InstanceNode extends AWSTreeNodeBase implements AWSResourceNode public readonly instance: SafeEc2Instance ) { super('') + this.parent.addChild(this) this.updateInstance(instance) this.id = this.InstanceId } @@ -41,7 +43,7 @@ export class Ec2InstanceNode extends AWSTreeNodeBase implements AWSResourceNode this.tooltip = `${this.name}\n${this.InstanceId}\n${this.instance.LastSeenStatus}\n${this.arn}` if (this.isPending()) { - this.parent.pollingSet.start(this.InstanceId) + this.parent.trackPendingNode(this.InstanceId) } } @@ -100,3 +102,14 @@ export class Ec2InstanceNode extends AWSTreeNodeBase implements AWSResourceNode await vscode.commands.executeCommand('aws.refreshAwsExplorerNode', this) } } + +export async function tryRefreshNode(node?: Ec2Node) { + if (node) { + const n = node instanceof Ec2InstanceNode ? node.parent : node + try { + await n.refreshNode() + } catch (e) { + getLogger().error('refreshNode failed: %s', (e as Error).message) + } + } +} diff --git a/packages/core/src/awsService/ec2/explorer/ec2ParentNode.ts b/packages/core/src/awsService/ec2/explorer/ec2ParentNode.ts index f751f7e0c61..854e6eacd1c 100644 --- a/packages/core/src/awsService/ec2/explorer/ec2ParentNode.ts +++ b/packages/core/src/awsService/ec2/explorer/ec2ParentNode.ts @@ -41,6 +41,13 @@ export class Ec2ParentNode extends AWSTreeNodeBase { }) } + public trackPendingNode(instanceId: string) { + if (!this.ec2InstanceNodes.has(instanceId)) { + throw new Error(`Attempt to track ec2 node ${instanceId} that isn't a child`) + } + this.pollingSet.start(instanceId) + } + public async updateChildren(): Promise { const ec2Instances = await (await this.ec2Client.getInstances()).toMap((instance) => instance.InstanceId) updateInPlace( @@ -52,9 +59,18 @@ export class Ec2ParentNode extends AWSTreeNodeBase { ) } + public getInstanceNode(instanceId: string): Ec2InstanceNode { + const childNode = this.ec2InstanceNodes.get(instanceId) + if (childNode) { + return childNode + } else { + throw new Error(`Node with id ${instanceId} from polling set not found`) + } + } + private async updatePendingNodes() { for (const instanceId of this.pollingSet.values()) { - const childNode = this.ec2InstanceNodes.get(instanceId)! + const childNode = this.getInstanceNode(instanceId) await this.updatePendingNode(childNode) } } @@ -71,6 +87,10 @@ export class Ec2ParentNode extends AWSTreeNodeBase { this.ec2InstanceNodes = new Map() } + public addChild(node: Ec2InstanceNode) { + this.ec2InstanceNodes.set(node.InstanceId, node) + } + public async refreshNode(): Promise { await this.clearChildren() await vscode.commands.executeCommand('aws.refreshAwsExplorerNode', this) diff --git a/packages/core/src/awsService/ec2/model.ts b/packages/core/src/awsService/ec2/model.ts index 021ad623dd2..fa7bbee71b7 100644 --- a/packages/core/src/awsService/ec2/model.ts +++ b/packages/core/src/awsService/ec2/model.ts @@ -3,9 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ import * as vscode from 'vscode' -import * as path from 'path' import { Session } from 'aws-sdk/clients/ssm' -import { IAM, SSM } from 'aws-sdk' +import { EC2, IAM, SSM } from 'aws-sdk' import { Ec2Selection } from './prompter' import { getOrInstallCli } from '../../shared/utilities/cliUtils' import { isCloud9 } from '../../shared/extensionUtilities' @@ -26,21 +25,24 @@ import { createBoundProcess } from '../../codecatalyst/model' import { getLogger } from '../../shared/logger/logger' import { CancellationError, Timeout } from '../../shared/utilities/timeoutUtils' import { showMessageWithCancel } from '../../shared/utilities/messages' -import { SshConfig, sshLogFileLocation } from '../../shared/sshConfig' +import { SshConfig } from '../../shared/sshConfig' import { SshKeyPair } from './sshKeyPair' -import globals from '../../shared/extensionGlobals' +import { Ec2SessionTracker } from './remoteSessionManager' +import { getEc2SsmEnv } from './utils' export type Ec2ConnectErrorCode = 'EC2SSMStatus' | 'EC2SSMPermission' | 'EC2SSMConnect' | 'EC2SSMAgentStatus' -interface Ec2RemoteEnv extends VscodeRemoteConnection { +export interface Ec2RemoteEnv extends VscodeRemoteConnection { selection: Ec2Selection keyPair: SshKeyPair + ssmSession: SSM.StartSessionResponse } -export class Ec2ConnectionManager { +export class Ec2Connecter implements vscode.Disposable { protected ssmClient: SsmClient protected ec2Client: Ec2Client protected iamClient: DefaultIamClient + protected sessionManager: Ec2SessionTracker private policyDocumentationUri = vscode.Uri.parse( 'https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html' @@ -54,6 +56,7 @@ export class Ec2ConnectionManager { this.ssmClient = this.createSsmSdkClient() this.ec2Client = this.createEc2SdkClient() this.iamClient = this.createIamSdkClient() + this.sessionManager = new Ec2SessionTracker(regionCode, this.ssmClient) } protected createSsmSdkClient(): SsmClient { @@ -68,6 +71,18 @@ export class Ec2ConnectionManager { return new DefaultIamClient(this.regionCode) } + public async addActiveSession(sessionId: SSM.SessionId, instanceId: EC2.InstanceId): Promise { + await this.sessionManager.addSession(instanceId, sessionId) + } + + public async dispose(): Promise { + await this.sessionManager.dispose() + } + + public isConnectedTo(instanceId: string): boolean { + return this.sessionManager.isConnectedTo(instanceId) + } + public async getAttachedIamRole(instanceId: string): Promise { const IamInstanceProfile = await this.ec2Client.getAttachedIamInstanceProfile(instanceId) if (IamInstanceProfile && IamInstanceProfile.Arn) { @@ -185,6 +200,7 @@ export class Ec2ConnectionManager { this.throwGeneralConnectionError(selection, err as Error) } } + public async prepareEc2RemoteEnvWithProgress(selection: Ec2Selection, remoteUser: string): Promise { const timeout = new Timeout(60000) await showMessageWithCancel('AWS: Opening remote connection...', timeout) @@ -206,8 +222,10 @@ export class Ec2ConnectionManager { throw err } - const session = await this.ssmClient.startSession(selection.instanceId, 'AWS-StartSSHSession') - const vars = getEc2SsmEnv(selection, ssm, session) + const ssmSession = await this.ssmClient.startSession(selection.instanceId, 'AWS-StartSSHSession') + await this.addActiveSession(selection.instanceId, ssmSession.SessionId!) + + const vars = getEc2SsmEnv(selection, ssm, ssmSession) const envProvider = async () => { return { [sshAgentSocketVariable]: await startSshAgent(), ...vars } } @@ -225,6 +243,7 @@ export class Ec2ConnectionManager { SessionProcess, selection, keyPair, + ssmSession, } } @@ -235,8 +254,7 @@ export class Ec2ConnectionManager { } public async configureSshKeys(selection: Ec2Selection, remoteUser: string): Promise { - const keyPath = path.join(globals.context.globalStorageUri.fsPath, `aws-ec2-key`) - const keyPair = await SshKeyPair.getSshKeyPair(keyPath, 30000) + const keyPair = await SshKeyPair.getSshKeyPair(`aws-ec2-key`, 30000) await this.sendSshKeyToInstance(selection, keyPair, remoteUser) return keyPair } @@ -270,17 +288,3 @@ export class Ec2ConnectionManager { throw new ToolkitError(`Unrecognized OS name ${osName} on instance ${instanceId}`, { code: 'UnknownEc2OS' }) } } - -function getEc2SsmEnv(selection: Ec2Selection, ssmPath: string, session: SSM.StartSessionResponse): NodeJS.ProcessEnv { - return Object.assign( - { - AWS_REGION: selection.region, - AWS_SSM_CLI: ssmPath, - LOG_FILE_LOCATION: sshLogFileLocation('ec2', selection.instanceId), - STREAM_URL: session.StreamUrl, - SESSION_ID: session.SessionId, - TOKEN: session.TokenValue, - }, - process.env - ) -} diff --git a/packages/core/src/awsService/ec2/prompter.ts b/packages/core/src/awsService/ec2/prompter.ts index 6bbc301e515..638458942e2 100644 --- a/packages/core/src/awsService/ec2/prompter.ts +++ b/packages/core/src/awsService/ec2/prompter.ts @@ -10,6 +10,8 @@ import { isValidResponse } from '../../shared/wizards/wizard' import { CancellationError } from '../../shared/utilities/timeoutUtils' import { AsyncCollection } from '../../shared/utilities/asyncCollection' import { getIconCode } from './utils' +import { Ec2Node } from './explorer/ec2ParentNode' +import { Ec2InstanceNode } from './explorer/ec2InstanceNode' export type instanceFilter = (instance: SafeEc2Instance) => boolean export interface Ec2Selection { @@ -72,3 +74,9 @@ export class Ec2Prompter { ) } } + +export async function getSelection(node?: Ec2Node, filter?: instanceFilter): Promise { + const prompter = new Ec2Prompter(filter) + const selection = node && node instanceof Ec2InstanceNode ? node.toSelection() : await prompter.promptUser() + return selection +} diff --git a/packages/core/src/awsService/ec2/remoteSessionManager.ts b/packages/core/src/awsService/ec2/remoteSessionManager.ts new file mode 100644 index 00000000000..4c1843aabdb --- /dev/null +++ b/packages/core/src/awsService/ec2/remoteSessionManager.ts @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EC2, SSM } from 'aws-sdk' +import { SsmClient } from '../../shared/clients/ssmClient' +import { Disposable } from 'vscode' + +export class Ec2SessionTracker extends Map implements Disposable { + public constructor( + readonly regionCode: string, + protected ssmClient: SsmClient + ) { + super() + } + + public async addSession(instanceId: EC2.InstanceId, sessionId: SSM.SessionId): Promise { + if (this.isConnectedTo(instanceId)) { + const existingSessionId = this.get(instanceId)! + await this.ssmClient.terminateSessionFromId(existingSessionId) + this.set(instanceId, sessionId) + } else { + this.set(instanceId, sessionId) + } + } + + private async disconnectEnv(instanceId: EC2.InstanceId): Promise { + await this.ssmClient.terminateSessionFromId(this.get(instanceId)!) + this.delete(instanceId) + } + + public async dispose(): Promise { + this.forEach(async (_sessionId, instanceId) => await this.disconnectEnv(instanceId)) + } + + public isConnectedTo(instanceId: EC2.InstanceId): boolean { + return this.has(instanceId) + } +} diff --git a/packages/core/src/awsService/ec2/sshKeyPair.ts b/packages/core/src/awsService/ec2/sshKeyPair.ts index 0e7ab3ea3c3..45565aa6e41 100644 --- a/packages/core/src/awsService/ec2/sshKeyPair.ts +++ b/packages/core/src/awsService/ec2/sshKeyPair.ts @@ -2,12 +2,14 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { fs } from '../../shared' +import os from 'os' +import { fs, globals } from '../../shared' import { ToolkitError } from '../../shared/errors' import { tryRun } from '../../shared/utilities/pathFind' import { Timeout } from '../../shared/utilities/timeoutUtils' import { findAsync } from '../../shared/utilities/collectionUtils' import { RunParameterContext } from '../../shared/utilities/processUtils' +import path from 'path' type sshKeyType = 'rsa' | 'ed25519' @@ -19,7 +21,7 @@ export class SshKeyPair { private readonly keyPath: string, lifetime: number ) { - this.publicKeyPath = `${keyPath}.pub` + this.publicKeyPath = `${this.keyPath}.pub` this.lifeTimeout = new Timeout(lifetime) this.lifeTimeout.onCompletion(async () => { @@ -27,17 +29,45 @@ export class SshKeyPair { }) } - public static async getSshKeyPair(keyPath: string, lifetime: number) { + private static getKeypath(keyName: string): string { + return path.join(globals.context.globalStorageUri.fsPath, keyName) + } + + public static async getSshKeyPair(keyName: string, lifetime: number) { + const keyPath = SshKeyPair.getKeypath(keyName) await SshKeyPair.generateSshKeyPair(keyPath) return new SshKeyPair(keyPath, lifetime) } - public static async generateSshKeyPair(keyPath: string): Promise { - const keyGenerated = await this.tryKeyTypes(keyPath, ['ed25519', 'rsa']) + private static isValidKeyPath(keyPath: string): boolean { + const relative = path.relative(globals.context.globalStorageUri.fsPath, keyPath) + return relative !== undefined && !relative.startsWith('..') && !path.isAbsolute(relative) && keyPath.length > 4 + } + + private static assertValidKeypath(keyPath: string, message: string): void | never { + if (!SshKeyPair.isValidKeyPath(keyPath)) { + throw new ToolkitError(message) + } + } + + private static async assertGenerated(keyPath: string, keyGenerated: boolean): Promise { if (!keyGenerated) { - throw new ToolkitError('ec2: Unable to generate ssh key pair') + throw new ToolkitError('ec2: Unable to generate ssh key pair with either ed25519 or rsa') + } + + if (!(await fs.exists(keyPath))) { + throw new ToolkitError(`ec2: Failed to generate keys, resulting key not found at ${keyPath}`) + } + } + + public static async generateSshKeyPair(keyPath: string): Promise { + const keyGenerated = await SshKeyPair.tryKeyTypes(keyPath, ['ed25519', 'rsa']) + // Should already be the case, but just in case we assert permissions. + // skip on Windows since it only allows write permission to be changed. + if (!globals.isWeb && os.platform() !== 'win32') { + await fs.chmod(keyPath, 0o600) + await SshKeyPair.assertGenerated(keyPath, keyGenerated) } - await fs.chmod(keyPath, 0o600) } /** * Attempts to generate an ssh key pair. Returns true if successful, false otherwise. @@ -72,8 +102,12 @@ export class SshKeyPair { } public async delete(): Promise { - await fs.delete(this.keyPath) - await fs.delete(this.publicKeyPath) + SshKeyPair.assertValidKeypath( + this.keyPath, + `ec2: keyPath became invalid after creation, not deleting key at ${this.keyPath}` + ) + await fs.delete(this.keyPath, { force: true }) + await fs.delete(this.publicKeyPath, { force: true }) if (!this.lifeTimeout.completed) { this.lifeTimeout.cancel() diff --git a/packages/core/src/awsService/ec2/utils.ts b/packages/core/src/awsService/ec2/utils.ts index f9272f5cee1..cd0e374629e 100644 --- a/packages/core/src/awsService/ec2/utils.ts +++ b/packages/core/src/awsService/ec2/utils.ts @@ -4,6 +4,10 @@ */ import { SafeEc2Instance } from '../../shared/clients/ec2Client' +import { copyToClipboard } from '../../shared/utilities/messages' +import { Ec2Selection } from './prompter' +import { sshLogFileLocation } from '../../shared/sshConfig' +import { SSM } from 'aws-sdk' export function getIconCode(instance: SafeEc2Instance) { if (instance.LastSeenStatus === 'running') { @@ -16,3 +20,25 @@ export function getIconCode(instance: SafeEc2Instance) { return 'loading~spin' } + +export async function copyInstanceId(instanceId: string): Promise { + await copyToClipboard(instanceId, 'Id') +} + +export function getEc2SsmEnv( + selection: Ec2Selection, + ssmPath: string, + session: SSM.StartSessionResponse +): NodeJS.ProcessEnv { + return Object.assign( + { + AWS_REGION: selection.region, + AWS_SSM_CLI: ssmPath, + LOG_FILE_LOCATION: sshLogFileLocation('ec2', selection.instanceId), + STREAM_URL: session.StreamUrl, + SESSION_ID: session.SessionId, + TOKEN: session.TokenValue, + }, + process.env + ) +} diff --git a/packages/core/src/awsService/iot/explorer/iotCertificateNode.ts b/packages/core/src/awsService/iot/explorer/iotCertificateNode.ts index 64d1cc3ae35..0009d057833 100644 --- a/packages/core/src/awsService/iot/explorer/iotCertificateNode.ts +++ b/packages/core/src/awsService/iot/explorer/iotCertificateNode.ts @@ -50,7 +50,7 @@ export abstract class IotCertificateNode extends AWSTreeNodeBase implements AWSR this.certificate.id, this.certificate.activeStatus, formatLocalized(this.certificate.creationDate), - things?.length ?? 0 > 0 ? `\nAttached to: ${things!.join(', ')}` : '' + (things?.length ?? 0 > 0) ? `\nAttached to: ${things!.join(', ')}` : '' ) this.iconPath = getIcon('aws-iot-certificate') this.description = `\t[${this.certificate.activeStatus}]` diff --git a/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts b/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts index 790a5864e6f..3f9b7003d60 100644 --- a/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts +++ b/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts @@ -39,7 +39,7 @@ export class IotPolicyNode extends AWSTreeNodeBase implements AWSResourceNode { 'AWS.explorerNode.iot.policyToolTip', '{0}{1}', policy.name, - certs?.length ?? 0 > 0 ? `\nAttached to: ${certs?.join(', ')}` : '' + (certs?.length ?? 0 > 0) ? `\nAttached to: ${certs?.join(', ')}` : '' ) this.iconPath = getIcon('aws-iot-policy') this.contextValue = 'awsIotPolicyNode.Certificates' 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/awsService/s3/commands/uploadFile.ts b/packages/core/src/awsService/s3/commands/uploadFile.ts index 43b17aa81c4..4bfcc91e027 100644 --- a/packages/core/src/awsService/s3/commands/uploadFile.ts +++ b/packages/core/src/awsService/s3/commands/uploadFile.ts @@ -6,7 +6,7 @@ import * as path from 'path' import * as mime from 'mime-types' import * as vscode from 'vscode' -import { statSync } from 'fs' +import { statSync } from 'fs' // eslint-disable-line no-restricted-imports import { S3 } from 'aws-sdk' import { getLogger } from '../../../shared/logger' import { S3Node } from '../explorer/s3Nodes' 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/codecatalyst/devEnv.ts b/packages/core/src/codecatalyst/devEnv.ts index cd45b353358..44db151d8de 100644 --- a/packages/core/src/codecatalyst/devEnv.ts +++ b/packages/core/src/codecatalyst/devEnv.ts @@ -98,7 +98,7 @@ export class DevEnvActivityStarter { } // If user is not authenticated, assume 15 minutes. const inactivityTimeoutMin = - devenvTimeoutMs > 0 ? devenvTimeoutMs / 60000 : thisDevenv?.summary.inactivityTimeoutMinutes ?? 15 + devenvTimeoutMs > 0 ? devenvTimeoutMs / 60000 : (thisDevenv?.summary.inactivityTimeoutMinutes ?? 15) if (!shouldSendActivity(inactivityTimeoutMin)) { getLogger().info( `codecatalyst: disabling DevEnvActivity heartbeat: configured to never timeout (inactivityTimeoutMinutes=${inactivityTimeoutMin})` diff --git a/packages/core/src/codewhisperer/client/user-service-2.json b/packages/core/src/codewhisperer/client/user-service-2.json index bda8d16922d..9defffe1063 100644 --- a/packages/core/src/codewhisperer/client/user-service-2.json +++ b/packages/core/src/codewhisperer/client/user-service-2.json @@ -39,6 +39,7 @@ "output": { "shape": "CreateTaskAssistConversationResponse" }, "errors": [ { "shape": "ThrottlingException" }, + { "shape": "ServiceQuotaExceededException" }, { "shape": "InternalServerException" }, { "shape": "ValidationException" }, { "shape": "AccessDeniedException" } @@ -56,6 +57,7 @@ "errors": [ { "shape": "ThrottlingException" }, { "shape": "ConflictException" }, + { "shape": "ServiceQuotaExceededException" }, { "shape": "ResourceNotFoundException" }, { "shape": "InternalServerException" }, { "shape": "ValidationException" }, @@ -278,6 +280,7 @@ "errors": [ { "shape": "ThrottlingException" }, { "shape": "ConflictException" }, + { "shape": "ServiceQuotaExceededException" }, { "shape": "ResourceNotFoundException" }, { "shape": "InternalServerException" }, { "shape": "ValidationException" }, @@ -336,6 +339,53 @@ "documentation": "

Reason for AccessDeniedException

", "enum": ["UNAUTHORIZED_CUSTOMIZATION_RESOURCE_ACCESS"] }, + "AppStudioState": { + "type": "structure", + "required": ["namespace", "propertyName", "propertyContext"], + "members": { + "namespace": { + "shape": "AppStudioStateNamespaceString", + "documentation": "

The namespace of the context. Examples: 'ui.Button', 'ui.Table.DataSource', 'ui.Table.RowActions.Button', 'logic.invokeAWS', 'logic.JavaScript'

" + }, + "propertyName": { + "shape": "AppStudioStatePropertyNameString", + "documentation": "

The name of the property. Examples: 'visibility', 'disability', 'value', 'code'

" + }, + "propertyValue": { + "shape": "AppStudioStatePropertyValueString", + "documentation": "

The value of the property.

" + }, + "propertyContext": { + "shape": "AppStudioStatePropertyContextString", + "documentation": "

Context about how the property is used

" + } + }, + "documentation": "

Description of a user's context when they are calling Q Chat from AppStudio

" + }, + "AppStudioStateNamespaceString": { + "type": "string", + "max": 1024, + "min": 1, + "sensitive": true + }, + "AppStudioStatePropertyContextString": { + "type": "string", + "max": 1024, + "min": 1, + "sensitive": true + }, + "AppStudioStatePropertyNameString": { + "type": "string", + "max": 1024, + "min": 1, + "sensitive": true + }, + "AppStudioStatePropertyValueString": { + "type": "string", + "max": 10240, + "min": 0, + "sensitive": true + }, "ArtifactId": { "type": "string", "max": 126, @@ -544,7 +594,8 @@ "members": { "programmingLanguage": { "shape": "ProgrammingLanguage" }, "codeScanJobId": { "shape": "CodeScanJobId" }, - "timestamp": { "shape": "Timestamp" } + "timestamp": { "shape": "Timestamp" }, + "codeAnalysisScope": { "shape": "CodeAnalysisScope" } } }, "CodeScanJobId": { @@ -612,6 +663,18 @@ "documentation": "

This exception is thrown when the action to perform could not be completed because the resource is in a conflicting state.

", "exception": true }, + "ConsoleState": { + "type": "structure", + "members": { + "region": { "shape": "String" }, + "consoleUrl": { "shape": "SensitiveString" }, + "serviceId": { "shape": "String" }, + "serviceConsolePage": { "shape": "String" }, + "serviceSubconsolePage": { "shape": "String" }, + "taskName": { "shape": "SensitiveString" } + }, + "documentation": "

Information about the state of the AWS management console page from which the user is calling

" + }, "ContentChecksumType": { "type": "string", "enum": ["SHA_256"] @@ -700,9 +763,7 @@ "uploadId": { "shape": "UploadId" }, "uploadUrl": { "shape": "PreSignedUrl" }, "kmsKeyArn": { "shape": "ResourceArn" }, - "requestHeaders": { - "shape": "RequestHeaders" - } + "requestHeaders": { "shape": "RequestHeaders" } } }, "CursorState": { @@ -860,6 +921,14 @@ "cursorState": { "shape": "CursorState", "documentation": "

Position of the cursor

" + }, + "relevantDocuments": { + "shape": "RelevantDocumentList", + "documentation": "

Represents IDE provided relevant files

" + }, + "useRelevantDocuments": { + "shape": "Boolean", + "documentation": "

Whether service should use relevant document in prompt

" } }, "documentation": "

Represents the state of an Editor

" @@ -927,6 +996,13 @@ "max": 100, "min": 0 }, + "FeatureDevEvent": { + "type": "structure", + "required": ["conversationId"], + "members": { + "conversationId": { "shape": "ConversationId" } + } + }, "FeatureEvaluation": { "type": "structure", "required": ["feature", "variation", "value"], @@ -1029,7 +1105,8 @@ "supplementalContexts": { "shape": "SupplementalContextList" }, "customizationArn": { "shape": "CustomizationArn" }, "optOutPreference": { "shape": "OptOutPreference" }, - "userContext": { "shape": "UserContext" } + "userContext": { "shape": "UserContext" }, + "profileArn": { "shape": "ProfileArn" } } }, "GenerateCompletionsRequestMaxResultsInteger": { @@ -1143,7 +1220,7 @@ }, "IdeCategory": { "type": "string", - "enum": ["JETBRAINS", "VSCODE", "CLI"], + "enum": ["JETBRAINS", "VSCODE", "CLI", "JUPYTER_MD", "JUPYTER_SM"], "max": 64, "min": 1 }, @@ -1170,6 +1247,29 @@ "max": 10, "min": 0 }, + "InlineChatEvent": { + "type": "structure", + "required": ["requestId", "timestamp"], + "members": { + "requestId": { "shape": "UUID" }, + "timestamp": { "shape": "Timestamp" }, + "inputLength": { "shape": "PrimitiveInteger" }, + "numSelectedLines": { "shape": "PrimitiveInteger" }, + "numSuggestionAddChars": { "shape": "PrimitiveInteger" }, + "numSuggestionAddLines": { "shape": "PrimitiveInteger" }, + "numSuggestionDelChars": { "shape": "PrimitiveInteger" }, + "numSuggestionDelLines": { "shape": "PrimitiveInteger" }, + "codeIntent": { "shape": "Boolean" }, + "userDecision": { "shape": "InlineChatUserDecision" }, + "responseStartLatency": { "shape": "Double" }, + "responseEndLatency": { "shape": "Double" }, + "programmingLanguage": { "shape": "ProgrammingLanguage" } + } + }, + "InlineChatUserDecision": { + "type": "string", + "enum": ["ACCEPT", "REJECT", "DISMISS"] + }, "Integer": { "type": "integer", "box": true @@ -1313,6 +1413,12 @@ "sensitive": true }, "PrimitiveInteger": { "type": "integer" }, + "ProfileArn": { + "type": "string", + "max": 950, + "min": 0, + "pattern": "arn:aws:codewhisperer:[-.a-z0-9]{1,63}:\\d{12}:profile/([a-zA-Z0-9]){12}" + }, "ProgrammingLanguage": { "type": "structure", "required": ["languageName"], @@ -1325,7 +1431,7 @@ "type": "string", "max": 128, "min": 1, - "pattern": "(python|javascript|java|csharp|typescript|c|cpp|go|kotlin|php|ruby|rust|scala|shell|sql|json|yaml|vue|tf|tsx|jsx)" + "pattern": "(python|javascript|java|csharp|typescript|c|cpp|go|kotlin|php|ruby|rust|scala|shell|sql|json|yaml|vue|tf|tsx|jsx|plaintext)" }, "ProgressUpdates": { "type": "list", @@ -1401,11 +1507,46 @@ "max": 10, "min": 0 }, - "ResourceArn": { + "RelevantDocumentList": { + "type": "list", + "member": { "shape": "RelevantTextDocument" }, + "max": 5, + "min": 0 + }, + "RelevantTextDocument": { + "type": "structure", + "required": ["relativeFilePath"], + "members": { + "relativeFilePath": { + "shape": "RelevantTextDocumentRelativeFilePathString", + "documentation": "

Filepath relative to the root of the workspace

" + }, + "programmingLanguage": { + "shape": "ProgrammingLanguage", + "documentation": "

The text document's language identifier.

" + }, + "text": { + "shape": "RelevantTextDocumentTextString", + "documentation": "

Content of the text document

" + }, + "documentSymbols": { + "shape": "DocumentSymbols", + "documentation": "

DocumentSymbols parsed from a text document

" + } + }, + "documentation": "

Represents an IDE retrieved relevant Text Document / File

" + }, + "RelevantTextDocumentRelativeFilePathString": { "type": "string", - "max": 1224, + "max": 4096, + "min": 1, + "sensitive": true + }, + "RelevantTextDocumentTextString": { + "type": "string", + "max": 10240, "min": 0, - "pattern": "arn:([-.a-z0-9]{1,63}:){2}([-.a-z0-9]{0,63}:){2}([a-zA-Z0-9-_:/]){1,1023}" + "sensitive": true }, "RequestHeaderKey": { "type": "string", @@ -1419,14 +1560,17 @@ }, "RequestHeaders": { "type": "map", - "key": { - "shape": "RequestHeaderKey" - }, - "value": { - "shape": "RequestHeaderValue" - }, + "key": { "shape": "RequestHeaderKey" }, + "value": { "shape": "RequestHeaderValue" }, "max": 16, - "min": 1 + "min": 1, + "sensitive": true + }, + "ResourceArn": { + "type": "string", + "max": 1224, + "min": 0, + "pattern": "arn:([-.a-z0-9]{1,63}:){2}([-.a-z0-9]{0,63}:){2}([a-zA-Z0-9-_:/]){1,1023}" }, "ResourceNotFoundException": { "type": "structure", @@ -1495,7 +1639,8 @@ }, "telemetryEvent": { "shape": "TelemetryEvent" }, "optOutPreference": { "shape": "OptOutPreference" }, - "userContext": { "shape": "UserContext" } + "userContext": { "shape": "UserContext" }, + "profileArn": { "shape": "ProfileArn" } } }, "SendTelemetryEventResponse": { @@ -1506,6 +1651,15 @@ "type": "string", "sensitive": true }, + "ServiceQuotaExceededException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { "shape": "String" } + }, + "documentation": "

This exception is thrown when request was denied due to caller exceeding their usage limits

", + "exception": true + }, "ShellHistory": { "type": "list", "member": { "shape": "ShellHistoryEntry" }, @@ -1609,11 +1763,11 @@ "members": { "artifacts": { "shape": "ArtifactMap" }, "programmingLanguage": { "shape": "ProgrammingLanguage" }, - "scope": { "shape": "CodeAnalysisScope" }, "clientToken": { "shape": "StartCodeAnalysisRequestClientTokenString", "idempotencyToken": true }, + "scope": { "shape": "CodeAnalysisScope" }, "codeScanName": { "shape": "CodeScanName" } } }, @@ -1641,7 +1795,9 @@ "required": ["conversationState", "workspaceState"], "members": { "conversationState": { "shape": "ConversationState" }, - "workspaceState": { "shape": "WorkspaceState" } + "workspaceState": { "shape": "WorkspaceState" }, + "taskAssistPlan": { "shape": "TaskAssistPlan" }, + "currentCodeGenerationId": { "shape": "CodeGenerationId" } }, "documentation": "

Structure to represent start code generation request.

" }, @@ -1770,6 +1926,63 @@ "type": "string", "enum": ["DECLARATION", "USAGE"] }, + "TaskAssistPlan": { + "type": "list", + "member": { "shape": "TaskAssistPlanStep" }, + "min": 0 + }, + "TaskAssistPlanStep": { + "type": "structure", + "required": ["filePath", "description"], + "members": { + "filePath": { + "shape": "TaskAssistPlanStepFilePathString", + "documentation": "

File path on which the step is working on.

" + }, + "description": { + "shape": "TaskAssistPlanStepDescriptionString", + "documentation": "

Description on the step.

" + }, + "startLine": { + "shape": "TaskAssistPlanStepStartLineInteger", + "documentation": "

Start line number of the related changes.

" + }, + "endLine": { + "shape": "TaskAssistPlanStepEndLineInteger", + "documentation": "

End line number of the related changes.

" + }, + "action": { + "shape": "TaskAssistPlanStepAction", + "documentation": "

Type of the action.

" + } + }, + "documentation": "

Structured plan step for a task assist plan.

" + }, + "TaskAssistPlanStepAction": { + "type": "string", + "documentation": "

Action for task assist plan step

", + "enum": ["MODIFY", "CREATE", "DELETE", "UNKNOWN"] + }, + "TaskAssistPlanStepDescriptionString": { + "type": "string", + "max": 1024, + "min": 1 + }, + "TaskAssistPlanStepEndLineInteger": { + "type": "integer", + "box": true, + "min": 0 + }, + "TaskAssistPlanStepFilePathString": { + "type": "string", + "max": 1024, + "min": 1 + }, + "TaskAssistPlanStepStartLineInteger": { + "type": "integer", + "box": true, + "min": 0 + }, "TaskAssistPlanningUploadContext": { "type": "structure", "required": ["conversationId"], @@ -1789,7 +2002,9 @@ "chatAddMessageEvent": { "shape": "ChatAddMessageEvent" }, "chatInteractWithMessageEvent": { "shape": "ChatInteractWithMessageEvent" }, "chatUserModificationEvent": { "shape": "ChatUserModificationEvent" }, - "terminalUserInteractionEvent": { "shape": "TerminalUserInteractionEvent" } + "terminalUserInteractionEvent": { "shape": "TerminalUserInteractionEvent" }, + "featureDevEvent": { "shape": "FeatureDevEvent" }, + "inlineChatEvent": { "shape": "InlineChatEvent" } }, "union": true }, @@ -1929,7 +2144,7 @@ }, "TransformationDownloadArtifactType": { "type": "string", - "enum": ["ClientInstructions", "Logs"] + "enum": ["ClientInstructions", "Logs", "GeneratedCode"] }, "TransformationDownloadArtifacts": { "type": "list", @@ -1962,7 +2177,15 @@ }, "TransformationLanguage": { "type": "string", - "enum": ["JAVA_8", "JAVA_11", "JAVA_17", "C_SHARP"] + "enum": ["JAVA_8", "JAVA_11", "JAVA_17", "C_SHARP", "COBOL", "PL_I", "JCL"] + }, + "TransformationLanguages": { + "type": "list", + "member": { "shape": "TransformationLanguage" } + }, + "TransformationMainframeRuntimeEnv": { + "type": "string", + "enum": ["MAINFRAME"] }, "TransformationOperatingSystemFamily": { "type": "string", @@ -1995,24 +2218,40 @@ }, "TransformationProgressUpdateStatus": { "type": "string", - "enum": ["IN_PROGRESS", "COMPLETED", "FAILED", "PAUSED"] + "enum": ["IN_PROGRESS", "COMPLETED", "FAILED", "PAUSED", "AWAITING_CLIENT_ACTION"] + }, + "TransformationProjectArtifactDescriptor": { + "type": "structure", + "members": { + "sourceCodeArtifact": { "shape": "TransformationSourceCodeArtifactDescriptor" } + }, + "union": true }, "TransformationProjectState": { "type": "structure", "members": { "language": { "shape": "TransformationLanguage" }, "runtimeEnv": { "shape": "TransformationRuntimeEnv" }, - "platformConfig": { "shape": "TransformationPlatformConfig" } + "platformConfig": { "shape": "TransformationPlatformConfig" }, + "projectArtifact": { "shape": "TransformationProjectArtifactDescriptor" } } }, "TransformationRuntimeEnv": { "type": "structure", "members": { "java": { "shape": "TransformationJavaRuntimeEnv" }, - "dotNet": { "shape": "TransformationDotNetRuntimeEnv" } + "dotNet": { "shape": "TransformationDotNetRuntimeEnv" }, + "mainframe": { "shape": "TransformationMainframeRuntimeEnv" } }, "union": true }, + "TransformationSourceCodeArtifactDescriptor": { + "type": "structure", + "members": { + "languages": { "shape": "TransformationLanguages" }, + "runtimeEnv": { "shape": "TransformationRuntimeEnv" } + } + }, "TransformationSpec": { "type": "structure", "members": { @@ -2066,11 +2305,11 @@ }, "TransformationType": { "type": "string", - "enum": ["LANGUAGE_UPGRADE"] + "enum": ["LANGUAGE_UPGRADE", "DOCUMENT_GENERATION"] }, "TransformationUploadArtifactType": { "type": "string", - "enum": ["Dependencies"] + "enum": ["Dependencies", "ClientBuildResult"] }, "TransformationUploadContext": { "type": "structure", @@ -2173,11 +2412,23 @@ }, "envState": { "shape": "EnvState", - "documentation": "

Environment state chat messaage context.

" + "documentation": "

Environment state chat message context.

" + }, + "appStudioContext": { + "shape": "AppStudioState", + "documentation": "

The state of a user's AppStudio UI when sending a message.

" }, "diagnostic": { "shape": "Diagnostic", "documentation": "

Diagnostic chat message context.

" + }, + "consoleState": { + "shape": "ConsoleState", + "documentation": "

Contextual information about the environment from which the user is calling.

" + }, + "userSettings": { + "shape": "UserSettings", + "documentation": "

Settings information, e.g., whether the user has enabled cross-region API calls.

" } }, "documentation": "

Additional Chat message context associated with the Chat Message

" @@ -2192,21 +2443,39 @@ "SHOW_EXAMPLES", "CITE_SOURCES", "EXPLAIN_LINE_BY_LINE", - "EXPLAIN_CODE_SELECTION" + "EXPLAIN_CODE_SELECTION", + "GENERATE_CLOUDFORMATION_TEMPLATE" ] }, "UserModificationEvent": { "type": "structure", - "required": ["sessionId", "requestId", "programmingLanguage", "modificationPercentage", "timestamp"], + "required": [ + "sessionId", + "requestId", + "programmingLanguage", + "modificationPercentage", + "timestamp", + "acceptedCharacterCount", + "unmodifiedAcceptedCharacterCount" + ], "members": { "sessionId": { "shape": "UUID" }, "requestId": { "shape": "UUID" }, "programmingLanguage": { "shape": "ProgrammingLanguage" }, "modificationPercentage": { "shape": "Double" }, "customizationArn": { "shape": "CustomizationArn" }, - "timestamp": { "shape": "Timestamp" } + "timestamp": { "shape": "Timestamp" }, + "acceptedCharacterCount": { "shape": "PrimitiveInteger" }, + "unmodifiedAcceptedCharacterCount": { "shape": "PrimitiveInteger" } } }, + "UserSettings": { + "type": "structure", + "members": { + "hasConsentedToCrossRegionCalls": { "shape": "Boolean" } + }, + "documentation": "

Settings information passed by the Q widget

" + }, "UserTriggerDecisionEvent": { "type": "structure", "required": [ @@ -2230,7 +2499,9 @@ "triggerToResponseLatencyMilliseconds": { "shape": "Double" }, "suggestionReferenceCount": { "shape": "PrimitiveInteger" }, "generatedLine": { "shape": "PrimitiveInteger" }, - "numberOfRecommendations": { "shape": "PrimitiveInteger" } + "numberOfRecommendations": { "shape": "PrimitiveInteger" }, + "perceivedLatencyMilliseconds": { "shape": "Double" }, + "acceptedCharacterCount": { "shape": "PrimitiveInteger" } } }, "ValidationException": { diff --git a/packages/core/src/codewhisperer/commands/basicCommands.ts b/packages/core/src/codewhisperer/commands/basicCommands.ts index 4f202eb93a8..53e693b8e69 100644 --- a/packages/core/src/codewhisperer/commands/basicCommands.ts +++ b/packages/core/src/codewhisperer/commands/basicCommands.ts @@ -41,8 +41,9 @@ import { ToolkitError, getTelemetryReason, getTelemetryReasonDesc } from '../../ import { isRemoteWorkspace } from '../../shared/vscode/env' import { isBuilderIdConnection } from '../../auth/connection' import globals from '../../shared/extensionGlobals' -import { getVscodeCliPath, tryRun } from '../../shared/utilities/pathFind' +import { getVscodeCliPath } from '../../shared/utilities/pathFind' import { setContext } from '../../shared/vscode/setContext' +import { tryRun } from '../../shared/utilities/pathFind' const MessageTimeOut = 5_000 diff --git a/packages/core/src/codewhisperer/commands/startSecurityScan.ts b/packages/core/src/codewhisperer/commands/startSecurityScan.ts index 8dee806f9df..58eaee2bf40 100644 --- a/packages/core/src/codewhisperer/commands/startSecurityScan.ts +++ b/packages/core/src/codewhisperer/commands/startSecurityScan.ts @@ -93,7 +93,8 @@ export async function startSecurityScan( editor: vscode.TextEditor | undefined, client: DefaultCodeWhispererClient, context: vscode.ExtensionContext, - scope: CodeWhispererConstants.CodeAnalysisScope + scope: CodeWhispererConstants.CodeAnalysisScope, + zipUtil: ZipUtil = new ZipUtil() ) { const logger = getLoggerForScope(scope) /** @@ -130,7 +131,6 @@ export async function startSecurityScan( * Step 1: Generate zip */ throwIfCancelled(scope, codeScanStartTime) - const zipUtil = new ZipUtil() const zipMetadata = await zipUtil.generateZip(editor?.document.uri, scope) const projectPaths = zipUtil.getProjectPaths() diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index 4d3c667f235..edf48ed00c5 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -4,8 +4,9 @@ */ import * as vscode from 'vscode' -import * as fs from 'fs' +import * as fs from 'fs' // eslint-disable-line no-restricted-imports import * as os from 'os' +import * as xml2js from 'xml2js' import path from 'path' import { getLogger } from '../../shared/logger' import * as CodeWhispererConstants from '../models/constants' @@ -15,9 +16,10 @@ import { JDKVersion, jobPlanProgress, FolderInfo, - TransformationCandidateProject, ZipManifest, TransformByQStatus, + DB, + TransformationType, } from '../models/model' import { convertDateToTimestamp } from '../../shared/utilities/textUtilities' import { @@ -37,7 +39,11 @@ import { uploadPayload, zipCode, } from '../service/transformByQ/transformApiHandler' -import { getOpenProjects, validateOpenProjects } from '../service/transformByQ/transformProjectValidationHandler' +import { + getJavaProjects, + getOpenProjects, + validateOpenProjects, +} from '../service/transformByQ/transformProjectValidationHandler' import { getVersionData, prepareProjectDependencies, @@ -81,17 +87,68 @@ function getFeedbackCommentData() { return s } -export async function processTransformFormInput( +export async function processLanguageUpgradeTransformFormInput( pathToProject: string, fromJDKVersion: JDKVersion, toJDKVersion: JDKVersion ) { + transformByQState.setTransformationType(TransformationType.LANGUAGE_UPGRADE) transformByQState.setProjectName(path.basename(pathToProject)) transformByQState.setProjectPath(pathToProject) transformByQState.setSourceJDKVersion(fromJDKVersion) transformByQState.setTargetJDKVersion(toJDKVersion) } +export async function processSQLConversionTransformFormInput(pathToProject: string, schema: string) { + transformByQState.setTransformationType(TransformationType.SQL_CONVERSION) + transformByQState.setProjectName(path.basename(pathToProject)) + transformByQState.setProjectPath(pathToProject) + transformByQState.setSchema(schema) + transformByQState.setSourceJDKVersion(JDKVersion.JDK8) // use dummy value of JDK8 so that startJob API can be called + // targetJDKVersion defaults to JDK17, the only supported version, which is fine +} + +export async function validateSQLMetadataFile(fileContents: string, message: any) { + try { + const sctData = await xml2js.parseStringPromise(fileContents) + const dbEntities = sctData['tree']['instances'][0]['ProjectModel'][0]['entities'][0] + const sourceDB = dbEntities['sources'][0]['DbServer'][0]['$']['vendor'].trim().toUpperCase() + const targetDB = dbEntities['targets'][0]['DbServer'][0]['$']['vendor'].trim().toUpperCase() + const sourceServerName = dbEntities['sources'][0]['DbServer'][0]['$']['name'].trim() + transformByQState.setSourceServerName(sourceServerName) + if (sourceDB !== DB.ORACLE) { + transformByQState.getChatMessenger()?.sendUnrecoverableErrorResponse('unsupported-source-db', message.tabID) + return false + } else if (targetDB !== DB.AURORA_POSTGRESQL && targetDB !== DB.RDS_POSTGRESQL) { + transformByQState.getChatMessenger()?.sendUnrecoverableErrorResponse('unsupported-target-db', message.tabID) + return false + } + transformByQState.setSourceDB(sourceDB) + transformByQState.setTargetDB(targetDB) + + const serverNodeLocations = + sctData['tree']['instances'][0]['ProjectModel'][0]['relations'][0]['server-node-location'] + const schemaNames = new Set() + serverNodeLocations.forEach((serverNodeLocation: any) => { + const schemaNodes = serverNodeLocation['FullNameNodeInfoList'][0]['nameParts'][0][ + 'FullNameNodeInfo' + ].filter((node: any) => node['$']['typeNode'].toLowerCase() === 'schema') + schemaNodes.forEach((node: any) => { + schemaNames.add(node['$']['nameNode'].toUpperCase()) + }) + }) + transformByQState.setSchemaOptions(schemaNames) // user will choose one of these + getLogger().info( + `CodeTransformation: Parsed .sct file with source DB: ${sourceDB}, target DB: ${targetDB}, source host name: ${sourceServerName}, and schema names: ${Array.from(schemaNames)}` + ) + } catch (err: any) { + getLogger().error('CodeTransformation: Error parsing .sct file.', err) + transformByQState.getChatMessenger()?.sendUnrecoverableErrorResponse('error-parsing-sct-file', message.tabID) + return false + } + return true +} + export async function setMaven() { let mavenWrapperExecutableName = os.platform() === 'win32' ? 'mvnw.cmd' : 'mvnw' const mavenWrapperExecutablePath = path.join(transformByQState.getProjectPath(), mavenWrapperExecutableName) @@ -278,8 +335,9 @@ export async function preTransformationUploadCode() { // if the user chose to skip unit tests, add the custom build command here transformZipManifest.customBuildCommand = transformByQState.getCustomBuildCommand() const zipCodeResult = await zipCode({ - dependenciesFolder: transformByQState.getDependencyFolderInfo()!, - modulePath: transformByQState.getProjectPath(), + // dependenciesFolder will be undefined for SQL conversions since we don't compileProject + dependenciesFolder: transformByQState.getDependencyFolderInfo(), + projectPath: transformByQState.getProjectPath(), zipManifest: transformZipManifest, }) @@ -607,6 +665,10 @@ export async function pollTransformationStatusUntilPlanReady(jobId: string) { throw new PollJobError() } } + if (transformByQState.getTransformationType() === TransformationType.SQL_CONVERSION) { + // for now, no plan shown with SQL conversions. later, we may add one + return + } let plan = undefined try { plan = await getTransformationPlan(jobId) @@ -663,9 +725,16 @@ export async function finalizeTransformationJob(status: string) { jobPlanProgress['transformCode'] = StepProgress.Succeeded } -export async function getValidCandidateProjects(): Promise { +export async function getValidLanguageUpgradeCandidateProjects() { + const openProjects = await getOpenProjects() + const javaMavenProjects = await validateOpenProjects(openProjects) + return javaMavenProjects +} + +export async function getValidSQLConversionCandidateProjects() { const openProjects = await getOpenProjects() - return validateOpenProjects(openProjects) + const javaProjects = await getJavaProjects(openProjects) + return javaProjects } export async function setTransformationToRunningState() { @@ -717,20 +786,23 @@ export async function postTransformationJob() { const durationInMs = calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime()) const resultStatusMessage = transformByQState.getStatus() - const versionInfo = await getVersionData() - const mavenVersionInfoMessage = `${versionInfo[0]} (${transformByQState.getMavenName()})` - const javaVersionInfoMessage = `${versionInfo[1]} (${transformByQState.getMavenName()})` - - // Note: IntelliJ implementation of ResultStatusMessage includes additional metadata such as jobId. - telemetry.codeTransform_totalRunTime.emit({ - buildSystemVersion: mavenVersionInfoMessage, - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - codeTransformResultStatusMessage: resultStatusMessage, - codeTransformRunTimeLatency: durationInMs, - codeTransformLocalJavaVersion: javaVersionInfoMessage, - result: resultStatusMessage === TransformByQStatus.Succeeded ? MetadataResult.Pass : MetadataResult.Fail, - reason: resultStatusMessage, - }) + if (transformByQState.getTransformationType() !== TransformationType.SQL_CONVERSION) { + // the below is only applicable when user is doing a Java 8/11 language upgrade + const versionInfo = await getVersionData() + const mavenVersionInfoMessage = `${versionInfo[0]} (${transformByQState.getMavenName()})` + const javaVersionInfoMessage = `${versionInfo[1]} (${transformByQState.getMavenName()})` + + // Note: IntelliJ implementation of ResultStatusMessage includes additional metadata such as jobId. + telemetry.codeTransform_totalRunTime.emit({ + buildSystemVersion: mavenVersionInfoMessage, + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + codeTransformResultStatusMessage: resultStatusMessage, + codeTransformRunTimeLatency: durationInMs, + codeTransformLocalJavaVersion: javaVersionInfoMessage, + result: resultStatusMessage === TransformByQStatus.Succeeded ? MetadataResult.Pass : MetadataResult.Fail, + reason: resultStatusMessage, + }) + } if (transformByQState.isSucceeded()) { void vscode.window.showInformationMessage(CodeWhispererConstants.jobCompletedNotification) diff --git a/packages/core/src/codewhisperer/index.ts b/packages/core/src/codewhisperer/index.ts index af056f8c76d..1c6423f7c86 100644 --- a/packages/core/src/codewhisperer/index.ts +++ b/packages/core/src/codewhisperer/index.ts @@ -25,6 +25,7 @@ export type { Completion, SendTelemetryEventResponse, TelemetryEvent, + InlineChatEvent, } from './client/codewhispereruserclient.d.ts' export type { default as CodeWhispererUserClient } from './client/codewhispereruserclient.d.ts' export { SecurityPanelViewProvider } from './views/securityPanelViewProvider' @@ -87,3 +88,5 @@ export * as supplementalContextUtil from './util/supplementalContext/supplementa export * from './service/diagnosticsProvider' export * as diagnosticsProvider from './service/diagnosticsProvider' export * from './ui/codeWhispererNodes' +export { getSelectedCustomization } from './util/customizationUtil' +export { Container } from './service/serviceContainer' diff --git a/packages/core/src/codewhisperer/models/constants.ts b/packages/core/src/codewhisperer/models/constants.ts index 41347803bd1..52b5b27d3e8 100644 --- a/packages/core/src/codewhisperer/models/constants.ts +++ b/packages/core/src/codewhisperer/models/constants.ts @@ -22,6 +22,20 @@ export const AWSTemplateKeyWords = ['AWSTemplateFormatVersion', 'Resources', 'AW export const AWSTemplateCaseInsensitiveKeyWords = ['cloudformation', 'cfn', 'template', 'description'] +export const JsonConfigFileNamingConvention = new Set([ + 'app.json', + 'appsettings.json', + 'bower.json', + 'composer.json', + 'db.json', + 'manifest.json', + 'package.json', + 'schema.json', + 'settings.json', + 'tsconfig.json', + 'vcpkg.json', +]) + export const normalTextChangeRegex = /[A-Za-z0-9]/g export const autoSuggestionConfig = { @@ -98,6 +112,14 @@ export const platformLanguageIds = [ 'packer', 'plaintext', 'jsonc', + 'systemverilog', + 'verilog', + 'powershell', + 'dart', + 'lua', + 'r', + 'swift', + 'vue', ] as const export type PlatformLanguageId = (typeof platformLanguageIds)[number] @@ -328,6 +350,7 @@ export const updateInlineLockKey = 'CODEWHISPERER_INLINE_UPDATE_LOCK_KEY' export const newCustomizationMessage = 'You have access to new Amazon Q customizations.' // Start of QCT Strings + export const uploadZipSizeLimitInBytes = 2000000000 // 2GB export const maxBufferSize = 1024 * 1024 * 8 // this is 8MB; the default max buffer size for stdout for spawnSync is 1MB @@ -420,20 +443,20 @@ export const codeTransformLocThreshold = 100000 export const jobStartedChatMessage = 'I am starting to transform your code. It can take 10 to 30 minutes to upgrade your code, depending on the size of your project. To monitor progress, go to the Transformation Hub. If I run into any issues, I might pause the transformation to get input from you on how to proceed.' -export const uploadingCodeStepMessage = 'Uploading your code' +export const uploadingCodeStepMessage = 'Upload your code' export const buildCodeStepMessage = 'Build uploaded code in secure build environment' export const generatePlanStepMessage = 'Generate transformation plan' -export const transformStepMessage = 'Transform your code to Java 17 using transformation plan' +export const transformStepMessage = 'Transform your code' export const filesUploadedMessage = 'Files have been uploaded to Amazon Q, transformation job has been accepted and is preparing to start.' export const planningMessage = 'Amazon Q is analyzing your code in order to generate a transformation plan.' -export const transformingMessage = 'Amazon Q is transforming your code. Details will appear soon.' +export const transformingMessage = 'Amazon Q is transforming your code.' export const stoppingJobMessage = 'Stopping the transformation...' @@ -476,6 +499,24 @@ export const absolutePathDetectedMessage = (numPaths: number, buildFile: string, export const unsupportedJavaVersionChatMessage = `Sorry, currently I can only upgrade Java 8 or Java 11 projects. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).` +export const selectSQLMetadataFileHelpMessage = + 'Next, I need the zipped metadata file from your schema conversion. You can download the metadata by going to your migration project in the AWS DMS console. Open the schema conversion and choose **Convert the embedded SQL in your application**. You can downloaded the metadata from Amazon S3 in the {schema-conversion-project}/ directory.' + +export const invalidMetadataFileUnsupportedSourceDB = + 'I can only convert SQL for migrations from an Oracle source database. The provided .sct file indicates another source database for this migration.' + +export const invalidMetadataFileUnsupportedTargetDB = + 'I can only convert SQL for migrations to Aurora PostgreSQL or Amazon RDS for PostgreSQL target databases. The provided .sct file indicates another target database for this migration.' + +export const invalidMetadataFileErrorParsing = + "It looks like the .sct file you provided isn't valid. Make sure that you've uploaded the .zip file you retrieved from your schema conversion in AWS DMS." + +export const invalidMetadataFileNoSctFile = + "An .sct file is required for transformation. Make sure that you've uploaded the .zip file you retrieved from your schema conversion in AWS DMS." + +export const sqlMetadataFileReceived = + 'I found the following source database, target database, and host based on the schema conversion metadata you provided:' + export const failedToStartJobChatMessage = "Sorry, I couldn't begin the transformation. Please try starting the transformation again." @@ -531,16 +572,16 @@ export const jobCancelledChatMessage = export const jobCancelledNotification = 'You cancelled the transformation.' export const jobCompletedChatMessage = - 'I upgraded your code to Java 17. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated.' + 'I upgraded your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated.' export const jobCompletedNotification = - 'Amazon Q upgraded your code to Java 17. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated.' + 'Amazon Q upgraded your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated.' export const jobPartiallyCompletedChatMessage = - 'I upgraded part of your code to Java 17. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.' + 'I upgraded part of your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.' export const jobPartiallyCompletedNotification = - 'Amazon Q upgraded part of your code to Java 17. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.' + 'Amazon Q upgraded part of your code. You can review the diff to see my proposed changes and accept or reject them. The transformation summary has details about the files I updated and the errors that prevented a complete transformation.' export const noPomXmlFoundChatMessage = `Sorry, I couldn\'t find a project that I can upgrade. I couldn\'t find a pom.xml file in any of your open projects. Currently, I can only upgrade Java 8 or Java 11 projects built on Maven. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).` @@ -604,7 +645,7 @@ export const cleanInstallErrorNotification = `Amazon Q could not run the Maven c export const enterJavaHomeChatMessage = 'Enter the path to JDK ' export const projectPromptChatMessage = - 'I can upgrade your JAVA_VERSION_HERE. To start the transformation, I need some information from you. Choose the project you want to upgrade and the target code version to upgrade to. Then, choose Transform.' + 'I can upgrade your JAVA_VERSION_HERE. To start the transformation, I need some information from you. Choose the project you want to upgrade and the target code version to upgrade to. Then, choose Confirm.' export const windowsJavaHomeHelpChatMessage = 'To find the JDK path, run the following commands in a new terminal: `cd "C:/Program Files/Java"` and then `dir`. If you see your JDK version, run `cd ` and then `cd` to show the path.' @@ -635,7 +676,7 @@ export const chooseTargetVersionFormTitle = 'Choose the target code version' export const skipUnitTestsFormTitle = 'Choose to skip unit tests' export const skipUnitTestsFormMessage = - 'I will build your project using `mvn test` by default. If you would like me to build your project without running unit tests, I will use `mvn test-compile`.' + 'I will build your project using `mvn clean test` by default. If you would like me to build your project without running unit tests, I will use `mvn clean test-compile`.' export const runUnitTestsMessage = 'Run unit tests' @@ -689,7 +730,8 @@ export const runSecurityScanButtonTitle = 'Run security scan' export const crossFileContextConfig = { numberOfChunkToFetch: 60, topK: 3, - numberOfLinesEachChunk: 10, + numberOfLinesEachChunk: 50, + maximumTotalLength: 20480, } export const utgConfig = { diff --git a/packages/core/src/codewhisperer/models/model.ts b/packages/core/src/codewhisperer/models/model.ts index 7e649d75e78..257ffedb403 100644 --- a/packages/core/src/codewhisperer/models/model.ts +++ b/packages/core/src/codewhisperer/models/model.ts @@ -17,6 +17,7 @@ import { References } from '../client/codewhisperer' import globals from '../../shared/extensionGlobals' import { ChatControllerEventEmitters } from '../../amazonqGumby/chat/controller/controller' import { TransformationSteps } from '../client/codewhispereruserclient' +import { Messenger } from '../../amazonqGumby/chat/controller/messenger/messenger' // unavoidable global variables interface VsCodeState { @@ -48,7 +49,7 @@ export type UtgStrategy = 'ByName' | 'ByContent' export type CrossFileStrategy = 'OpenTabs_BM25' -export type SupplementalContextStrategy = CrossFileStrategy | UtgStrategy | 'Empty' +export type SupplementalContextStrategy = CrossFileStrategy | UtgStrategy | 'Empty' | 'LSP' export interface CodeWhispererSupplementalContext { isUtg: boolean @@ -283,6 +284,11 @@ export enum TransformByQStatus { PartiallySucceeded = 'Partially Succeeded', } +export enum TransformationType { + LANGUAGE_UPGRADE = 'Language Upgrade', + SQL_CONVERSION = 'SQL Conversion', +} + export enum TransformByQReviewStatus { NotStarted = 'NotStarted', PreparingReview = 'PreparingReview', @@ -303,6 +309,13 @@ export enum JDKVersion { UNSUPPORTED = 'UNSUPPORTED', } +export enum DB { + ORACLE = 'ORACLE', + RDS_POSTGRESQL = 'RDS_POSTGRESQL', + AURORA_POSTGRESQL = 'AURORA_POSTGRESQL', + OTHER = 'OTHER', +} + export enum BuildSystem { Maven = 'Maven', Gradle = 'Gradle', @@ -311,12 +324,21 @@ export enum BuildSystem { export class ZipManifest { sourcesRoot: string = 'sources/' - dependenciesRoot: string | undefined = 'dependencies/' + dependenciesRoot: string = 'dependencies/' buildLogs: string = 'build-logs.txt' version: string = '1.0' hilCapabilities: string[] = ['HIL_1pDependency_VersionUpgrade'] - transformCapabilities: string[] = ['EXPLAINABILITY_V1'] + transformCapabilities: string[] = ['EXPLAINABILITY_V1'] // TO-DO: for SQL conversions, maybe make this = [] customBuildCommand: string = 'clean test' + requestedConversions?: { + sqlConversion?: { + source?: string + target?: string + schema?: string + host?: string + sctFileName?: string + } + } } export interface IHilZipManifestParams { @@ -364,6 +386,8 @@ export let sessionJobHistory: { export class TransformByQState { private transformByQState: TransformByQStatus = TransformByQStatus.NotStarted + private transformationType: TransformationType | undefined = undefined + private projectName: string = '' private projectPath: string = '' @@ -377,6 +401,18 @@ export class TransformByQState { private customBuildCommand: string = '' + private sourceDB: DB | undefined = undefined + + private targetDB: DB | undefined = undefined + + private schema: string = '' + + private schemaOptions: Set = new Set() + + private sourceServerName: string = '' + + private metadataPathSQL: string = '' + private planFilePath: string = '' private summaryFilePath: string = '' private preBuildLogFilePath: string = '' @@ -401,6 +437,7 @@ export class TransformByQState { private javaHome: string | undefined = undefined private chatControllers: ChatControllerEventEmitters | undefined = undefined + private chatMessenger: Messenger | undefined = undefined private dependencyFolderInfo: FolderInfo | undefined = undefined @@ -432,6 +469,10 @@ export class TransformByQState { return this.transformByQState === TransformByQStatus.PartiallySucceeded } + public getTransformationType() { + return this.transformationType + } + public getProjectName() { return this.projectName } @@ -464,6 +505,30 @@ export class TransformByQState { return this.targetJDKVersion } + public getSourceDB() { + return this.sourceDB + } + + public getTargetDB() { + return this.targetDB + } + + public getSchema() { + return this.schema + } + + public getSchemaOptions() { + return this.schemaOptions + } + + public getSourceServerName() { + return this.sourceServerName + } + + public getMetadataPathSQL() { + return this.metadataPathSQL + } + public getStatus() { return this.transformByQState } @@ -520,6 +585,10 @@ export class TransformByQState { return this.chatControllers } + public getChatMessenger() { + return this.chatMessenger + } + public getDependencyFolderInfo(): FolderInfo | undefined { return this.dependencyFolderInfo } @@ -560,6 +629,10 @@ export class TransformByQState { this.transformByQState = TransformByQStatus.PartiallySucceeded } + public setTransformationType(type: TransformationType) { + this.transformationType = type + } + public setProjectName(name: string) { this.projectName = name } @@ -588,6 +661,30 @@ export class TransformByQState { this.targetJDKVersion = version } + public setSourceDB(db: DB) { + this.sourceDB = db + } + + public setTargetDB(db: DB) { + this.targetDB = db + } + + public setSchema(schema: string) { + this.schema = schema + } + + public setSchemaOptions(schemaOptions: Set) { + this.schemaOptions = schemaOptions + } + + public setSourceServerName(serverName: string) { + this.sourceServerName = serverName + } + + public setMetadataPathSQL(path: string) { + this.metadataPathSQL = path + } + public setPlanFilePath(filePath: string) { this.planFilePath = filePath } @@ -636,6 +733,10 @@ export class TransformByQState { this.chatControllers = controllers } + public setChatMessenger(messenger: Messenger) { + this.chatMessenger = messenger + } + public setDependencyFolderInfo(folderInfo: FolderInfo) { this.dependencyFolderInfo = folderInfo } @@ -666,6 +767,14 @@ export class TransformByQState { this.jobFailureErrorChatMessage = undefined this.jobFailureMetadata = '' this.payloadFilePath = '' + this.metadataPathSQL = '' + this.sourceJDKVersion = undefined + this.targetJDKVersion = JDKVersion.JDK17 + this.sourceDB = undefined + this.targetDB = undefined + this.sourceServerName = '' + this.schemaOptions.clear() + this.schema = '' this.errorLog = '' this.customBuildCommand = '' this.intervalId = undefined diff --git a/packages/core/src/codewhisperer/service/inlineCompletionItemProvider.ts b/packages/core/src/codewhisperer/service/inlineCompletionItemProvider.ts index b2571ece38c..e5ac2212e06 100644 --- a/packages/core/src/codewhisperer/service/inlineCompletionItemProvider.ts +++ b/packages/core/src/codewhisperer/service/inlineCompletionItemProvider.ts @@ -169,6 +169,7 @@ export class CWInlineCompletionItemProvider implements vscode.InlineCompletionIt ImportAdderProvider.instance.onShowRecommendation(document, this.startPos.line, r) this.nextMove = 0 TelemetryHelper.instance.setFirstSuggestionShowTime() + session.setPerceivedLatency() this._onDidShow.fire() if (matchedCount >= 2 || this.nextToken !== '') { const result = [item] diff --git a/packages/core/src/codewhisperer/service/inlineCompletionService.ts b/packages/core/src/codewhisperer/service/inlineCompletionService.ts index 69bd9bdb887..715fd93ad2d 100644 --- a/packages/core/src/codewhisperer/service/inlineCompletionService.ts +++ b/packages/core/src/codewhisperer/service/inlineCompletionService.ts @@ -112,7 +112,6 @@ export class InlineCompletionService { await this.setState('loading') - TelemetryHelper.instance.setInvocationStartTime(performance.now()) RecommendationHandler.instance.checkAndResetCancellationTokens() RecommendationHandler.instance.documentUri = editor.document.uri let response: GetRecommendationsResponse = { diff --git a/packages/core/src/codewhisperer/service/recommendationHandler.ts b/packages/core/src/codewhisperer/service/recommendationHandler.ts index fcd7fb2b84a..5792a92142a 100644 --- a/packages/core/src/codewhisperer/service/recommendationHandler.ts +++ b/packages/core/src/codewhisperer/service/recommendationHandler.ts @@ -14,7 +14,7 @@ import { AWSError } from 'aws-sdk' import { isAwsError } from '../../shared/errors' import { TelemetryHelper } from '../util/telemetryHelper' import { getLogger } from '../../shared/logger' -import { isCloud9, isSageMaker } from '../../shared/extensionUtilities' +import { isCloud9 } from '../../shared/extensionUtilities' import { hasVendedIamCredentials } from '../../auth/auth' import { asyncCallWithTimeout, @@ -38,12 +38,12 @@ import globals from '../../shared/extensionGlobals' import { noSuggestions, updateInlineLockKey } from '../models/constants' import AsyncLock from 'async-lock' import { AuthUtil } from '../util/authUtil' -import { CodeWhispererUserGroupSettings } from '../util/userGroupUtil' import { CWInlineCompletionItemProvider } from './inlineCompletionItemProvider' import { application } from '../util/codeWhispererApplication' import { openUrl } from '../../shared/utilities/vsCodeUtils' import { indent } from '../../shared/utilities/textUtilities' import path from 'path' +import { isIamConnection } from '../../auth/connection' /** * This class is for getRecommendation/listRecommendation API calls and its states @@ -159,8 +159,7 @@ export class RecommendationHandler { autoTriggerType?: CodewhispererAutomatedTriggerType, pagination: boolean = true, page: number = 0, - isSM: boolean = isSageMaker(), - retry: boolean = false + generate: boolean = isIamConnection(AuthUtil.instance.conn) ): Promise { let invocationResult: 'Succeeded' | 'Failed' = 'Failed' let errorMessage: string | undefined = undefined @@ -187,7 +186,7 @@ export class RecommendationHandler { ).language session.taskType = await this.getTaskTypeFromEditorFileName(editor.document.fileName) - if (pagination && !isSM) { + if (pagination && !generate) { if (page === 0) { session.requestContext = await EditorContext.buildListRecommendationRequest( editor as vscode.TextEditor, @@ -242,7 +241,9 @@ export class RecommendationHandler { this.lastInvocationTime = startTime const mappedReq = runtimeLanguageContext.mapToRuntimeLanguage(request) const codewhispererPromise = - pagination && !isSM ? client.listRecommendations(mappedReq) : client.generateRecommendations(mappedReq) + pagination && !generate + ? client.listRecommendations(mappedReq) + : client.generateRecommendations(mappedReq) const resp = await this.getServerResponse(triggerType, config.isManualTriggerEnabled, codewhispererPromise) TelemetryHelper.instance.setSdkApiCallEndTime() latency = startTime !== 0 ? performance.now() - startTime : 0 @@ -257,7 +258,7 @@ export class RecommendationHandler { sessionId = resp?.$response?.httpResponse?.headers['x-amzn-sessionid'] TelemetryHelper.instance.setFirstResponseRequestId(requestId) if (page === 0) { - TelemetryHelper.instance.setTimeToFirstRecommendation(performance.now()) + session.setTimeToFirstRecommendation(performance.now()) } if (nextToken === '') { TelemetryHelper.instance.setAllPaginationEndTime() @@ -702,7 +703,6 @@ export class RecommendationHandler { duration: performance.now() - this.lastInvocationTime, passive: true, credentialStartUrl: AuthUtil.instance.startUrl, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), result: 'Succeeded', }) } diff --git a/packages/core/src/codewhisperer/service/securityScanHandler.ts b/packages/core/src/codewhisperer/service/securityScanHandler.ts index e746ad6e108..86480f0766e 100644 --- a/packages/core/src/codewhisperer/service/securityScanHandler.ts +++ b/packages/core/src/codewhisperer/service/securityScanHandler.ts @@ -16,7 +16,7 @@ import { import { sleep } from '../../shared/utilities/timeoutUtils' import * as codewhispererClient from '../client/codewhisperer' import * as CodeWhispererConstants from '../models/constants' -import { existsSync, statSync, readFileSync } from 'fs' +import { existsSync, statSync, readFileSync } from 'fs' // eslint-disable-line no-restricted-imports import { RawCodeScanIssue } from '../models/model' import * as crypto from 'crypto' import path = require('path') @@ -310,7 +310,7 @@ export async function uploadArtifactToS3( ) const errorMessage = getTelemetryReasonDesc(error)?.includes(`"PUT" request failed with code "403"`) ? `"PUT" request failed with code "403"` - : getTelemetryReasonDesc(error) ?? 'Security scan failed.' + : (getTelemetryReasonDesc(error) ?? 'Security scan failed.') throw new UploadArtifactToS3Error(errorMessage) } diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index b10418bd3af..55cd7797e5e 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import * as vscode from 'vscode' -import * as nodefs from 'fs' +import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' import * as os from 'os' import * as codeWhisperer from '../../client/codewhisperer' @@ -16,6 +16,7 @@ import { jobPlanProgress, sessionJobHistory, StepProgress, + TransformationType, transformByQState, TransformByQStatus, TransformByQStoppedError, @@ -212,6 +213,11 @@ export async function uploadPayload(payloadFileName: string, uploadContext?: Upl transformByQState.setJobId(encodeHTML(response.uploadId)) } jobPlanProgress['uploadCode'] = StepProgress.Succeeded + if (transformByQState.getTransformationType() === TransformationType.SQL_CONVERSION) { + // if doing a SQL conversion, we don't build the code or generate a plan, so mark these steps as succeeded immediately so that next step renders + jobPlanProgress['buildCode'] = StepProgress.Succeeded + jobPlanProgress['generatePlan'] = StepProgress.Succeeded + } updateJobHistory() return response.uploadId } @@ -275,9 +281,9 @@ export function createZipManifest({ hilZipParams }: IZipManifestParams) { } interface IZipCodeParams { - dependenciesFolder: FolderInfo + dependenciesFolder?: FolderInfo humanInTheLoopFlag?: boolean - modulePath?: string + projectPath?: string zipManifest: ZipManifest | HilZipManifest } @@ -287,25 +293,27 @@ interface ZipCodeResult { fileSize: number } -export async function zipCode({ dependenciesFolder, humanInTheLoopFlag, modulePath, zipManifest }: IZipCodeParams) { +export async function zipCode( + { dependenciesFolder, humanInTheLoopFlag, projectPath, zipManifest }: IZipCodeParams, + zip: AdmZip = new AdmZip() +) { let tempFilePath = undefined let logFilePath = undefined let dependenciesCopied = false try { throwIfCancelled() - const zip = new AdmZip() - // If no modulePath is passed in, we are not uploaded the source folder - // NOTE: We only upload dependencies for human in the loop work - if (modulePath) { - const sourceFiles = getFilesRecursively(modulePath, false) + // if no project Path is passed in, we are not uploaded the source folder + // we only upload dependencies for human in the loop work + if (projectPath) { + const sourceFiles = getFilesRecursively(projectPath, false) let sourceFilesSize = 0 for (const file of sourceFiles) { if (nodefs.statSync(file).isDirectory()) { getLogger().info('CodeTransformation: Skipping directory, likely a symlink') continue } - const relativePath = path.relative(modulePath, file) + const relativePath = path.relative(projectPath, file) const paddedPath = path.join('sources', relativePath) zip.addLocalFile(file, path.dirname(paddedPath)) sourceFilesSize += (await nodefs.promises.stat(file)).size @@ -313,14 +321,40 @@ export async function zipCode({ dependenciesFolder, humanInTheLoopFlag, modulePa getLogger().info(`CodeTransformation: source code files size = ${sourceFilesSize}`) } + if ( + transformByQState.getTransformationType() === TransformationType.SQL_CONVERSION && + zipManifest instanceof ZipManifest + ) { + // note that zipManifest must be a ZipManifest since only other option is HilZipManifest which is not used for SQL conversions + const metadataZip = new AdmZip(transformByQState.getMetadataPathSQL()) + zipManifest.requestedConversions = { + sqlConversion: { + source: transformByQState.getSourceDB(), + target: transformByQState.getTargetDB(), + schema: transformByQState.getSchema(), + host: transformByQState.getSourceServerName(), + sctFileName: metadataZip.getEntries().filter((entry) => entry.entryName.endsWith('.sct'))[0] + .entryName, + }, + } + // TO-DO: later consider making this add to path.join(zipManifest.dependenciesRoot, 'qct-sct-metadata', entry.entryName) so that it's more organized + metadataZip + .getEntries() + .forEach((entry) => + zip.addFile(path.join(zipManifest.dependenciesRoot, entry.entryName), entry.getData()) + ) + const sqlMetadataSize = (await nodefs.promises.stat(transformByQState.getMetadataPathSQL())).size + getLogger().info(`CodeTransformation: SQL metadata file size = ${sqlMetadataSize}`) + } + throwIfCancelled() let dependencyFiles: string[] = [] - if (await fs.exists(dependenciesFolder.path)) { + if (dependenciesFolder && (await fs.exists(dependenciesFolder.path))) { dependencyFiles = getFilesRecursively(dependenciesFolder.path, true) } - if (dependencyFiles.length > 0) { + if (dependenciesFolder && dependencyFiles.length > 0) { let dependencyFilesSize = 0 for (const file of dependencyFiles) { if (isExcludedDependencyFile(file)) { @@ -334,10 +368,6 @@ export async function zipCode({ dependenciesFolder, humanInTheLoopFlag, modulePa } getLogger().info(`CodeTransformation: dependency files size = ${dependencyFilesSize}`) dependenciesCopied = true - } else { - if (zipManifest instanceof ZipManifest) { - zipManifest.dependenciesRoot = undefined - } } zip.addFile('manifest.json', Buffer.from(JSON.stringify(zipManifest)), 'utf-8') @@ -354,10 +384,11 @@ export async function zipCode({ dependenciesFolder, humanInTheLoopFlag, modulePa tempFilePath = path.join(os.tmpdir(), 'zipped-code.zip') await fs.writeFile(tempFilePath, zip.toBuffer()) - if (await fs.exists(dependenciesFolder.path)) { + if (dependenciesFolder && (await fs.exists(dependenciesFolder.path))) { await fs.delete(dependenciesFolder.path, { recursive: true, force: true }) } } catch (e: any) { + getLogger().error(`CodeTransformation: zipCode error = ${e}`) throw Error('Failed to zip project') } finally { if (logFilePath) { @@ -392,9 +423,9 @@ export async function startJob(uploadId: string) { programmingLanguage: { languageName: CodeWhispererConstants.defaultLanguage.toLowerCase() }, }, transformationSpec: { - transformationType: CodeWhispererConstants.transformationType, - source: { language: sourceLanguageVersion }, - target: { language: targetLanguageVersion }, + transformationType: CodeWhispererConstants.transformationType, // shared b/w language upgrades & sql conversions for now + source: { language: sourceLanguageVersion }, // dummy value of JDK8 used for SQL conversions just so that this API can be called + target: { language: targetLanguageVersion }, // always JDK17 }, }) if (response.$response.requestId) { diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts index d7040a11cd6..f6c5e24bed1 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts @@ -8,7 +8,7 @@ import * as path from 'path' import * as os from 'os' import xml2js = require('xml2js') import * as CodeWhispererConstants from '../../models/constants' -import { existsSync, writeFileSync } from 'fs' +import { existsSync, writeFileSync } from 'fs' // eslint-disable-line no-restricted-imports import { BuildSystem, FolderInfo, transformByQState } from '../../models/model' import { IManifestFile } from '../../../amazonqFeatureDev/models' import fs from '../../../shared/fs/fs' diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformProjectValidationHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformProjectValidationHandler.ts index c0f47e88d4c..143f20af51a 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformProjectValidationHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformProjectValidationHandler.ts @@ -17,7 +17,7 @@ import { checkBuildSystem } from './transformFileHandler' export async function getOpenProjects(): Promise { const folders = vscode.workspace.workspaceFolders - if (folders === undefined) { + if (folders === undefined || folders.length === 0) { throw new NoOpenProjectsError() } @@ -32,7 +32,7 @@ export async function getOpenProjects(): Promise= 1 + activeStepId >= 1 && transformByQState.getTransformationType() !== TransformationType.SQL_CONVERSION // for SQL conversions, don't show buildCode step ? simpleStep( this.getProgressIconMarkup(jobPlanProgress['buildCode']), CodeWhispererConstants.buildCodeStepMessage, @@ -339,7 +356,7 @@ export class TransformationHubViewProvider implements vscode.WebviewViewProvider ) : '' const planMarkup = - activeStepId >= 2 + activeStepId >= 2 && transformByQState.getTransformationType() !== TransformationType.SQL_CONVERSION // for SQL conversions, don't show generatePlan step ? simpleStep( this.getProgressIconMarkup(jobPlanProgress['generatePlan']), CodeWhispererConstants.generatePlanStepMessage, diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts b/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts index 2f31027fecc..2f75795c251 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformationResultsViewProvider.ts @@ -5,7 +5,7 @@ import AdmZip from 'adm-zip' import os from 'os' -import fs from 'fs' +import fs from 'fs' // eslint-disable-line no-restricted-imports import { parsePatch, applyPatches, ParsedDiff } from 'diff' import path from 'path' import vscode from 'vscode' diff --git a/packages/core/src/codewhisperer/tracker/codewhispererCodeCoverageTracker.ts b/packages/core/src/codewhisperer/tracker/codewhispererCodeCoverageTracker.ts index b4c842b0413..925609ce185 100644 --- a/packages/core/src/codewhisperer/tracker/codewhispererCodeCoverageTracker.ts +++ b/packages/core/src/codewhisperer/tracker/codewhispererCodeCoverageTracker.ts @@ -8,15 +8,14 @@ import { getLogger } from '../../shared/logger/logger' import * as CodeWhispererConstants from '../models/constants' import globals from '../../shared/extensionGlobals' import { vsCodeState } from '../models/model' -import { distance } from 'fastest-levenshtein' import { CodewhispererLanguage, telemetry } from '../../shared/telemetry/telemetry' import { runtimeLanguageContext } from '../util/runtimeLanguageContext' import { TelemetryHelper } from '../util/telemetryHelper' import { AuthUtil } from '../util/authUtil' -import { CodeWhispererUserGroupSettings } from '../util/userGroupUtil' import { getSelectedCustomization } from '../util/customizationUtil' import { codeWhispererClient as client } from '../client/codewhisperer' import { isAwsError } from '../../shared/errors' +import { getUnmodifiedAcceptedTokens } from '../util/commonUtil' interface CodeWhispererToken { range: vscode.Range @@ -87,18 +86,10 @@ export class CodeWhispererCodeCoverageTracker { for (let i = 0; i < this._acceptedTokens[filename].length; i++) { const oldText = this._acceptedTokens[filename][i].text const newText = editor.document.getText(this._acceptedTokens[filename][i].range) - this._acceptedTokens[filename][i].accepted = this.getUnmodifiedAcceptedTokens(oldText, newText) + this._acceptedTokens[filename][i].accepted = getUnmodifiedAcceptedTokens(oldText, newText) } } } - // With edit distance, complicate usermodification can be considered as simple edit(add, delete, replace), - // and thus the unmodified part of recommendation length can be deducted/approximated - // ex. (modified > original): originalRecom: foo -> modifiedRecom: fobarbarbaro, distance = 9, delta = 12 - 9 = 3 - // ex. (modified == original): originalRecom: helloworld -> modifiedRecom: HelloWorld, distance = 2, delta = 10 - 2 = 8 - // ex. (modified < original): originalRecom: CodeWhisperer -> modifiedRecom: CODE, distance = 12, delta = 13 - 12 = 1 - public getUnmodifiedAcceptedTokens(origin: string, after: string) { - return Math.max(origin.length, after.length) - distance(origin, after) - } public emitCodeWhispererCodeContribution() { let totalTokens = 0 @@ -134,7 +125,6 @@ export class CodeWhispererCodeCoverageTracker { codewhispererSuggestedTokens: acceptedTokens, codewhispererPercentage: percentage ? percentage : 0, successCount: this._serviceInvocationCount, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererCustomizationArn: selectedCustomization.arn === '' ? undefined : selectedCustomization.arn, credentialStartUrl: AuthUtil.instance.startUrl, }) diff --git a/packages/core/src/codewhisperer/tracker/codewhispererTracker.ts b/packages/core/src/codewhisperer/tracker/codewhispererTracker.ts index e15c43e42ee..05a6d83f3f0 100644 --- a/packages/core/src/codewhisperer/tracker/codewhispererTracker.ts +++ b/packages/core/src/codewhisperer/tracker/codewhispererTracker.ts @@ -9,14 +9,14 @@ import { distance } from 'fastest-levenshtein' import { AcceptedSuggestionEntry } from '../models/model' import { getLogger } from '../../shared/logger/logger' import { AmazonqModifyCode, telemetry } from '../../shared/telemetry/telemetry' -import { CodeWhispererUserGroupSettings } from '../util/userGroupUtil' import { AuthUtil } from '../util/authUtil' import { InsertedCode } from '../../codewhispererChat/controllers/chat/model' import { codeWhispererClient } from '../client/codewhisperer' import { logSendTelemetryEventFailure } from '../../codewhispererChat/controllers/chat/telemetryHelper' import { Timeout } from '../../shared/utilities/timeoutUtils' import { getSelectedCustomization } from '../util/customizationUtil' -import { undefinedIfEmpty } from '../../shared' +import { isAwsError, undefinedIfEmpty } from '../../shared' +import { getUnmodifiedAcceptedTokens } from '../util/commonUtil' /** * This singleton class is mainly used for calculating the percentage of user modification. @@ -90,19 +90,20 @@ export class CodeWhispererTracker { public async emitTelemetryOnSuggestion(suggestion: AcceptedSuggestionEntry | InsertedCode) { let percentage = 1.0 + let currString = '' + const customizationArn = undefinedIfEmpty(getSelectedCustomization().arn) try { if (suggestion.fileUrl?.scheme !== '') { const document = await vscode.workspace.openTextDocument(suggestion.fileUrl) if (document) { - const currString = document.getText( - new vscode.Range(suggestion.startPosition, suggestion.endPosition) - ) + currString = document.getText(new vscode.Range(suggestion.startPosition, suggestion.endPosition)) percentage = this.checkDiff(currString, suggestion.originalString) } } } catch (e) { getLogger().verbose(`Exception Thrown from CodeWhispererTracker: ${e}`) + return } finally { if ('conversationID' in suggestion) { const event: AmazonqModifyCode = { @@ -121,7 +122,7 @@ export class CodeWhispererTracker { conversationId: event.cwsprChatConversationId, messageId: event.cwsprChatMessageId, modificationPercentage: event.cwsprChatModificationPercentage, - customizationArn: undefinedIfEmpty(getSelectedCustomization().arn), + customizationArn: customizationArn, }, }, }) @@ -137,13 +138,42 @@ export class CodeWhispererTracker { codewhispererCompletionType: suggestion.completionType, codewhispererLanguage: suggestion.language, credentialStartUrl: AuthUtil.instance.startUrl, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererCharactersAccepted: suggestion.originalString.length, codewhispererCharactersModified: 0, // TODO: currently we don't have an accurate number for this field with existing implementation }) - // TODO: - // Temperary comment out user modification event, need further discussion on how to calculate this metric - // TelemetryHelper.instance.sendUserModificationEvent(suggestion, percentage) + + codeWhispererClient + .sendTelemetryEvent({ + telemetryEvent: { + userModificationEvent: { + sessionId: suggestion.sessionId, + requestId: suggestion.requestId, + programmingLanguage: { languageName: suggestion.language }, + // deprecated % value and should not be used by service side + modificationPercentage: percentage, + customizationArn: customizationArn, + timestamp: new Date(), + acceptedCharacterCount: suggestion.originalString.length, + unmodifiedAcceptedCharacterCount: getUnmodifiedAcceptedTokens( + suggestion.originalString, + currString + ), + }, + }, + }) + .then() + .catch((error) => { + let requestId: string | undefined + if (isAwsError(error)) { + requestId = error.requestId + } + + getLogger().debug( + `Failed to send UserModificationEvent to CodeWhisperer, requestId: ${requestId ?? ''}, message: ${ + error.message + }` + ) + }) } } } diff --git a/packages/core/src/codewhisperer/util/authUtil.ts b/packages/core/src/codewhisperer/util/authUtil.ts index c4d2c0109b8..ed2dfd66e6c 100644 --- a/packages/core/src/codewhisperer/util/authUtil.ts +++ b/packages/core/src/codewhisperer/util/authUtil.ts @@ -59,11 +59,8 @@ export const isValidCodeWhispererCoreConnection = (conn?: Connection): conn is C return isIamConnection(conn) } - if (isSageMaker()) { - return isIamConnection(conn) - } - return ( + (isSageMaker() && isIamConnection(conn)) || (isCloud9('codecatalyst') && isIamConnection(conn)) || (isSsoConnection(conn) && hasScopes(conn, codeWhispererCoreScopes)) ) @@ -71,9 +68,10 @@ export const isValidCodeWhispererCoreConnection = (conn?: Connection): conn is C /** Superset that includes all of CodeWhisperer + Amazon Q */ export const isValidAmazonQConnection = (conn?: Connection): conn is Connection => { return ( - (isSsoConnection(conn) || isBuilderIdConnection(conn)) && - isValidCodeWhispererCoreConnection(conn) && - hasScopes(conn, amazonQScopes) + (isSageMaker() && isIamConnection(conn)) || + ((isSsoConnection(conn) || isBuilderIdConnection(conn)) && + isValidCodeWhispererCoreConnection(conn) && + hasScopes(conn, amazonQScopes)) ) } @@ -442,7 +440,8 @@ export class AuthUtil { if (conn === undefined) { return buildFeatureAuthState(AuthStates.disconnected) } - if (!isSsoConnection(conn)) { + + if (!isSsoConnection(conn) && !isSageMaker()) { throw new ToolkitError(`Connection "${conn.id}" is not a valid type: ${conn.type}`) } @@ -453,7 +452,7 @@ export class AuthUtil { return state } - if (isBuilderIdConnection(conn) || isIdcSsoConnection(conn)) { + if (isBuilderIdConnection(conn) || isIdcSsoConnection(conn) || isSageMaker()) { if (isValidCodeWhispererCoreConnection(conn)) { state[Features.codewhispererCore] = AuthStates.connected } diff --git a/packages/core/src/codewhisperer/util/codeWhispererSession.ts b/packages/core/src/codewhisperer/util/codeWhispererSession.ts index d6c06ef5350..e5daae22d17 100644 --- a/packages/core/src/codewhisperer/util/codeWhispererSession.ts +++ b/packages/core/src/codewhisperer/util/codeWhispererSession.ts @@ -12,7 +12,7 @@ import { } from '../../shared/telemetry/telemetry.gen' import { GenerateRecommendationsRequest, ListRecommendationsRequest, Recommendation } from '../client/codewhisperer' import { Position } from 'vscode' -import { CodeWhispererSupplementalContext } from '../models/model' +import { CodeWhispererSupplementalContext, vsCodeState } from '../models/model' class CodeWhispererSession { static #instance: CodeWhispererSession @@ -41,6 +41,9 @@ class CodeWhispererSession { fetchCredentialStartTime = 0 sdkApiCallStartTime = 0 invokeSuggestionStartTime = 0 + timeToFirstRecommendation = 0 + firstSuggestionShowTime = 0 + perceivedLatency = 0 public static get instance() { return (this.#instance ??= new CodeWhispererSession()) @@ -58,6 +61,12 @@ class CodeWhispererSession { } } + setTimeToFirstRecommendation(timeToFirstRecommendation: number) { + if (this.invokeSuggestionStartTime) { + this.timeToFirstRecommendation = timeToFirstRecommendation - this.invokeSuggestionStartTime + } + } + setSuggestionState(index: number, value: string) { this.suggestionStates.set(index, value) } @@ -75,6 +84,25 @@ class CodeWhispererSession { return this.completionTypes.get(index) || 'Line' } + getPerceivedLatency(triggerType: CodewhispererTriggerType) { + if (triggerType === 'OnDemand') { + return this.timeToFirstRecommendation + } else { + return session.firstSuggestionShowTime - vsCodeState.lastUserModificationTime + } + } + + setPerceivedLatency() { + if (this.perceivedLatency !== 0) { + return + } + if (this.triggerType === 'OnDemand') { + this.perceivedLatency = this.timeToFirstRecommendation + } else { + this.perceivedLatency = this.firstSuggestionShowTime - vsCodeState.lastUserModificationTime + } + } + reset() { this.sessionId = '' this.requestContext = { request: {} as any, supplementalMetadata: {} as any } diff --git a/packages/core/src/codewhisperer/util/commonUtil.ts b/packages/core/src/codewhisperer/util/commonUtil.ts index 05fe21458a7..1d624e77b5e 100644 --- a/packages/core/src/codewhisperer/util/commonUtil.ts +++ b/packages/core/src/codewhisperer/util/commonUtil.ts @@ -5,9 +5,14 @@ import * as vscode from 'vscode' import * as semver from 'semver' +import { distance } from 'fastest-levenshtein' import { isCloud9 } from '../../shared/extensionUtilities' import { getInlineSuggestEnabled } from '../../shared/utilities/editorUtilities' -import { AWSTemplateCaseInsensitiveKeyWords, AWSTemplateKeyWords } from '../models/constants' +import { + AWSTemplateCaseInsensitiveKeyWords, + AWSTemplateKeyWords, + JsonConfigFileNamingConvention, +} from '../models/constants' export function getLocalDatetime() { const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone @@ -61,13 +66,23 @@ export function getPrefixSuffixOverlap(firstString: string, secondString: string return secondString.slice(0, i) } -export function checkLeftContextKeywordsForJsonAndYaml(leftFileContent: string, language: string): boolean { +export function checkLeftContextKeywordsForJson(fileName: string, leftFileContent: string, language: string): boolean { if ( - (language === 'json' || language === 'yaml') && + language === 'json' && !AWSTemplateKeyWords.some((substring) => leftFileContent.includes(substring)) && - !AWSTemplateCaseInsensitiveKeyWords.some((substring) => leftFileContent.toLowerCase().includes(substring)) + !AWSTemplateCaseInsensitiveKeyWords.some((substring) => leftFileContent.toLowerCase().includes(substring)) && + !JsonConfigFileNamingConvention.has(fileName.toLowerCase()) ) { return true } return false } + +// With edit distance, complicate usermodification can be considered as simple edit(add, delete, replace), +// and thus the unmodified part of recommendation length can be deducted/approximated +// ex. (modified > original): originalRecom: foo -> modifiedRecom: fobarbarbaro, distance = 9, delta = 12 - 9 = 3 +// ex. (modified == original): originalRecom: helloworld -> modifiedRecom: HelloWorld, distance = 2, delta = 10 - 2 = 8 +// ex. (modified < original): originalRecom: CodeWhisperer -> modifiedRecom: CODE, distance = 12, delta = 13 - 12 = 1 +export function getUnmodifiedAcceptedTokens(origin: string, after: string) { + return Math.max(origin.length, after.length) - distance(origin, after) +} diff --git a/packages/core/src/codewhisperer/util/editorContext.ts b/packages/core/src/codewhisperer/util/editorContext.ts index e81565282f9..72b5d2874eb 100644 --- a/packages/core/src/codewhisperer/util/editorContext.ts +++ b/packages/core/src/codewhisperer/util/editorContext.ts @@ -14,7 +14,7 @@ import { fetchSupplementalContext } from './supplementalContext/supplementalCont import { supplementalContextTimeoutInMs } from '../models/constants' import { getSelectedCustomization } from './customizationUtil' import { selectFrom } from '../../shared/utilities/tsUtils' -import { checkLeftContextKeywordsForJsonAndYaml } from './commonUtil' +import { checkLeftContextKeywordsForJson } from './commonUtil' import { CodeWhispererSupplementalContext } from '../models/model' import { getOptOutPreference } from '../../shared/telemetry/util' @@ -39,7 +39,7 @@ export function extractContextForCodeWhisperer(editor: vscode.TextEditor): codew ) ) let languageName = 'plaintext' - if (!checkLeftContextKeywordsForJsonAndYaml(caretLeftFileContext, editor.document.languageId)) { + if (!checkLeftContextKeywordsForJson(document.fileName, caretLeftFileContext, editor.document.languageId)) { languageName = runtimeLanguageContext.normalizeLanguage(editor.document.languageId) ?? editor.document.languageId } diff --git a/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts b/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts index 646581b83d1..a8bfb74175b 100644 --- a/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts +++ b/packages/core/src/codewhisperer/util/runtimeLanguageContext.ts @@ -9,7 +9,7 @@ import { createConstantMap, ConstantMap } from '../../shared/utilities/tsUtils' import * as codewhispererClient from '../client/codewhisperer' import * as CodeWhispererConstants from '../models/constants' -type RuntimeLanguage = Exclude +type RuntimeLanguage = Exclude | 'systemverilog' const runtimeLanguageSet: ReadonlySet = new Set([ 'c', @@ -21,15 +21,22 @@ const runtimeLanguageSet: ReadonlySet = new Set([ 'kotlin', 'php', 'python', + 'powershell', + 'r', + 'dart', 'ruby', 'rust', 'scala', 'shell', 'sql', + 'swift', + 'lua', + 'vue', 'typescript', 'json', 'yaml', 'tf', + 'systemverilog', ]) export class RuntimeLanguageContext { @@ -93,6 +100,8 @@ export class RuntimeLanguageContext { r: 'r', swift: 'swift', systemVerilog: 'systemVerilog', + systemverilog: 'systemVerilog', + verilog: 'systemVerilog', vue: 'vue', }) this.supportedLanguageExtensionMap = createConstantMap({ @@ -120,6 +129,17 @@ export class RuntimeLanguageContext { ts: 'typescript', yaml: 'yaml', yml: 'yaml', + sv: 'systemVerilog', + svh: 'systemVerilog', + vh: 'systemVerilog', + dart: 'dart', + lua: 'lua', + wlua: 'lua', + swift: 'swift', + vue: 'vue', + ps1: 'powershell', + psm1: 'powershell', + r: 'r', }) } @@ -147,6 +167,9 @@ export class RuntimeLanguageContext { case 'tsx': return 'typescript' + case 'systemVerilog': + return 'systemverilog' + default: if (!runtimeLanguageSet.has(language)) { getLogger().error(`codewhisperer: unknown runtime language ${language}`) @@ -242,15 +265,6 @@ export class RuntimeLanguageContext { case 'plaintext': return false - case 'dart': - case 'lua': - case 'powershell': - case 'r': - case 'swift': - case 'vue': - case 'systemVerilog': - return false - default: return true } diff --git a/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts b/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts index 44abefed792..1352f3ae8c8 100644 --- a/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts +++ b/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts @@ -4,18 +4,23 @@ */ import * as vscode from 'vscode' -import { fs } from '../../../shared' +import { FeatureConfigProvider, fs } from '../../../shared' import path = require('path') import { BM25Document, BM25Okapi } from './rankBm25' import { ToolkitError } from '../../../shared/errors' -import { UserGroup, crossFileContextConfig, supplemetalContextFetchingTimeoutMsg } from '../../models/constants' +import { + crossFileContextConfig, + supplementalContextTimeoutInMs, + supplemetalContextFetchingTimeoutMsg, +} from '../../models/constants' import { CancellationError } from '../../../shared/utilities/timeoutUtils' -import { CodeWhispererUserGroupSettings } from '../userGroupUtil' import { isTestFile } from './codeParsingUtil' import { getFileDistance } from '../../../shared/filesystemUtilities' import { getOpenFilesInWindow } from '../../../shared/utilities/editorUtilities' import { getLogger } from '../../../shared/logger/logger' import { CodeWhispererSupplementalContext, CodeWhispererSupplementalContextItem } from '../../models/model' +import { LspController } from '../../../amazonq/lsp/lspController' +import { waitUntil } from '../../../shared/utilities/timeoutUtils' type CrossFileSupportedLanguage = | 'java' @@ -48,24 +53,54 @@ interface Chunk { score?: number } +type SupplementalContextConfig = 'none' | 'v1' | 'v2' + export async function fetchSupplementalContextForSrc( editor: vscode.TextEditor, cancellationToken: vscode.CancellationToken ): Promise | undefined> { - const shouldProceed = shouldFetchCrossFileContext( - editor.document.languageId, - CodeWhispererUserGroupSettings.instance.userGroup + const supplementalContextConfig = getSupplementalContextConfig(editor.document.languageId) + + if (supplementalContextConfig === 'none') { + return undefined + } + if (supplementalContextConfig === 'v1') { + return fetchSupplementalContextForSrcV1(editor, cancellationToken) + } + const promiseV1 = waitUntil( + async function () { + return await fetchSupplementalContextForSrcV1(editor, cancellationToken) + }, + { timeout: supplementalContextTimeoutInMs, interval: 10, truthy: false } + ) + const promiseV2 = waitUntil( + async function () { + return await fetchSupplementalContextForSrcV2(editor) + }, + { timeout: supplementalContextTimeoutInMs, interval: 10, truthy: false } ) + const [resultV1, resultV2] = await Promise.all([promiseV1, promiseV2]) + return resultV2 ?? resultV1 +} + +export async function fetchSupplementalContextForSrcV2( + editor: vscode.TextEditor +): Promise | undefined> { + const inputChunkContent = getInputChunk(editor) - if (!shouldProceed) { - return shouldProceed === undefined - ? undefined - : { - supplementalContextItems: [], - strategy: 'Empty', - } + const inlineProjectContext: { content: string; score: number; filePath: string }[] = + await LspController.instance.queryInlineProjectContext(inputChunkContent.content, editor.document.uri.fsPath) + + return { + supplementalContextItems: [...inlineProjectContext], + strategy: 'LSP', } +} +export async function fetchSupplementalContextForSrcV1( + editor: vscode.TextEditor, + cancellationToken: vscode.CancellationToken +): Promise | undefined> { const codeChunksCalculated = crossFileContextConfig.numberOfChunkToFetch // Step 1: Get relevant cross files to refer @@ -91,15 +126,22 @@ export async function fetchSupplementalContextForSrc( // Step 3: Generate Input chunk (10 lines left of cursor position) // and Find Best K chunks w.r.t input chunk using BM25 - const inputChunk: Chunk = getInputChunk(editor, crossFileContextConfig.numberOfLinesEachChunk) + const inputChunk: Chunk = getInputChunk(editor) const bestChunks: Chunk[] = findBestKChunkMatches(inputChunk, chunkList, crossFileContextConfig.topK) throwIfCancelled(cancellationToken) // Step 4: Transform best chunks to supplemental contexts const supplementalContexts: CodeWhispererSupplementalContextItem[] = [] + let totalLength = 0 for (const chunk of bestChunks) { throwIfCancelled(cancellationToken) + totalLength += chunk.nextContent.length + + if (totalLength > crossFileContextConfig.maximumTotalLength) { + break + } + supplementalContexts.push({ filePath: chunk.fileName, content: chunk.nextContent, @@ -137,7 +179,8 @@ function findBestKChunkMatches(chunkInput: Chunk, chunkReferences: Chunk[], k: n /* This extract 10 lines to the left of the cursor from trigger file. * This will be the inputquery to bm25 matching against list of cross-file chunks */ -function getInputChunk(editor: vscode.TextEditor, chunkSize: number) { +function getInputChunk(editor: vscode.TextEditor) { + const chunkSize = crossFileContextConfig.numberOfLinesEachChunk const cursorPosition = editor.selection.active const startLine = Math.max(cursorPosition.line - chunkSize, 0) const endLine = Math.max(cursorPosition.line - 1, 0) @@ -151,19 +194,17 @@ function getInputChunk(editor: vscode.TextEditor, chunkSize: number) { /** * Util to decide if we need to fetch crossfile context since CodeWhisperer CrossFile Context feature is gated by userGroup and language level * @param languageId: VSCode language Identifier - * @param userGroup: CodeWhisperer user group settings, refer to userGroupUtil.ts * @returns specifically returning undefined if the langueage is not supported, * otherwise true/false depending on if the language is fully supported or not belonging to the user group */ -function shouldFetchCrossFileContext( - languageId: vscode.TextDocument['languageId'], - userGroup: UserGroup -): boolean | undefined { +function getSupplementalContextConfig(languageId: vscode.TextDocument['languageId']): SupplementalContextConfig { if (!isCrossFileSupported(languageId)) { - return undefined + return 'none' } - - return true + if (FeatureConfigProvider.instance.isNewProjectContextGroup()) { + return 'v2' + } + return 'v1' } /** @@ -171,7 +212,7 @@ function shouldFetchCrossFileContext( * when a given chunk context passes the match in BM25. * Special handling is needed for last(its next points to its own) and first chunk */ -function linkChunks(chunks: Chunk[]) { +export function linkChunks(chunks: Chunk[]) { const updatedChunks: Chunk[] = [] // This additional chunk is needed to create a next pointer to chunk 0. diff --git a/packages/core/src/codewhisperer/util/supplementalContext/utgUtils.ts b/packages/core/src/codewhisperer/util/supplementalContext/utgUtils.ts index 2982df882f1..63c29dc1c9a 100644 --- a/packages/core/src/codewhisperer/util/supplementalContext/utgUtils.ts +++ b/packages/core/src/codewhisperer/util/supplementalContext/utgUtils.ts @@ -18,8 +18,6 @@ import { ToolkitError } from '../../../shared/errors' import { supplemetalContextFetchingTimeoutMsg } from '../../models/constants' import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { utgConfig } from '../../models/constants' -import { CodeWhispererUserGroupSettings } from '../userGroupUtil' -import { UserGroup } from '../../models/constants' import { getOpenFilesInWindow } from '../../../shared/utilities/editorUtilities' import { getLogger } from '../../../shared/logger/logger' import { CodeWhispererSupplementalContext, CodeWhispererSupplementalContextItem, UtgStrategy } from '../../models/model' @@ -32,19 +30,12 @@ function isUtgSupportedLanguage(languageId: vscode.TextDocument['languageId']): return utgSupportedLanguages.includes(languageId) } -export function shouldFetchUtgContext( - languageId: vscode.TextDocument['languageId'], - userGroup: UserGroup -): boolean | undefined { +export function shouldFetchUtgContext(languageId: vscode.TextDocument['languageId']): boolean | undefined { if (!isUtgSupportedLanguage(languageId)) { return undefined } - if (languageId === 'java') { - return true - } else { - return userGroup === UserGroup.CrossFile - } + return languageId === 'java' } /** @@ -60,10 +51,7 @@ export async function fetchSupplementalContextForTest( editor: vscode.TextEditor, cancellationToken: vscode.CancellationToken ): Promise | undefined> { - const shouldProceed = shouldFetchUtgContext( - editor.document.languageId, - CodeWhispererUserGroupSettings.instance.userGroup - ) + const shouldProceed = shouldFetchUtgContext(editor.document.languageId) if (!shouldProceed) { return shouldProceed === undefined ? undefined : { supplementalContextItems: [], strategy: 'Empty' } @@ -141,7 +129,7 @@ async function findSourceFileByContent( throwIfCancelled(cancellationToken) - testElementList.push(...extractClasses(editor.document.fileName, languageConfig.classExtractionPattern)) + testElementList.push(...extractClasses(testFileContent, languageConfig.classExtractionPattern)) throwIfCancelled(cancellationToken) diff --git a/packages/core/src/codewhisperer/util/telemetryHelper.ts b/packages/core/src/codewhisperer/util/telemetryHelper.ts index 9c5fe6b1856..2d156066fe7 100644 --- a/packages/core/src/codewhisperer/util/telemetryHelper.ts +++ b/packages/core/src/codewhisperer/util/telemetryHelper.ts @@ -18,7 +18,6 @@ import { import { CodewhispererCompletionType, CodewhispererSuggestionState } from '../../shared/telemetry/telemetry' import { getImportCount } from './importAdderUtil' import { CodeWhispererSettings } from './codewhispererSettings' -import { CodeWhispererUserGroupSettings } from './userGroupUtil' import { getSelectedCustomization } from './customizationUtil' import { AuthUtil } from './authUtil' import { isAwsError } from '../../shared/errors' @@ -31,7 +30,6 @@ import { CodeScanRemediationsEventType } from '../client/codewhispereruserclient export class TelemetryHelper { // Some variables for client component latency private sdkApiCallEndTime = 0 - private firstSuggestionShowTime = 0 private allPaginationEndTime = 0 private firstResponseRequestId = '' // variables for user trigger decision @@ -42,8 +40,6 @@ export class TelemetryHelper { private typeAheadLength = 0 private timeSinceLastModification = 0 private lastTriggerDecisionTime = 0 - private invocationTime = 0 - private timeToFirstRecommendation = 0 private classifierResult?: number = undefined private classifierThreshold?: number = undefined // variables for tracking end to end sessions @@ -90,7 +86,6 @@ export class TelemetryHelper { codewhispererSupplementalContextIsUtg: supplementalContextMetadata?.isUtg, codewhispererSupplementalContextLatency: supplementalContextMetadata?.latency, codewhispererSupplementalContextLength: supplementalContextMetadata?.contentsLength, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererCustomizationArn: getSelectedCustomization().arn, traceId: this.traceId, } @@ -117,7 +112,6 @@ export class TelemetryHelper { codewhispererLanguage: language, codewhispererGettingStartedTask: session.taskType, credentialStartUrl: AuthUtil.instance.startUrl, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererSupplementalContextTimeout: supplementalContextMetadata?.isProcessTimeout, codewhispererSupplementalContextIsUtg: supplementalContextMetadata?.isUtg, codewhispererSupplementalContextLength: supplementalContextMetadata?.contentsLength, @@ -171,7 +165,6 @@ export class TelemetryHelper { codewhispererLanguage: session.language, codewhispererGettingStartedTask: session.taskType, credentialStartUrl: AuthUtil.instance.startUrl, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererSupplementalContextTimeout: supplementalContextMetadata?.isProcessTimeout, codewhispererSupplementalContextIsUtg: supplementalContextMetadata?.isUtg, codewhispererSupplementalContextLength: supplementalContextMetadata?.contentsLength, @@ -235,7 +228,6 @@ export class TelemetryHelper { .map((e) => e.codewhispererSuggestionImportCount || 0) .reduce((a, b) => a + b, 0), codewhispererTypeaheadLength: 0, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererSupplementalContextTimeout: supplementalContextMetadata?.isProcessTimeout, codewhispererSupplementalContextIsUtg: supplementalContextMetadata?.isUtg, codewhispererSupplementalContextLength: supplementalContextMetadata?.contentsLength, @@ -290,13 +282,12 @@ export class TelemetryHelper { codewhispererTimeSinceLastUserDecision: this.lastTriggerDecisionTime ? performance.now() - this.lastTriggerDecisionTime : undefined, - codewhispererTimeToFirstRecommendation: this.timeToFirstRecommendation, + codewhispererTimeToFirstRecommendation: session.timeToFirstRecommendation, codewhispererTriggerCharacter: autoTriggerType === 'SpecialCharacters' ? this.triggerChar : undefined, codewhispererSuggestionState: aggregatedSuggestionState, codewhispererPreviousSuggestionState: this.prevTriggerDecision, codewhispererClassifierResult: this.classifierResult, codewhispererClassifierThreshold: this.classifierThreshold, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererSupplementalContextTimeout: supplementalContextMetadata?.isProcessTimeout, codewhispererSupplementalContextIsUtg: supplementalContextMetadata?.isUtg, codewhispererSupplementalContextLength: supplementalContextMetadata?.contentsLength, @@ -311,11 +302,11 @@ export class TelemetryHelper { this.prevTriggerDecision = this.getAggregatedSuggestionState(this.sessionDecisions) this.lastTriggerDecisionTime = performance.now() - // When we send a userTriggerDecision of Empty or Discard, we set the time users see the first - // suggestion to be now. - let e2eLatency = this.firstSuggestionShowTime - session.invokeSuggestionStartTime - if (e2eLatency < 0) { - e2eLatency = performance.now() - session.invokeSuggestionStartTime + // When we send a userTriggerDecision for neither Accept nor Reject, service side should not use this value + // and client side will set this value to 0.0. + let e2eLatency = session.firstSuggestionShowTime - session.invokeSuggestionStartTime + if (aggregatedSuggestionState !== 'Reject' && aggregatedSuggestionState !== 'Accept') { + e2eLatency = 0.0 } client @@ -333,11 +324,13 @@ export class TelemetryHelper { completionType: this.getSendTelemetryCompletionType(aggregatedCompletionType), suggestionState: this.getSendTelemetrySuggestionState(aggregatedSuggestionState), recommendationLatencyMilliseconds: e2eLatency, + triggerToResponseLatencyMilliseconds: session.timeToFirstRecommendation, + perceivedLatencyMilliseconds: session.perceivedLatency, timestamp: new Date(Date.now()), - triggerToResponseLatencyMilliseconds: this.timeToFirstRecommendation, suggestionReferenceCount: referenceCount, generatedLine: generatedLines, numberOfRecommendations: suggestionCount, + acceptedCharacterCount: acceptedRecommendationContent.length, }, }, }) @@ -383,16 +376,6 @@ export class TelemetryHelper { this.timeSinceLastModification = timeSinceLastModification } - public setInvocationStartTime(invocationTime: number) { - this.invocationTime = invocationTime - } - - public setTimeToFirstRecommendation(timeToFirstRecommendation: number) { - if (this.invocationTime) { - this.timeToFirstRecommendation = timeToFirstRecommendation - this.invocationTime - } - } - public setTraceId(traceId: string) { this.traceId = traceId } @@ -402,7 +385,8 @@ export class TelemetryHelper { this.triggerChar = '' this.typeAheadLength = 0 this.timeSinceLastModification = 0 - this.timeToFirstRecommendation = 0 + session.timeToFirstRecommendation = 0 + session.perceivedLatency = 0 this.classifierResult = undefined this.classifierThreshold = undefined } @@ -485,7 +469,7 @@ export class TelemetryHelper { session.sdkApiCallStartTime = 0 this.sdkApiCallEndTime = 0 session.fetchCredentialStartTime = 0 - this.firstSuggestionShowTime = 0 + session.firstSuggestionShowTime = 0 this.allPaginationEndTime = 0 this.firstResponseRequestId = '' } @@ -509,8 +493,8 @@ export class TelemetryHelper { } public setFirstSuggestionShowTime() { - if (this.firstSuggestionShowTime === 0 && this.sdkApiCallEndTime !== 0) { - this.firstSuggestionShowTime = performance.now() + if (session.firstSuggestionShowTime === 0 && this.sdkApiCallEndTime !== 0) { + session.firstSuggestionShowTime = performance.now() } } @@ -523,23 +507,22 @@ export class TelemetryHelper { // report client component latency after all pagination call finish // and at least one suggestion is shown to the user public tryRecordClientComponentLatency() { - if (this.firstSuggestionShowTime === 0 || this.allPaginationEndTime === 0) { + if (session.firstSuggestionShowTime === 0 || this.allPaginationEndTime === 0) { return } telemetry.codewhisperer_clientComponentLatency.emit({ codewhispererRequestId: this.firstResponseRequestId, codewhispererSessionId: session.sessionId, codewhispererFirstCompletionLatency: this.sdkApiCallEndTime - session.sdkApiCallStartTime, - codewhispererEndToEndLatency: this.firstSuggestionShowTime - session.invokeSuggestionStartTime, + codewhispererEndToEndLatency: session.firstSuggestionShowTime - session.invokeSuggestionStartTime, codewhispererAllCompletionsLatency: this.allPaginationEndTime - session.sdkApiCallStartTime, - codewhispererPostprocessingLatency: this.firstSuggestionShowTime - this.sdkApiCallEndTime, + codewhispererPostprocessingLatency: session.firstSuggestionShowTime - this.sdkApiCallEndTime, codewhispererCredentialFetchingLatency: session.sdkApiCallStartTime - session.fetchCredentialStartTime, codewhispererPreprocessingLatency: session.fetchCredentialStartTime - session.invokeSuggestionStartTime, codewhispererCompletionType: 'Line', codewhispererTriggerType: session.triggerType, codewhispererLanguage: session.language, credentialStartUrl: AuthUtil.instance.startUrl, - codewhispererUserGroup: CodeWhispererUserGroupSettings.getUserGroup().toString(), codewhispererCustomizationArn: getSelectedCustomization().arn, }) } diff --git a/packages/core/src/codewhisperer/util/zipUtil.ts b/packages/core/src/codewhisperer/util/zipUtil.ts index f8656536ad8..b0c22eed885 100644 --- a/packages/core/src/codewhisperer/util/zipUtil.ts +++ b/packages/core/src/codewhisperer/util/zipUtil.ts @@ -9,7 +9,7 @@ import { tempDirPath } from '../../shared/filesystemUtilities' import { getLogger } from '../../shared/logger' import * as CodeWhispererConstants from '../models/constants' import { ToolkitError } from '../../shared/errors' -import { fs } from '../../shared' +import { fs } from '../../shared/fs/fs' import { getLoggerForScope } from '../service/securityScanHandler' import { runtimeLanguageContext } from './runtimeLanguageContext' import { CodewhispererLanguage } from '../../shared/telemetry/telemetry.gen' diff --git a/packages/core/src/codewhisperer/views/lineAnnotationController.ts b/packages/core/src/codewhisperer/views/lineAnnotationController.ts index a75ec39a7e9..df00b6fe7ac 100644 --- a/packages/core/src/codewhisperer/views/lineAnnotationController.ts +++ b/packages/core/src/codewhisperer/views/lineAnnotationController.ts @@ -46,6 +46,7 @@ function fromId(id: string | undefined): AnnotationState | undefined { interface AnnotationState { id: string suppressWhileRunning: boolean + decorationRenderOptions?: vscode.ThemableDecorationAttachmentRenderOptions text: () => string updateState(changeSource: AnnotationChangeSource, force: boolean): AnnotationState | undefined @@ -199,6 +200,26 @@ export class EndState implements AnnotationState { } } +export class InlineChatState implements AnnotationState { + static static = 'amazonq_annotation_inline_chat' + id = InlineChatState.static + suppressWhileRunning = false + + text = () => { + if (os.platform() === 'darwin') { + return 'Amazon Q: Edit \u2318I' + } else { + return 'Amazon Q: Edit (Ctrl+I)' + } + } + updateState(_changeSource: AnnotationChangeSource, _force: boolean): AnnotationState { + return this + } + isNextState(_state: AnnotationState | undefined): boolean { + return false + } +} + /** * There are * - existing users @@ -314,6 +335,26 @@ export class LineAnnotationController implements vscode.Disposable { await globals.globalState.update(inlinehintKey, this._currentState.id) } + /** + * Trys to show the inline hint, if the tutorial is not finished it will not be shown + */ + async tryShowInlineHint(): Promise { + if (this.isTutorialDone()) { + this._isReady = true + this._currentState = new InlineChatState() + return true + } + return false + } + + async tryHideInlineHint(): Promise { + if (this._currentState instanceof InlineChatState) { + this._currentState = new EndState() + return true + } + return false + } + private async onActiveLinesChanged(e: LinesChangeEvent) { if (!this._isReady) { return @@ -438,7 +479,7 @@ export class LineAnnotationController implements vscode.Disposable { ): Partial | undefined { const isCWRunning = RecommendationService.instance.isRunning - const textOptions = { + const textOptions: vscode.ThemableDecorationAttachmentRenderOptions = { contentText: '', fontWeight: 'normal', fontStyle: 'normal', diff --git a/packages/core/src/codewhispererChat/app.ts b/packages/core/src/codewhispererChat/app.ts index f65352ecc10..6781cde30e5 100644 --- a/packages/core/src/codewhispererChat/app.ts +++ b/packages/core/src/codewhispererChat/app.ts @@ -10,6 +10,7 @@ import { AmazonQAppInitContext } from '../amazonq/apps/initContext' import { MessageListener } from '../amazonq/messages/messageListener' import { MessagePublisher } from '../amazonq/messages/messagePublisher' import { + ViewDiff, ChatItemFeedbackMessage, ChatItemVotedMessage, CopyCodeToClipboard, @@ -24,6 +25,7 @@ import { TabCreatedMessage, TriggerTabIDReceived, UIFocusMessage, + AcceptDiff, } from './controllers/chat/model' import { EditorContextCommand, registerCommands } from './commands/registerCommands' @@ -34,6 +36,8 @@ export function init(appContext: AmazonQAppInitContext) { processTabClosedMessage: new EventEmitter(), processTabChangedMessage: new EventEmitter(), processInsertCodeAtCursorPosition: new EventEmitter(), + processAcceptDiff: new EventEmitter(), + processViewDiff: new EventEmitter(), processCopyCodeToClipboard: new EventEmitter(), processContextMenuCommand: new EventEmitter(), processTriggerTabIDReceived: new EventEmitter(), @@ -62,6 +66,8 @@ export function init(appContext: AmazonQAppInitContext) { processInsertCodeAtCursorPosition: new MessageListener( cwChatControllerEventEmitters.processInsertCodeAtCursorPosition ), + processAcceptDiff: new MessageListener(cwChatControllerEventEmitters.processAcceptDiff), + processViewDiff: new MessageListener(cwChatControllerEventEmitters.processViewDiff), processCopyCodeToClipboard: new MessageListener( cwChatControllerEventEmitters.processCopyCodeToClipboard ), @@ -108,6 +114,8 @@ export function init(appContext: AmazonQAppInitContext) { processInsertCodeAtCursorPosition: new MessagePublisher( cwChatControllerEventEmitters.processInsertCodeAtCursorPosition ), + processAcceptDiff: new MessagePublisher(cwChatControllerEventEmitters.processAcceptDiff), + processViewDiff: new MessagePublisher(cwChatControllerEventEmitters.processViewDiff), processCopyCodeToClipboard: new MessagePublisher( cwChatControllerEventEmitters.processCopyCodeToClipboard ), diff --git a/packages/core/src/codewhispererChat/clients/chat/v0/chat.ts b/packages/core/src/codewhispererChat/clients/chat/v0/chat.ts index 00326ddd955..fc164ebb95c 100644 --- a/packages/core/src/codewhispererChat/clients/chat/v0/chat.ts +++ b/packages/core/src/codewhispererChat/clients/chat/v0/chat.ts @@ -3,10 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { SendMessageCommandOutput, SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client' import { GenerateAssistantResponseCommandOutput, GenerateAssistantResponseRequest } from '@amzn/codewhisperer-streaming' import * as vscode from 'vscode' import { ToolkitError } from '../../../../shared/errors' import { createCodeWhispererChatStreamingClient } from '../../../../shared/clients/codewhispererChatClient' +import { createQDeveloperStreamingClient } from '../../../../shared/clients/qDeveloperChatClient' export class ChatSession { private sessionId?: string @@ -28,8 +30,28 @@ export class ChatSession { public setSessionID(id?: string) { this.sessionId = id } + async chatIam(chatRequest: SendMessageRequest): Promise { + const client = await createQDeveloperStreamingClient() - async chat(chatRequest: GenerateAssistantResponseRequest): Promise { + const response = await client.sendMessage(chatRequest) + if (!response.sendMessageResponse) { + throw new ToolkitError( + `Empty chat response. Session id: ${this.sessionId} Request ID: ${response.$metadata.requestId}` + ) + } + + const responseStream = response.sendMessageResponse + for await (const event of responseStream) { + if ('messageMetadataEvent' in event) { + this.sessionId = event.messageMetadataEvent?.conversationId + break + } + } + + return response + } + + async chatSso(chatRequest: GenerateAssistantResponseRequest): Promise { const client = await createCodeWhispererChatStreamingClient() if (this.sessionId !== undefined && chatRequest.conversationState !== undefined) { diff --git a/packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts b/packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts index f853fb4611d..9ff56523379 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts @@ -4,14 +4,14 @@ */ import { + ConversationState, CursorState, DocumentSymbol, - GenerateAssistantResponseRequest, RelevantTextDocument, SymbolType, TextDocument, } from '@amzn/codewhisperer-streaming' -import { TriggerPayload } from '../model' +import { ChatTriggerType, TriggerPayload } from '../model' import { undefinedIfEmpty } from '../../../../shared' const fqnNameSizeDownLimit = 1 @@ -37,7 +37,7 @@ export const supportedLanguagesList = [ const filePathSizeLimit = 4_000 const customerMessageSizeLimit = 4_000 -export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): GenerateAssistantResponseRequest { +export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): { conversationState: ConversationState } { let document: TextDocument | undefined = undefined let cursorState: CursorState | undefined = undefined @@ -98,6 +98,7 @@ export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): Gen const useRelevantDocuments = triggerPayload.useRelevantDocuments // service will throw validation exception if string is empty const customizationArn: string | undefined = undefinedIfEmpty(triggerPayload.customization.arn) + const chatTriggerType = triggerPayload.trigger === ChatTriggerType.InlineChatMessage ? 'INLINE_CHAT' : 'MANUAL' return { conversationState: { @@ -117,7 +118,7 @@ export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): Gen userIntent: triggerPayload.userIntent, }, }, - chatTriggerType: 'MANUAL', + chatTriggerType, customizationArn: customizationArn, }, } diff --git a/packages/core/src/codewhispererChat/controllers/chat/controller.ts b/packages/core/src/codewhispererChat/controllers/chat/controller.ts index e4680c02571..5f527ffa4ba 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/controller.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/controller.ts @@ -5,7 +5,7 @@ import { Event as VSCodeEvent, Uri } from 'vscode' import { EditorContextExtractor } from '../../editor/context/extractor' import { ChatSessionStorage } from '../../storages/chatSession' -import { Messenger, StaticTextResponseType } from './messenger/messenger' +import { Messenger, MessengerResponseType, StaticTextResponseType } from './messenger/messenger' import { PromptMessage, ChatTriggerType, @@ -24,6 +24,8 @@ import { ResponseBodyLinkClickMessage, ChatPromptCommandType, FooterInfoLinkClick, + ViewDiff, + AcceptDiff, } from './model' import { AppToWebViewMessageDispatcher } from '../../view/connector/connector' import { MessagePublisher } from '../../../amazonq/messages/messagePublisher' @@ -32,10 +34,8 @@ import { EditorContentController } from '../../../amazonq/commons/controllers/co import { EditorContextCommand } from '../../commands/registerCommands' import { PromptsGenerator } from './prompts/promptsGenerator' import { TriggerEventsStorage } from '../../storages/triggerEvents' -import { - CodeWhispererStreamingServiceException, - GenerateAssistantResponseCommandOutput, -} from '@amzn/codewhisperer-streaming' +import { SendMessageRequest } from '@amzn/amazon-q-developer-streaming-client' +import { CodeWhispererStreamingServiceException } from '@amzn/codewhisperer-streaming' import { UserIntentRecognizer } from './userIntent/userIntentRecognizer' import { CWCTelemetryHelper, recordTelemetryChatRunCommand } from './telemetryHelper' import { CodeWhispererTracker } from '../../../codewhisperer/tracker/codewhispererTracker' @@ -52,6 +52,7 @@ import { getHttpStatusCode, AwsClientResponseError } from '../../../shared/error import { uiEventRecorder } from '../../../amazonq/util/eventRecorder' import { globals } from '../../../shared' import { telemetry } from '../../../shared/telemetry' +import { isSsoConnection } from '../../../auth/connection' export interface ChatControllerMessagePublishers { readonly processPromptChatMessage: MessagePublisher @@ -59,6 +60,8 @@ export interface ChatControllerMessagePublishers { readonly processTabClosedMessage: MessagePublisher readonly processTabChangedMessage: MessagePublisher readonly processInsertCodeAtCursorPosition: MessagePublisher + readonly processAcceptDiff: MessagePublisher + readonly processViewDiff: MessagePublisher readonly processCopyCodeToClipboard: MessagePublisher readonly processContextMenuCommand: MessagePublisher readonly processTriggerTabIDReceived: MessagePublisher @@ -77,6 +80,8 @@ export interface ChatControllerMessageListeners { readonly processTabClosedMessage: MessageListener readonly processTabChangedMessage: MessageListener readonly processInsertCodeAtCursorPosition: MessageListener + readonly processAcceptDiff: MessageListener + readonly processViewDiff: MessageListener readonly processCopyCodeToClipboard: MessageListener readonly processContextMenuCommand: MessageListener readonly processTriggerTabIDReceived: MessageListener @@ -159,6 +164,14 @@ export class ChatController { return this.processInsertCodeAtCursorPosition(data) }) + this.chatControllerMessageListeners.processAcceptDiff.onMessage((data) => { + return this.processAcceptDiff(data) + }) + + this.chatControllerMessageListeners.processViewDiff.onMessage((data) => { + return this.processViewDiff(data) + }) + this.chatControllerMessageListeners.processCopyCodeToClipboard.onMessage((data) => { return this.processCopyCodeToClipboard(data) }) @@ -278,6 +291,30 @@ export class ChatController { this.telemetryHelper.recordInteractWithMessage(message) } + private async processAcceptDiff(message: AcceptDiff) { + const context = this.triggerEventsStorage.getTriggerEvent((message.data as any)?.triggerID) || '' + this.editorContentController + .acceptDiff({ ...message, ...context }) + .then(() => { + this.telemetryHelper.recordInteractWithMessage(message) + }) + .catch((error) => { + this.telemetryHelper.recordInteractWithMessage(message, { result: 'Failed' }) + }) + } + + private async processViewDiff(message: ViewDiff) { + const context = this.triggerEventsStorage.getTriggerEvent((message.data as any)?.triggerID) || '' + this.editorContentController + .viewDiff({ ...message, ...context }) + .then(() => { + this.telemetryHelper.recordInteractWithMessage(message) + }) + .catch((error) => { + this.telemetryHelper.recordInteractWithMessage(message, { result: 'Failed' }) + }) + } + private async processCopyCodeToClipboard(message: CopyCodeToClipboard) { this.telemetryHelper.recordInteractWithMessage(message) } @@ -618,11 +655,24 @@ export class ChatController { request )}` ) - let response: GenerateAssistantResponseCommandOutput | undefined = undefined + let response: MessengerResponseType | undefined = undefined session.createNewTokenSource() try { this.messenger.sendInitalStream(tabID, triggerID) - response = await session.chat(request) + this.telemetryHelper.setConversationStreamStartTime(tabID) + if (isSsoConnection(AuthUtil.instance.conn)) { + const { $metadata, generateAssistantResponseResponse } = await session.chatSso(request) + response = { + $metadata: $metadata, + message: generateAssistantResponseResponse, + } + } else { + const { $metadata, sendMessageResponse } = await session.chatIam(request as SendMessageRequest) + response = { + $metadata: $metadata, + message: sendMessageResponse, + } + } this.telemetryHelper.recordEnterFocusConversation(triggerEvent.tabID) this.telemetryHelper.recordStartConversation(triggerEvent, triggerPayload) diff --git a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts index dad3181381d..3c377119747 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts @@ -13,9 +13,10 @@ import { QuickActionMessage, } from '../../../view/connector/connector' import { EditorContextCommandType } from '../../../commands/registerCommands' +import { ChatResponseStream as qdevChatResponseStream } from '@amzn/amazon-q-developer-streaming-client' import { + ChatResponseStream as cwChatResponseStream, CodeWhispererStreamingServiceException, - GenerateAssistantResponseCommandOutput, SupplementaryWebLink, } from '@amzn/codewhisperer-streaming' import { ChatMessage, ErrorMessage, FollowUp, Suggestion } from '../../../view/connector/connector' @@ -27,15 +28,21 @@ import { getHttpStatusCode, getRequestId, ToolkitError } from '../../../../share import { keys } from '../../../../shared/utilities/tsUtils' import { getLogger } from '../../../../shared/logger/logger' import { FeatureAuthState } from '../../../../codewhisperer/util/authUtil' -import { AuthFollowUpType, AuthMessageDataMap } from '../../../../amazonq/auth/model' import { userGuideURL } from '../../../../amazonq/webview/ui/texts/constants' import { CodeScanIssue } from '../../../../codewhisperer/models/model' import { marked } from 'marked' import { JSDOM } from 'jsdom' import { LspController } from '../../../../amazonq/lsp/lspController' +import { extractCodeBlockLanguage } from '../../../../shared/markdown' +import { extractAuthFollowUp } from '../../../../amazonq/util/authUtils' export type StaticTextResponseType = 'quick-action-help' | 'onboarding-help' | 'transform' | 'help' +export type MessengerResponseType = { + $metadata: { requestId?: string; httpStatusCode?: number } + message?: AsyncIterable +} + export class Messenger { public constructor( private readonly dispatcher: AppToWebViewMessageDispatcher, @@ -43,26 +50,7 @@ export class Messenger { ) {} public async sendAuthNeededExceptionMessage(credentialState: FeatureAuthState, tabID: string, triggerID: string) { - let authType: AuthFollowUpType = 'full-auth' - let message = AuthMessageDataMap[authType].message - if ( - credentialState.codewhispererChat === 'disconnected' && - credentialState.codewhispererCore === 'disconnected' - ) { - authType = 'full-auth' - message = AuthMessageDataMap[authType].message - } - - if (credentialState.codewhispererCore === 'connected' && credentialState.codewhispererChat === 'expired') { - authType = 'missing_scopes' - message = AuthMessageDataMap[authType].message - } - - if (credentialState.codewhispererChat === 'expired' && credentialState.codewhispererCore === 'expired') { - authType = 're-auth' - message = AuthMessageDataMap[authType].message - } - + const { message, authType } = extractAuthFollowUp(credentialState) this.dispatcher.sendAuthNeededExceptionMessage( new AuthNeededException( { @@ -86,6 +74,8 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID: '', + userIntent: undefined, + codeBlockLanguage: undefined, }, tabID ) @@ -119,7 +109,7 @@ export class Messenger { } public async sendAIResponse( - response: GenerateAssistantResponseCommandOutput, + response: MessengerResponseType, session: ChatSession, tabID: string, triggerID: string, @@ -130,8 +120,9 @@ export class Messenger { let codeReference: CodeReference[] = [] let followUps: FollowUp[] = [] let relatedSuggestions: Suggestion[] = [] + let codeBlockLanguage: string = 'plaintext' - if (response.generateAssistantResponseResponse === undefined) { + if (response.message === undefined) { throw new ToolkitError( `Empty response from CodeWhisperer Streaming service. Request ID: ${response.$metadata.requestId}` ) @@ -148,7 +139,7 @@ export class Messenger { const eventCounts = new Map() waitUntil( async () => { - for await (const chatEvent of response.generateAssistantResponseResponse!) { + for await (const chatEvent of response.message!) { for (const key of keys(chatEvent)) { if ((chatEvent[key] as any) !== undefined) { eventCounts.set(key, (eventCounts.get(key) ?? 0) + 1) @@ -181,7 +172,9 @@ export class Messenger { chatEvent.assistantResponseEvent.content.length > 0 ) { message += chatEvent.assistantResponseEvent.content - + if (codeBlockLanguage === 'plaintext') { + codeBlockLanguage = extractCodeBlockLanguage(message) + } this.dispatcher.sendChatMessage( new ChatMessage( { @@ -193,6 +186,8 @@ export class Messenger { codeReference, triggerID, messageID, + userIntent: triggerPayload.userIntent, + codeBlockLanguage: codeBlockLanguage, }, tabID ) @@ -269,6 +264,8 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID, + userIntent: triggerPayload.userIntent, + codeBlockLanguage: codeBlockLanguage, }, tabID ) @@ -286,6 +283,8 @@ export class Messenger { relatedSuggestions, triggerID, messageID, + userIntent: triggerPayload.userIntent, + codeBlockLanguage: undefined, }, tabID ) @@ -302,6 +301,8 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID, + userIntent: triggerPayload.userIntent, + codeBlockLanguage: undefined, }, tabID ) @@ -425,6 +426,8 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID: 'static_message_' + triggerID, + userIntent: undefined, + codeBlockLanguage: undefined, }, tabID ) @@ -435,7 +438,7 @@ export class Messenger { let message = '' switch (quickAction) { case 'help': - message = 'What can Amazon Q help me with?' + message = 'How can Amazon Q help me?' break } diff --git a/packages/core/src/codewhispererChat/controllers/chat/model.ts b/packages/core/src/codewhispererChat/controllers/chat/model.ts index 94e7d0d10cc..f79510acacb 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/model.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/model.ts @@ -46,6 +46,7 @@ export interface InsertCodeAtCursorPosition { eventId: string codeBlockIndex: number totalCodeBlocks: number + codeBlockLanguage: string } export interface CopyCodeToClipboard { @@ -59,6 +60,32 @@ export interface CopyCodeToClipboard { eventId: string codeBlockIndex: number totalCodeBlocks: number + codeBlockLanguage: string +} + +export interface AcceptDiff { + command: string | undefined + tabID: string // rename tabId + messageId: string + actionId: string + data: string + code: string + referenceTrackerInformation?: CodeReference[] + eventId: string + codeBlockIndex?: number + totalCodeBlocks?: number +} +export interface ViewDiff { + command: string | undefined + tabID: string // rename tabId + messageId: string + actionId: string + data: string + code: string + referenceTrackerInformation?: CodeReference[] + eventId: string + codeBlockIndex?: number + totalCodeBlocks?: number } export type ChatPromptCommandType = @@ -129,6 +156,7 @@ export interface ChatItemFeedbackMessage { export enum ChatTriggerType { ChatMessage = 'ChatMessage', + InlineChatMessage = 'InlineChatMessage', } export interface TriggerPayload { diff --git a/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts b/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts index a86d8c0ff68..c6e12d601c2 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts @@ -15,6 +15,8 @@ import { } from '../../../shared/telemetry/telemetry' import { ChatSessionStorage } from '../../storages/chatSession' import { + AcceptDiff, + ViewDiff, ChatItemFeedbackMessage, ChatItemVotedMessage, CopyCodeToClipboard, @@ -63,6 +65,8 @@ export class CWCTelemetryHelper { private triggerEventsStorage: TriggerEventsStorage private responseStreamStartTime: Map = new Map() private responseStreamTotalTime: Map = new Map() + private conversationStreamStartTime: Map = new Map() + private conversationStreamTotalTime: Map = new Map() private responseStreamTimeForChunks: Map = new Map() private responseWithProjectContext: Map = new Map() @@ -171,6 +175,7 @@ export class CWCTelemetryHelper { public recordInteractWithMessage( message: + | AcceptDiff | InsertCodeAtCursorPosition | CopyCodeToClipboard | PromptMessage @@ -178,6 +183,8 @@ export class CWCTelemetryHelper { | SourceLinkClickMessage | ResponseBodyLinkClickMessage | FooterInfoLinkClick + | ViewDiff, + { result }: { result: Result } = { result: 'Succeeded' } ) { const conversationId = this.getConversationId(message.tabID) let event: AmazonqInteractWithMessage | undefined @@ -185,7 +192,7 @@ export class CWCTelemetryHelper { case 'insert_code_at_cursor_position': message = message as InsertCodeAtCursorPosition event = { - result: 'Succeeded', + result, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, cwsprChatMessageId: message.messageId, @@ -198,12 +205,13 @@ export class CWCTelemetryHelper { cwsprChatCodeBlockIndex: message.codeBlockIndex, cwsprChatTotalCodeBlocks: message.totalCodeBlocks, cwsprChatHasProjectContext: this.responseWithProjectContext.get(message.messageId), + cwsprChatProgrammingLanguage: message.codeBlockLanguage, } break case 'code_was_copied_to_clipboard': message = message as CopyCodeToClipboard event = { - result: 'Succeeded', + result, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, cwsprChatMessageId: message.messageId, @@ -215,12 +223,45 @@ export class CWCTelemetryHelper { cwsprChatCodeBlockIndex: message.codeBlockIndex, cwsprChatTotalCodeBlocks: message.totalCodeBlocks, cwsprChatHasProjectContext: this.responseWithProjectContext.get(message.messageId), + cwsprChatProgrammingLanguage: message.codeBlockLanguage, + } + break + case 'accept_diff': + message = message as AcceptDiff + event = { + result, + cwsprChatConversationId: conversationId ?? '', + cwsprChatMessageId: message.messageId, + cwsprChatInteractionType: 'acceptDiff', + credentialStartUrl: AuthUtil.instance.startUrl, + cwsprChatAcceptedCharactersLength: message.code.length, + cwsprChatHasReference: + message.referenceTrackerInformation && message.referenceTrackerInformation.length > 0, + cwsprChatCodeBlockIndex: message.codeBlockIndex, + cwsprChatTotalCodeBlocks: message.totalCodeBlocks, + cwsprChatHasProjectContext: this.responseWithProjectContext.get(message.messageId), + } + break + case 'view_diff': + message = message as ViewDiff + event = { + result, + cwsprChatConversationId: conversationId ?? '', + cwsprChatMessageId: message.messageId, + cwsprChatInteractionType: 'viewDiff', + credentialStartUrl: AuthUtil.instance.startUrl, + cwsprChatAcceptedCharactersLength: message.code.length, + cwsprChatHasReference: + message.referenceTrackerInformation && message.referenceTrackerInformation.length > 0, + cwsprChatCodeBlockIndex: message.codeBlockIndex, + cwsprChatTotalCodeBlocks: message.totalCodeBlocks, + cwsprChatHasProjectContext: this.responseWithProjectContext.get(message.messageId), } break case 'follow-up-was-clicked': message = message as PromptMessage event = { - result: 'Succeeded', + result, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, cwsprChatMessageId: message.messageId, @@ -231,7 +272,7 @@ export class CWCTelemetryHelper { case 'chat-item-voted': message = message as ChatItemVotedMessage event = { - result: 'Succeeded', + result, cwsprChatMessageId: message.messageId, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, @@ -242,7 +283,7 @@ export class CWCTelemetryHelper { case 'source-link-click': message = message as SourceLinkClickMessage event = { - result: 'Succeeded', + result, cwsprChatMessageId: message.messageId, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, @@ -254,7 +295,7 @@ export class CWCTelemetryHelper { case 'response-body-link-click': message = message as ResponseBodyLinkClickMessage event = { - result: 'Succeeded', + result, cwsprChatMessageId: message.messageId, cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, @@ -266,7 +307,7 @@ export class CWCTelemetryHelper { case 'footer-info-link-click': message = message as FooterInfoLinkClick event = { - result: 'Succeeded', + result, cwsprChatMessageId: 'footer', cwsprChatConversationId: conversationId ?? '', credentialStartUrl: AuthUtil.instance.startUrl, @@ -317,6 +358,10 @@ export class CWCTelemetryHelper { return 'UPVOTE' case 'downvote': return 'DOWNVOTE' + case 'acceptDiff': + return 'ACCEPT_DIFF' + case 'viewDiff': + return 'VIEW_DIFF' default: return 'UNKNOWN' } @@ -408,7 +453,9 @@ export class CWCTelemetryHelper { this.getTimeBetweenChunks(message.tabID, this.responseStreamTimeForChunks) ), cwsprChatFullResponseLatency: this.responseStreamTotalTime.get(message.tabID) ?? 0, - cwsprTimeToFirstDisplay: this.getFirstDisplayTime(tabID, startTime), + cwsprChatTimeToFirstDisplay: this.getFirstDisplayTime(tabID, startTime), + cwsprChatTimeToFirstUsableChunk: this.getFirstUsableChunkTime(message.tabID) ?? 0, + cwsprChatFullServerResponseLatency: this.conversationStreamTotalTime.get(message.tabID) ?? 0, cwsprChatTimeBetweenDisplays: JSON.stringify(this.getTimeBetweenChunks(tabID, this.displayTimeForChunks)), cwsprChatFullDisplayLatency: fullDisplayLatency, cwsprChatRequestLength: triggerPayload.message?.length ?? 0, @@ -510,6 +557,10 @@ export class CWCTelemetryHelper { this.responseWithProjectContext.set(messageId, true) } + public setConversationStreamStartTime(tabID: string) { + this.conversationStreamStartTime.set(tabID, performance.now()) + } + private getResponseStreamTimeToFirstChunk(tabID: string): number { const chunkTimes = this.responseStreamTimeForChunks.get(tabID) ?? [0, 0] if (chunkTimes.length === 1) { @@ -529,6 +580,13 @@ export class CWCTelemetryHelper { return Math.round(chunkTimes[0] - startTime) } + private getFirstUsableChunkTime(tabID: string) { + const startTime = this.conversationStreamStartTime.get(tabID) ?? 0 + const chunkTimes = this.responseStreamTimeForChunks.get(tabID) ?? [0, 0] + // first chunk is the start time, we use the second because thats the first actual usable chunk time + return Math.round(chunkTimes[1] - startTime) + } + private getTimeBetweenChunks(tabID: string, chunks: Map): number[] { try { const chunkDeltaTimes: number[] = [] @@ -545,8 +603,13 @@ export class CWCTelemetryHelper { } public setResponseStreamTotalTime(tabID: string) { - const totalTime = performance.now() - (this.responseStreamStartTime.get(tabID) ?? 0) - this.responseStreamTotalTime.set(tabID, Math.round(totalTime)) + // time from when the requests started streaming until the end of the stream + const totalStreamingTime = performance.now() - (this.responseStreamStartTime.get(tabID) ?? 0) + this.responseStreamTotalTime.set(tabID, Math.round(totalStreamingTime)) + + // time from the initial server request, including creating the conversation id, until the end of the stream + const totalConversationTime = performance.now() - (this.conversationStreamStartTime.get(tabID) ?? 0) + this.conversationStreamTotalTime.set(tabID, Math.round(totalConversationTime)) } public getConversationId(tabID: string): string | undefined { diff --git a/packages/core/src/codewhispererChat/editor/context/file/languages.ts b/packages/core/src/codewhispererChat/editor/context/file/languages.ts index b2dac49f2ad..51887eaf31b 100644 --- a/packages/core/src/codewhispererChat/editor/context/file/languages.ts +++ b/packages/core/src/codewhispererChat/editor/context/file/languages.ts @@ -5,57 +5,57 @@ import { TextDocument } from 'vscode' +const defaultLanguages = [ + 'yaml', + 'xsl', + 'xml', + 'vue', + 'tex', + 'typescript', + 'swift', + 'stylus', + 'sql', + 'slim', + 'shaderlab', + 'sass', + 'rust', + 'ruby', + 'r', + 'python', + 'pug', + 'powershell', + 'php', + 'perl', + 'markdown', + 'makefile', + 'lua', + 'less', + 'latex', + 'json', + 'javascript', + 'java', + 'ini', + 'html', + 'haml', + 'handlebars', + 'groovy', + 'go', + 'diff', + 'css', + 'c', + 'coffeescript', + 'clojure', + 'bibtex', + 'abap', +] + export function extractLanguageNameFromFile(file: TextDocument): string | undefined { const languageId = file.languageId if (languageId === undefined) { return undefined } - if ( - [ - 'yaml', - 'xsl', - 'xml', - 'vue', - 'tex', - 'typescript', - 'swift', - 'stylus', - 'sql', - 'slim', - 'shaderlab', - 'sass', - 'rust', - 'ruby', - 'r', - 'python', - 'pug', - 'powershell', - 'php', - 'perl', - 'markdown', - 'makefile', - 'lua', - 'less', - 'latex', - 'json', - 'javascript', - 'java', - 'ini', - 'html', - 'haml', - 'handlebars', - 'groovy', - 'go', - 'diff', - 'css', - 'c', - 'coffeescript', - 'clojure', - 'bibtex', - 'abap', - ].includes(languageId) - ) { + if (defaultLanguages.includes(languageId)) { return languageId } switch (languageId) { @@ -117,54 +117,7 @@ export function extractLanguageNameFromFile(file: TextDocument): string | undefi export function extractAdditionalLanguageMatchPoliciesFromFile(file: TextDocument): Set { const languageId = file.languageId - if (languageId === undefined) { - return new Set() - } - if ( - [ - 'yaml', - 'xsl', - 'xml', - 'vue', - 'tex', - 'typescript', - 'swift', - 'stylus', - 'sql', - 'slim', - 'shaderlab', - 'sass', - 'rust', - 'ruby', - 'r', - 'python', - 'pug', - 'powershell', - 'php', - 'perl', - 'markdown', - 'makefile', - 'lua', - 'less', - 'latex', - 'json', - 'javascript', - 'java', - 'ini', - 'html', - 'haml', - 'handlebars', - 'groovy', - 'go', - 'diff', - 'css', - 'c', - 'coffeescript', - 'clojure', - 'bibtex', - 'abap', - ].includes(languageId) - ) { + if (languageId === undefined || defaultLanguages.includes(languageId)) { return new Set() } switch (languageId) { diff --git a/packages/core/src/codewhispererChat/index.ts b/packages/core/src/codewhispererChat/index.ts index 0a954458cfe..e473203caf5 100644 --- a/packages/core/src/codewhispererChat/index.ts +++ b/packages/core/src/codewhispererChat/index.ts @@ -7,3 +7,11 @@ export { FocusAreaContextExtractor } from './editor/context/focusArea/focusAreaE export { TryChatCodeLensProvider, resolveModifierKey, tryChatCodeLensCommand } from './editor/codelens' export { focusAmazonQPanel } from './commands/registerCommands' export { ChatSession } from './clients/chat/v0/chat' +export { triggerPayloadToChatRequest } from './controllers/chat/chatRequest/converter' +export { ChatTriggerType, PromptMessage, TriggerPayload } from './controllers/chat/model' +export { UserIntentRecognizer } from './controllers/chat/userIntent/userIntentRecognizer' +export { EditorContextExtractor } from './editor/context/extractor' +export { ChatSessionStorage } from './storages/chatSession' +export { TriggerEventsStorage } from './storages/triggerEvents' +export { ReferenceLogController } from './view/messages/referenceLogController' +export { extractLanguageNameFromFile } from './editor/context/file/languages' diff --git a/packages/core/src/codewhispererChat/storages/triggerEvents.ts b/packages/core/src/codewhispererChat/storages/triggerEvents.ts index 2218d4a11a9..d30ebf48939 100644 --- a/packages/core/src/codewhispererChat/storages/triggerEvents.ts +++ b/packages/core/src/codewhispererChat/storages/triggerEvents.ts @@ -12,6 +12,7 @@ export type TriggerEventType = | 'follow_up' | 'onboarding_page_interaction' | 'quick_action' + | 'inline_chat' export interface TriggerEvent { readonly id: string diff --git a/packages/core/src/codewhispererChat/view/connector/connector.ts b/packages/core/src/codewhispererChat/view/connector/connector.ts index 094c2b2c6d9..02794af5fb3 100644 --- a/packages/core/src/codewhispererChat/view/connector/connector.ts +++ b/packages/core/src/codewhispererChat/view/connector/connector.ts @@ -141,6 +141,8 @@ export interface ChatMessageProps { readonly codeReference?: CodeReference[] readonly triggerID: string readonly messageID: string + readonly userIntent: string | undefined + readonly codeBlockLanguage: string | undefined } export class ChatMessage extends UiMessage { @@ -153,6 +155,8 @@ export class ChatMessage extends UiMessage { readonly followUpsHeader: string | undefined readonly triggerID: string readonly messageID: string | undefined + readonly userIntent: string | undefined + readonly codeBlockLanguage: string | undefined override type = 'chatMessage' constructor(props: ChatMessageProps, tabID: string) { @@ -165,6 +169,8 @@ export class ChatMessage extends UiMessage { this.codeReference = props.codeReference this.triggerID = props.triggerID this.messageID = props.messageID + this.userIntent = props.userIntent + this.codeBlockLanguage = props.codeBlockLanguage } } diff --git a/packages/core/src/codewhispererChat/view/messages/messageListener.ts b/packages/core/src/codewhispererChat/view/messages/messageListener.ts index d9214f43365..93c750ab01b 100644 --- a/packages/core/src/codewhispererChat/view/messages/messageListener.ts +++ b/packages/core/src/codewhispererChat/view/messages/messageListener.ts @@ -63,6 +63,12 @@ export class UIMessageListener { }) } break + case 'accept_diff': + this.processAcceptDiff(msg) + break + case 'view_diff': + this.processViewDiff(msg) + break case 'code_was_copied_to_clipboard': this.processCodeWasCopiedToClipboard(msg) break @@ -159,6 +165,23 @@ export class UIMessageListener { eventId: msg.eventId, codeBlockIndex: msg.codeBlockIndex, totalCodeBlocks: msg.totalCodeBlocks, + codeBlockLanguage: msg.codeBlockLanguage, + }) + } + + private processAcceptDiff(msg: any) { + this.chatControllerMessagePublishers.processAcceptDiff.publish({ + command: msg.command, + tabID: msg.tabID || msg.tabId, + ...msg, + }) + } + + private processViewDiff(msg: any) { + this.chatControllerMessagePublishers.processViewDiff.publish({ + command: msg.command, + tabID: msg.tabID || msg.tabId, + ...msg, }) } @@ -174,6 +197,7 @@ export class UIMessageListener { eventId: msg.eventId, codeBlockIndex: msg.codeBlockIndex, totalCodeBlocks: msg.totalCodeBlocks, + codeBlockLanguage: msg.codeBlockLanguage, }) } diff --git a/packages/core/src/dev/activation.ts b/packages/core/src/dev/activation.ts index df69c018791..e676c426b12 100644 --- a/packages/core/src/dev/activation.ts +++ b/packages/core/src/dev/activation.ts @@ -4,7 +4,6 @@ */ import * as vscode from 'vscode' -import * as config from './config' import { createCommonButtons } from '../shared/ui/buttons' import { createQuickPick } from '../shared/ui/pickerPrompter' import { SkipPrompter } from '../shared/ui/common/skipPrompter' @@ -14,9 +13,6 @@ import { Commands } from '../shared/vscode/commands2' import { createInputBox } from '../shared/ui/inputPrompter' import { Wizard } from '../shared/wizards/wizard' import { deleteDevEnvCommand, installVsixCommand, openTerminalCommand } from './codecatalyst' -import { watchBetaVSIX } from './beta' -import { isCloud9 } from '../shared/extensionUtilities' -import { isReleaseVersion } from '../shared/vscode/env' import { isAnySsoConnection } from '../auth/connection' import { Auth } from '../auth/auth' import { getLogger } from '../shared/logger' @@ -61,57 +57,59 @@ let targetAuth: Auth * on selection. There is no support for name-spacing. Just add the relevant * feature/module as a description so it can be moved around easier. */ -const menuOptions: Record = { - installVsix: { - label: 'Install VSIX on Remote Environment', - description: 'CodeCatalyst', - detail: 'Automatically upload/install a VSIX to a remote host', - executor: installVsixCommand, - }, - openTerminal: { - label: 'Open Remote Terminal', - description: 'CodeCatalyst', - detail: 'Opens a new terminal connected to the remote environment', - executor: openTerminalCommand, - }, - deleteDevEnv: { - label: 'Delete Workspace', - description: 'CodeCatalyst', - detail: 'Deletes the selected Dev Environment', - executor: deleteDevEnvCommand, - }, - editStorage: { - label: 'Show or Edit globalState', - description: 'VS Code', - detail: 'Shows all globalState values, or edit a globalState/secret item', - executor: openStorageFromInput, - }, - showEnvVars: { - label: 'Show Environment Variables', - description: 'AWS Toolkit', - detail: 'Shows all environment variable values', - executor: () => showState('envvars'), - }, - deleteSsoConnections: { - label: 'Auth: Delete SSO Connections', - detail: 'Deletes all SSO Connections the extension is using.', - executor: deleteSsoConnections, - }, - expireSsoConnections: { - label: 'Auth: Expire SSO Connections', - detail: 'Force expires all SSO Connections, in to a "needs reauthentication" state.', - executor: expireSsoConnections, - }, - editAuthConnections: { - label: 'Auth: Edit Connections', - detail: 'Opens editor to all Auth Connections the extension is using.', - executor: editSsoConnections, - }, - forceIdeCrash: { - label: 'Crash: Force IDE ExtHost Crash', - detail: `Will SIGKILL ExtHost, { pid: ${process.pid}, sessionId: '${getSessionId().slice(0, 8)}-...' }, but the IDE itself will not crash.`, - executor: forceQuitIde, - }, +const menuOptions: () => Record = () => { + return { + installVsix: { + label: 'Install VSIX on Remote Environment', + description: 'CodeCatalyst', + detail: 'Automatically upload/install a VSIX to a remote host', + executor: installVsixCommand, + }, + openTerminal: { + label: 'Open Remote Terminal', + description: 'CodeCatalyst', + detail: 'Opens a new terminal connected to the remote environment', + executor: openTerminalCommand, + }, + deleteDevEnv: { + label: 'Delete Workspace', + description: 'CodeCatalyst', + detail: 'Deletes the selected Dev Environment', + executor: deleteDevEnvCommand, + }, + editStorage: { + label: 'Show or Edit globalState', + description: 'VS Code', + detail: 'Shows all globalState values, or edit a globalState/secret item', + executor: openStorageFromInput, + }, + showEnvVars: { + label: 'Show Environment Variables', + description: 'AWS Toolkit', + detail: 'Shows all environment variable values', + executor: () => showState('envvars'), + }, + deleteSsoConnections: { + label: 'Auth: Delete SSO Connections', + detail: 'Deletes all SSO Connections the extension is using.', + executor: deleteSsoConnections, + }, + expireSsoConnections: { + label: 'Auth: Expire SSO Connections', + detail: 'Force expires all SSO Connections, in to a "needs reauthentication" state.', + executor: expireSsoConnections, + }, + editAuthConnections: { + label: 'Auth: Edit Connections', + detail: 'Opens editor to all Auth Connections the extension is using.', + executor: editSsoConnections, + }, + forceIdeCrash: { + label: 'Crash: Force IDE ExtHost Crash', + detail: `Will SIGKILL ExtHost, { pid: ${process.pid}, sessionId: '${getSessionId().slice(0, 8)}-...' }, but the IDE itself will not crash.`, + executor: forceQuitIde, + }, + } } /** @@ -167,7 +165,7 @@ export async function activate(ctx: vscode.ExtensionContext): Promise { globalState = targetContext.globalState targetAuth = opts.auth void openMenu( - entries(menuOptions) + entries(menuOptions()) .filter((e) => (opts.menuOptions ?? Object.keys(menuOptions)).includes(e[0])) .map((e) => e[1]) ) @@ -192,10 +190,6 @@ export async function activate(ctx: vscode.ExtensionContext): Promise { const editor = new ObjectEditor() ctx.subscriptions.push(openStorageCommand.register(editor)) - - if (!isCloud9() && !isReleaseVersion() && config.betaUrl) { - ctx.subscriptions.push(watchBetaVSIX(config.betaUrl)) - } } async function openMenu(options: MenuOption[]): Promise { diff --git a/packages/core/src/dev/beta.ts b/packages/core/src/dev/beta.ts index 69935ace908..7718d1f49fc 100644 --- a/packages/core/src/dev/beta.ts +++ b/packages/core/src/dev/beta.ts @@ -18,6 +18,9 @@ import { isUserCancelledError, ToolkitError } from '../shared/errors' import { telemetry } from '../shared/telemetry/telemetry' import { cast } from '../shared/utilities/typeConstructors' import { CancellationError } from '../shared/utilities/timeoutUtils' +import { isAmazonQ, isCloud9, productName } from '../shared/extensionUtilities' +import * as config from './config' +import { isReleaseVersion } from '../shared/vscode/env' const localize = nls.loadMessageBundle() @@ -39,6 +42,16 @@ async function updateBetaToolkitData(vsixUrl: string, data: BetaToolkit) { }) } +/** + * Set up "beta" update monitoring. + */ +export async function activate(ctx: vscode.ExtensionContext) { + const betaUrl = isAmazonQ() ? config.betaUrl.amazonq : config.betaUrl.toolkit + if (!isCloud9() && !isReleaseVersion() && betaUrl) { + ctx.subscriptions.push(watchBetaVSIX(betaUrl)) + } +} + /** * Watch the beta VSIX daily for changes. * If this is the first time we are watching the beta version or if its been 24 hours since it was last checked then try to prompt for update @@ -75,11 +88,12 @@ async function runAutoUpdate(vsixUrl: string) { async function checkBetaUrl(vsixUrl: string): Promise { const resp = await got(vsixUrl).buffer() const latestBetaInfo = await getExtensionInfo(resp) - if (VSCODE_EXTENSION_ID.awstoolkit !== `${latestBetaInfo.publisher}.${latestBetaInfo.name}`) { + const extId = isAmazonQ() ? VSCODE_EXTENSION_ID.amazonq : VSCODE_EXTENSION_ID.awstoolkit + if (extId !== `${latestBetaInfo.publisher}.${latestBetaInfo.name}`) { throw new ToolkitError('URL does not point to an AWS Toolkit artifact', { code: 'InvalidExtensionName' }) } - const currentVersion = vscode.extensions.getExtension(VSCODE_EXTENSION_ID.awstoolkit)?.packageJSON.version + const currentVersion = vscode.extensions.getExtension(extId)?.packageJSON.version if (latestBetaInfo.version !== currentVersion) { const tmpFolder = await makeTemporaryToolkitFolder() const betaPath = vscode.Uri.joinPath(vscode.Uri.file(tmpFolder), path.basename(vsixUrl)) @@ -141,7 +155,7 @@ async function promptInstallToolkit(pluginPath: vscode.Uri, newVersion: string, const response = await vscode.window.showInformationMessage( localize( 'AWS.dev.beta.updatePrompt', - `New version of AWS Toolkit is available at the [beta URL]({0}). Install the new version "{1}" to continue using the beta.`, + `New version of ${productName()} is available at the [beta URL]({0}). Install the new version "{1}" to continue using the beta.`, vsixUrl, newVersion ), diff --git a/packages/core/src/dev/config.ts b/packages/core/src/dev/config.ts index 219f9b35fec..276732a72bf 100644 --- a/packages/core/src/dev/config.ts +++ b/packages/core/src/dev/config.ts @@ -3,7 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -// This file is strictly used for private development +// This file is for internal testing. // Nothing in this file should have a truthy value on mainline -export const betaUrl = '' +export const betaUrl = { + amazonq: '', + toolkit: '', +} + +// feature flag for SQL transformations +export const isSQLTransformReady = false diff --git a/packages/core/src/dev/index.ts b/packages/core/src/dev/index.ts index e69b1908875..111920c99ee 100644 --- a/packages/core/src/dev/index.ts +++ b/packages/core/src/dev/index.ts @@ -4,3 +4,4 @@ */ export { DevOptions, updateDevMode } from './activation' +export * as beta from './beta' diff --git a/packages/core/src/dynamicResources/awsResourceManager.ts b/packages/core/src/dynamicResources/awsResourceManager.ts index 6c09423be64..a6045559675 100644 --- a/packages/core/src/dynamicResources/awsResourceManager.ts +++ b/packages/core/src/dynamicResources/awsResourceManager.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { writeFileSync } from 'fs' +import { writeFileSync } from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' import * as vscode from 'vscode' import { CloudFormationClient } from '../shared/clients/cloudFormationClient' diff --git a/packages/core/src/extensionNode.ts b/packages/core/src/extensionNode.ts index f91fa321f59..b9ac4977b22 100644 --- a/packages/core/src/extensionNode.ts +++ b/packages/core/src/extensionNode.ts @@ -7,10 +7,9 @@ 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' -import { SharedCredentialsProviderFactory } from './auth/providers/sharedCredentialsProviderFactory' import { activate as activateSchemas } from './eventSchemas/activation' import { activate as activateLambda } from './lambda/activation' import { activate as activateCloudFormationTemplateRegistry } from './shared/cloudformation/activation' @@ -24,7 +23,7 @@ import { } from './shared/extensionUtilities' import { getLogger, Logger } from './shared/logger/logger' import { activate as activateEcr } from './awsService/ecr/activation' -import { activate as activateEc2 } from './awsService/ec2/activation' +import { activate as activateEc2, deactivate as deactivateEc2 } from './awsService/ec2/activation' import { activate as activateSam } from './shared/sam/activation' import { activate as activateS3 } from './awsService/s3/activation' import * as filetypes from './shared/filetypes' @@ -36,12 +35,10 @@ import { activate as activateEcs } from './awsService/ecs/activation' import { activate as activateAppRunner } from './awsService/apprunner/activation' import { activate as activateIot } from './awsService/iot/activation' import { activate as activateDev } from './dev/activation' +import * as beta from './dev/beta' import { activate as activateApplicationComposer } from './applicationcomposer/activation' import { activate as activateRedshift } from './awsService/redshift/activation' import { activate as activateIamPolicyChecks } from './awsService/accessanalyzer/activation' -import { Ec2CredentialsProvider } from './auth/providers/ec2CredentialsProvider' -import { EnvVarsCredentialsProvider } from './auth/providers/envVarsCredentialsProvider' -import { EcsCredentialsProvider } from './auth/providers/ecsCredentialsProvider' import { SchemaService } from './shared/schemas' import { AwsResourceManager } from './dynamicResources/awsResourceManager' import globals from './shared/extensionGlobals' @@ -55,7 +52,7 @@ import { learnMoreAmazonQCommand, qExtensionPageCommand, dismissQTree } from './ import { AuthUtil, codeWhispererCoreScopes, isPreviousQUser } from './codewhisperer/util/authUtil' import { installAmazonQExtension } from './codewhisperer/commands/basicCommands' import { isExtensionInstalled, VSCODE_EXTENSION_ID } from './shared/utilities' -import { ExtensionUse } from './auth/utils' +import { ExtensionUse, initializeCredentialsProviderManager } from './auth/utils' import { ExtStartUpSources } from './shared/telemetry' import { activate as activateThreatComposerEditor } from './threatComposer/activation' import { isSsoConnection, hasScopes } from './auth/connection' @@ -78,7 +75,8 @@ export async function activate(context: vscode.ExtensionContext) { // IMPORTANT: If you are doing setup that should also work in web mode (browser), it should be done in the function below const extContext = await activateCommon(context, contextPrefix, false) - await (await CrashMonitoring.instance()).start() + // Intentionally do not await since this can be slow and non-critical + void (await CrashMonitoring.instance())?.start() initializeCredentialsProviderManager() @@ -109,6 +107,7 @@ export async function activate(context: vscode.ExtensionContext) { try { await activateDev(context) + await beta.activate(context) } catch (error) { getLogger().debug(`Developer Tools (internal): failed to activate: ${(error as Error).message}`) } @@ -207,6 +206,8 @@ export async function activate(context: vscode.ExtensionContext) { await activateRedshift(extContext) + await activateAppBuilder(extContext) + await activateIamPolicyChecks(extContext) context.subscriptions.push( @@ -254,7 +255,7 @@ export async function activate(context: vscode.ExtensionContext) { export async function deactivate() { // Run concurrently to speed up execution. stop() does not throw so it is safe - await Promise.all([await (await CrashMonitoring.instance()).stop(), deactivateCommon()]) + await Promise.all([await (await CrashMonitoring.instance())?.shutdown(), deactivateCommon(), deactivateEc2()]) await globals.resourceManager.dispose() } @@ -309,12 +310,6 @@ async function handleAmazonQInstall() { }) } -function initializeCredentialsProviderManager() { - const manager = CredentialsProviderManager.getInstance() - manager.addProviderFactory(new SharedCredentialsProviderFactory()) - manager.addProviders(new Ec2CredentialsProvider(), new EcsCredentialsProvider(), new EnvVarsCredentialsProvider()) -} - function recordToolkitInitialization(activationStartedOn: number, settingsValid: boolean, logger?: Logger) { try { const activationFinishedOn = Date.now() 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 42a8681c672..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 } @@ -258,7 +275,7 @@ export function createRuntimeQuickPick(params: { totalSteps?: number }): QuickPickPrompter { const zipRuntimes = params.runtimeFamily - ? getRuntimesForFamily(params.runtimeFamily) ?? samLambdaCreatableRuntimes() + ? (getRuntimesForFamily(params.runtimeFamily) ?? samLambdaCreatableRuntimes()) : samLambdaCreatableRuntimes() const zipRuntimeItems = zipRuntimes 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 852537800f8..36ea36a55c5 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts +++ b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts @@ -4,10 +4,11 @@ */ import { _Blob } from 'aws-sdk/clients/lambda' -import { readFileSync } from 'fs' +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,16 +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 { @@ -35,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 { @@ -53,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() @@ -61,7 +90,7 @@ export class RemoteInvokeWebview extends VueWebview { try { const funcResponse = await this.client.invoke(this.data.FunctionArn, input) - const logs = funcResponse.LogResult ? Buffer.from(funcResponse.LogResult, 'base64').toString() : '' + const logs = funcResponse.LogResult ? decodeBase64(funcResponse.LogResult) : '' const payload = funcResponse.Payload ? funcResponse.Payload : JSON.stringify({}) this.channel.appendLine(`Invocation result for ${this.data.FunctionArn}`) @@ -78,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', @@ -100,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') } } } @@ -125,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 */ -